一、java集合分为两个大类一个是实现Collection,一个是实现Map接口
如图:
叶子节点都是实现类,其他都是接口,继承了父接口,也可以理解为扩展了子接口
二、set接口及其实现类详解
- set接口的性质:类似数学中的集合无序,不可重复(无序是指你插入的顺序与你读出来的顺序不同)
- set接口的实现类有两个 一个是HashSet 另一个是TreeSet
- HashSet map接口中的HashMap 是以键值即K-V形式存储的 HashMap允许key值有一个是null存储在数组的entry[0]位置,允许多个value值为null,HashSet就是HashMap的value值为null 即key就是你存储的元素,value默认是null,所以HashMap的的数据结构与HashSet一样 HashMap会在下面详细说
- TreeSet是SortMap接口的实现类,他对插入的对象进行排序 假如是自定义的类,需要实现Comparable<>接口
package com.jd.test;
import java.util.Comparator;
//演示浅克隆
public class Book implements Cloneable,Comparable<Book>{
private int price;
private int size;
private int a;
public Book(){};
public Book(int a){
this.a = a;
};
public Book clone(){
Book bk = null;
try {
bk = (Book)super.clone();
}catch (CloneNotSupportedException e){
}
return bk;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getA() {
return a;
}
@Override
public String toString(){
return "Book.price = "+this.getPrice()+
" Book.size = "+this.getSize();
}
//这个方法是Comparable接口的方法 我们实现这个方法,TreeSet才能基于他比较大小
@Override
public int compareTo(Book o) {
return this.getA()-o.getA();
}
//调用方法
public class void Main(String[] args){
Book bk1 = new Book(1);
Book bk2 = new Book(2);
Book bk3 = new Book(3);
Set book = new TreeSet();
book.add(bk1);
book.add(bk2);
book.add(bk3);
Iterator it = book.iterator();
while(it.hasNext()){
Book bk = it.next();
System.out.println(bk.getA())
}
}
结果:
1
2
3
//无论按什么顺序插入 输出都是基于a的大小来比较升序输出
三、list接口及其实现类详解
list相当于数学中的数列,有序(插入顺序与读出顺序一致)可以重复 元素顺序是从0开始的
3.1 ArrayList
顾名思义 底层实现是数组,所以就有了数组的特性增删慢,查询快 每次扩容是原来的0.5倍 初始容量是10
3.2 Vector
也是数组实现的,他是线程安全的类 ArrayList不是线程安全的,每次扩容是原来的1倍
3.3 LinkedList
底层实现是链表,适合插入删除操作 性能比较高
四 Map接口
map 接口的存储方式是以键值对的形式添加即K-V结构
4.1HashMap
- 哈希map的数据结构是数组加链表,主干是数组,初始大小是16 阈值为容量的0.75(也叫扩充因子)即每次扩充为原来大小的1.75倍
- HashMap的key可以为null但是仅仅可以有一个 value可以有多个值为null 存储在数组的下标为0的位置
- HashMap是线程不安全的 HashMap的hash冲突的解决方案是使用链地址法 也就是数组加链表中的链表部分;1.8 链表长度超过8会转换为红黑树
4.2 LinkedHashMap
LinkedHashMap的数据结构与HashMap没有区别只是内部维护了一个双向链表 可以保持顺序(插入和读出顺序一致)
4.3 Hashtable(table首字母不大写)
Hashtable 是线程安全的 但是效率极低 内部用到了Synchnized锁 线程安全建议用concurrentHashMap 用分段锁机制加了即实现了安全又有效率
4.4 TreeMap
同TreeSet 插入的元素是有序的 (不是插入与读出的顺序而是大小排序)
自定义的类需要实现Comparable接口
底层实现是红黑树
五 结合面试题巩固知识点
- Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题
六 随笔
hashmap的put操作 如果key已经存在了,那么新的value会覆盖旧的value
用谷歌的gson.from(String,Hashmap.class) 如何json中的key重复会报错