旧的集合类
-
Vector
- 实现原理和ArrayList相同,功能相同,都是长度可变的数组结构,很多情况下可以互用。
- 两者的主要区别如下:
1.Vector是早期JDK接口,ArrayList是替代Vector的新接口。
2.Vector线程安全,效率低下;ArrayList重速度轻安全,线程非安全。
3.长度需要增长时,Vector默认增长一倍,ArrayList增长50%。
-
HashTable类
- 实现原理和HashMap相同,功能相同,底层都是哈希表结构,查询速度快,很多情况下可以互用。
- 两者的区别主要如下:
1.HashTable是早期JDK提供,HashMap是新版JDK提供 。
2.HashTable继承Dictionary类,HashMap实现Map接口。
3.HashTable线程安全,HashMap线程非安全。
4.HashTable不允许null值,HashMap允许null值。
示例 :使用Vector类进行集合操作
package com.bjsxt.other;
import java.util.Enumeration;
import java.util.Vector;
public class TestVector {
public static void main(String[] args) {
Vector v = new Vector();
v.addElement(123);
v.addElement(345);
v.addElement(123);
System.out.println(v.size());
Enumeration en = v.elements();
while (en.hasMoreElements()) {
int elem= (int) en.nextElement();
System.out.println(elem);
}
}
}
/*
output:
3
123
345
123
*/
新一代并发集合类
-
早期集合类Vector、HashTable通过使用syncronized关键字修饰方法来保证线程安全。
-
为了提高性能,使用ArrayList、HashMap 替换,但不能保证线程安全,那么需要线程安全该怎么办呢?
答:使用Collections.synchronizedList(list)Collections.synchronizedMap(m)解决,底层使用synchronized代码块锁。虽然也是锁住了所有的代码,但是锁在方法里面,比锁在方法外边性能可以理解为稍有提高吧。毕竟方法本身就要分配资源的。 -
在大量并发的情况下如何提高集合的效率和安全呢?
提供了新的线程同步集合类,位于java.util.concurrent包下,使用Lock锁。- ConcurrentHashMap
- CopyOnWriteArrayList
- CopyOnWriteArraySet
集合常用概念辨析
-
集合和数组的比较
数组不是面向对象的,存在明显缺陷,集合完全弥补了数组的一些缺点,比数组更灵活更实用,可大大提高软件的开发效率而且不同的集合框架类。
可适用于不同场合,具体如下:
1.数组容量固定且无法动态改变,集合类容量可以动态改变。
2.数组中能存放基本数据类型和引用数据类型的数据,而集合中只能存放引用数据类型的数据。
3.数组无法判断其中实际存有多少元素,length只告诉了数组的容量;集合可以判断实际存有多少元素,而对总的容量不关心。
4.集合有多种数据结构(顺序表、链表、哈希表、树等)、多种特征(是否有序、是否唯一)、不同适应场合(查询快,便于删除、有序),而数组仅采用顺序表表示。
5.集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率。
- ArrayList和LinkedList的联系和区别
联系:
1.都实现了List接口
2.有序、不唯一(可重复)
ArrayList:
特点:在内存中分配连续的地址空间,实现了长度可变的数组。
优点:遍历元素和随机访问元素的效率比较高。
缺点:添加和删除需要移动大量的元素,效率低,按内容查找效率低。
LinkedList:
特点:采用链表存储方式,底层是双向链表。
缺点:遍历和随机访问效率低下。
优点:插入删除元素效率较高(但是前提也是必须先低效率查询才可。如果插入删除发生在头尾可以减少查询次数)。
哈希表的原理(HashMap的底层原理) -
哈希表的特征
快:添加快、删除快、查询快。 -
哈希表的结构
1.最常用、最容易理解的结构(JDK1.7):数组+链表。
2.JDK1.8:数组+链表/红黑树(链表长度>=8)
-
哈希表的添加原理
1.计算哈希码(hashCode());
2.计算存储位置(存储位置就是数组的索引);
3.存入指定位置(要处理冲突,可能重复。需借助equals()进行比较) -
哈希表的查询原理
同哈希表的添加原理。 -
其他:
1.hashCode()和equals()的作用。
2.如何减少冲突。
3.如何生产不同数据类型的哈希码。
TreeMap的底层原理(红黑树的底层原理)
- 基本特征:
二叉树、二叉查找树、二叉平衡树、红黑树。
每个节点的结构:
- 添加原理
1.从根节点开始比较
2.添加过程就是构造二叉平衡树的过程,会自动平衡
3.平衡离不开比较:外部比较器优先,然后是内部比较器,否则出错
- 查询原理基本同添加
Collection和Collections的区别
- Collection是Java提供的集合接口,存储一组不唯一、无序的对象。他有两个接口List和Set。
- Java中还有一个Collections类,专门用来操作集合类,他提供一系列的静态方法来实现对各种集合的搜索、排序、线程安全化等操作。