【Java_13】List、Set、Collections

2021-02-04 10:06:14 浏览数 (1)

一、List
1. 特点
代码语言:javascript复制
① 有序(存取一致)
② 有索引
③ 可重复
2. 常用方法
代码语言:javascript复制
① add(int index, E element)
    将指定的元素,添加到该集合中的指定位置上。
② get(int index)
    返回集合中指定位置的元素。
③ remove(int index)
    移除列表中指定位置的元素, 返回的是被移除的元素。
④ set(int index, E element)
    用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
⑤ 示例    
    import java.util.ArrayList;
    import java.util.List;

    public class DemoArrayList {
        public static void main(String[] args) {
            //多态,创建集合
            List<String> list = new ArrayList<>();
 
            //添加数据
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("b");
 
            //使用普通for遍历数组
            for (int i = 0; i < list.size(); i  ) {
                System.out.print(list.get(i)   't');
            }
        }
    }
3. ArrayList
代码语言:javascript复制
① java.util.ArrayList集合数据存储的结构是数组结构。
② 元素增删慢,查找快
③ 无特殊功能
4. LinkedList
代码语言:javascript复制
① java.util.LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。
② 常用方法    
    * addFirst(E e)
        将指定元素插入此列表的开头。
    * addLast(E e)
        将指定元素添加到此列表的结尾。
    * getFirst()
        返回此列表的第一个元素。
    * getLast()
        返回此列表的最后一个元素。
    * removeFirst()
        移除并返回此列表的第一个元素。
    * removeLast()
        移除并返回此列表的最后一个元素。
    * pop()
        从此列表所表示的堆栈处弹出一个元素;与removeFist()一样。
    * push(E e)
        将元素推入此列表所表示的堆栈;与addFist(E e)一样。
    * isEmpty()
        如果列表不包含元素,则返回true
③ 示例
    import java.util.LinkedList;

    public class DemoLinkedList {
        public static void main(String[] args) {
            //创建集合
            LinkedList<String> list = new LinkedList<>();
 
            //开头添加数据
            list.addFirst("前");
            //末尾添加数据
            list.addLast("后");
            list.addFirst("左");
            list.addLast("右");
            list.addFirst("上");
            list.addLast("下");
            list.addFirst("东");
            list.addLast("西");
            //压栈
            list.push("啊哈哈哈哈哈");
 
            System.out.println(list);
 
            //删除开头数据
            System.out.println(list.removeFirst());
            //删除末尾数据
            System.out.println(list.removeLast());
            //弹栈
            System.out.println(list.pop());
 
            System.out.println(list);
 
            //获取并打印第一个元素
            System.out.println(list.getFirst());
            //获取并打印最后一个元素
            System.out.println(list.getLast());
        }
    }

二、Set

1. 特点
代码语言:javascript复制
① 无序(存取不一致)
② 不可重复
2. HashSet
代码语言:javascript复制
① java.util.HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)
② set1.add(new Student("张三",23));
  set1.add(new Student("张三",23));
  System.out.println(set1);    //[Student{name='张三', age=23},Student{name='张三', age=23}]
    
  set2.add("abc");
  set2.add("abc");
  System.out.println(set2);    //[abc]
  
  * 保证元素唯一性的方式依赖于:hashCode 与 equals方法。
  * 判断是否重复的流程
        ⚪ 使用参数类的 hashCode() 比较两个元素的哈希值,如果哈希值不一样则存入;
        ⚪ 如果哈希值一样则调用 equals() 比较两个元素的内容是否一样。
  * Student 类没有重写 hashCode 与 equals 方法,故使用的是 Object 的。
  * 查看重写 hashCode 源码
        @Override
        public int hashCode() {
            return Objects.hash(name, age);
        }
        
        //Objects中
        public static int hash(Object... values) {
            return Arrays.hashCode(values);
        }
        
        //Arrays中
        public static int hashCode(Object a[]) {
            if (a == null)
                return 0;
 
            int result = 1;
 
            for (Object element : a)
                result = 31 * result   (element == null ? 0 : element.hashCode());
 
            return result;
        }    
  * 可变参数
        ⚪ 参数类型一致而参数个数不确定。
        ⚪ 格式
            修饰符 返回值类型 方法名(参数类型... 形参名){  }
        ⚪ 底层使用数组实现,可以当作数组使用。
        ⚪ 示例
            public class ChangeArgs {
                public static void main(String[] args) {
                    int[] arr = { 1, 4, 62, 431, 2 };
                    int sum = getSum(arr);
                    System.out.println(sum);
                }
                
                public static int getSum(int... arr) {
                    int sum = 0;
                    for (int a : arr) {
                        sum  = a;
                    }
                    return sum;
                }
            }
        ⚪ 终极写法
            修饰符 返回值类型 方法名(Object... obj){  }
        ⚪ 注意
            一个参数列表只能由一个可变参数
            如果由多个参数,可变参数位于最后
3. LinkedHashSet
代码语言:javascript复制
* HsahSet 的子类
* 底层是 哈希表(数组   链表)   链表
* 由哈希表保证唯一性,链表保证存取一致

三、Collections

1. 常用方法
代码语言:javascript复制
① addAll(Collection<T> c, T... elements)
    往集合中添加一些元素。
② shuffle(List<?> list)
    打乱集合顺序。
③ sort(List<T> list)
    将集合中元素按照默认规则排序。
④ sort(List<T> list,Comparator<? super T> )
    将集合中元素按照指定规则排序。
2. sort(List<T> list)
代码语言:javascript复制
① 使用该方法的类必须实现 Comparable 并且重写 compareTo()
② 示例
    public class Student implements Comparable<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 String toString() {
            return "Student{"  
                    "name='"   name   '''  
                    ", age="   age  
                    '}';
        }
        
        @Override
        public int compareTo(Student o) {
            if (this.getAge() == o.getAge()) {
                return this.getName().compareTo(o.getName());
            } else {
                return this.getAge() - o.getAge();
            }
        }
    }
    
    public class DemoHashSet {
        public static void main(String[] args) {
            ArrayList<Student> list = new ArrayList<>();
 
            list.add(new Student("张三",23));
            list.add(new Student("里斯",23));
            list.add(new Student("王五",13));
 
            Collections.sort(list);
 
            System.out.println(list);
        }
    }
    
③ 注意
    基本类型 this - obj 升序;obj - this 降序
    引用类型 this.compareTo(obj) 升序;obj.compareTo(this) 降序
3. sort(List<T> list,Comparator<? super T> )
代码语言:javascript复制
① 示例
    public class CollectionsDemo3 {
        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<String>();
            list.add("cba");
            list.add("aba");
            list.add("sba");
            list.add("nba");
            //匿名内部类
            Collections.sort(list, new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    return o2.charAt(0) - o1.charAt(0);
                }
            });
            System.out.println(list);
        }
    }

0 人点赞