集合框架
List
- List 和 Set的区别
- 相同点:都是Collection接口的子接口
- List接口 是有序 可重复 也有索引
- Set接口 是无序 不可重复 没有索引
- ArrayList LinkedList Version的关系
类名 | 区别 |
---|---|
ArrayList | 一个可扩容、可重复的有序数组,可以存入所有元素包括null。 检索的效率高,插和删效率低 默认长度是10 不支持线程同步 |
LinkedList | 双向链表数据类型 相比增删效率高,查的效率低 可以模拟堆栈(先进后出)、队列(先进先出) 方法不同步 |
Vector | 和ArrayList一样 主要的区别就是 线程同步,以及特殊的扩容方法 |
- ArrayList 是基于数组模型的,可变数组集合,里面的值是连续的 所以特别查询效率高,但是插入或者删除的时候都会需要,先复制后面的值,再去移动,所以效率比较低
- LinkedList :是双向链表型,所以数据并不是挨着的,所以查找只能依靠内部算法进行查找,但是增和删的效率比较高
5. vector:它和ArrayList类似,但是线程安全,但是效率较低。
Set
- HashSet 和 TreeSet
- HashSet : 无序不重复的集合,可以添加(add)删除(remove),但是不能指定获取也不能用for,因为没有无序无下标,可以使用foreach,Iterator获取。
- TreeSet:自然顺序排序(数字顺序字母顺序Unicode码顺序)的不重复集合,也不同步
-
HashSet怎么保证元素不重复
1.HashCode码如果不同就直接插入集合
2.HashCode如果相同再去判断equals -
.HashSet 怎么深层次判断对象的内容
//重写hashCode方法
@Override
public int hashCode(){
//Object.hash 底层执行的是Array.hashCode 会获取到每个元素的hashCode然后进行运算 返回一个新的值
return Object.hash(属性1,属性2,...,属性N);
}
public boolean equals(Object o){
//==判断内存地址相同不
if(this == o)return true;
if(o == null || o.Class() != this.Class() )return false;
类型 n = (类型)o;
return String属性.equals(n.String属性) &&
int属性 == n.int属性 && ...
}
泛型:
-
概念:泛型是JDK1.5之后出现的 ,本质上是参数化类型(ParameterizedType),可以用在方法、类型、接口中,分为泛方法、泛类型、泛接口。泛型的应用之一就是:为了限制集合里数据的类型,保证数据统一。
-
创建泛型变量
-
获取这个类里面的属性并比较是不是属于ParameterizedType
-
结果
-
泛型擦除: 泛型只在编译期起作用,当编译结束后就清除泛型,不会参与运行
-
自定义泛型:
- T Type 任意类型
- E Element 元素
- K,V Key,value 分别是键和值
- ? 不确定类型
- <? extends T> 子类和本身
- <? super T>父类和本身
Map
- 概念:映射键值关系的对象,键不能重复,值可以重复。
HashMap
- HashMap是通过哈希算法来确定存储的位置,所以它是无序的,但是再好的哈希算法也免不了计算出相同值得状态,这种情况就叫哈希冲突也叫哈希碰撞,所以HashMap最终的数据存储是使用哈希+链表的格式 。
- 当然是以哈希表为主,而链表只是为了解决哈希碰撞的。
- 增删改查的时候,会找哈希表,如果找到的地方没有链表就直接返回,如果有再去看链表。
- hashMap不支持线程安全,所以需要特殊处理才能在线程使用:
- 使用HashTable类
- 使用Collections.synchroizedCollection包装一下
更深度的分析就去看这位大佬的文章Java集合之一—HashMap
TreeMap:
- 红黑树的数据结构,自然顺序排序,也可以使用Comparable来自定义规则。
- 至于红黑树就是这个样子
- 多用于需要排序的场景下
- 可以使用 Comparatpr进行排序
new TreeMap<>(new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
return 0;
}
});
- 排序源码: 重写的Comparator类通过构造方法传入,走到getEntry,如果传入了Comparator了之后就还行getEntryUsingComparator这个方法。
HashTable
- hashTable也是用键值对来存放元素的,其中hashTable不能存储key=null的键值对,hashTable中的方法都实现了synchronize,是线程安全的。