List集合、Set接口、Collections工具类

目录

List集合

   1.List接口特点

   2.常用方法

   3.List子类

Set接口

   1.HsahSet集合  implements Set接口

HashSet 存储自定义类型元素

   2.LinkedHashSet

Collections

1.常用方法


List集合

   1.List接口特点

             A.  它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。

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

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

   2.常用方法

            List接口作为Collection接口的子类,继承了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):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。

实例:

package demo1_List;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
       java.util.List接口extends Collection接口
       特点:
            1.存取有序的集合
            2.是一个带索引的集合
            3.允许重复元素

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

       三种遍历方式:1.普通for循环  2.迭代器     3.增强for循环
       注意:防止索引越界
 */
public class Test01_List {
    public static void main(String[] args) {
        //创建集合对象
        List<String> list=new ArrayList<>();
        list.add("小太阳");
        list.add("小太阳");
        list.add("小月亮");
        list.add("小星星");

        //允许带有重复的元素
        System.out.println(list);       //[小太阳, 小太阳, 小月亮, 小星星]

        //添加元素到指定位置
        list.add(2,"就是我");
        System.out.println(list);       //[小太阳, 小太阳, 就是我, 小月亮, 小星星]

        //移除指定位置元素,返回值是被移除的元素
         String str=list.remove(1);
        System.out.println("我是被移除的元素:"+str);    //我是被移除的元素:小太阳
        System.out.println(list);           //[小太阳, 就是我, 小月亮, 小星星]

        //替换指定位置的元素,返回值是旧元素
        String str2=list.set(1,"小行星");
        System.out.println("我是被替换的元素:"+str2);   //我是被替换的元素:就是我
        System.out.println(list);           //[小太阳, 小行星, 小月亮, 小星星]

        //1.普通for循环遍历
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
        System.out.println("===============");

        //2.迭代器遍历
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println("================");

        //3.增强for遍历
        for (String s : list) {
            System.out.println(s);
        }
    }
}

   3.List子类

            A.  ArrayList集合

            B.  LinkedList集合:java.util.LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合,但查询慢。

实例:

package demo1_List;

import java.util.LinkedList;

/*
    java.util.LinkedList集合 implements List接口
    LinkedList集合特点:
        1.底层是一个链表结构:查询慢,增删快
        2.里面包含了大量操作首位元素的方法
        注意:使用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。

 */
public class Test02_LinkedList {
    public static void main(String[] args) {
//        method1_AddGet();
//        method2_Remove();
        method3_PopPush();
    }

    public static void method3_PopPush(){
        LinkedList<String> liked=method1_AddGet();
        System.out.println("=================");
        // - public E pop():从此列表所表示的堆栈处弹出一个元素。
        //LinkedList底层是一个链表解构首先弹出的是第一个元素
        String str1=liked.pop();
        System.out.println(str1);
        System.out.println(liked);

        //将元素推入此列表所表示的堆栈
        liked.push("小月亮");
        System.out.println(liked);
    }

    public static void method2_Remove(){
        LinkedList<String> liked=method1_AddGet();
        System.out.println("=================");
        String str1=liked.removeFirst();
        String str2=liked.removeLast();
        System.out.println(str1+str2);
        System.out.println(liked);
    }

    public static LinkedList<String> method1_AddGet(){
        LinkedList<String> liked=new LinkedList<>();
        liked.addFirst("会发光的");
        liked.add("打不过我吧");
        liked.addLast("小太阳");
        System.out.println(liked);          // [会发光的, 打不过我吧, 小太阳]

        String str1=liked.getFirst();
        String str2=liked.getLast();
        System.out.println(str1+str2);      // 会发光的小太阳

        return liked;
    }
}

Set接口

       Set 接口 extends Collection接口

       特点:1.不允许存储重复的元素,无序

                   2.没有索引,没有带索引的方法,不能用普通for循环遍历

   1.HsahSet集合  implements Set接口

             1.不允许存储重复的元素

             2.没有索引,没有带索引的方法,不能用普通for循环遍历

             3.是一个无序的集合,存储元素和取出元素顺序可能不一致

             4.底层是一个哈希表结构(查询速度非常快),具有良好的查询和存取性能。

实例:

package demo2_Set;

import java.util.HashSet;

/*
    Set接口   extends Collection接口
    特点 :1.不允许存储重复的元素
           2.没有索引,也没有带索引的方法,不能用普通for循环遍历

    HashSet集合  implements Set接口
    特点;  1.不允许存储重复的元素
       2.没有索引,没有带索引的方法,不能用普通for循环遍历
       3.是一个无序的集合,存储元素和取出元素顺序可能不一致
       4.底层是一个哈希表结构(查询速度非常快)
 */
public class Test01_HashSet {
    public static void main(String[] args) {
        method();
    }

    public static void method(){
        //创建集合
        HashSet<String> hs=new HashSet<>();
        hs.add("太阳");
        hs.add("月亮");
        hs.add("星星");
        hs.add("太阳");

        System.out.println(hs);     //[太阳, 月亮, 星星],没有重复元素
    }
}

HashSet 存储自定义类型元素

        哈希值:是一个十进制的整数,有系统随机给出,就是对象的地址值,是一个逻辑地址, 是模拟出来的地址,不是实际存储的物理地址。
         在Object类中有一个方法,可以获取对象的哈希值

        public native int hashCode() 返回该对象的哈希值

        给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象不重复。

        在IDEA中有重写hashCode和equals方法的快捷方式:鼠标右键--->Generate--->equals and hashCode().

定义Person类并重写hashCode和equals方法:

    /*
        总而言之,JDK1.8引入红黑树大程度优化了HashMap的性能,那么对于我们来讲
        保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。
        如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法
        建立属于当前对象的比较方式。
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

 测试类:添加四个对象元素,其中两个为重复,测试能否添加成功重复元素

package demo2_Set;

import java.util.HashSet;

/*
    HashSet存储自定义类型元素

    set集合报错元素唯一:
        存储的元素(String,Integer,...Student,Person...),需要重写对象中的hashCode和equals方法,
        建立自己的比较方式,才能保证HashSet集合中的对象唯一
    要求:
        同名同年龄的人视为一个人。
 */
public class Test02_HashSet {
    public static void main(String[] args) {
        //创建集合  存储Personl类型对象
        HashSet<Person> stu=new HashSet<>();
        stu.add(new Person("太阳",18));
        stu.add(new Person("月亮",19));
        stu.add(new Person("星星",22));
        stu.add(new Person("太阳",18));

        //增强for遍历
        for (Person person : stu) {
            System.out.println(person);
        }
    }
}

   2.LinkedHashSet

注意:HashSet 与 LinkedHashSet 的区别就是前者是无序的,后者是有序的。但是我们在测试时可能会出现这种现象:比如我现在创建一个HashSet,调用add()方法,一词添加字符‘A’,‘C’,‘B’,然后输出则为【A,B,C】,我们换一种测试:依次添加A,B,C或者依次添加C,B,A,然后输出结果都是【A,B,C】,有的小伙伴就会说这不是有序的吗?。。。请注意:这里的无序指的是往内存中存放元素的顺序和取出时的顺序不一致,比如你存进去时是ACB,取出时是ABC,这不是无序吗。
          而LinkedHashSet可以保证存放元素的顺序和取出时的顺序一致,这就是有序。

实例:

package demo2_Set;

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;

/*
    java.utilLinkedHashSet集合 extends HashSet集合
    LinkedHashSet特点:
        底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序
 */
public class Test04_LinkedHashSet {
    public static void main(String[] args) {
        HashSet<String>  hs=new HashSet<>();
        hs.add("bcs");
        hs.add("abc");
        hs.add("abc");
        hs.add("vfd");
        hs.add("wdc");
        System.out.println(hs); //  无序(指的是存放的顺序和取出的顺序不一致),不重复

        LinkedHashSet<String> lhs=new LinkedHashSet<>();
        lhs.add("太阳");
        lhs.add("月亮");
        lhs.add("太阳");
        lhs.add("星星");
        System.out.println(lhs);// 有序,不重复
    }
}

Collections

Collections是集合工具类,用来对集合进行操作。

1.常用方法

  • public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。

  • public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。

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

  • public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。

实例:

package demo3_Collections;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;

/*
    - public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。
    - public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。
    - public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。
    - public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。
 */
public class Test01 {
    public static void main(String[] args) {
        method();
    }

    public static void method(){
        ArrayList<Integer> list=new ArrayList<>();
        //添加
        Collections.addAll(list,2,43,5,16,23,90,1,13);
        System.out.println(list);           //[2, 43, 5, 16, 23, 90, 1, 13]

        //打乱顺序输出
        Collections.shuffle(list);
        System.out.println(list);           //[23, 16, 2, 1, 13, 43, 90, 5]

        //默认排序输出
        Collections.sort(list);
        System.out.println(list);           //[1, 2, 5, 13, 16, 23, 43, 90]

        //按照指定规则排序输出---假设为倒序
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        System.out.println(list);
    }
}

猜你喜欢

转载自blog.csdn.net/hpuxiaofang/article/details/81388341