Java集合框架汇总

Java集合框架汇总,第1张

Java集合框架汇总 1.集合框架一览

 上面两图为网上资源,个人觉得画的很好信息量很全面,如侵权请联系我删除

2.集合框架简单理解(常见集合)

单列集合

2.1.List接口的常见实现类:

■ArrayList:底层是数组实现,不同步,线程不安全,相较于linkedList具有查询快, *** 作慢的特点

■linkedList:底层是链表,不同步,线程不安全,相较于ArrayList具有查询慢, *** 作快的特点

■Vector:一种老的动态数组(简单理解),线程同步,效率很低,不赞成使用

这里就牵扯到三道常问的面试题

1.ArrayList和linkedList异同

答:

1.两者都是不同步的,不保证线程安全

2.ArrayList底层为数组,linkedList使用的是双向链表

3.ArrayList查询快(数组索引的缘故),时间复杂度为O(1), *** 作(增删改慢),而linkedList查询慢,时间复杂度为O(n), *** 作快

4.ArrayList在列表尾部会预留部分空间,linkedList的空间浪费更大,因为链表的每个元素都要存放(数据以及直接前驱,直接后继)

2.ArrayList和Vector异同

答:

1.两者底层都是通过数组实现的

2.前者线程不安全,后者安全

3.两者扩容机制不同,Vector可以设置增长因子,而ArrayList不能

4.ArrayList总体高效,而Vector效率很低

3.数组和集合的区别(简单的往往容易忽视)

1.数组需要声明存储类型,集合不声明。

2.数组是静态的,一旦创建了就不能改变容量。集合可以动态扩容。

3.数组查询效率高且但 *** 作起来很麻烦,集合提供很多的成员方法, *** 作起来很方便。

4.数组只能存放一种数据类型,集合存放的类型可以是多种(不加泛型时添加的类型是Object)。

2.2.Set接口的常见实现类:

■HashSet:底层结构采用哈希表实现,元素无序且唯一,效率高,但线程不安全,可存储null,要想保证元素的唯一性需要给存储的元素类型重写hashCode()和equals()两个方法。源码中,HashSet底层就是基于HashMap实现的,只有clone(),writeObject()等几个方法是其自己实现的,其余都是直接调用HashMap中的方法

        ■linkedHashSet:底层数据结构采用链表和哈希表共同实现,继承了HashSet的优点,链表则保证了元素的存储顺序,线程不安全,效率高。

■TreeSet:底层数据采用红黑树来实现,TreeSet会给存储的元素排序(元素唯一,要重写hashCode和equals),排序根据构造方法的不同,分为自然排序和比较器排序,两种都需要重写compareTo方法

自然排序(懒人引入lombok)

public class People implements Comparable{
    private Integer id;
    private String name;
    private Integer age;

    
    @Override
    public int compareTo(People people) {
        //升序
       
       //降序
        if (this.age>people.age){
            return -1;
        }else if(this.age 

 比较器排序

@Test
    public void t2(){
        TreeSet set = new TreeSet<>(new Comparator() {//匿名内部类
            @Override
            public int compare(Student o1, Student o2) {
                if (o1.getAge()>o2.getAge())
                    return 1;
                else if(o1.getAge() 
 2.3.单列集合(List&Set总结) 

1.两者都继承了Collection接口

2.有序性:List保证按插入顺序排序,Set存储和取出顺序不一致

3.唯一性:List可以重复,Set元素唯一

4.获取元素:List通过索引直接获取,Set不能

        遍历方式

1. 使用iterator()方法遍历集合,使用while循环,iter.hasNext(),iter.next()...

2.增强for循环直接遍历(常用)

3.对List:普通for循环遍历,需知道初始条件和终止条件

2.4.双列集合(key:value形式存储)

双列集合 

Map接口有四个比较重要的实现类,分别是HashMap、linkedHashMap、TreeMap和Hashtable

■HashMap: 采用哈希表,key无序且唯一,value可重复,非同步,线程不安全,最多只能有一个key为null

        ■linkedHashMap:采用链表和哈希表,特征和HashMap大致相同,但可以保证key的插入顺序

■TreeMap:采用红黑树算法,key唯一且按照指定排序进行排序,若compareTo的返回值为0,则判断key重复,分为自然排序和定制排序(排序key),TreeMap没有调优选项,因为该树总处于平衡状态

■Hashtable:采用哈希表算法,线程安全,注意Hashtable的key和value都不能为null

 注意:Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。
区别及面试题我放在下文面试热题中

遍历方式
public static void main(String[] args) {

        Map map = new HashMap();
        map.put(1, "Jordan");
        map.put(2, "Kobe");
        map.put(3, "Pual");
        map.put(4, "Harden");


        // 第一种:通过Map.keySet遍历key和value
        for (Integer key : map.keySet()) {
            System.out.println(key + ":" + map.get(key));
        }

        // 第二种:通过Map.entrySet使用iterator遍历key和value

        Iterator> it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry entry = it.next();
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }

        // 第三种:通过Map.entrySet遍历key和value
        for (Map.Entry entry : map.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }

    }
3.面试热题 1.ArrayList和linkedList异同(往上翻) 2.ArrayList和Vector异同(往上翻) 3.数组和集合的区别(往上翻)

4.HashMap和Hashtable区别

        1.Hashtable的方法是同步的,线程安全,HashMap的方法不是同步的,线程不安全

        2.Hashtable的key不允许为null,而HashMap可以

        3.HashMap效率最高,Hashtable效率最低

        4.如果保证线程安全,Hashtable也不太常用,会用ConcurrentHashMap(了解)

5.List,Set,Map三者的区别(从优点入手)

        1.List:顺序,支持快速随机查询,效率高

        2.Set:唯一,去重的优点,不会有重复的元素或对象

        3.Map:类似字典,通过线索找元素,不同的key可以引用相同对象,但key不能相同

6.ArrayList扩容机制(这个不太好理解,要去看源码)

        辅助:ArrayList扩容机制(基于jdk1.8)_烟雨星空的博客-CSDN博客_arraylist扩容机制

7.HashSet,linkedHashSet,TreeSet对比

HashSet:

不能保证元素插入顺序一致,非同步,集合元素可以是null,但最多只有一个

HashSet判断两个元素相等的标准是通过equals方法比较相等,且两个对象的HashCode()返回值相等,如果要把一个对象放入HashSet中,需要重写该对象类型的equals和hashCode方法

TreeSet:(TreeSet类型是J2SE中唯一可实现自动排序的类型)

TreeSet可确保集合元素处于排序状态,其支持自然排序和定制排序两种

自然排序需要对象类型实现Comparable接口。该接口中compareTo(Object obj)方法返回一个整数值,实现了该接口的对象就可比较大小,从而排序

定制排序需使用Comparator接口,实现int  compare(x,y)方法

linkedHashSet:

linkedHashSet和HashSet一样,也算根据元素的hash值来决定排序位置,但它底层用到了链表为何元素的次序,这样看起来元素像是插入顺序保存的(注意,看起来),遍历的时候就是插入时候的顺序

8.linkedHashMap和HashMap,TreeMap对比

HashMap:

最常用的Map集合,单列集合根据元素的Hash值来存储元素,HashMap则是根据key的hash值存储,访问速度很快,遍历时数据顺序随机

linkedHashMap:

 和HashMap很像,只不过其底层的链表会保存插入顺序,通常情况下遍历要比HashMap慢

特殊:当HashMap容量很大,实际数据少,遍历起来要比linkedHashMap慢些,因为linkedHashMap的遍历速度只和实际数据有关,和容量无关,HashMap和容量有关(这里还是卷些为好)

TreeMap:

参考TreeSet,TreeMap采用红黑树算法,可以将保存的数据根据key排序, 默认按照key键的升序排列,注意这里是遍历出来的元素是排好序的(好好理解)

9.HashSet如何检查重复

这里要简单说下过程,当添加元素的时候,HashSet会先根据对象的hash值来判断有没有和别的元素相同,如果没有则可以加入,这里根据hash值也会判断加入的位置。如何发现hash值一致的对象,这时就要调用equals方法来检查对象是否真的相同,如果相同则不会添加

可以理解为两次筛选

10.HashMap底层实现

这个依旧是个很复杂的问题,需要自己去看去理解源码

在这里做些总结可以记住,以后有时间再去理解源码

底层原理:HashMap是由数组+链表组成,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。HashMap综合了数组和链表的优点,即寻址容易修改也容易.

相关问题:

1.负载因子   0.75,即当数组元素个数达到数组容量的75%进行扩容

2.为什么设为0.75   太小会造成空间浪费,太大会造成hash冲突过多,尽可能找黄金值

3.数组默认初始长度为16

4.每次扩容都是都是2倍,(个人理解)因为计算机底层是2进制数据,2的n次方可以减少hash冲突

5.什么时候结构变成红黑树?  链表长度>=8且hash表中的元素>=64(元素个数<64扩容)

6.什么是hash冲突   添加元素的时候,key的hash值一样

7.怎么解决hash冲突 ?    用链表或者红黑树

11.comparable和Comparator的区别

comparable出自java.lang包 它有一个 compareTo(Object obj)方法用来排序

comparator出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序

集合框架原本就是面试中的高频热点,集合种类繁多,知识点琐碎,面试问题多,本篇只是列举了一些,还希望各位不要忽视基础,多下功夫,多拿salary

生活原本艰难,希望学习能简单一些,一篇简单总结希望能帮到你们

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5696287.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存