2.Collection集合2.1数组和集合的区别(理解)
相同点
都是容器,可以存储多个数据
不同点
数组的长度是不可变的,集合的长度是可变的
数组可以存基本数据类型和引用数据类型
集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类
2.2集合类体系结构(理解)
红黑树添加节点后如何保持红黑规则
根节点位置
直接变为黑色
非根节点位置
父节点为黑色
不需要任何操作,默认红色即可
父节点为红色
叔叔节点为红色
将”父节点”设为黑色,将”叔叔节点”设为黑色
将”祖父节点”设为红色
如果”祖父节点”为根节点,则将根节点再次变成黑色
叔叔节点为黑色
将”父节点”设为黑色
将”祖父节点”设为红色
以”祖父节点”为支点进行旋转
10.HashSet集合1.1HashSet集合概述和特点(应用)
底层数据结构是哈希表
存取无序
不可以存储重复元素
没有索引,不能使用普通for循环遍历
1.2HashSet集合的基本应用(应用)
public class HashSetDemo {
public static void main(String[] args) {
//创建集合对象
HashSet<String> set = new HashSet<String>();
//添加元素
set.add("hello");
set.add("world");
set.add("java");
set.add("java");
set.add("java");
set.add("java");
//迭代器遍历
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String next = it.next();
System.out.println(next);
}
System.out.println("=================");
//增强for遍历
for (String s : set) {
System.out.println(s);
}
}
}
1.3哈希值(理解)
哈希值简介
根据对象的地址值或者属性值计算出来的一个int类型的整数
如何获取哈希值
Object类中的public int hashCode():返回对象的哈希码值
哈希值的特点
如果没有重写hashcode方法,那么就根据对象的地址值进行计算哈希值
针对同一个对象,返回的哈希值相同,针对不同的对象,返回的哈希值不同
如果重写了hashcode方法,一般都是根据对象的属性值来进行重写。
如果不同对象的属性值相同,那么它们的哈希值也是一样的。
示例代码
public class HashSetDemo2 {
public static void main(String[] args) {
Student s1 = new Student("张三",23);
Student s2 = new Student("张三",23);
Student s3 = new Student("李四",24);
//如果Student类没有重写hashcode方法,则根据地址值计算哈希值
//如果重写了则一般根据属性值进行计算哈希值
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
}
}
public class Student {
private String name;
private int age;
public Student() {
}
public Student(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 boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if (age != student.age) return false;
return name != null ? name.equals(student.name) : student.name == null;
}
// 可以对Object类的hashCode()方法进行重写
// 根据对象的属性值计算哈希值
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}