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(); } });
总结: