栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

List和Set

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

List和Set

目录

List接口

集合框架:

list接口:

ArrayList:

概念:

使用场景:

常用用法:

代码举例:

注意:

LinkedList:

概念:

使用场景:

语法:

常用方法(LinkedList提供了大量首尾操作的方法):

代码举例:

set接口

HashSet:

概念:

HashSet存储自定义类型元素:

代码举例:

注意:

LikedHashSet:

概念:

结论:

举例代码:


List接口

集合框架:

 

list接口:

 

ArrayList:

概念:

用法类似于数组,且其容量可按需要动态调整,亦被称为动态数组。

数组最大的痛点是大小固定(可以改变,但是很麻烦) ArrayList底层是用数组实现的,所以名字里带了个数组(Array)。

ArrayList底层是通过数组实现,查询快、增删慢。API文档上说ArrayList不是同步的,即多线程环境下不安全,但是效率高。

使用场景:

1.频繁访问列表中的某一个元素。

2.只需要在列表末尾进行添加和删除元素操作。

常用用法:

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

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

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

4.public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。(index:要更改的索引(集合下标),element:要更改成的内容)

代码举例:
//新建集合
        ArrayList objects = new ArrayList<>();
        //集合开始的长度
        int size1 = objects.size();
        System.out.println(size1);//0
        objects.add("sb");
        objects.add("chenyan");
        objects.add("aichidami");
​
        //用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
        objects.set(1,"曹兔");
        System.out.println(objects.get(1));//曹兔
        //集合结束的长度
        int size = objects.size();
        System.out.println(size);//3
​
        //返回集合中指定位置的元素
        Object o = objects.get(0);
        System.out.println(o);//sb
​
        //按照索引删除元素
        boolean sb = objects.remove("sb");
        for (Object object : objects) {
            System.out.print(object.toString()+"t");//曹兔   aichidami
        } 
 

在上述代码中,我们用的全是string类型的数据(我没改类型,我在尖括号里面写的是Object,也没事如果你想变成string类型的话,就把Object变成string就行),如果我们要存储基本数据类型的数据(所有集合都只能存引用数据类型),我们就得用基本类型的包装类。

ArrayList objects = new ArrayList<>();

注意:

List接口下的子类都可以使用上面的用法,但是在set接口下的子类没有get/set方法,但是有别的方法。

LinkedList:
概念:

LinkedList使用链表实现,查询慢,增删快,适用于经常插入、删除大量数据的场合,适合采用迭代器Iterator遍历。

LinkedList实现了List和Deque(双端队列)接口。

使用场景:

1.你需要通过循环迭代来访问列表中的某些元素。

2.需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。

语法:
LinkedList list = new LinkedList();   // 普通创建方法(一般普通方法用的比较多)
或者
LinkedList list = new LinkedList(Collection c); // 使用集合创建链表

常用方法(LinkedList提供了大量首尾操作的方法):

1.public void addFirst(E e):将指定元素插入此列表的开头。

2.public void addLast(E e):将指定元素添加到此列表的结尾。

3.public E getFirst():返回此列表的第一个元素。

4.public E getLast():返回此列表的最后一个元素。

5.public E removeFirst():移除并返回此列表的第一个元素。

6.public E removeLast():移除并返回此列表的最后一个元素。

**7.**public E pop():从此列表所表示的堆栈处弹出一个元素(使用这个会把这个集合的第一个元素删除,然后返回这个元素)。

**8.**public void push(E e):将元素推入此列表所表示的堆栈(就是在第一个元素前在插入一个元素)。

9.public boolean isEmpty():如果列表不包含元素,则返回true。

代码举例:
 LinkedList list = new LinkedList<>();
        list.add("dazhe");
        list.add("曹兔子");
        for (Object o : list) {
            System.out.print(o.toString()+"t");
            System.out.println();
        }
​
        //将指定元素插入此列表的开头。
        list.addFirst("曹志顺");
        //返回此列表的第一个元素
        Object first = list.getFirst();
        System.out.println(first);//曹志顺
        System.out.println(list.get(0));
​
        //将指定元素添加到此列表的结尾
        list.addLast("久诚");
        System.out.println(list.get(3));
        //返回此列表的最后一个元素。
        Object last = list.getLast();
        System.out.println(last);//久诚
​
        //移除并返回此列表的第一个元素。
        Object o = list.removeFirst();
        System.out.println(o);
        //遍历
        for (Object o1 : list) {
            System.out.print(o1.toString());
        }
​
​
        //从此列表所表示的堆栈处弹出一个元素。,使用这个会把这个集合的第一个元素删除,然后返回这个元素。
        Object pop = list.pop();
        System.out.println(pop);//dazhe
​
        //将元素推入此列表所表示的堆栈。就是在第一个元素前在插入一个元素
        list.push("ddddd");
        for (Object o1 : list) {
            System.out.println(o1.toString());//ddddd 曹兔子 久诚
        } 
 

set接口

HashSet:
概念:

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

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

HashSet存储自定义类型元素:

第一步:

自定义类型也就是我们自己创建的实体类

第二步:

使用HashSet集合

代码举例:
//实体类
public class Student {
    //私有属性
    private String name;
    private int age;
    
    //构造方法
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Student() {
    }
​
    
​
​
    //重写equals方法
    @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 &&
                name.equals(student.name);
    }
    //重写hashCode
    @Override
    public int hashCode() {
        return Objects.hash(name, 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;
    }
​
    //重写tostring方法
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
    
    
    
//测试HashSet
    //新建Hashset集合 让他装自定义类对象
        HashSet set = new HashSet<>();
​
        //新建自定义类对象
        Student  s= new Student("陈妍", 20);
        //把对象添加到集合去
        set.add(s);
        set.add(new Student("曹兔子",23));
        set.add(new Student("陈妍",20));
​
        //遍历集合
        for (Student student : set) {
            System.out.println(student);
        }//Student{name='曹兔子', age=23} Student{name='陈妍', age=20}
注意:

如果不重写equals方法和HashSet方法的话,添加相同的元素,hashset里面的元素会相同。

LikedHashSet:
概念:

set是无序、唯一的话,可以使用LikedHashSet--它是HashSet下面的一个子类,底层使用了LinkedHashMap,在HashSet的哈希表数据结构基础之上,增加了一个双向链表用来记录元素添加的顺序,能按照添加顺序遍历输出。需要频繁遍历的话效率可能高于HashSet。

结论:

LinkedHashSet 底层采用双向链表实现,可以保证元素的插入顺序,又因为是HashSet的子类,所以插入的元素不能重复。

举例代码:
public static void main(String[] args) {
        //新建一个集合(输出数据是有序的集合)
        LinkedHashSet set = new LinkedHashSet<>();
        //在集合里添加元素
        set.add("ccc");
        set.add("bbb");
        set.add("aav");
        //使用迭代器遍历输出元素
        Iterator ite = set.iterator();
        while (ite.hasNext()){
            System.out.println(ite.next());//ccc bbb aav
        }
    }
转载请注明:文章转载自 www.wk8.com.cn
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号