1、 集合语法
1.1 、集合基础知识
集合的定义
集合是用来存储数据的容器。
集合的特点
1、用来存储对象。
2、对象个数可以确定时,使用数组;对象的个数不确定时,使用集合。
集合与数组的区别
1、数组是固定长度,集合是可变长度。
2、数组的可以存储,基本类型和引用类型。集合只能存储引用类型。
3、一个数组的存储数据类型是同一类型。集合的存储数据类型不是同一类型。
常用的集合类有哪些?
Map和Collection是所有集合的父接口。
架构图
java的集合分为Collection和Map两大类。
Collection集合主要有set和List接口。
1、 List接口:一个有序的容器。元素可以重复,且插入null元素。
实现类:
1.1ArrayList(底层数据结构是Array)
1.2LinkedList(底层数据机构是链表)
2、Set接口:一个无序的容器。元素不能重复,只能插入一个null元素。实现类有:1.1HashSet:无序、唯一,底层数据结构是HashMap。
2.1TreeSet :有序,唯一。数据结构是排序二叉树。
2.2LinkedHashSet: LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别的。
Map是一个键值对集合,存储键、值和之间的映射。
Map 的常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap。
Java集合的快速失败机制 “fail-fast”?
java集合的错误检测机制,如果多个线程对集合进行结构上操作,就可以产生fail-fast机制。
解决办法:
1、在遍历过程中,所有涉及到改变modCount值得地方全部加上synchronized。
2、使用CopyOnWriteArrayList来替换ArrayList。
1.2 、Collection接口
1.2.1 、List接口
1.2.1.1、迭代器 Iterator 是什么?
iterator是用来遍历colleciton接口。
ArrayList<Integer> lists = new ArrayList<Integer>();
lists.add(2);
lists.add(3);
lists.add(4);
lists.add(5);
lists.add(6);
Iterator<Integer> iterator = lists.iterator();
while (iterator.hasNext()) {
System.out.println("--->" + iterator.next());
}
Iterator 的特点是只能单向遍历,但是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。
1.2.1.2、如何边遍历边移除 Collection 中的元素?
Iterator<Integer> iterator = lists.iterator();
while (iterator.hasNext()){
iterator.remove();
}
注意:不能使用forEach.
for (Integer i : lists) {
lists.remove(i);
}
原因是:使用foreach,实际上生成生成iterator 来遍历该 list。java不允许便利时候,同时修改list。
1.2.1.3、遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java 中 List 遍历的最佳实践是什么?
1、使用iterator模式,其实是一种设计模式。
2、for循环,使用计数器。
3、forEach,本质还是使用iterator方式,这是代码简洁。
最佳实践:Java Collections 框架中提供了一个 RandomAccess 接口,用来标记 List 实现是否支持 Random Access。
1、如果实现RandomAccess接口,位置读取的时间复杂度是(0),例如,ArrayList,使用for循环。
2、没有实现RandomAccess接口,例如:List集合、set集合,都是推荐,使用iterator、forEach循环。
1.2.1.4、ArrayList介绍
1、ArrayList的数据结构是数组。特点就是,查询速度很快,增删性能慢(原因是需要进行复制数据)
2、ArraysList和Arrays的相互转化:
Arrays----->List: Arrays.asList()
Integer[] ints = new Integer[]{
12, 25, 256, 45};
List<Integer> intsList = Arrays.asList(ints);
intsList.forEach((t