目录
1、List:存储有序的,可重复的数据; -->"动态"数组
1.1 Collection常用方法:List、Set 继承了Collection所有方法
1.5 ArrayList LinkList Vector的异同:
2.2 HashSet LinkedHashSet TreeSet 的区别:
Collection:单例集合,存储一个一个的对象
1、List:存储有序的,可重复的数据; -->"动态"数组
Collection coll = new Collection();
1.1 Collection常用方法:List、Set 继承了Collection所有方法
1)add(Object e) 将元素e添加到集合coll中,元素e为Object任何类型;
2)addAll(Collection coll1) 将另一个集合(包括List和Set)coll1添加到coll中,添加集合操作;
3)size() 获取添加元素的个数;
4)isEmpty() 判断集合元素是否为空;
5)clear() 清空集合内元素;
6)contains(Object e) 判断是否包含元素e,返回一个Boolean类型;
判断时使用equals而不是(==),如果没有重写equals等价于(==);
7)containsAll(Collection coll1) 判断当前集合是否包含集合(List Set)coll1中所有元素;
新方法:Collection coll1 = Arrays.asList(List<T>);
8)boolean remove(Object e) 从当前集合中删除对象e,返回一个boolean类型;
删除成功返回true,失败返回false;修改了当前集合;
9)removeAll(Collection coll1) 移除集合coll1中所有元素(所有共有元素);
contains 和 remove 都需要重写equals()方法;
10)retainAll(Collection coll1) 求当前集合和集合coll1的交集,并返回给当前集合 (修改了当前集合)
11)equals(Collection coll1) 判断当前集合和集合coll1是否相等,2集合顺序也必须相等;
·12)hashCode() 返回当前对象的哈希值;
13)toArray() 把Collection类型转换成Object数组;
相反:调用Arrays的静态方法 Arrays.asList(List<T>);
14)iterator() 返回一个Iterator接口的实例,用于遍历集合元素;
1.2 经典面试题:![](https://i-blog.csdnimg.cn/blog_migrate/8cdd5562cbca2b02a14682fb6e04fa4f.png)
第一个输出:1、2 第二个输出:1、3;
区分 move(Object obj) 与 move(int index)
move()方法有2种参数,一个里面是Object类,一个是index类;要指定Object可以自动装箱;
1.3 使用迭代器Iterator接口遍历集合元素;
Iterator对象常用方法:1)boolean hasNext() 判断是否有下一个元素;
2)E next() 输出下一个元素;(泛型) 有2步操作:1指针下移,2返回下移以后集 合位置上的元素;
3)remove() 可以在遍历的时候删除集合中的元素;和next()一样,删除指针对应的当前元 素,此方法不同于集合中的remove()方法,这是迭代器中的remove()方法;
如果一开始未调用next或者同一个指针对应的位置重复调用remove(),会报错;
1.4 foreach:用于遍历集合或数组:
for(集合中元素的类型 局部变量 :集合对象) {}
内部实现使用迭代器;
1.5 ArrayList LinkList Vector的异同:
异:
同:3个类都实现了List接口,存储数据特点相同:存储有序的,可重复的数据 ;
1.6 ArrayList源码分析:
jdk7中:
jdk8中:
小节:
1.7 LinkList源码分析:
1.8 Vector源码分析:
使用较少,线程安全;
底层数组初始化为10,在add前就进行初始化,底层数组扩容为原来的2倍;
2、Set:存储无序的,不可重复的数据;
2.1:注意事项:
2.1.1 向Set中添加对象时,其所在的类一定要重写equals() 和 hashCode() 方法;
2.1.2 重写的equals() 和 hashCode() 竟可能保存一致性,以实现相同对象相等规则:
即“相等的对象有相同散列码“
2.1.3 重写2个方法小技巧:对象中用作equals()方法比较的Field,都应该用来比较hashCode()值;
2.2 HashSet LinkedHashSet TreeSet 的区别:
2.2.1 HashSet:
特点:
1.无序性:存储在底层数组的元素并不是按照数组索引的顺序添加,而是根据数据的哈希值决定;
2.不可重复性:保证添加的元素按照equals()判断时,不能返回True;即相同元素只能添加一个;
3.底层:数组加链表的形式;数组初始大小为16;
2.2.2 面试题:
输出: 1001,“CC”;1002,"BB";
1001,"CC";1002,"BB";1001,"CC";
1001,"CC";1001,"BB";1001,"CC";1001,"AA"
2.2.3 LinkHashSet
LinkHashSet作为HashSet的子类,在添加数据的同时,每个数据还记录了2个引用,来记录此数据前一个数据和后一个数据;
优点:对于频繁地遍历操作,LinkHashSet比HashSet效率高;
2.2.4 TreeSet
1.向TreeSet中添加数据时,必须是相同对象的类;
2.两种排序:自然排序(实现CompareTo接口)和 定制排序 (Comparator);
3.自然排序中,比较2个对象是否相等比较为:comparerTo()返回0,不再是equals()方法;
定制排序:相当于把构造器当成参数放入TreeSet构造器中;