1、什么是java集合
java集合是用来存储多个数据引用的数据类型。
2、java集合分类
java集合类在java.util包下
集合的顶层接口有Collection,Map,Iterator。
其中Collection中有两个子接口List和Set。
java集合结构.png java集合类图.png
3、list
list为有序可重复的集合。常见子类有:
-
ArrayList: 基于动态数组实现,支持下标访问。数据的修改和查询快。
-
Vector:与ArrayList类似,但是是线程安全的。
-
LinkedList:基于双向链表实现,只能顺序访问,数据的添加和删除效率较高。
-
CopyOnWriteArrayList:线程安全,读写分离的集合,读的性能较高,适用于读多写少的场景。缺点:内存占用高,读操作不能读取到实时数据。
3.1 ArrayList的扩容:
扩展:ArrayList动态数组初始默认大小为10,当不够存储时,会按旧容量1.5倍进行扩容。使用的是Arrays.copyOf()方法。
3.2 ArrayList序列化:
ArrayList的序列化时,因为动态数组中数据可能没有存满,所有不能直接对数组中的数据进行序列化,ArrayList将动态数组用transient,让其不被序列化,然后ArrayList 实现了 writeObject() 和 readObject() 来控制只序列化数组中有元素填充那部分内容。序列化时需要使用 ObjectOutputStream 的 writeObject() 将对象转换为字节流并输出。而 writeObject() 方法在传入的对象存在 writeObject() 的时候会去反射调用该对象的 writeObject() 来实现序列化
3.3 Vector的替代方案:
因为vector的效率不是很高,可以使用 Collections.synchronizedList(); 得到一个线程安全的 ArrayList。
List<String> list = new ArrayList<>();
List<String> synList = Collections.synchronizedList(list);
4、set
set为无序不可重复的集合。
1、那我们怎么来判定元素是否重复呢?
2、通过equals来比较的话,我们如果要插入一万条数据,
那我们没插入一条数据都要跟已有的数据做equals比较吗?
3、hashcode存在的价值??
哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。用以快速定位寻址存储的对象。
4、hashcode与equals 怎么联合起来工作的?
整个处理流程是:
1、判断两个对象的hashcode是否相等,
若不等,则认为两个对象不等,完毕,
若相等,则比较equals。
2、若两个对象的equals不等,则可以认为两个对象不等,否则认为他们相等。
5、hascode与equals的关系
如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。
如果x.equals(y)返回“false”,
那么x和y的hashCode()有可能相等,也有可能不等。
set有三个常用的子类分别为 Hashset,LinkedHashSet,TreeSet
-
HashSet是使用哈希表(hash table)实现的,其中的元素是无序的。HashSet的add、remove、contains方法 的时间复杂度为常量O(1)。
-
TreeSet基于红黑树实现。TreeSet中的元素是可排序的,但add、remove和contains方法的时间复杂度为O(log(n))。TreeSet还提供了first()、last()、headSet()、tailSet()等方法来操作排序后的集合。
-
LinkedHashSet介于HashSet和TreeSet之间。它基于一个由链表实现的哈希表,保留了元素插入顺序。LinkedHashSet中基本方法的时间复杂度为O(1)。
5.Map
Map是以键值对的方式来存储数据。常见的子类有HashMap,HashTable,ConcurrentHashMap,LinkedHashMap。
- hashMap 采用key-value形式存储数据,key唯一不可重复,且可以为null。
- hashTable: 与HashMap类似,线程安全。
- ConcurentHashMap:与HashMap类似,采用了分段锁(Segment),多个线程可以同时访问不同分段锁上数据,并发处理能力更高。
- LinkedHashMap :内部通过双向链表实现,会保留Map的插入顺序
- TreeMap :可以排序的Map
- WeakHashMap :主要用来实现缓存,通过使用 WeakHashMap 来引用缓存对象,由 JVM 对这部分缓存进行回收
6、java泛型
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
网友评论