Java集合
集合简介:
1.定义:一系列储存数据的接口和类,位于Java.until包中。
2.作用:可以解决复杂数据问题,任何一个集合可以储存不同类型的数据且长度动态可变。
java集合结构:
Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类。但是却让其被继承产生了两个接口,就是Set和List。
Set中不能包含重复的元素。
List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式。
:集合的使用都直接或间接的实现了Collection、Map接口或者其他子接口。
Map是Java.util包中的另一个接口,它和Collection接口没有关系,是相互独立的,但是都属于集合类的一部分。Map包含了key-value对。Map不能包含重复的key,但是可以包含相同的value。
Iterator,所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含以下三种方法:
1.hasNext()是否还有下一个元素。
2.next()返回下一个元素。
3.remove()删除当前元素。
Java集合分类:
- 数组
- List
- Set
- Map
- Queue
- 工具类
List :有序,可重复 | |
ArrayList | 动态数组,查询快、增删慢,初始大小为10 |
LinkedList | 双向链表、增删快、查询慢 |
Vector | 线程安全、动态数组 |
Stack | 栈,先进后出 |
CopyOnWriteArrayList | CopyOnWriteArrayList是ArrayList的线程安全的变体 |
Vector和ArrayList区别
1,vector是 线程同步,线程安全,arraylist是线程异步,不安全的。一般用arraylist效率比较高(不管线程安全)。
2,vector增长率为目前数组长度的100%,arraylist增长率为目前数组长度的50%。
3. Java官方不建议使用Stack、Vector
需要并发编程,自 Java 5 以后,也推荐使用 java.util.concurrent 包
Arraylist和linkedlist
1.数据结构ArrayList底层是动态数组,LinkedList底层是链表。
2.查询 :ArrayList优于LinkedList
3.增删 :LinkedList优于ArrayList
Set :元素无序,不可重复 | |
EnumSet | 枚举类型专用Set,所有元素都是枚举类型。 |
HashSet | 以哈希码决定元素位置的set、不允许存放重复元素、存储元素的方式是散列存储,即存储是无序的。 |
LinkedHashSet | 使用链表维护集合元素中元素的顺序。遍历时是按照先进先出的顺序进行遍历;插入性能略低于HashSet,但是在迭代访问中仍具有很好的性能。 |
TreeSet | 有序;插入时会自动排序的set、若中途修改元素大小,不会重新排序,只会在插入时排序(TreeSet是SortedSet接口的唯一实现类) |
Map:键值对、键唯一、值不唯一 | |
:Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。 | |
TreeMap | 自动排序map,根据key值自动排序 |
HashMap | key的哈希码决定元素位置,需要保证key的哈希码不一致,如果碰到值不同但哈希码相同的key,会以单向链表的方式扩展 |
HashTable | 线程安全的HashMap |
ConcurrentHashMap | 线程安全,并且锁分离。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行 |
LinkedHashMap | LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢,有HashMap的全部特性。 |
Properties | 继承自HashTable,从可以从Property文件中加载数据,其读写操作更加方便 |
EnumMap | Key值必须是Enum |
HashMap与TreeMap
1、 HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
2、插入、删除和定位元素时,HashMap是较好的选择。但是需要按自然顺序或自定义的顺序遍历键,那么TreeMap会更好。并且HashMap使用中要求明确定义hashCode()和 equals()的实现。
两个map中的元素一样,但顺序不一样,导致hashCode()不一样。
对于测试:
在HashMap中,同样的值的map,顺序不同,equals时,false;
而在treeMap中,同样的值的map,顺序不同,equals时,true,代表着treeMap在equals()时是整理了顺序了的。
阻塞式队列:队满后,插入元素抛出异常; | |
ArrayBlockingQueue | 以数组方式实现 单端队列(一边进一边出) |
PriorityBlockingQueue | 优先级组件的队列 单端队列 |
LinkedBlockingQueue | 通过链表实现的队列 单端队列 |
非阻塞队列可以持续追加 (内存允许) | |
PriorityQueue | 双端队列,支持在头尾两端插入和移除元素 |
数组工具类
- java.util.Arrays
- java.lang.reflect.Array :反射中的Array
集合工具类
- java.util.Collections
Iterator
Iterator和ListIterator :
- ListIterator继承自Iterator接口,然后添加了一些额外的功能
Iterator 方法: - 通过Iterator的next()方法返回第一个元素(使用容器的iterator()方法获得一个Iterator)。
- 使用Iterator()的hasNext()方法判断容器中是否还有元素。
- 可以通过remove()方法删除迭代器返回的元素。
ListIterator 方法: - ListIterator它不仅可以向后迭代,它还可以向前迭代。
- ListIterator相对Iterator增加了如下3个方法:
- boolean hasPrevious():返回该迭代器关联的集合是否还有上一个元素。
- Object previous():返回该迭代器的上一个元素。
Iterator(集合迭代器:一个接口):迭代集合的迭代器。主要就2个方法:
1、返回boolean类型的hasNext()方法,解释——判断集合中是否有数据实例。
2、返回object类型的next()方法,解释——通过迭代集合得到集合中的数据实例。
Enumeration和Iterator的区别
- Enumeration出现的比Iterator早,JDK1.0出现而Iterator在JDK1.2发布
- Iterator 可代替Enumeration
- Iterator有fail-fast机制
- Enumeration的内存占用相对较少、效率更高,而Iterator更加的安全
JAVA中Collection和Collections的区别 | |
1.java.util.Collection 是一个集合接口。 | 它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现 |
2.java.util.Collections 是一个包装类。 | 它包含有各种有关集合操作的静态多态方法。不可实例化,工具类,为Java的Collection框架提供服务。 |
Collections中的sort方法:
很常用的方法
下面的代码摘自Collections类中源码
public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}