2022-08-06 day24 第一小组 王鸣赫
Collection接口
List:有顺序,元素可以重复
Set:没有顺序,元素不可以重复
Set内部有一个专门排序的算法
所谓的无序不等于随机
所谓的无序指的是没有按照添加的先后顺序,其实内部是做了内部排序的
顺序指的是添加的先后顺序
List
List:数据时有顺序的,数据可以重复
ArrayList集合:内部结构是数组。比较适合做高频率的查找、遍历
LinkedList集合:双向链表。比较适合做高频率的新增和删除
点击查看代码
//List<String> list = new LinkedList<>();
LinkedList<String> list = new LinkedList<>();
//添加数据
list.add("a");
list.add("b");
list.add("c");
list.add("d");
//创建对象时用的是多态
//父类对象---->子类引用
//创建出来的对象只能调用父类和子类都有的方法
//在集合头部添加
list.addFirest("z");
//在集合尾部添加
list.addLast("x");
//删除集合第一个元素
list.removeFirst();
//删除集合最后一个元素
list.removeLast();
//根据下标索引获取指定位置的元素
list.get(int index)
List集合的遍历
点击查看代码
List<String> list = new ArrayList<>();
1.for循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
2.foreach循环
for (String s: list) {
System.out.println(s);
}
3.迭代器
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String s = iterator.next();
System.out.println(s);
}
Set
Set集合如何确保数据的不重复
->保证数据类型的类要重写hashCode和equals方法
实例如下:
点击查看代码
Set<Person> set = new HashSet<>();
set.add(new Person("张三",1001));
set.add(new Person("张三",1001));
set.add(new Person("张三",1001));
set.add(new Person("张三",1001));
System.out.println(set);
LinkedHashSet
由于LinkedHashSet的底层是哈希表和链表,所以它与其它的Set集合的区别就是,LinkedHashSet是有序的。使得其在添加数据的同时维护数据的添加顺序,效率比HashSet略低
哈希表:保证集合的唯一性特点
链表:保证有序
Set集合的遍历
点击查看代码
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(4);
set.add(15);
set.add(38);
//增加for循环
for (Integer integer: set) {
System.out.println(integer);
}
//迭代器
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()){
Integer s = iterator.next();
System.out.println(s);
}
比较接口
Comparable接口:自然排序,排序规则是固定的
Comparator接口:临时排序
Comparable的compareTo(T)方法只有1个参数,.
Comparator接口的compare(T o1, T o2)方法有两个参数
Map接口
存储对值K-V key-value
key不能重复,value是可以重复的
没有顺序(添加的先后顺序)
HashMap内部存储结构:
jdk1.7之前:链表 + 二叉树
jdk1.7及其之后:链表 + 数组 + 红黑树
点击查看代码
Map<String, String> map = new HashMap<>();
map.put("1001","张岳");
map.put("1002","赵红兵");
map.put("1003","小北京");
map.put("1004","李四");
map.put("1005","张浩然");
//获取values()值 姓名
System.out.println(map.values());
//获取keySet() ID
System.out.println(map.keySet());
Hashtable和HashMap的区别
Hashtable是线程同步的,线程安全 HashMap是线程异步的,线程不安全
HashMap的key是可以为null的,Hashtable是不可以为null
Properties:属性
Properties是Hashtable的子类,更多地是用来操作属性文件
迭代中删除元素
点击查看代码
public class Ch13 {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("tom");
names.add("lucy");
names.add("lucy");
names.add("lucy");
names.add("jerry");
for (int i = 0; i < names.size(); i++) {
if(Objects.equals(names.get(i),"lucy")){
names.remove(i);
// 1.回调指针
i--;
}
if("lucy".equals(names.get(i))){
}
}
// 2.逆序遍历
for (int i = names.size() - 1; i >= 0; i--) {
if(Objects.equals(names.get(i),"lucy")){
names.remove(i);
}
}
// 3.使用迭代器(推荐)万无一失
Iterator<String> iterator = names.iterator();
while(iterator.hasNext()) {
String s = iterator.next();
if(Objects.equals(s,"lucy")){
iterator.remove();
}
}
// 4.增强for循环
for (String s : names) {
if(Objects.equals(s,"lucy")){
names.remove(names.indexOf(s));
}
}
System.out.println(names);
}
}
其他的集合
LinkedHashMap,在HashMap的基础上维护了一个双向链表。
TreeMap:天然支持排序
Collections:Collections是一个工具类
线程安全问题:
迭代器是依赖于集合而存在,在判断成功以后,集合中新增了元素,
迭代器不知道,所以就报错。
解决:
1.迭代器遍历元素,迭代器删除元素
2.普通for循环遍历,集合删除
点击查看代码
public class Ch15 {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("tom");
names.add("lucy");
names.add("lucy");
names.add("lucy");
names.add("jerry");
for (String s : names) {
if (Objects.equals(s, "lucy")) {
names.add(s);
}
}
}
}

浙公网安备 33010602011771号