一,Set
无序:存储顺序不一致
不可重复:元素可以去除重复
无索引:没有带索引的方法,不能使用for循环遍历
- HashSet:无序,不重复,无索引
- LinkedHashSet:有序,不重复,无索引
- TreeSet:排序,不重复,无索引
同样也可以使用多态的写法
Set<String> sets = new HashSet<>();//如果想更改 直接更改后面的LinkedHashSet
其他基本功能与Collection API 一致
HashSet集合的底层原理
底层是采取哈希表存储的数据
(哈希表是一种对于增删改查数据性能都比较好的结构)
jdk8之前 ,底层使用数组+链表组成
jdk8之后,底层使用数组+链表+红黑树组成
- 哈希值
是jdk根据对象的地址,按照规则算出来的int类型的数值
public int hashCode();返回对象的哈希值
底层逻辑
jdk1.8 之后,当链表过长时会影响查询速度,所以当链表长度超过8时会自动转换为红黑树
public static void main(String[] args) {
Set<Student> sets = new HashSet<>();
Student s1 = new Student("张三");
Student s2 = new Student("张三");
Student s3 = new Student("张三");
sets.add(s1);
sets.add(s2);
sets.add(s3);
System.out.println(sets);
}
![](https://img.haomeiwen.com/i24559446/a269f1e1f9144156.png)
那么为什么存储对象的时候没有去重复呢,
因为Set集合判断是否重复,首先要基于同一个对象判断哈希值是否一样,然后在判断equals方法
解决方法重写hashCode和equals方法
因为子类重写优先调用子类重写方法
LinkedHashSet
有序,不重复,无索引
底层原理:
依然还是哈希表,只是每个元素多了双链表机制记录存储顺序
TreeSet
不重复,无索引,可排序(默认升序)
底层原理:
基于红黑树数据结构来实现的,增删改查性能都比较好
对于自定义的Student等对象而言 ,无法直接排序
解决方法
- 1让自定义的类,实现(implements)comparable<Student>泛型接口重写里面的compareTo方法来制定比较规则
- 2TreeSet集合的有参构造器可以设置comparator接口对应比较器对象,来制定比较规则
Set<Apple> apples = new TreeSet<>(new comparator<Apple>());
规则方式
第一个>第二个 返回正整数
如果希望元素可重复,有索引,查询快用ArrayList
如果希望元素可以重复又有索引,增删首尾快LinkedList
如果希望增删改查都快,不重复,无索引,无序HashSet
如果希望增删改查都快,元素不重复,有序,无索引LinkedHashSet
如果希望对象排序TreeSet
二,集合的工具类
可变参数
用在形参中可以接收多个数据
格式:数据类型...
变量
public static void sum(int...num){}
需求.如我们定义一个求和方法,可以完成
求一个参数的和,计算两个参数的和,又可以计算三个参数的和,又可以没有参数计算,如何实现
public static void sum(int...num){
//其实传进来的参数其实就是放在一个数组
遍历数组元素解决就好
}
注意
- 一个形参列表可变参数只能有一个
- 可变参数必须放在形参列表最后面
Collection工具类
帮助我们来操控集合的
- 1.为任意集合批量加数据
List<String> names = new ArrayList<>();
Collections.addAll(names,"张三","李四","王五");
- 2 打乱List集合顺序
Collectins.shuffle(names);
shift+f6 同步改名字
- 3 对于List集合进行默认规则排序
Collectins.sort(list);
三,Map集合
就是键值对
如购物车中商品对应的价格
![](https://img.haomeiwen.com/i24559446/6f137ac9f43982df.png)
map集合的键是无序,不重复的
HashMap:无序,不重复,无索引,值无要求
Map<String,Integer> maps = new HashMap<>();
maps.put("上衣",100);//添加数据
LinkedHashMap:有序,不重复,无索引
TreeMap:排序,不重复,无索引
Map集合相关API
maps.put(键,值);添加元素
maps.clear(); 清空集合
maps.isEmpty();判断是否为空
maps.get(键);根据键获取每个元素
maps.remove(键);根据键删除元素,返回对应的值
maps.containValue(值);判断是否包含某个值
Set<String> keys = maps.keySet();获取全部键的集合
Collection<Integer> values = maps.values();获取全部值的集合
maps.size();集合的长度
map1.putAll(map2);(map2元素拷贝到map1中)合并其他map集合
3.1map集合遍历 键找值
流程:先获取全部键set集合,遍历set集合用get方法取值
// 1拿到所有的键
Set<String> sets = maps.keySet();
// 2遍历每个键提取值
for(String key:keys){
int value = maps.(key);
system.out.println(key,value);
}
3.2键值对
把键值对当成一个整体来遍历.
流程:先把map集合转换成Set集合,set集合每个元素都是键值对实体类型了 ,然后遍历set集合,提取键和值
为什么要转成set集合,因为map集合中 衣服=100,这个元素没法确定什么类型,没法forEach遍历
// 1把map集合转换为set集合 ctrl+alt+A 自动补全
Set<Map.Entry<String,Integer>> entries = maps.entrySet();
// 2开始遍历
for(Map.Entry<Map.Entry<String,Integer >entry:entries){
String s = entry.getKey();
int calue = entry.getValue()
}
#### 3lambda表达式遍历
maps.forEach(key,value)->{
system.out.println(key,value);
}
### 不可变集合
是不允许被修改,添加,删除的集合,如集合中有高考成绩等等
List<Double > list = List.of(422,523);
List Set Map,都存在of方法可以创建不可变集合
网友评论