一文掌握Java中List和Set接口的基本使用

目录
  • 集合的概念
    • List接口
    • 泛型
    • Set接口
  • List和set的区别
    • 基本概念的区别
    • 使用场景

集合的概念

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

集合的特点

只能存放Object对象

  • 只能存放引用类型
  • 不能存放接口,只能存放接口实现类对象

来自java.util包

List接口

List的存储特点

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

常用实现类

1.ArrayList 最常用

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

2.一般不用

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

3.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. 如果集合中存放基本类型,则泛型必须声明为其包装类型

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的存储特点

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

常用实现类

1.HashSet

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

2.LinkedHashSet

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

3.TreeSet

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

创建

利用多态

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

常用方法

全部继承自Collection

遍历方法

  • Iterator迭代器遍历
  • 外遍历forEach
  • 自遍历forEach

哈希表的去重过程

  • 先通过调用元素的hashCode()方法得到哈希码值
  • 然后通过哈希码值%数组长度得到存放下标
  • 若该下标位置未存放元素,则直接存放
  • 若已存有元素,则调用当前元素的equals()方法与其位置的所有元素进行值的比较
  • 都不相同,则链表存放
  • 若有相同,舍弃当前元素

注意事项

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

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

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

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

b.两种排序方式:

I.实现Comparable接口,重写compareTo方法

要对谁排,就让谁实现

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

返回值规则:

  • 从小到大:this的值>o的值,返回正数
  • 从大到小:this的值>o的值,返回负数
  • 相等返回0

II.实现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() 的定义进行排序的有序容器。

到此这篇关于一文掌握Java中List和Set接口的基本使用的文章就介绍到这了,更多相关Java List Set接口内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JAVA中的 map,list,set

    目录 1.Map接口和Collection接口是所有集合框架的父接口 2.Collection集合主要有List和Set两大接口 3.Map (1)Map 存元素和取元素和删除(put.get.remove) (2)循环Map 1.Map接口和Collection接口是所有集合框架的父接口 Collection接口的子接口包括:Set接口和List接口 Map接口的实现类主要有:HashMap.TreeMap.Hashtable.ConcurrentHashMap以及Properties等 Se

  • Java中Set与List的关系与区别介绍

    两个接口都是继承自Collection. List (inteface) 次序是List 的最重要特点,它确保维护元素特定的顺序. --ArrayList 允许对元素快速随机访问. --LinkedList 对顺序访问进行优化,向List 中间插入与移除的开销并不大,具有addFrist(),addLast(),getFirst,getLast,removeFirst和removeLast().这些方法使得LinkedList可当作堆栈/队列/双向队列. Set (inteface) 存入Set

  • Java集合基础知识 List/Set/Map详解

    一.List Set 区别 List 有序,可重复: Set 无序,不重复: 二.List Set 实现类间区别及原理 Arraylist 底层实现使用Object[],数组查询效率高 扩容机制 1.6采用(capacity * 3)/ 2 + 1,默认容量为10: 1.7采用(capacity >> 2 + capacity)实现,位移动效率高于数学运算,右移一位等于乘以2倍: 读取速度快,写入会涉及到扩容,所以相对较慢. LinkedList底层采用双向链表,只记录 first 和 las

  • Java中的Set、List、Map的用法与区别介绍

    Collection 接口 :Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法.Set和List都继承了Conllection,Map Collection接口的方法: boolean add(Object o):向集合中加入一个对象的引用 void clear():删除集合中所有的对象,即不再持有这些对象的引用 boolean isEmpty():判断集合是否为空 boolean contains(Object o):判断集合中是否持有特定对

  • 深入解读Java三大集合之map list set的用法

    Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List接口 Map接口的实现类主要有:HashMap.TreeMap.Hashtable.ConcurrentHashMap以及Properties等 Set接口的实现类主要有:HashSet.TreeSet.LinkedHashSet等 List接口的实现类主要有:ArrayList.LinkedList.Stack以及Vector等 List,Set,Map三者的区别?List.

  • Java中集合List、Set和Map的入门详细介绍

    目录 一.Collection接口 二.List集合 2.1介绍 2.1.1 ArrayList(数组) 2.1.2 Vector(数组实现.线程同步) 2.1.3 LinkList(链表) 2.2 List特性 2.3 List常用方法 2.4 List总结 三.Set集合 3.1介绍 3.2 分类 3.2.1 HashSet(Hash表) 3.2.2 TreeSet(二叉树) 3.2.3 LinkHashSet(HashSet+LinkedHashMap) 四.Map集合 4.1 HashM

  • 一文掌握Java中List和Set接口的基本使用

    目录 集合的概念 List接口 泛型 Set接口 List和set的区别 基本概念的区别 使用场景 集合的概念 是一个工具类,作用为存储多个数据,通常用于替代数组 集合的特点 只能存放Object对象 只能存放引用类型 不能存放接口,只能存放接口实现类对象 来自java.util包 List接口 List的存储特点 有序.有下标.元素可以重复 常用实现类 1.ArrayList 最常用 JDK1.2 底层数组实现 查询快.增删慢 线程不安全,效率高 2.一般不用 JDK1.2 底层链表实现 增删

  • 一文解开java中字符串编码的小秘密(干货)

    简介 在本文中你将了解到Unicode和UTF-8,UTF-16,UTF-32的关系,同时你还会了解变种UTF-8,并且探讨一下UTF-8和变种UTF-8在java中的应用. 一起来看看吧. Unicode的发展史 在很久很久以前,西方世界出现了一种叫做计算机的高科技产品. 初代计算机只能做些简单的算数运算,还要使用人工打孔的程序才能运行,不过随着时间的推移,计算机的体积越来越小,计算能力越来越强,打孔已经不存在了,变成了人工编写的计算机语言. 一切都在变化,唯有一件事情没有变化.这件事件就是计

  • 一文解析Java中的方法重写

    目录 1.含义 2.为什么要使用方法重写 3.如何使用方法重写 3.1 基本语法 3.2 具体分析 3.3 方法重写的一些小技巧 1.含义 子类继承父类后,可以在子类中书写一个与父类同名同参的方法,从而实现对父类中同名同参数的方法的覆盖,我们把这一过程叫做方法的重写(override) 2.为什么要使用方法重写 2.1 当父类的方法满足不了子类的需求的时候,需要在子类中对该方法进行重写 2.2 题目与分析 例如存在一个父类Peple,子类Chinese,父类中有一个say()方法,输出人在说话,

  • 一文了解Java中record和lombok的使用对比

    目录 小型不可变对象 透明的数据载体 有许多字段的类 可变数据 继承性 结论 大家好,我是指北君. Java的 record 关键字是Java 14中引入的一个新的语义特性.record 对于创建小型不可变的对象非常有用.另一方面,Lombok 是一个Java库,可以自动生成一些已知的模式为Java字节码.尽管它们都可以用来减少模板代码,但它们是不同的工具.因此,我们应该在特定情况下使用更适合我们需求的工具. 在这篇文章中,我们将探讨各种使用情况,包括java record 的一些限制.对于每个

  • 一文了解Java中枚举的使用

    目录 概述 枚举介绍和使用 枚举的本质 枚举常见用途 枚举创建单例 枚举抽象方法 概述 Java中枚举,大家在项目中经常使用吧,主要用来定义一些固定值,在一个有限的集合内,比如在表示一周的某一天,一年中的四季等.那你了解枚举的本质吗?了解枚举的一些常见用法吗? 枚举介绍和使用 枚举主要用来定义一个有限集合内的固定值. 枚举定义方式如下: // 简单的定义 enum WeekEnum { MONDAY, TUESDAY } // 有属性的定义 enum StatusEnum { ENABLE("1

  • 详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着"该类支持排序".  即然实现Comparable接口的类支持排序,假设现在存在"实现Comparable接口的类的对象的List列表(

  • java中Statement 与 PreparedStatement接口之间的关系和区别

    Statement 和 PreparedStatement之间的关系和区别. 关系:PreparedStatement继承自Statement,都是接口     区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高 详解: 1.PreparedStatement:表示预编译的 SQL 语句的对象. 接口:public interface PreparedStatement extends Statement之间的继承关系    SQL 语句被预编译

  • java中的内部类内部接口用法说明

    简介 一般来说,我们创建类和接口的时候都是一个类一个文件,一个接口一个文件,但有时候为了方便或者某些特殊的原因,java并不介意在一个文件中写多个类和多个接口,这就有了我们今天要讲的内部类和内部接口. 内部类 先讲内部类,内部类就是在类中定义的类.类中的类可以看做是类的一个属性,一个属性可以是static也可以是非static的.而内部类也可以定义在类的方法中,再加上匿名类,总共有5种内部类. 静态内部类 我们在class内部定义一个static的class,如下所示: @Slf4j publi

  • java中的抽象类和接口定义与用法详解

    目录 一.抽象类 1.什么叫抽象类? 2.抽象类的特点: 3.成员特点: 二.接口 1.接口是什么? 2.接口的特点 3.接口的组成成员 4.类与抽象的关系: 5.抽象类与接口的区别: 一.抽象类 1.什么叫抽象类? 例如在生活中我们都把狗和猫归为动物着一类中,但当只说动物时,我们是不知道是猫还是狗还是其他的.所以动物就是所谓的抽象类,猫和狗则是具体的类了.因此在Java中,一个没有方法体的方法应该定义为抽象类,而类中有抽象方法,则必须为抽象类. 2.抽象类的特点: 抽象类与抽象方法必须用abs

  • Java中比较抽象类与接口的异同

    目录 一.抽象类 (一)概念 (二)抽象类和抽象方法 (三)使用抽象类的意义 二.接口 (一)概念 (二)语法 三.比较抽象类与接口 Q: 为什么有了抽象类还要接口?  Q: 如何确定在什么情况下应该使用接口,什么情况下应该使用类呢? 一.抽象类 (一)概念       在继承的层次结构中,每个新的子类都使类变得更加明确和具体.如果从一个子类向父类追溯,类就会变得更通用.更加不明确.类的设计应该确保父类包含它的子类的共同特征.有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例.这样的类

随机推荐