首页 > 编程语言 >Java中的集合类

Java中的集合类

时间:2024-08-25 21:26:02浏览次数:10  
标签:Java List System println add 集合 new out

两大集合接口

Collection

  • 单列集合接口,它是所有单列集合类的根接口。
  • Collection集合有两个重要的子接口,分别是List和Set
  • List集合的特点是元素有序、可重复。该接口的主要实现类有ArrayList和LinkedList
  • Set集合的特点是元素无序并且不可重复。该接口的主要实现类有HashSet和TreeSet

相关方法 

Map

  • 双列集合接口,用于存储具有键(key)、值(Value)映射关系的元素
  • 它存储了一组键值对的数据,其中每个键都是唯一的。通过键可以快速地访问对应的值
  • Map接口的主要实现类有HashMap和TreeMap
CollectionListArrayList使用数组实现的动态数组
LinkedList使用链表数据结构来存储元素
setHashSet 使用哈希表作为其底层数据结构
TreeSet使用红黑树的数据结构来存储元素
Map<K,V>AbstractMap<K,V>HashMap<K,V> 使用数组+链表+红黑树的结构
TreeMap<K,V>使用红黑树,TreeMap实现了有序的键值对存储和检索
ConcurrentHashMap<K,V>使用数组+链表+红黑树的组合实现的
Dictionary<K,V>HashTable<K,V>使用数组和链表的结合方式

ArrayList与LinkedList

ArrayList

  • 使用数组实现的动态数组,它实现了可变大小的数组
  • 提供快速的随机访问,但插入和删除操作可能较慢(需要移动元素)

LinkedList

  • 使用链表数据结构来存储元素
  • 提供快速的插入和删除操作,但随机访问较慢(需要顺序遍历)

public class ListTest {
    public static void main(String[] args) {
        //ArrayList随机访问
        List<String> arrayList = new ArrayList<>();
        arrayList.add("Lucy");
        arrayList.add(1, "Tom");
        System.out.println(arrayList);

        //多用于快速随机访问
        String rst = arrayList.get(1);
        System.out.println(rst);

        //LinkedList插入操作
        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("Kitty");
        //多用于插入与删除操作,尤其是在大数据中
        linkedList.add(0, "LiSi");
        System.out.println(linkedList);
    }
}

HashSet、LinkedHashSet与TreeSet

  • HashSet:无序,快速查找,但是不支持元素的有序遍历
  • LinkedHashSet:保持插入顺序,查询速度和HashSet相当
  • TreeSet:保持自然顺序,查找速度慢于前两者,但是可以有序遍历
public class SetTest {
    public static void main(String[] args) {
        //HashSet快速查找
        Set<Integer> hashSet = new HashSet<>();
        hashSet.add(20);
        hashSet.add(40);
        hashSet.add(42);
        //快速查找
        boolean contains1 = hashSet.contains(22);
        boolean contains2 = hashSet.contains(42);
        System.out.println(contains1);
        System.out.println(contains2);

        //LinkedHashSet保持插入顺序
        Set<String> linkedHashSet = new LinkedHashSet<>();
        linkedHashSet.add("apple");
        linkedHashSet.add("banana");
        linkedHashSet.add("cherry");
        //按插入顺序遍历
        Iterator<String> iterator = linkedHashSet.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

        //TreeSet自然排序
        TreeSet<Integer> treeSt=new TreeSet<>();
        treeSt.add(0);
        treeSt.add(2);
        treeSt.add(8);
        //获取第一个(最小的)元素
        Integer first = treeSt.first();
        Integer last = treeSt.last();
        System.out.println(first);
        System.out.println(last);
    }
}

HashMap 、TreeMap与ConcurrentHashMap

  • HashMap<K,V>用于存储键值对,并且不保证顺序。它基于哈希表实现,提供了快速的插入、删除和查找操作。
  • TreeMap<K,V>用于存储有序的键值对。它基于红黑树实现,对插入、删除、查找等操作都提供了较高的性能
  • ConcurrentHashMap<K,V>用于用于存储有序的键值对,多线程安全场景,不同的线程可以同时访问不同的段,并发操作不会产生冲突
  • EnumMap与EnumSet专门为枚举类型设计的集合,内部使用数组而不是哈希表
enum Color {RED, GREEN, BLUE}

public class MapTest {
    public static void main(String[] args) {
        //使用HashMap
        Map<String, String> hashMap = new HashMap<>();
        hashMap.put("Java", "JVM");
        hashMap.put("C#", "WINFOEM");

        //使用LinkedHashMap
        Map<String, String> linkedHashMap = new LinkedHashMap<>();
        linkedHashMap.put("Java", "NORMAL");
        linkedHashMap.put("C#", "EASY");

        //使用TreeMap
        Map<String, String> treeMap = new TreeMap<>();
        treeMap.put("Java", "DEPT");
        treeMap.put("C#", "COMPANY");

        //使用EnumMap
        Map<Color, String> enumMap = new EnumMap<>(Color.class);
        enumMap.put(Color.RED, "Ruby");
        enumMap.put(Color.GREEN, "Emerald");

        //使用EnumSet
        Set<Color> enumSet = EnumSet.of(Color.RED, Color.BLUE);

    }

}

集合的操作与算法

遍历:增强型for循环,迭代器、Java8的stream流

搜索:使用List的indexOf和lastIndexOf方法来搜索特定元素

排序:使用Collections类或者Java8的流来对集合排序

public class OperateTest {
    public static void main(String[] args) {
        //使用增强型for循环遍历List
        List<String> list = new ArrayList<>();
        list.add("Tom");
        list.add("Nancy");
        for (String language : list) {
            System.out.println(language);
        }

        //使用迭代器遍历Set
        Set<String> set = new HashSet<>();
        set.add("SuSan");
        set.add("Mark");
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

        //使用Java 8 Stream遍历Map
        Map<String, String> map = new HashMap<>();
        map.put("Java", "JVM");
        map.put("C#", "NC");
        map.forEach((key, value) -> System.out.println(key + " runs on " + value));

        //搜索
        List<String> list1 = Arrays.asList("Java", "Kotlin", "Scala", "Groovy");
        int index = list1.indexOf("Kotlin"); // 返回1
        System.out.println(index);


        //使用Collections.sort()对List进行排序
        List<String> list2 = new ArrayList<>();
        list2.add("Tom");
        list2.add("Kotlin");
        Collections.sort(list2);
        System.out.println(list2);

        //使用Java 8 Stream对List进行自定义排序
        List<String> list3 = new ArrayList<>();
        list3.add("Tom");
        list3.add("Ace");
        List<String> sortedList = list3.stream()
                .sorted((s1, s2) -> s1.compareTo(s2))
                .collect(Collectors.toList());

        System.out.println(sortedList);

    }
}

集合转换:可以使用Collections类或Java 8的流来进行集合转换

不可变集合:指一旦创建后就不能被修改的集合,它们提供了更好的线程安全性

public class Operate1Test {
    public static void main(String[] args) {
        //将List转换为Set
        List<String> list = Arrays.asList("Java", "Kotlin", "Java");
        Set<String> set = new HashSet<>(list);
        System.out.println(set);

        //使用Java 8 Stream将List转换为Map
        Map<String, Integer> map = list.stream()
                .collect(Collectors.toMap(
                        String::toString,
                        s -> 1,
                        (existing, replacement) -> existing
                ));
        System.out.println(map);

        //创建不可变List
        List<String> immutableList = Collections.unmodifiableList(
                new ArrayList<>(Arrays.asList("Java", "Kotlin"))
        );
        System.out.println(immutableList);

        //创建不可变Set
        Set<String> immutableSet = Collections.unmodifiableSet(
                new HashSet<>(Arrays.asList("Java", "Kotlin"))
        );
        System.out.println(immutableSet);

    }
}

Collections和Arrays类提供了多种静态方法来操作集合和数组,翻转、排序、二分查找和填充等算法

public class Operate2Test {
    public static void main(String[] args) {
        //集合
        List<String> list = Arrays.asList("Java", "C#", "PHP");
        Collections.reverse(list); // 翻转List
        System.out.println(list);
        Collections.shuffle(list); // 随机打乱List
        System.out.println(list);

        //数组
        Integer[] array = {3, 1, 4, 1, 5};
        Arrays.sort(array); // 排序数组
        int index = Arrays.binarySearch(array, 4); // 二分查找
        System.out.println(index);
    }
}

标签:Java,List,System,println,add,集合,new,out
From: https://blog.csdn.net/m0_46359551/article/details/140806492

相关文章

  • Java泛型机制详解
    引入泛型的原因泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。引入泛型的意义......
  • ipset:保存集合内容到文件
    一,保存到文件1,创建集合:[root@blog~]#ipsetcreatemysethash:ip添加ip:[root@blog~]#ipsetaddmyset192.168.1.100[root@blog~]#ipsetaddmyset192.168.1.101[root@blog~]#ipsetaddmyset192.168.1.102查看集合信息:[root@blog~]#ipsetlistmyset......
  • JavaSE基础知识分享(十五)
    写在前面今天继续讲Java中的枚举和正则表达式的的知识!这部分说完,JavaSE部分的知识就结束了!枚举概述枚举类用于描述有限个对象的类。自JDK1.5起引入了对枚举类型的原生支持,简化了枚举的定义和使用。下面是JDK1.5之前和之后的枚举类定义方式的比较。JDK1.5之前的写法......
  • Java基础课设,大作业,小游戏--------数字华容道[无偿提供源代码]100%可以运行
    成品游戏胜利1.准备图片0.png1.png2.png3.png4.png5.png6.png7.png8.png9.png10.png11.png12.png13.png......
  • Java笔试面试题之多线程常见考点总结
    Java多线程面试题涵盖了Java多线程编程的多个重要方面,主要考察面试者对Java并发编程的理解和应用能力。以下是常见的考点总结:基本概念与区别:进程与线程的区别:进程是资源分配的基本单位,线程是CPU调度的基本单位,线程共享进程资源。Java堆与栈的区别:堆用于存储对象实例,栈用......
  • 【API渗透】资料集合
    今天给大家分享一些非常优质的API渗透测试学习资源。主要包含以下内容:API概述及其分类API渗透测试优质文章API渗透资料聚合项目国外免费的API安全课程API渗透检查列表ChecklistAPI测试字典开源API安全靶场常用API渗透测......
  • 【JAVA安全】JOOQ框架常见SQL注入场景
    一、关于JOOQ1.1核心接口1.2常见参数绑定方式二、常见SQL注入场景2.1PlainSQLAPI以下文章来源于亿人安全,作者tkswiftyJOOQ是一个ORM框架,利用其生成的Java代码和流畅的API,可以快速构建有类型约束的安全的SQL语句。本文主要介绍该框架常见的SQ......
  • C/C++、Java、Python全面比较
    以下是对C/C++、Java、Python三种编程语言的全面比较,以表格形式呈现:特性/语言C/C++JavaPython类型系统静态类型静态类型动态类型内存管理手动管理自动管理(垃圾回收)自动管理(垃圾回收)编译/解释编译型编译型(通过JVM解释执行)解释型性能高(直接编译成机器码)中等(通过JIT优化)较低(解......
  • 56个JavaScript 实用工具函数助你提升开发效率!
    今天来看看JavaScript中的一些实用的工具函数,希望能帮助你提高开发效率!整理不易,如果觉得有用就点个关注鼓励一下吧!1.数字操作(1)生成指定范围随机数export const randomNum = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;(2)数字千分......
  • Java 集合(小白版)
     集合是整个JavaSE乃至于JavaEE很重要的知识点基本数据类型(8个):short,int,long,float,double,byte,char,boolean引用数据类型(3个):类,接口,数组数组(3种声明方式):int[]arr={7,8,9}      int[]arr=newint[3]      int[]arr=newint[]{1,2,3}简单说集合......