快速掌握Java中List和Set接口的基本使用

简介: 快速掌握Java中List和Set接口的基本使用

集合的概念


是一个工具类,作用为存储多个数据,通常用于替代数组


集合的特点


只能存放Object对象

只能存放引用类型

不能存放接口,只能存放接口实现类对象

来自java.util包

List接口


List的存储特点


有序、有下标、元素可以重复

常用实现类

ArrayList 最常用

JDK1.2 底层数组实现 查询快、增删慢 线程不安全,效率高

一般不用

JDK1.2 底层链表实现 增删快,查询慢 线程不安全,效率高

Vector 不用

JDK1.0 底层数组实现 都慢 线程安全,效率低

创建


通常使用多态


List 集合名=new 实现类名();


常用方法


集合名.方法名


boolean add(元素):将元素添加至集合末尾

void add(下标,元素):将元素添加至指定下标位置

boolean addAll(集合名):将指定集合所有元素添加至当前集合末尾

boolean addAll(下标,集合名):将指定集合所有元素添加至当前集合指定下标位置

void clear():清空集合元素

int size():获取集合长度

boolean contains(元素):判断集合中是否包含指定元素

boolean containsAll(集合名):判断集合中是否包含指定集合的所有元素

元素 get(下标):获取指定下标位置上的元素

int indexOf(元素):获取指定元素第一次出现的下标,不存在返回-1

int lastIndexOf(元素):获取指定元素最后一次出现的下标,不存在返回-1

boolean isEmpty():判断集合元素是否为空,不能判比null值

元素 remove(下标):移除指定下标的元素,返回该元素

元素 set(下标,新值):将指定下标位置的值替换为新值,返回旧值

void sort(比较器实现类对象):对集合元素按照指定规则排序

Object[] toArray():将集合转换为数组


代码示例


public class Test {
        public static void main(String[] args) {
            List list = new ArrayList();
            list.add(66);
            list.add(5);
            list.add(77);//66 5 77
            list.add(2,44);//66 5 44 77
            List list2 = new ArrayList();
            list2.add(2);
            list2.add(1);
            list.addAll(list2);//66 5 44 77 2 1
            list.addAll(1, list2);//66 2 1 5 44 77 2 1
            System.out.println("清空之前:"+list.size());
           // list.clear();
           // System.out.println("清空之后:"+list.size());
            System.out.println(list.contains(5));//t
            System.out.println(list.containsAll(list2));//t
            List list3 = new ArrayList();
            list3.add(66);
            list3.add(77);
            list3.add(88);
            System.out.println(list.containsAll(list3));//f
            System.out.println(list.get(3));//5
            System.out.println(list.indexOf(88));//-1
            System.out.println(list.lastIndexOf(2));//6
            //list.clear();
            System.out.println(list.isEmpty());
            List list4=null;
            //System.out.println(list4.isEmpty()); 空指针异常
            System.out.println(list.remove(3));//66 2 1 44 77 2 1
            // System.out.println(list.remove(2));
            list.set(1, 88);//66 88 1 44 77 2 1
            Object[] os=list.toArray();
            for(int i=0;i<os.length;i++){
                System.out.print(os[i]+" ");
            }
            System.out.println();
        }
    }


遍历方法


for+get()
 for (int i = 0; i < 集合名.size(); i++) {
       //i代表当前下标
       //通过集合名.get(i)的方式获取当前元素
   }
   如:
 for (int i = 0; i < list.size(); i++) {
        System.out.print(list.get(i)+" ");
         }
        System.out.println();


迭代器遍历

hasNext():判断是否存在下一元素
next():指针后移,获取下一元素
//获取迭代器对象
Iterator it=集合名.iterator();
while(it.hasNext()){//集合存在下一元素则继续后续操作
//通过it.next()使指针后移,得到元素
}
如:
Iterator it=list.iterator();
while(it.hasNext()){
System.out.print(it.next()+" ");
}
System.out.println();
tips:迭代过程中不允许对集合进行增删操作
外遍历forEach
for(数据类型 元素名(随便起) : 集合名){
//元素名就代表当前元素
}
如:
for (Object o: list) {
System.out.print(o+" ");
}
System.out.println();
本质也是迭代器遍历,内部不允许进行增删操作
JDK5.0
自遍历forEach
//匿名内部类
集合名.forEach(new Consumer() {
@Override
public void accept(Object o) {
//o就代表当前元素
}
});
 //lambda简化
         集合名.forEach(o-> {o就代表当前元素});
 如:
         list.forEach(new Consumer() {
             @Override
             public void accept(Object o) {
                 System.out.print(o + " ");
             }
         });
         System.out.println();
         // lambda
         list.forEach(o-> System.out.print(o+" "));


JDK8.0

泛型

作用


用于集合中,可以约束集合存储的数据类型


语法


List<数据类型> 集合名=new 实现类名<数据类型>();

1

使用


1. 如果集合中存放基本类型,则泛型必须声明为其包装类型

2. 声明泛型之后,集合中不允许存放其他类型的数据

3. 前后类型声明必须一致

4. 等号后边的泛型不声明,语法不规范

5. 等号前边的泛型不声明,泛型无意义


List<Integer> list = new ArrayList<Integer>();
        list.add(66);
        list.add(88);
       /* list.add("abc");
        list.add(5.5);*/
        list.forEach(new Consumer<Integer>() {
            @Override
            public void accept(Integer i) {
                System.out.println(i);
            }
        });


Set接口

Collection


是一个接口

是List和Set的父接口

所有集合都由Collection或Map派生

特点


存放着List和Set的共有方法

没有自己的直接实现类

Set的存储特点

无序、无下标、元素不可重复

常用实现类

HashSet

JDK1.2 底层哈希表实现(数组+链表 又名散列表) 线程不安全,效率高

LinkedHashSet

JDK1.2 是HashSet的子类,底层哈希表实现 线程不安全,效率高

TreeSet

JDK1.2 是SortedSet的实现类,底层红黑树实现 线程不安全,效率高

创建


利用多态


Set<泛型类型> 集合名 = new 实现类名<泛型类型>();


常用方法


全部继承自Collection

遍历方法

Iterator迭代器遍历

外遍历forEach

自遍历forEach

哈希表的去重过程


先通过调用元素的hashCode()方法得到哈希码值

然后通过哈希码值%数组长度得到存放下标

若该下标位置未存放元素,则直接存放

若已存有元素,则调用当前元素的equals()方法与其位置的所有元素进行值的比较

都不相同,则链表存放

若有相同,舍弃当前元素


注意事项

当集合中存放的为自定义类型时,必须重写hashCode和equals才能保证去重

LinkedHashSet能够保证元素存入和取出顺序一致

TreeSet可以实现对元素进行默认的升序排序

如果存放的为自定义类型,必须重写排序规则

两种排序方式:

实现Comparable接口,重写compareTo方法

要对谁排,就让谁实现

原理:让当前对象与参数对象进行比较

返回值规则:

从小到大:this的值>o的值,返回正数

从大到小:this的值>o的值,返回负数

相等返回0

实现Comparator接口,重写compare方法

在集合创建处的小括号内传入该接口的实现类对象


 

public class Test2 {
            public static void main(String[] args) {
                Set<Student> set = new TreeSet<Student>(new Comparator<Student>() {
                    @Override
                    public int compare(Student o1, Student o2) {
                        //根据学生年龄从大到小排序
                        return o2.getAge()-o1.getAge();
                    }
                });
                set.add(new Student("张三", 20));
                set.add(new Student("lisi", 21));
                set.add(new Student("lisi", 21));
                set.add(new Student("wangwu", 22));
                set.add(new Student("maliu", 19));
                set.forEach(s-> System.out.println(s));
            }
        }


默认识别第一种排序方式

第二种排序方式优先级高于第一种

List和set的区别

基本概念的区别

List 接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。List 接口存储一组不唯一,有序的对象。


Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。Set 接口存储一组唯一,无序的对象。


1.Set 接口实例存储的是无序的, 不重复的数据, List 接口实例存储的是有序的,可以重复的元素;

2.Set检索效率低下, 删除和插入效率高, 插入和删除不会引起元素位置改变

3.List和数组类似, 可以动态增长, 根据实际存储的数据的长度自动增长List的长度, 查找元素效率高, 插入删除效率低, 因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> ;

使用场景

List


常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。

set


Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。

目录
打赏
0
0
0
0
88
分享
相关文章
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
Java 中数组Array和列表List的转换
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
随着大模型的越来越盛行,现在很多企业开始接入大模型的接口,今天我从java开发角度来写一个demo的示例,用于接入DeepSeek大模型,国内的大模型有很多的接入渠道,今天主要介绍下阿里云的百炼模型,因为这个模型是免费的,只要注册一个账户,就会免费送百万的token进行学习,今天就从一个简单的可以执行的示例开始进行介绍,希望可以分享给各位正在学习的同学们。
192 3
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
327 3
|
5天前
|
Java Lambda 表达式:以 Foo 接口为例深入解析
本文深入解析了 Java 8 中 Lambda 表达式的用法及其背后的函数式接口原理,以 `Foo` 接口为例,展示了如何通过简洁的 Lambda 表达式替代传统匿名类实现。文章从 Lambda 基本语法、函数式接口定义到实际应用层层递进,并探讨默认方法与静态方法的扩展性,最后总结常见误区与关键点,助你高效优化代码!
20 0
|
5天前
|
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
13 0
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
336 5
|
5月前
|
在Java中如何实现接口?
实现接口是 Java 编程中的一个重要环节,它有助于提高代码的规范性、可扩展性和复用性。通过正确地实现接口,可以使代码更加灵活、易于维护和扩展。
316 64
|
5月前
|
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
479 60
|
5月前
|
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
251 58
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
90 20
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等