1、TreeSet(Set)
- 实现了Set接口,无序、无下标、元素不可重复。
- 元素不能为NULL
- 底层原理(红黑树)
- 线程不安全
- 定义一个Student实现了Comparable接口,重写了compareTo()方法(如果没有实现方法,则需要自定义比较器)
class Student implements Comparable<Student>{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
//重写了compareTo()方法
@Override
public int compareTo(Student o) {
return name.hashCode()-o.getName().hashCode();
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
- 自定义比较器(如果Student没有实现Comparable接口,需要比较器来进行比较,比较器在TreeSet创建时传入)
//Student的比较器
class StudentCompare implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
return o1.getName().hashCode()-o2.getName().hashCode();
}
}
//Set<Studemt> set = new TreeSet<>(new StudentCompare()); //在TreeSet创建时传入比较器
- 定义一个只能储存Student类的TreeSet集合
private static void test1(){
//无序(排序)、无下标,元素不能重复,不能为null
Set<Student> set = new TreeSet<>();
Student st1 = new Student("张三",21);
Student st2 = new Student("李四",25);
Student st3 = new Student("老王",37);
Student st4 = new Student("Tony",28);
//增
set.add(st1);
set.add(st2);
set.add(st3);
set.add(st4);
//删
set.remove(st3);
//改(Set只能先删除元素,然后添加元素)
set.remove(st1);
set.add(new Student("张三",33));
//查
boolean bl = set.contains(new Student("Tony",28));
System.out.println("是否存在这个元素:"+bl);
//遍历Set
for(Student p:set){
System.out.println(p);
}
}
2、HashMap(Map)
- 实现了Map接口,无序、无下标
- Key允许为NULL
- Key不能重复
- 底层原理:动态数组+链表(红黑树)
- 线程不安全
- HashMap的增删改查
private static void test2(){
//key无序、可以为null、无下标,动态数组+链表(红黑树)
Map<Integer,String> map = new HashMap<>();
//增
map.put(null,"Hello");
map.put(17,"Jack");
map.put(20,"Tom");
map.put(13,"Bill");
map.put(35,"Ailly");
//删
map.remove(17);
//改
map.put(13,"Steve");
//查
System.out.println("Key:"+35+",Value:"+map.get(35));
}
-
HashMap的三种遍历方式
- 第一种:通过获取KeySet来遍历Value
private static void printMap1(Map<Integer,String> map){ Set<Integer> set = map.keySet(); //获取key的set集合 for(Integer i:set){ System.out.println("Key:"+i+",Value:"+map.get(i)); } }
- 第二种:直接遍历所有的Value
private static void printMap2(Map<Integer,String> map){ Collection<String> ct = map.values(); for(String str : ct) { System.out.println("Values:"+str); } }
- 第三种,通过entrySet()方法访问所有的Key和Value
private static void printMap3(Map<Integer,String> map){ Set<Map.Entry<Integer, String>> st = map.entrySet(); for(Map.Entry<Integer,String> tmp:st) { System.out.println("Key:"+tmp.getKey()+",Value:"+tmp.getValue()); } }