集合是什么?
集合也称容器,是一个用来存放对象的容器,Java集合类存放于java.util包中。
Java集合框架主要分为两大部分,一部分Collection接口,该接口定义了存取一组对象的方法,其子接口Set和List分别定义了存取的方式;另一部是Map接口,该接口定义了存储一组key value键值对方法。
注意:
1:集合只能存放对象。如果一个int型数据1存入集合中,它会自动转换成integer类后存入的,Java的每一种基本类型都有对应的引用类型。
2:集合存放的是多个对象的引用,对象本身还是放在堆内存中。
3:集合可以存放不同类型,不限数量的数据类型。
一:Iterator
Iterator迭代器,他是Java集合的顶层接口(不包括map系列的集合,Map接口是map系列集合的顶层接口)
基本上所有的Java集合类除了map系列的集合,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,Java集合的顶层接口Collection继承的就是Iterable。
Iterator和Iterable的区别:
Iterable:存在与java.lang包中,里面封装了Iterator接口,只要实现了Iterable接口的类,就可以使用Iterator迭代器了。
Iterator:存在于java.util包中。核心的方法next(),hasnext(),remover().
Collection
Collection:List接口和Set接口的父接口
public interface Collection<E> extends Iterable<E> {
List
List:有序,可以重复的集合
1 List 接口的三个典型实现:
-
List list1 = new Arraylist();
底层数据结构是数组,查询快,增删慢,线程不安全,效率高。 -
List list2 = new Vector();
底层数据结构是数组,查询快,增删慢,线程安全,效率低几乎已经淘汰了。 -
List list3 = new LinkedList();
底层数据结构是链表,查询慢,增删快,线程不安全,效率高。
List接口还可以使用for循环进行遍历,指定位置添加元素,替换元素等等。
Set
Set:典型实现HashSet()是一个无序,不可重复的集合。
1:Seto hashSet = new HashSet();
HashSet不能保证元素的顺序,不可重复,不是线程安全的,集合元素可为NULL;
其底层是一个数组,存在的意义是加速查询速度,在一般的数组中,元素在数组中的索引位置是随机的,元素的取值和元素的位置之间不存在确定的关系,而HashSet集合底层数组的索引和值有一个确定的关系,底层通过哈希算法实现,调用这个算法就能快速找到元素或索引。
对于HashSet,如果两个对象通过equals()方法返回true,这两个对象的hashCode值也应该相同。
当向HashSet集合中存入一个元素时,HashSet会先调用对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet的存储位置。
如果hashCode值不同,直接把元素存储到hashCode()指定的位置。
如果hashCode值相同,继续判断该元素和集合对象的equals()比较
hashCode相同,equals为true,则视为同一个对象,不保存在hashCode()中。
hashCode相同,equals为false,则表示发生了冲突,这很麻烦,我们应该尽量避免这样的事情发生,即保证:如果两对象通过equals()方法返回true,则这两个对象的hashCode值也应该相同。
注意:每一个存储到哈希表中的对象,都将提供hashCode()和equals()方法的实现,用来判断是否是一个对象,
对于HashSet集合,我们要保证如果两个对象通过equals()方法返回true,这两个对象的hashCode值也应该相同。
2:Set linkedHashSet = new LinkedHashSet();
不可以重复,有序
因为底层采用链表和哈希表的算法,链表保证元素的添加顺序,哈希表保证元素的唯一性
3:Set treeSet = new TreeSet();
TreeSet:有序,底层使用红黑树算法,擅长于范围查询。
如果使用TreeSet()无参数的构造器创建一个TreeSet对象,则要求放入其中的元素的类必须实现Comparable接口,所以在其中不能放入null元素
必须放入同样类的对象,(默认会进行排序)否则可能会发生类型转换异常,可以使用泛型来限制。
以上三个set接口的实现类的共同点:
1:都不允许元素重复
2:都不是线程安全的类,解决办法:Set set = Collections.synchronizedSet(set对象)
Map
Map:key-value的键值对,key不允许重复,value可以
因为Map集合既没有实现于Collection接口,也没有实现Iterable接口,所以不能对Map集合进行for-each遍历。