集合】【Java基础】java常用集合的区别

2021-01-28 20:51发布

6条回答
灰机带翅膀
2楼 · 2021-01-29 10:23

list元素可重复,set元素唯一,map存储键值对。

ArrayList

实现原理是数组,是非线程安全的,同样效果线程安全使用vector。

LinkedList

实现原理是链表,是非线程安全的,线程安全使用ConcurrentLinkedQueue。

HashSet

实现原理是哈希表,元素是无序的。

TreeSet

实现原理是二叉树,可利用实现的 Comparable接口对元素进行排序。

HashMap

实现原理是数组加链表 拉链法,是非线程安全的。

HashTable

实现原理是“拉链法”实现的散列表,Hashtable是线程安全的。

TreeMap

实现原理是红黑树,可利用实现的 Comparable接口对元素进行排序。


大冬瓜
3楼 · 2021-01-29 10:26

一. Java集合框架概述
Java平台包括集合框架。 集合框架是用于表示和操作集合的统一体系结构,使集合可以独立于实现细节进行操作。集合框架主要具有以下优势:
1、通过提供数据结构和算法减少编程工作
2、提供高性能实现的数据结构和算法来提高程序性能
3、通过建立共同语言来回传递集合,提供不相关API间的互操作性
4、通过学习特定的集合API减少学习API的成本
5、减少了设计和实现集合API的工作量
6、通过为集合和算法提供标准接口实现软件重用
二、 集合的关系
下图是经常使用的集合,他们之间的关系如图:

这里写图片描述

三、 各个集合的特点及使用场景

1、list:(元素有放入顺序,元素可重复)可以迭代也可以直接根据下标获取元素。list接口有两个常用子类,一个是arraylist,一个是linkedList。
1.1、ArrayList : 基于数组实现的非线程安全的集合。查询元素快,插入,删除中间元素慢。
1.2、LinkedList : 基于链表实现的非线程安全的集合。查询元素慢,插入,删除中间元素快。
还有Vector,CopyOnWriteArrayList,二者不经常使用,此处不作介绍。

2、set:(元素无放入顺序,元素不可重复,重复元素会覆盖掉),只能用迭代获取元素。不能直接遍历集合获取。set接口下的常用子类说明;
2.1、 HashSet: HashSet是Set接口的典型实现,HashSet使用HASH算法来存储集合中的元素,因此具有良好的存取和查找性能。当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值决定该对象在HashSet中的存储位置。值得主要的是,HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法的返回值相等。
2.2、 SortedSet:此接口主要用于排序操作,即实现此接口的子类都属于排序的子类。
2.2.1、TreeSet:TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。

3、map: map的主要特点是键值对的形式,一一对应,且一个key只对应1个value。其常用的map实现类主要有HashMap、HashTable、TreeMap、ConcurrentHashMap、LinkedHashMap、weakHashMap等等。其最常使用的有:
3.1、HashMap使用位桶和链表实现(最近的jdk1.8改用红黑树存储而非链表),它是线程不安全的Map,方法上都没有synchronize关键字修饰,但实现效率较快。
3.2、hashTable是线程安全的一个map实现类,它实现线程安全的方法是在各个方法上添加了synchronize关键字。但实现效率较慢。
3.3、ConcurrentHashMap,这个map实现类是在jdk1.5中加入的,其在jdk1.6/1.7中的主要实现原理是segment段锁,它不再使用和HashTable一样的synchronize一样的关键字对整个方法进行枷锁,而是转而利用segment段落锁来对其进行加锁,以保证Map的多线程安全。
其实可以理解为,一个ConcurrentHashMap是由多个HashTable组成,所以它允许获取不用段锁的线程同时持有该资源,segment有多少个,理论上就可以同时有多少个线程来持有它这个资源。他吸收了hashmap与hashtable二者的优点。
具体有关Map的介绍,这个链接比较清晰,感兴趣去的可以了解一下
以上就是我对最常使用集合的了解,具体使用什么集合类型进行数据获取,可以根据他的优缺点进行实际得考虑。从而提高程序性能。


爱学习的小巴
4楼 · 2021-01-29 10:40

相同点:
都是用来存储数据的。
不同点:
1.集合带array的,底层由数组实现,还有一部分由其他方式(树、链表等)实现。
2.数组大小固定,而集合没有固定的大小,更方便存储。
3.数组只能放一种类型,集合不考虑泛型可以存多种类型。
4.集合放基本类型是通过装箱拆箱(包装类与基本数据类型的转换)来实现的。(写泛形的时候不能用int,而要用Integer)

梦到内河_
5楼 · 2021-01-29 15:06

相同点:
都是用来存储数据的。
不同点:
1.集合带array的,底层由数组实现,还有一部分由其他方式(树、链表等)实现。
2.数组大小固定,而集合没有固定的大小,更方便存储。
3.数组只能放一种类型,集合不考虑泛型可以存多种类型。
4.集合放基本类型是通过装箱拆箱(包装类与基本数据类型的转换)来实现的。(写泛形的时候不能用int,而要用Integer)

py大白
6楼 · 2021-02-01 14:18

list元素可重复,set元素唯一,map存储键值对。

ArrayList

实现原理是数组,是非线程安全的,同样效果线程安全使用vector。

LinkedList

实现原理是链表,是非线程安全的,线程安全使用ConcurrentLinkedQueue。

HashSet

实现原理是哈希表,元素是无序的。

TreeSet

实现原理是二叉树,可利用实现的 Comparable接口对元素进行排序。

HashMap

实现原理是数组加链表 拉链法,是非线程安全的。

HashTable

实现原理是“拉链法”实现的散列表,Hashtable是线程安全的。

TreeMap

实现原理是红黑树,可利用实现的 Comparable接口对元素进行排序。


征戰撩四汸
7楼 · 2022-01-11 15:23

1、list:(元素有放入顺序,元素可重复)可以迭代也可以直接根据下标获取元素。list接口有两个常用子类,一个是arraylist,一个是linkedList。 
ArrayList : 基于数组实现的非线程安全的集合。查询元素快,插入,删除中间元素慢。 
LinkedList : 基于链表实现的非线程安全的集合。查询元素慢,插入,删除中间元素快。 
还有Vector,CopyOnWriteArrayList,二者不经常使用,此处不作介绍。

2、set:(元素无放入顺序,元素不可重复,重复元素会覆盖掉),只能用迭代获取元素。不能直接遍历集合获取。set接口下的常用子类说明; 
 HashSet: HashSet是Set接口的典型实现,HashSet使用HASH算法来存储集合中的元素,因此具有良好的存取和查找性能。当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值决定该对象在HashSet中的存储位置。值得主要的是,HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法的返回值相等。 
SortedSet:此接口主要用于排序操作,即实现此接口的子类都属于排序的子类。 
reeSet:TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。

3、map: map的主要特点是键值对的形式,一一对应,且一个key只对应1个value。其常用的map实现类主要有HashMap、HashTable、TreeMap、ConcurrentHashMap、LinkedHashMap、weakHashMap等等。其最常使用的有: 
HashMap使用位桶和链表实现(最近的jdk1.8改用红黑树存储而非链表),它是线程不安全的Map,方法上都没有synchronize关键字修饰,但实现效率较快。 
hashTable是线程安全的一个map实现类,它实现线程安全的方法是在各个方法上添加了synchronize关键字。但实现效率较慢。 
ConcurrentHashMap,这个map实现类是在jdk1.5中加入的,其在jdk1.6/1.7中的主要实现原理是segment段锁,它不再使用和HashTable一样的synchronize一样的关键字对整个方法进行枷锁,而是转而利用segment段落锁来对其进行加锁,以保证Map的多线程安全。 


相关问题推荐

  • 回答 5

    Java提供的众多集合类由两大接口衍生而来:Collection(单列集合)接口和Map(双列集合)接口一 、Collection接口Collection接口定义了一个包含一批对象的集合。接口的主要方法包括:size() - 集合内的对象数量add(E)/addAll(Collection) - 向集合内添加单个/批...

  • 回答 5

    集合的话,分单列集合和双列集合,单列集合的话就是Collection接口,下面有两个子接口:Set和List。其中呢Set集合是一个不可有重复元素的无序集合;List是一个有序的集合,可以包含重复元素并且提供了按索引访问的方式。双列集合的话就是Map接口,它的实现类...

  • 回答 3

    list元素可重复,set元素唯一,map存储键值对。ArrayList实现原理是数组,是非线程安全的,同样效果线程安全使用vector。LinkedList实现原理是链表,是非线程安全的,线程安全使用ConcurrentLinkedQueue。HashSet实现原理是哈希表,元素是无序的。TreeSet实现...

  • 回答 5

    Java集合框架为程序员提供了预先包装的数据结构和算法来操纵他们。集合是一个对象,可容纳其他对象的引用。集合接口声明对每一种类型的集合可以执行的操作。集合框架的类和接口均在java.util包中。任何对象加入集合类后,自动转变为Object类型,所以在取出的...

  • 回答 11

    Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列:有序,可重复的;3、Set集合:不可重复;4、Map映射:无序,键唯一,值不唯一。

  • 回答 6

    /** * 使用Lambda表达式实现过滤统计 */ public void countListItemNum(List list) {// 使用Map存储List中每个元素的数量:// key:元素   value:数量 Map result = new HashMap(); list.forEach(item->{ long count = list.stream().filter......

没有解决我的问题,去提问