集合
集合体系结构(单列和双列)
单列结构(一次添加一个元素)
List系列集合:添加的元素是有序(存和取的顺序是一样的),可重复(集合种存取的元素是可重复的),有索引(可通过索引去获取集合中的每一个元素)
Set系列集合:添加的元素是无序(存和取的顺序不一定相同,比如存的时候,123,取的时候,132),不重复(不能存储重复的元素),无索引。
Collection
Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。
Collection是一个接口,我们不能直接创建他的对象。只能创建他实现类的对象,实现类:ArrayList
Collection的遍历方式
迭代器遍历,增强for遍历,Lambda表达式遍历
迭代器遍历
迭代器不依赖索引
增强for遍历
数据结构(计算机底层存储,组织数据的方式)
数据结构(链表)
每个节点都是一个元素
数组是一片连续的空间,查询某一个数时不需要从头开始,查询速度相对快。
ArrayList
LinkedList
Set
Set接口中的方法基本上与Collection的API一致
Set集合是不包含重复元素的集合
Set是一个接口,不能直接实例化。需要它的实现类HashSet<类型>,对集合的迭代顺序没有任何保证。
用boolean可判断元素是否添加成功
HashSet
哈希值:对象的整数表现形式
根据公式计算出在数组中应存储的位置
哈希碰撞有可能发生,但是概率不高
HashSet底层原理
LinkedHashSet
TreeSet
双列集合(每次添加两个元素或者说一对元素)
键和值一一对应
Map中常见的API
Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的
put方法可添加和覆盖
Map是一个接口,不能直接创建对象,需要借助它的实现类来创建对象
Map里面可以存两个元素,一个键,一个值,所以我们在使用时要定义两个泛型(Map<键:String,值:String>)
Map的遍历方式(键找值,键值对,Lambda表达式)
键找值
键值对
依次获取键值对对象,再通过getKey()方法获得每一个键,通过getValue()方法获取每一个对象
Lambda表达式
HashMap
LinkedHashMap
可以保证存和取的顺序一致
TreeMap
默认情况下,输出仍按1,2,3,4,5的顺序,若要按照升序来排,直接打印
hashCode()和equals()方法的重写
重写hashCode()和equals()方法是为了在使用Java集合框架时能够正确地比较对象。
示例:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.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);
}
}
在上面的示例中,重写了equals()方法和hashCode()方法。equals()方法比较两个对象是否相等,而hashCode()方法返回对象的哈希码。
当重写equals()方法时,必须同时重写hashCode()方法,以确保在使用Java集合框架时能够正确地比较对象。如果不重写hashCode()方法,则可能会导致对象在集合中无法正确地比较。
Object类
object类是Java中所有类的父类
常用方法有:
- equals(Object obj)方法:用于比较两个对象是否相等,返回一个布尔值。
- hashCode()方法:返回对象的哈希码值。
- toString()方法:返回对象的字符串表示形式。
- getClass()方法:返回对象的类。
- clone()方法:创建并返回此对象的一个副本。
- finalize()方法:在垃圾回收器回收对象之前调用。
- wait()方法:导致当前线程等待,直到另一个线程调用该对象的notify()或notifyAll()方法。
- notify()方法:唤醒在此对象监视器上等待的单个线程。
- notifyAll()方法:唤醒在此对象监视器上等待的所有线程。
使用Object类的equals()和toString()方法:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
} if (!(obj instanceof Person)) {
return false;
}
Person other = (Person) obj;
return this.name.equals(other.name) && this.age == other.age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}