java - day011 - 集合, ArrayList HashMap,HashSet, Iterator 接口, for-each 循环格式
集合 ArrayList
丑数: 能被3,5,7整除多次,
ArrayList
list 接口
| - ArrayList
| - LinkedList
ArrayList 内部封装一个数组
用数组存放数据
默认初始容量是 10,
放满后会新建1.5倍的长度的新数组
之前数据复制放入新数组,之前数组释放
数组访问效率高,任意位置都是
但是增删数据效率可能低
创建对象
new ArrayList();
初始容量10
new ArrayList(1000);
初始容量 指定 1000
方法
与LinkedList 相同
没有两端操作数据的方法
iterator();方法
hasNext();
next();
remove();
迭代器遍历期间,不能使用 list 增删数据,
迭代期间删除必须使用 iterator.remove();
HashMap 哈希表 / 散列表
存放键值对数据
键不重复,数据无序
作用: 用键快速查找速度
方法:
put(key,value); 放入键值对数据,重复键覆盖原值
get(key);取键对应的值,键不存在 返回 null
size();键值对的数量
remove(key);移除键值对,返回被移除的值
keySet(); 把HashMap 里面所有键取出放入HashSet里面
-
哈希算法
-
用数组存放数据,初始长度16
- 存放数据的过程: 先获得键的哈希值, key.hashCode();
- 用哈希值和数组长度来计算一个下标值 index
- 将键和值进行封装成 Entry 对象
- Entry 对象,放入 index 位置
空位置,直接放入
有数据,依次用 equals() 比较键是否相等
找到相等的,覆盖值
没有相等,链表连在一起
负载率,加载因子到 0.75(既数据数量到数组容量的0.75)
新建容量翻倍的新数组
所有数据,重新哈希,放入新数组
jdk 1.8以后
链表长度到 8, 转成红黑树(二叉树结构,小的往左放,大的往右放)(比大小比键的哈希值)
红黑树长度减少到 6, 转成链表
- HasCode()
- 从object 继承的方法
- 默认实现是使用内存地址值作为哈希值
- 可以在子类中重写这个方法, 用对象的属性数据计算哈希值
- HashSet
- 用hashmap 放数据
- 数据不重复且无需
- 方法:
- add(数据)
- remove(数据)
- size()
- iterator() 迭代器
- Iterator 接口
- 使用集合的 iterator() 方法创建的迭代器对象,都是接口的子类型对象
- 迭代器使用期间,不能直接使用集合来增删数据
- 方法:
- hashNext()
- next()
- remove()
- Collections 工具类
- addAll(集合,值1,值2,值3,值4...); 集合多个添加数据
- sort(集合);排序 可以自己设置比较器
- binarySerarch(集合,目标值); 有序集合二分法查找,可以自己设置比较器
- swap(集合,a,b);交换a,b 位置
- for-erch 循环
- 是对数组遍历访问,集合迭代遍历访问的语法简化
- for-each简化语
-
1 for(String s :a){ 2 // 处理 s 3 }
- 集合的迭代遍历
for(Iterator<Intger>it=list.iterator;it.hasNext();){ Integer s = it.next(); }
-
- for-each简化语法
for(String s : list){ }
- foreach 语法, 对集合有要求
- 要求集合必须实现 Iterable 接口
- 必须是 Iterable 接口的子类,才能用foreach
- for-each简化语法