Java集合

List集合

List接口当中的常用API方法:增删改查

出了继承Collection接口当中的方法外,还增加了一些根据元素索引来操作集合的特定方法:

  • public void add(int index,E element):将指定的元素,添加到给定集合中的指定位置上

  • public E get(int index):根据指定的索引获取对应位置上的元素

  • public E remove(int index):通过索引删除索引对应位置上的元素

  • public E set(int index,E element) :在指定索引位置上替换成给定的元素,并且返回更新前的元素。

LinkedList集合

  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是List的子类,List当中的方法LinkedList都是可以使用的。我们只了解LinkedList独有的方法,

在开发当中,LinkedList集合也可以作为堆栈、队列结构使用(了解)

Set接口

  继承自Collection接口,它与Collection接口中的方法基本一样,没有对Collection接口进行功能上的扩展,只是比Collection接口更加严格。与List接口不同的是,Set接口中的元素是无序的,并且都会以某种规则保证存入的元素不重复。

  Set接口有很多个子类,有两个重要子类:java.util.HashSetjava.util.LinkedHashSet集合

  Set集合没有索引,取出元素的方式可以采用:迭代器、增强for循环。

         Set<Integer> set=new HashSet<>();
        //set没有索引,可以用迭代器和增强for循环遍历。相同元素只能添加一次
        set.add(563);
        set.add(153);
        set.add(323);
        set.add(563);
        set.add(546);
        for (Integer b : set) {
            System.out.print(b+" ");//546 563 323 153 集合无序
        }        

HashSet集合

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

  java.util.HashSet底层的实现其实是一个java.util.HashMap支持的。

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

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

哈希值:是一个十进制的整数,由系统随机给出(对象地址值,是一个逻辑地址,是模拟出来得到的地址,不是数据实际存储的物理地址)
是顶级父类Object中的方法,可以获取对象的哈希值:int hashCode返回对象的哈希码值
源码:public native int hashCode();
native:调用本地操作系统中的方法
HashSet集合存储数据的结构(哈希表)
JDK1.8之前:哈希表=数组+链表
JDK1.8之后:
哈希表=数组+链表 数组初始容量16
哈希表=数组+红黑树; 如果链表长度超过了8位,那么就会把链表换成红黑树,减少查找时间

HashSet存储自定义类型的元素

   一般需要重写对象当中的hashCode和equals方法,建立自己的比较方式。才能保证HashSet集合中元素的唯一性。

@Override
    public boolean equals(Object o) {
        if (o == null) {
            return false;
        }
        if (this == o) {
            return true;
        }
        // 向下转型 类型判断
        if (o instanceof Student) {
            Student student = (Student)o;
            // 同名同年龄的人为同一个人 true
            return student.getName().equals(name) && student.getAge() == age;
        }
        return false;
    }

    @Override
    public int hashCode(){
         // 使用Objects类中的hash方法
        return Objects.hash(name,age);
    }

LinkedHashSet集合

  存进去的元素是没有顺序的而 LinkedHashSet底层是一个哈希表(数组+链表、红黑树)+链表 :多了条链表(存元素的存储的顺序),从而使元素有序

        LinkedHashSet<String> linked = new LinkedHashSet<>();
        linked.add("ass");
        linked.add("滴滴");
        linked.add("来了");
        linked.add("宝贝");
        System.out.println(linked);//[ass, 滴滴, 来了, 宝贝]    
原文地址:https://www.cnblogs.com/9080dlb/p/14083520.html