《简介》
《Collection》
首先:Collection是个接口类,其身上有许多方法都是由其子类实现
注意:该 contains() 方法内部其实使用 equals() 方法来查找元素。如果指定的元素与数组中的元素有匹配到,则该方法返回 true。
《ArrayList》
import java.util.ArrayList;
ArrayList类有点像封装过后的结构体,可以接受各种类型的数据
《迭代器》
在Iterable这个接口上有一个重要的方法:
import java.util.Iterator;
《增强for循环》
底层增强for循环就是调用iterator来实现的
《List接口》
注意:这并不是说可以像数组一样( ArrayList arr)arr[1],这样用下标直接访问,还是要用迭代器来访问
或者用方法arr.get(1),可以返回下标为1的元素
改变某一下标的元素用 arr.set(index,elememt);
以下是List独有的重写了的方法:
《ArrayList》
《ArrayList的扩容机制》
在 ArrayList arr = new ArrayList(N); 这里是可以写数的,即指定初始化数组大小
《Vector》
《LinkedList》
链表(双向)
操作API与上面相同
《Set》
《HashSet》
import java.util.HashSet;
《HashSet底层分析》
所以在添加时有如下:
在String中,其hashCode方法得到了重写,是只将其value(字符串)来进行hash,如果字符串内容相同,那么hashCode的值也相同
所以我们可以重写hashCode和equals方法来使得HashSet能否能放进去:
1 package com.collection;
2
3 import java.util.HashSet;
4 import java.util.Objects;
5
6 public class SetHomeWork {
7 public static void main(String[] args) {
8 HashSet hset = new HashSet();
9 hset.add(new Dog("tom", 18));
10 hset.add(new Dog("tom", 18));
11 }
12
13 static class Dog {
14 String name;
15 int age;
16
17 public Dog(String name, int age) {
18 this.name = name;
19 this.age = age;
20 }
21
22 @Override
23 public boolean equals(Object obj) {
24 if (this == obj) return true;
25 if (obj instanceof Dog) {
26 Dog t = (Dog) obj;
27 if (this.name.equals(t.name) && this.age == this.age)
28 return true;
29 else return false;
30 } else return false;
31 }
32
33 @Override
34 public int hashCode() {
35 return Objects.hash(name, age);
36 }
37 }
38 }
《练习题》
总结:没事不要乱改已经加入Set的值,会出BUG,
重写hashCode方法是为了计算出加入位置,然后加入用的
重写equals方法是为了如果hash冲突,看一下是否相同,决定是否加入
《LinkHashSet》
《TreeSet》
TreeSet的底层是TreeMap
底层比较:
、
我们在new TreeSet时,可以在其中传入比较匿名内部类,通过这个的比较规则,如果相同就不加进去(TreeSet没有重复元素的原因)
否则在tset.add();加入元素时就按照这个规则顺序加入
《练习题》
没有指定匿名内部类,底层无法比较会抛出异常
《Map》
《Map常用方法》
《Map遍历方式(以HashMap为例)》
在Map类中一个包含 指向Key和对应Value的集合 为Entry,在MapSet中其运行类型是MapSet$Node,
而这些Entry的集合为EntrySet,在Entry这个类型中有获得Key和Value的方法,所以要转型
《HashTable》
《Properties》
《Collections工具类》
注意:首先不要将他与Collection这个接口弄混淆了,Collections是一个类
使用方法:Collections.reverse(arr);等
《总结》
注意:Collections工具类提供的sort, reverse等位置改变的方法是只能List类传进去的,而Set类不行
所以用HashSet注定是无序的,但是用TreeSet可以是有序的
《栈和队列》
根据网上的说法:Stack被弃用了,一般都是可以用队列Queue去模拟栈
那就来说说队列吧:
但是单纯的队列一般更多人喜欢用LinkedList去模拟实现
常用方法: