一.集合与数组的区别
集合不是固定长度,和固定存放数据类型的,
数组只能存放统一的数据类型的数据,且长度是固定的
二.集合是什么(java集合存放在java.util包中,用来存放对象的容器)
注意:
1.集合只能存放对象,基本数据类型进集合都会自动转换为包装类
2.集合存放的是对象的引用,对象本身还是在堆内存中
3.集合能存放不同类型,不限数量的对象
三.集合的分类:
继承了Iterable接口的collection接口集合
Iterable接口中封装了Iterator接口(迭代器)(存在于java.lang包中)
Iterator:是实现了collection接口集合的顶层接口,存在于java.util包中
核心方法有:next(),hasnext(),remove()
1)Collection:List 接口和 Set 接口的父接口
1)List:有序,可以重复的集合。
List list1 = new ArrayList();
底层数据结构是数组,查询快,增删慢;线程不安全,效率高
2)List list2 = new Vector();
底层数据结构是数组,查询快,增删慢;线程安全,效率低,几乎已经淘汰了这个集合
3)List list3 = new LinkedList();
底层数据结构是链表,查询慢,增删快;线程不安全,效率高
4)Set:典型实现 HashSet()是一个无序,不可重复的集合
Set hashSet = new HashSet();
不能保证元素的顺序;不可重复;不是线程安全的;集合元素可以为 NULL,其底层其实是一个数组
5)Set linkedHashSet = new LinkedHashSet();
不可以重复,有序,因为底层采用 链表 和 哈希表的算法。链表保证元素的添加顺序,哈希表保证元素的唯一性
6)Set treeSet = new TreeSet();
有序;不可重复,不保证元素的添加顺序,但是会对集合中的元素进行排序,底层使用 红黑树算法,擅长于范围查询。
以上三个 Set 接口的实现类比较:
共同点:
1、都不允许元素重复
2、都不是线程安全的类,解决办法:Set set = Collections.synchronizedSet
2)Map:key-value的键值对,key不允许重复,value可以(严格来说 Map 并不是一个集合,而是两个集合之间的映射关系)
注意:
1)Map可以看成由多个Entry组成
2)没有实现Iterable接口,所以不能用加强for循环遍历Map集合
Map的常用实现类:
1)HashMap:采用哈希表算法,key不保证添加的顺序,但不许重复(用equals判断是否为true,hashcode相等,(key值可以为null,但只能有一个)
2)TreeMap:红黑树算法,Key会按照自然排序或定制排序进行排序(compareTo/compare的返回值是否为0,要求里面的对象都实现了Comparable接口,key值不可以为null)
3)LinkedHashMap:链表和哈希表算法,链表保证了key先后添加的顺序,哈希表算法保证key不重复
4)Properties:要求Key和value都是String类型
上面三个都是线程不安全的,properties由于父接口为HashTable(采用哈希表算法,不推荐),为线程安全的,但效率较低