java回顾之集合List
java回顾之集合List
一、List接口
list的特点,元素有索引,元素可以重复,元素存取有序(存的时候和取得时候顺序是一样的)
常用方法 add、get、remove、set
1.2ArrayList
ArrayList是具体的类,这个类的底层用的数组数据结构,查询快,增删慢。

1.3LinkedList集合
LinkedList集合底层是用双向链表来实现的,增删快,查询慢。
常用方法:
addFirst 往开头添加元素
addLast 往末尾添加元素
getFirst 获取开头的元素
getLast 获取末尾的元素
removeFirst 删除开头的元素
removeLast 删除末尾的元素
pop() 模拟栈的结构,弹出一个元素
push() 模拟栈的结构,推入一个元素
原理图

二、Collections工具类
Collection是集合的工具类,工具类提供了静态方法。
shuffle(list) 随机打乱集合元素的顺序
sort(list) 集合的排序从小到大
sort(list,Comparator)按照指定的方式排序
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
排列自定义类型
public class Demo02比较器对自定义类型比较 {
public class Demo02比较器对自定义类型比较 {
public static void main(String[] args) {
//创建集合
ArrayList<Student> list = new ArrayList<>();
//添加元素
list.add(new Student("柳岩",36));
list.add(new Student("美美",26));
list.add(new Student("罗志美美",26));
list.add(new Student("郭美美",26));
list.add(new Student("老王",62));
//打印集合
System.out.println(list);//存取有序
//排序
//按照年龄从小到大排序,如果年龄相同,按照姓名长度从小到大排序
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
//年龄从小到大
if(o1.getAge() != o2.getAge()){
return o1.getAge() - o2.getAge();
}else{
//如果年龄相同
//按照姓名长度从小到大
return o1.getName().length() - o2.getName().length();
}
}
});
//打印集合
System.out.println(list);
}
}
三、可变参数
可以接受同种类型任意个数的参数。
public static void method(int... a){}//可变参数的本质其实是一个数组
-
-
一个方法只能有一个可变参数,并且可变参数必须放在最后。
-
可变参数的本质其实就是数组,在方法中可以把可变参数当做数组来使用
四、Set接口及子类
4.1HashSet
特点:元素不可重复、元素没有索引、元素存取无序,底层是哈希表

4.2hash值
在Object类中有一个方法hashCode(),这个方法的返回值是一个整数类型,在子类中会重写这个方法,我们把返回值成为hash值。在子类中重写的hashCode()方法可以粗略判断出两个对象是否相同。
如果哈希值不同,两个对象一定不同,如果哈希值相同,两个对象不一定相同
p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))
判断两个对象的hash值是否相同,
如果对象的hash值不同,说明两个对象一定不同就【可以保存】
如果对象的hash值相同,那么就调用equals方法判断
如果equals返回的结果是false,代表两个对象不同,【可以存储】
如果equals返回的结果是true,代表两个对象相同,【不可以存储】

存储自定义类型的时候要重写hoshcode()和equal()两个方法,比如定义一个Student类,后面创建一个HashSet
HashSet<Student> set = new HashSet<>();这个时候hashCode和equal方法需要重写
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
4.2LinkedHashSet集合
元素不可重复、元素没有索引、元素存取有序
因为HashSet是存取无序集合,他儿子想要让存取变的有序,所以LinkedHashSet就是在HashSet的基础上加了一个链表,加的这个链表的作用记录元素的存储顺序。
4.3、TreeSet集合
TreeSet集合的底层是红黑树,元素不可重复,元素没有索引,元素会默认被排序
比如Integer类,String类他们自带排序方式,因为这些类底层实现Comparable接口。不需要我们指定排序方式这就是自然排序。
//创建集合
TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() {
/*
compare的意思是比较,可以用这个方法来规定比较的规则:
参数:
o1代表要比较的数字, o2代表已经比较完的数字
返回值:
如果返回值是正数,代表o1 > o2,就会把o1移动到后面
如果返回值是负数,代表o1 < o2,就会把o1移动到前面
如果返回值是零,代表o1 == o2,就不会移动
*/
@Override
public int compare(Student o1, Student o2) {
//按照年龄排序,年龄小的在前,年龄大的在后
return o1.getAge() - o2.getAge();
}
});
总结:


浙公网安备 33010602011771号