集合
1.单列集合
Collection
1.1 单列集合的两大派系
List:有序,可重复的
ArrayList 数组--> 查询快(有索引),底层连续,增删慢,数组长度不可变
LinkedList 双向链表 --> 查询慢,增删快
Set:无索引,不可重复
LinkedHashSet :有序,不可重复的集合
HashSet:底层哈希表 1.7 数组+ 链表 1.8 数组+链表+红黑树
HashSet:中无法存储重复元素的原因:(重点,菜J杀手)
1.调用HashCode 方法 --> 如果hashCode 元素的索引位置上有元素
有元素 :调eqauls
1.相等:不存
2.不相等:挂
没元素:放
TreeSet:
底层可以排序的不可重复的set 集合
自然排序和比较器排序 --> 左中右原则
1.2 为什么需要有迭代器这个东西 :编程思想:屏蔽底层不同
但是在迭代过程中,如果利用集合去修改集合长度,此时会发生并发修改异常
简单版:解决方案(listIterator)
复杂版: 底层有期望值和修改值 当调用了迭代方法后,那么就会进行期望值=修改值,
而在此过程中,如果使用集合修改了长度,修改值发生变化,所以发生了并发修改异常
2.双列集合
Map 底层是哈希表
无序的--> 存進去的顺序和取出来的顺序不一致
Map的key 是不能重复,Map 的value 无所谓
map中常见的方法
遍历
Map<String,String> hm = new HashMap();
Set<String> keySet = hm.keySet();
for(String key : keySet){
int value = hm.get(key)
}
遍历的第二种方式
Set<Map.Entry<String,String>> entrySet = hm.entrySet();
for( Map.Entry<String,String> entry : entrySet){
entry.getKey();
entry.getValue();
}
1.arrayList 中有HashMap
2.HashMap有 arrayList
2.1 可变参
1.底层是一个数组 show(int...b,int...a)
show(3,4,5) //编译器会替我们将多个元素装换成 数组 new int[]{3,4,5}
2.可变参 只能有一个
3.如果有多个参数:其他参数放在前边
泛型的好处
1.将运行期错误提前到编译器
2.提高了程序的安全性,和健壮性
务必掌握:
1.集合体系
2.需要掌握map的两种遍历方式
3.斗地主案例
面试:
1.Collection 和 Collections的区别
2.说一说集合体系
3.HashMap 和HashSet 区别
4.HashMap 和HashTable 和 ConcurrentHashMap
1.HashMap 是jdk1.2 出现的,HashTable 是jdk1.0出现的
2.HashMap 是线程不安全 , HashTable 是线程安全的
3.HashMap 能够处理null值和null键,而HashTable 不能处理
Hash冲突算法
( n-1 ) & hash 值
hash :为了让32 位数尽可能都参与运算 -> 高低16 异或
n-1 是为了让二进制最后一位是 1
HashTable 冲突算法
hash % 16 0 -15
|
|