List集合(ArrayList集合、LinkedList集合)、Set接口(HashSet、LinkedHashSet)、可变参数

LIst集合

java.util.List 接口继承自 Collection 接口,是单列集合的一个重要分支,在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。

List接口特点:

  1. 它是一个元素存取有序的集合。

  2. 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。

  3. 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。

List接口中常用方法

  • public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
  • public E get(int index) :返回集合中指定位置的元素。
  • public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
  • public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。

ArrayList集合

java.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快

LinkedList集合

java.util.LinkedList 集合数据存储的结构是链表结构。方便元素添加、删除的集合

LinkedList是一个双向链表
在这里插入图片描述

LinkedList中常用方法

  • public void addFirst(E e) :将指定元素插入此列表的开头。
  • public void addLast(E e) :将指定元素添加到此列表的结尾。
  • public E getFirst() :返回此列表的第一个元素。
  • public E getLast() :返回此列表的最后一个元素。
  • public E removeFirst() :移除并返回此列表的第一个元素。
  • public E removeLast() :移除并返回此列表的最后一个元素。
  • public E pop() :从此列表所表示的堆栈处弹出一个元素。
  • public void push(E e) :将元素推入此列表所表示的堆栈。
  • public boolean isEmpty() :如果列表不包含元素,则返回true。

在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。

Set接口

java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,与 List 接口不

同的是, Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。

HashSet集合

java.util.HashSet 是 Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。 java.util.HashSet 底层的实现其实是一个 java.util.HashMap 支持。

HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性 的方式依赖于: hashCode 与 equals 方法。

HashSet集合存储数据的结构(哈希表)

JDK1.8之前,哈希表底层采用数组+链表实现,而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树。
在这里插入图片描述
在这里插入图片描述

HashSet存储自定义类型元素

public class Student {
    private int age;
    private String name;

    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public Student() {
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

    @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(age, name);
    }
}
public class StudentDemo {
    public static void main(String[] args) {
        HashSet<Student> s = new HashSet<>();
        Student stu = new Student(15,"lihua");
        Student stu1 = new Student(13,"lihua");
        Student stu2 = new Student(14,"zhaohua");
        Student stu3 = new Student(15,"zhanghua");

        s.add(stu);
        s.add(stu1);
        s.add(stu2);
        s.add(stu3);

//        System.out.println(s);
        for (Student s1:s) {
            System.out.println(s1);
        }
    }
}

LinkedHashSet集合

链表和哈希表组合的一个数据存储结构。 保证元素唯一,且有序。

public class LinkedHashSetDemo {
    public static void main(String[] args) {
//        LinkedHashSet<String> link = new LinkedHashSet<>();//有序
        HashSet<String> link = new HashSet<>();//无序
        link.add("bbb");
        link.add("aaa");
        link.add("ccc");
        link.add("bbc");
        for (String s:link) {
            System.out.println(s);
        }
    }
}

可变参数(定义一个方法需要接受多个参数,并且多个参数类型一致)

修饰符 返回值类型 方法名(参数类型... 形参名){ }
修饰符 返回值类型 方法名(参数类型[] 形参名){ }

后面这种定义,在调用时必须传递数组,而前者可以直接传递数据即可。

同样是代表数组,但是在调用这个带有可变参数的方法时,不用创建数组(这就是简单之处),直接将数组中的元素作为实际参数进行传递,其实编译成的class文件,将这些元素先封装到一个数组中,在进行传递。这些动作都在编译.class文件时,自动完成了。

public class ChangeArgs {
    public static void main(String[] args) {
        int[] arr = { 1, 44, 462, 41, 25}; 
        int sum = getSum(arr); 
        System.out.println(sum); 
        // 6 7 2 12 2121 
        // 求 这几个元素和 6 7 2 12 2121 
        int sum2 = getSum(6, 5, 12, 24, 1952); 
        System.out.println(sum2);
    }

//    private static int getSum(int[] arr) {
//        int sum = 0;
//        for(int a : arr) {
//            sum += a;
//        }
//        return sum;
//    }
    public static int getSum(int... arr) {
        int sum = 0;
        for (int a : arr) {
            sum += a;
        }
        return sum;
    }
}

如果在方法书写时,这个方法拥有多参数,参数中包含可变参数,可变参数一定要写在参数列表的末尾位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值