day03-List、Set、数据结构、Collections

java集合体系结构

a.Collection(单列集合):

​ list(接口–新增四个方法):1.有序的。 2.可以存储重复元素

​ ArrayList(子类):数组实现

​ LinkedList(子类—新增2个方法):链表实现

​ set(接口);1.无序的。 2.不能存储重复元素

​ HashSet(子类):哈希表实现

​ LinkedHashSet(子类):链表、哈希表实现

b.Map(双列集合):

List集合—接口常用的方法

特点:

​ 1.有序的;

​ 2.可以储存重复元素;

常用方法:

1.增

​ public void add(int index, E ele);将元素ele添加到index位置

2.删

​ public E remove(int index):移除列表中指定位置的元素,返回的是被移除的元素

3.改

​ public E set(int index, E ele):用指定元素替换集合中指定位置的元素,返回值是更新前的元素

4.查

​ public E get(int index):返回集合中指定位置的元素

注意:上述四个方法都会用到一个index作为索引值,注意不要超出集合范围,否则抛异常
示例代码:
public static void main(String[] args) {
        ArrayList<String> strList = new ArrayList<>();
        strList.add("王宝强");
        strList.add("杰克");
        strList.add("汤姆");
        System.out.println(strList);
        System.out.println("---------------------");
        //增:在索引的位子添加一个元素,然后原先索引位置的元素依次往后移
        strList.add(1,"邦德");
        System.out.println(strList);
        //删:把索引位置的元素给删除,返回的移除的那个元素
        System.out.println(strList.remove(1));
        System.out.println(strList);
        System.out.println("=========================");
        //改:在指定索引的位置修改一个元素,返回值时修改前的元素
        System.out.println(strList.set(1,"Tom"));
        System.out.println(strList);
        //查:查询指定索引的元素
       String name = strList.get(0);
        System.out.println(name);
    }

数据结构

存储数据的方式就是数据结构

作用:不同的存储方式,会影响增,删,改,查的效率

数据结构__数组

ArrayList(内部就是数组来实现的)

“数组”特点:在内存中是“连续的”,可以通过索引访问里面的元素

​ 1.添加:可能涉及到”数组扩容”,影响效率

​ 2.删除:删除元素后,要将后续元素依次前移一位,影响效率

​ 3.查询:查询list.get(索引),内部将索引作为数组的索引,直接获取,效率快

总结:增删慢,查询快

这里写图片描述

LinkedList(链表实现)

特点:

​ 1.添加:只需赋值几个引用即可,效率快

​ 2.删除:只需要将自己的next赋值给前一个节点(node)的next即可,效率快

​ 3.查询:总是需要从一端开始,向另一端查找,效率慢
这里写图片描述

总结:

​ 1.链表是通过记录节点的地址来进行连接的(多个节点,通过地址连接)

​ 2.操作受限的一个线性表,查询慢,添加,删除快

1).栈结构

这里写图片描述

特点:

​ 1.受限的线性表:添加,删除元素都在同一端(栈顶)

​ 2.先进后出

2).队列

这里写图片描述

特点:

​ 1.受限的线性表,添加,删除各占一端:

​ 2.先进先出

数据结构—红黑树

这里写图片描述

List的子类—ArrayList集合

1.ArrayList内部:数组实现_查询快,增删慢:

2.示例代码:
ArrayList<String> list = new ArrayList<>();
        list.add("黄磊");
        list.add("黄渤");
        list.add("黄晓明");
        //遍历方式:增强for(底层:迭代器)
        for(String s : list){
            System.out.println(s);
        }
        //遍历方式:size() + get()
        for(int i = 0;i < list.size(); i++){
            String s = list.get(i);
            System.out.println(s);
        }

List的子类—LinkedList集合

1.LinkedList:链表实现—查询慢,增删快:

2.特有方法:

​ a) push():模拟压栈

​ b) Poll():模拟弹栈

示例代码:
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.push("7.62");
        list.push("7.62");
        list.push("7.62");
        list.push("7.62");
        list.push("7.62");
        list.push("7.62");
        //因为LinkedList是list集合的子类,所以有list的接口特点:1.有序的  2.可以储存重复的元素

        //list.poll();
        //list.poll();
        //list.poll();
        //list.poll();
       // list.poll();
        //list.poll();
        //System.out.println(list.poll());
        //为了防止抛空的情况,可以用while循环进行判断
        while(list.size() >0){
            System.out.println(list.poll());
        }
    }

Set接口—HashSet存储字符串

Set集合的特点;

​ 1.无序的

​ 2.不能存储重复元素(可以用这个筛选一些重复的元素,编译通过,运行不报错,但是重复的自动筛选出来)

示例代码:
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("Tom");
        set.add("jarry");
        set.add("邦德");
        set.add("詹姆斯");
        set.add("科比");
        set.add("jarry");
        //筛选出重复的元素,编译通过,运行不报错,但是集合不储存这个重复的元素,
        //实际案例中让我们把重复的一些元素筛选出来,打印剩下的,最简便的 方法就是用Set

        //遍历集合
        for (String S:set) {
            System.out.println(S);
        }
    }

Set接口—HashSet存储自定义对象

1.定义Student类(注意:重写,hashCode()和equals())

示例代码:

1.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;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

2.测试类

    public static void main(String[] args) {
        HashSet<Student> set = new HashSet<>();
        set.add(new Student("邦德",10));
        set.add(new Student("Tom",3));
        set.add(new Student("Tom",3));
        //这里添加的两个相同的元素,Set会先判断hashCode(),相同,在判断equals(),要是再相同,不存储元素,不相同就存储进集合
        //                                                 不相同的话,就会存储进集合
        //遍历
        for (Student S:set) {
            System.out.println(S);
        }
        System.out.println("集合大小"+set.size());
    }

Set接口数据结构_哈希表

![](F:\黑马程序员 就业办 课件\photo\7.png)

特点:

​ 1.采用:数组 + 链表 + 红黑树实现

​ 2.验证元素的唯一性:

​ a)先判断元素的hashCode()

​ 不同:存到集合中

​ 相同:在判断元素的equals()

​ 不同:存到集合中

​ 相同:不存

Set接口-LinkedHashSet的特点及使用

1.LinkedHashSet:它是链表,哈希表的实现

​ 它是Set的特例,有序的哈希表

示例代码:
    public static void main(String[] args) {
        LinkedHashSet<String> set = new LinkedHashSet<>();

        set.add("aaa");
        set.add("bbb");
        set.add("ccc");
        set.add("ccc");
        //Set接口自己会把重复的元素筛选出来
        //System.out.println(set);
        //遍历
        for (String S:set) {
            System.out.println(S);//有序的
        }
    }

Set接口—可变参数

    public static void main(String[] args) {
        //编译前
        sum();
        sum(10,20);
        sum(10,3,24,324,321,45,43,24,324,325,42,431);
        //Set接口的可变参数的作用就是方便添加元素

        //编译后
       /* sum(new int[0]);
        sum(new int[]{10,20});
        sum(new int[]{10,3,24,324,321,45,43,24,324,325,42,431);*/

    }
    //编译前
    public static int sum(int ... nums) {
        int sum = 0;
        for (int n : nums) {
            sum += n;
        }
        return sum;
    }
    //编译后
    /*public static int sum(int[] nums) {
        int sum = 0;
        for (int n : nums) {
            sum += n;
        }
        return sum;
    }*/
}
其它说明:

1).在一个方法中最多只能有一个“可变参数”,而且必须位于参数列表的末尾:
public static int sum(int a,String b,int … nums){//OK的
}
public static int sum(int…nums,int a,int b){//错误
}
public static int sum(String…s,int … nums){//错误
}

注意:前两个必须要传,后面一个可以不传

Collection-常用功能

1.java.util.Collections(工具类):里面包含了对Collection集合操作的一些工具性方法。

2.常用方法:
1).public static <T> boolean addAll(Collection<T> c, T. .elements) :往集合中添加一些元素。
2).public static void shuffle(List<?> list) 打乱顺序 :打乱集合顺序。
3).public static <T> void sort(List<T> list) :将集合中元素按照默认规则排序。
4).public static <T> void sort(List<T> list,Comparator<? super T>):将集合中元素按照指定规则排序。

shuffle(list c):打乱集合内元素顺序,实用例子洗牌

3.示例代码:
    public static void main(String[] args) {
        ArrayList<Integer> intList = new ArrayList<>();
        /*intList.add(10);
        intList.add(1);
        intList.add(2);
        intList.add(13);
        intList.add(1);
        intList.add(40);
        */
        //之前这种添加方式效率慢

        //1.addAll(Collection c , T ... nums):向集合中添加若干的T类型的数据
        Collections.<Integer>addAll(intList,10,1,2,13,1,4);
        System.out.println(intList);

        //2.shuffle(List c):打乱集合内元素的顺序
        Collections.shuffle(intList);
        System.out.println(intList);

        //3.sort(List c):对集合内的元素进行"排序(默认—升序)"
        Collections.sort(intList);
        System.out.println(intList);

        System.out.println("-------------------------");

        ArrayList<String> strList = new ArrayList<>();
        strList.add("abcdef");
        strList.add("abc");
        strList.add("bac");
        strList.add("bca");
        strList.add("cba");
        strList.add("cab");

        Collections.sort(strList);
        System.out.println(strList);

        System.out.println("======================");
        //对于自定义对象排序的前提:Student必须实现Comparable接口
        ArrayList<Student> stuList = new ArrayList<>();
        stuList.add(new Student("邦德",10));
        stuList.add(new Student("Tom",4));
        stuList.add(new Student("Jerry",3));
        stuList.add(new Student("詹姆斯",20));

        Collections.sort(stuList);
        System.out.println(stuList);

        //这时候是按年龄的从小到大,按升序排的。       int n = this.age - o.age;
        //要是想从大到小,按降序排。         int n = o.age - this.age;
    }

Student类:

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 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);
    }

    @Override
    public int compareTo(Student o) {
        int n = o.age - this.age;
        return n;
    }

        //这时候是按年龄的从小到大,按升序排的。       int n = this.age - o.age;
        //要是想从大到小,按降序排。         int n = o.age - this.age;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

Collection工具类—实现比较方式一 -为类添加比较功能—Comparble

3).public static void sort(List list) :将集合中元素按照默认规则排序。

示例代码:
public class Student implements Comparable<Student>{
    private String name;
    private int age;
     ......
    @Override
    public int compareTo(Student o) {
        int n = o.age - this.age;
        return n;
    }
}
测试代码:
ArrayList<Student> stuList = new ArrayList<>();
stuList.add(new Student("张三1", 18));
stuList.add(new Student("张三2", 19));
stuList.add(new Student("张三3", 17));
stuList.add(new Student("张三4", 10));

Collections.sort(stuList);//sort会去调用Student的compareTo()方法进行依次的比较

System.out.println(stuList);

Collection工具类—实现比较方式一 比较器—Comparator接口

4).public static void sort(List list,Comparator

示例代码:
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;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
测试类:
class MyCom implements Comparator<Student>{
    @Override
    public int compare(Student o1, Student o2) {
        return o1.getAge() -o2.getAge();
    }
}
public class Deom {
    public static void main(String[] args) {
        ArrayList<Student> stuList = new ArrayList<>();
        stuList.add(new Student("邦德",10));
        stuList.add(new Student("Tom",3));
        stuList.add(new Student("Jarry",1));
        stuList.add(new Student("詹姆斯",20));

        Collections.sort(stuList,new MyCom());
        System.out.println(stuList);

    }
}
使用匿名内部类:
public class Demo01 {
    public static void main(String[] args) {
        ArrayList<Student> stuList = new ArrayList<>();
        stuList.add(new Student("邦德", 10));
        stuList.add(new Student("Tom", 3));
        stuList.add(new Student("Jarry", 1));
        stuList.add(new Student("詹姆斯", 20));

        //这个用了匿名内部类,简化代码,
        //new的不是Comparator 因为它是个接口,new的是括号内的子类对象
        /*new  Comparator<Student> (){
                    @Override
                   public int compare(Student o1, Student o2) {
                        return o1.getAge() -o2.getAge();
                   }*/
        //这个表达式做了两件事:1.定义了一个子类,并且即实现了Comparator接口,又重写了Compare方法
        //2.直接把这个子类new出一个对象,然后传到这个方法中
        Collections.sort(stuList, new  Comparator<Student> (){
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getAge() -o2.getAge();
            }
    });
        System.out.println(stuList);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值