Collection接口
-
Collection接口是最基本的容器接口,继承至Iterable接口,允许元素重复,可以无序,无下标
-
方法
- boolean add(Object obj) //添加一个对象。
- boolean addAll(Collection c) //将一个集合中的所有对象添加到此集合中。
- void clear() //清空此集合中的所有对象。
- boolean contains(Object o) //检查此集合中是否包含o对象
- boolean equals(Object o) //比较此集合是否与指定对象相等。
- boolean isEmpty() //判断此集合是否为空
- boolean remove(Object o) //在此集合中移除o对象
- int size() //返回此集合中的元素个数。
- Object[] toArray() //将此集合转换成数组。
-
迭代器
-
//Iterator
- Iterator iterator = collection.iterator();
-
//迭代器: 是一种专门用来遍历集合元素的一种方法
-
//hasNext(); 有下一个元素 返回true
-
//next(); 取下一个元素
-
//remove(); 删除元素
-
注意事项:
- //删除
-
//必须使用迭代器的删除方法
-
//iterator.remove();
-
//集合删除方法 :ConcurrentModificationException
-
//迭代过程中不能使用集合的删除方法,否则会出现并发修改异常
-
//collection.remove(o);
-
-
List接口
-
特点:有序、有下标、元素可以重复。
-
方法:
- • void add(int index, Object o) //在index位置插入对象o。
- • boolean addAll(int index, Collection c) //将一个集合中的元素添加到此集合中的 index位置。
- • Object get(int index) //返回集合中指定位置的元素。
- • List subList(int fromIndex, int toIndex) //返回fromIndex和toIndex之间的集合元 素。
-
ArrayList
-
底层的数据结构使用的是数组结构,有序,有下标,可以重复,查询很快,但增删较慢,线程不安全
ArrayList的查找遍历比较快,插入和删除相对较慢,因为使用本地方法优化,并不一定比LinkedList慢 -
源码分析
-
- (1) 调用无参构造方法创建ArrayList集合,长度是0
-
- (2) Object[] elementData 储存元素个数 size初始为0
-
- (3) 当添加第一个元素时,容量扩容为10 每次扩容大小都是1.5倍
-
- (4) remove 方法使用System.arrayCopy实现移动,效率高
-
- (5) 迭代器中有一个cursor,获取一个元素侯,cursor+1,如果cursor == size,不能获取
-
-
-
LinkedList
-
底层的数据结构是双向链表结构,有序,有下标,可以重复LinkedList的插入和删除比较快,查找遍历比较慢
-
源码分析
-
- (1)构造没有任何操作,属性size=0,first头节点 last最后一个节点
-
- (2)静态内部类Node 包含三个属性 item 数据 next下一个元素 prev上一个元素
-
- (3)add方法 每添加一个元素都会形成一个节点 first属性指向第一个元素,last指向后一个元素
-
- 每一个节点都有前驱和后继(重点)
-
-
-
列表迭代器
- //列表迭代器
-
ListIterator listIterator = linkedListist.listIterator();
-
while (listIterator.hasNext()) {
-
System.out.println(listIterator.next());
-
}
-
while (listIterator.hasPrevious()) {
-
System.out.println(listIterator.previous());
-
}
-
Vector
-
底层是数组数据结构,查询快、增删慢,JDK1.0版本,运行效率慢、线程安全。
-
遍历
-
//枚举器
-
Enumeration elements = vector.elements();
-
while (elements.hasMoreElements()) {
-
System.out.println(elements.nextElement());
-
}
-
-
-
-
Set接口
-
特点: 无序、无下标、元素不可重复。
-
最多只能包含一个null元素
-
方法: 全部继承自Collection中的方法。
-
HashSet类
-
底层实现是基于HashMap、不保证Set的迭代顺序、不保证该顺序永久不变
-
存储结构: 哈希表
- hashtable 本质 数组+链表
- JDK1.7 (数组+链表) (链表头插入) 可以并存 并且数组连续
- JDK1.8 (数组+链表+红黑树)
- 打印对象的原始hashcode System.out.println(System.identityHashCode(student1));
-
存储重复依据:hashCode和equals 方法
-
存储过程:
- (1)根据hashCode计算存储位置,如果此位置没有元素,则添加
- (2)如果此位置有元素,在比较equals,如果equals相同,则拒绝添加否则形成链表添加
-
-
LinkedHashSet
- 链表实现的HashSet,按照链表进行存储,即可保留元素的插入顺序。
- 存储结构: 哈希表
-
TreeSet
-
特点:
- (1) 无序 没有下标 不能重复
- (2) 对元素进行排序
-
存储结构: 红黑树
-
重复依据: Comparable 接口中compareTo(),如果comparTo方法返回0,重复元素拒绝添加
-
基于排列顺序实现元素不重复。(二叉排序树)
-
实现了SortedSet接口,对集合元素自动排序。
-
元素对象的类型必须实现Comparable接口,指定排序规则。
-
通过CompareTo方法确定是否为重复元素。
-
-
-
数据结构
-
栈
-
是一种先进后出的数据结构
-
Stack类:继承Vector类
-
push方法入栈、pop方法出栈
- //入栈 压栈
- stack.push(“王五”);
-
//出栈
-
int count = stack.size();
-
for (int i = 0; i < count; i++) {
-
System.out.println(stack.pop());
-
}
-
LinkedList也实现了栈结构
-
-
队列
-
是一种先进先出的数据结构
-
Queue接口:继承Collection接口
-
offer方法入队、pop方法出队
- //进队
-
queue.offer("桃子");
-
//出队
-
int count = queue.size();
-
for (int i = 0; i < count; i++) {
-
System.out.println(queue.poll());
-
}
-
LinkedList实现了Queue接口
-
-
二叉排序树
-
又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一 般情况下,查询效率比链表结构要高。
-
特点:
- 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 左、右子树也分别为二叉排序树;
- 没有键值相等的结点。
-
代码
- 中序遍历
-
-
-
注意事项:
- 不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。
Map接口
-
Map父接口
-
特点:
- 称为“映射”,用于存储任意键值对(Key-Value)
- 键:无下标、不可以重复(唯一)
- 值:无下标、可以重复
-
方法:
- V put(K key,V value) //将对象存入到集合中,关联键值。key重复则覆盖原值。
- Object get(Object key) //根据键获取对应的值。
- Set keySet()//返回所有key。
- Collection values() //返回包含所有值的Collection集合。
- Set<Map.Entry<K,V>> entrySet() //键值匹配的Set集合。
-
-
HashMap类
-
基于哈希表的Map接口实现,利用哈希算法根据hashCode()来配置存储地址
-
JDK1.2版本,线程不安全,运行效率快 ;允许用null 作为key或是value。
-
储存结构: 哈希表
- JDK1.7 数组 + 链表
- JDK1.8 数组 + 链表 + 红黑树
-
存储重复依据:hashCode和equals 方法
-
存储过程:
- (1)根据hashCode计算存储位置,如果此位置没有元素,则添加
- (2)如果此位置有元素,在比较equals,如果equals相同,则拒绝添加否则形成链表添加
-
HashMap源码分析
- • HashMap刚创建时,table是null,为了节省空间,当添加第一个元素时,table容量 调整为16。
- • 当元素个数大于阈值(16*0.75=12)时,会进行扩容,扩容后大小为原来的2倍。目的是 减少调整元素的个数。
- • jdk1.8 当每个链表长度大于8,并且数组元素个数大于等于64时,会调整为红黑树,目 的提高执行效率。
- • jdk1.8 当链表长度小于等于6时,调整成链表。
- • jdk1.8以前,链表是头插入,jdk1.8以后是尾插入。
-
-
LinkedHashMap
- 链表实现的HashMap,按照链表进行存储,即可保留元素的插入顺序。
- 存储结构: 哈希表
-
Hashtable
- JDK1.0版本,线程安全,运行效率慢;不允许null作为key或是value。
-
Properties
-
Hashtable的子类,要求key和value都是String。通常用于配置文件的读取。
-
属性集合:
- (1)存储的是属性名和属性值
- (2)只能存储String key valus字符串
- (3)没有泛型
- (4)和IO流有关
-
-
TreeMap类
- 基于红黑树(Red-Black tree)的NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者 根据创建映射时提供的Comparator 进行排序,具体取决于使用的构造方法
- 实现了SortedMap接口(Map的子接口),可以对key自动排序,Key需实现 Comparable接口。
-
SortedMap接口
- 进一步提供关于键的总体排序 的 Map
辅助工具类
-
Collections
-
提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作
-
方法
- Collections.max(arrayList)最大值
- Collections.reverse(arrayList)翻转
- Collections.shuffle(arrayList)打乱
- Collections.binarySearch(arrayList, 47)二分查找
- Collections.sort(arrayList)倒序
- Collections.frequency(arrayList, 10)查找元素出现的个数
- Collections.copy(arrayList1, arrayList);复制
-
-
Arrays类
-
Comparable
- Comparable用作默认的比较方式,实现了该接口的类之间可以相互进行比较,这个对象组成的集合就可以直接通过sort()进行排序了
-
Comparator比较器
- Comparator是设计模式中策略模式的一种应用
- 可以实现定制比较,元素自身提供的比较规则称为自然排序。
- compare(o1,o2),如果返回值为0,则为重复元素。
- 使用Comparator比较器,元素类型可不实现Comparable接口,并且优先级高于 Comparable接口。
- 实现字符串按照长度排序,如果长度相同,按照编码顺序。
数组和集合的转换
-
数组转成集合
- List integers = Arrays.asList(nums);
- add和remove方法不能使用会出现UnsupportedOperationException不支持操作异常
-
集合变成数组
-
注意点: 数组要给初始值
-
步骤
- ArrayList stringArrayList = new ArrayList<>();
-
stringArrayList.add("上海");
-
stringArrayList.add("北京");
-
String[] strings = stringArrayList.toArray(new String[0]);
-