一、集合概述
1、集合分类
(1)以单个方式存储元素:
这类集合中超级父接口是 [java.util.Collection]
包含的集合类型:List-----有序可重复
Set------无序不可重复
(2) 以键值对方式存储元素
这类集合的超级父接口是[java.util.Map]
包含的集合类型:HashMap、HashTable、SotedMap(TreeMap)-----无序集合
2、集合存储的是java对象的内存地址
集合不能直接存储基本数据类型,也不能直接存储java对象,
当直接存储基本数据类型或对象时,系统会自动装箱---JDK5的新特性
如:list.add(100),存的不是100,它会自动装箱Integer
【注】
- 集合在Java中本身是一个容器,是一个对象,有自己本身的内存地址
- 集合中任何时候存储的都是“引用”
- 集合存储的基本数据类型,实际是存储其对应的包装类对象(八大基本类型包装类)
二、单个方式存储接口----Collection
(一)Colletction接口
1、collection接口不能new对象,要用接口下的任意一个实现类来new对象----多态
引用---------collection接口
new的对象---实现接口实现类的对象(List、Set)
Colletction c=new ArrayList();//接口类型引用指向list类型对象
2、 接口种常用方法
添加某个元素-----Boolean add()
删除某个元素-----Boolean remove()
清空集合-----Boolean clear()
获取元素个数-----int size()
判断集合是否包含某元素-----Boolean contains()
判断集合是否为空-------Boolean isEmpty()
将集合转成数组-----Object[] toArray()
【注】求数组中元素个数:【数组名.length】 属性
String类型元素长度:【数组名.length()】方法
集合中元素个数:【集合名.size()】 方法
3、集合遍历
<1>创建collection集合对象,并添加collection集合元素
<2>创建迭代器对象it
<3>利用迭代器对象的hasNext函数先判断,然后循环输出
it.hasNext()----判断是否有元素可迭代
it.Next()-------迭代器前进一位,并返回当前指向的元素
Colletction c=new HashSet(); //new的对象可为collection接口实现类的任意一个
c.add("abc");
c.add(100);
c.add(new Student());
Iterator it=c.iterator();
while(it.hasNext()){
Object o=it.next();
System.out.println(o);//或直接输出: System.out.println(it.next());
}
【注】
- 迭代器it最初并没有指向第一个元素,因此判断的是next
- 当创建集合对象时,没有使用泛型,则集合中可以存放任意不同类型的对象,这也是和数组的区别之一。
一个数组只能存储同一类元素,而一个集合可以同时存储任意类型元素,可使用泛型固定只能存储一种类型元素
- 集合中的元素都是Object类型的元素,即使是一般类型数据,也会转换成其包装类对象
(二)List主要实现类【有序可重复】
1、ArrayList-----底层实现是数组
2、LinkedList----底层实现是双向链表
3、Vector--------底层实现是数组,线程安全
(三)Set主要实现类【无序不可重复】
1、HashSet-----底层HashMap(哈希表),HashMap的key部分是一个Set集合(无序不可重复)
2、SortedSet----TreeSet----底层TreeMap(平衡二叉树:左大右小,中序遍历),
特点:自动排序----底层实现了comparable接口
(四)Collection和Collections区别
1、一个是接口,一个是工具类
java.util. collection-----集合接口
java.util.collections-----集合工具类
2、collections种常用方法:
(1)synchronizedList()------将非线程安全的List集合转成线程安全
List<String> list=new ArrayList<>();
Collections.synchronizedList(list);// 将非线程安全的list集合变成线程安全
实现原理主要是:通过synchronized关键字,给所有接口方法加锁,保证线程安全【多线程安全实现方式之一】
(2)sort()-----集合排序
要求:待排序对象的类必须实现了comparable接口
- String 、Interger、Date可以直接用(系统默认已实现)
- 自定义类的对象要手动实现comparable接口后,才能调用sort函数完成排序功能
list.add("abf");
list.add("abx");
list.add("abc");
Collections.sort(list);
(3)其他
max()/min()
binarySearch()
reverse()
三、Map---【无序不重复】
(一)HashMap【重要】
1、底层结构:哈希表=数组+单向链表(具体实现另有详述)
2、实质:一个node类型的一维数组,数组中存储元素是一个node类型对象(单向链表)
3、原理概述:
(1)采用hash算法将要存储的对象存储到数组的对应位置,
(2)当元素较多时,容易出现hash冲突,即多个元素需存储到同一个数组下标位置
(3)解决:单向链表,多个元素以链表形式存储在同一个数组下标下
(4)当单向链表节点数大于8时,链表转成红黑树------几率极小,因为会数组扩容
(二)HashTable-----properties
1、线程安全
2、底层实现是哈希表
3、key,value均是String类型
(三)SortedMap
1、实现类TreeMap-----二叉树
2、key部分自动排序(TreeSet)
四、总结
1、collection-----list和set----存 add
map------hashmap和treemap---存put 取ge
2、元素特点:
list:有序可重复----存的顺序和取的顺序一致,且有下标,可存重复的值
set:无序不可重复---存的顺序和取的顺序不一致,没有下标,不可存重复的值
2、集合扩容
ArraryList hashSet hashMap hashTable
初始化容量 10 16 16,默认加载因子0.75 11
扩容倍数 原容量1.5倍 原容量2倍 原容量2倍 原容量*2+1
集合具体内容和实现原理详见详述文章