HashSet-->是由HashMap维护的
无序的,不可重复的
底层结构:哈希表(数组+链表+红黑树)
特点:查询,增删效率较高
无序,去重
应用场景:存储数据由单个值决定的情况下,想要去重的情况下,适合使用HashSet
新增内容:无新增方法
哈希表中hashcode与equals之间(前提是重写hashcode与equals都是根据
成员变量计算)
equals相等hashcode一定相等
hashcode相等,equals不一定相等
哈希表存储自定义引用数据类型数据的去重:
需要在数据的类型中重写hashcode与equals方法,实现根据内容
(成员变量的值)进行比较和计算
HashSet<Person> set = new HashSet<>();
set.add(new Person("小红",18));
set.add(new Person("小明",19));
set.add(new Person("小红",18));
set.add(new Person("小小彬",17));
System.out.println(set);
System.out.println(new Person("小红",18).hashCode());
System.out.println(new Person("小红",18).hashCode());
}
}
class Person{
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
TreeSet-->是由TreeMap维护的
无序,去重
底层结构:红黑树(平衡双叉树)
特点:默认升序排序
新增方法:数据的大小比较相关的方法,因为红黑树结构中数据已经比较过大小,默认升序
使用TreeS存储自定义的引用数据类型,如何是否去重实现默认升序排序
TestSet<Double> tree=new TreeSet<();
tree.add(1.3);
tree.add(1.1);
tree.add(2.2);
tree.add(4.4);
tree.add(5.5);
tree.add(5.5);
System.out.println(tree);
//测试新增的方法
//第一个,一般也是最小的一个
System.out.println(tree.first());
//最后一个,一般是最大的,从大到小排序
System.out.println(tree.last());
System.out.println(tree.ceiling(2.1));
System.out.println(tree.floor(3.3));
TreeSet<String> tree2=new TerrSet<>();
tree2.add("abc");
tree2.add("bc");
tree2.add("a");
tree2.add("bc");
tree2.add("ab");
System.out.println(tree2);
Map<K,V>存储简直数据
元素的集合,键值对的集合
K-V键值对
key-->唯一的,无序的-->Set集合
value-->无序的,可重复的-->Collection
键值对为一个映射关系
key-->映射-->value
一个key只能对应一个value
一个key可以实现对应一个集合作为value,集合中可以存放多个数值
Map<Integer,String> map=new HashMap<>();
System.out.println(map.put(103,"杜甫"));
System.out.println(map.put(101,"杜甫"));
System.out.println(map.put(102,"李白"));
System.out.println(map);
System.out.println(map.put(104,"小白"));
System.out.println(map);
System.out.println(map.containsKey(103));
System.out.println(map.containsKey("胡歌"));
System.out.println(map.get(103));
//不可修改
Map<String,Integer> map2=Map.of("zhangsan",18,"list",19);
System.out.println(map2);
//移除
System.out.println(map.remove(103));
System.out.println(map);
//替换
map.replace(101,"小黑")
System.out.println(map);
HashMap:
底层:哈希表(数组+链表+红黑树)
特点:查询,增删效率较高
新增方法:无新增方法
遍历方式:与map相同
并且允许null值和null键
DEFAULT_LOAD_FACTOR : 默认的加载因子 0.75
DEFAULT_INITIAL_CAPACITY : 默认初始容量 1<<4 = 16
threshold 扩容临界值 | 阀值 CAPACITY*LOAD_FACTOR
扩容: newCap = oldCap << 1 每次扩容原数组容量的2倍
HashMap<String,Integer> map=new HashMap<>();
//折腾得你的名字加上年龄
map.put("小白",17);
map.put("小黑",15);
map.put("小黄",16);
map.put("小绿",18);
//遍历map
System.out.println(map);
TreeMap:
根据key实现去重
底层结构:红黑树
特点:根据key对数据做升序
新增功能:比较相关的一些方法
根据key做去重,根据key做排序
要求:key指定比较规则|方式|比较器|排序
内部比较器
外部比较器
//根据key默认比较规则,对数据进行升序排序
//TreeMap<Teacher,String> tree = new TreeMap<>();
//根据实参传递的外部比较规则,对key数据进行升序排序
//这个Student是类名,在别的地方调用了
TreeMap<Student,String> tree=new TreeMap<>((t1,t2)->t1.getSubject().compareTo(t2.getSubject()));
tree.put(new Student(113,"小白",18),"java");
tree.put(new Student(117,"小鱼",18),"java");
tree.put(new Student(495,"小龙",18),"java");
tree.put(new Student(385,"小黑",18),"java");
System.out.println(tree);
System.out.println(tree.firstKey());
System.out.println(tree.firstEntry()+"--"+tree.firstEntry().getKey());