(面试题四)【JAVAse部分】集合框架

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34687582/article/details/78155359

【为了帮助各位和我一样面临找工作的朋友,我把java各个部分的重要知识点进行梳理和总结】
-------------------------------------------------------------------------------------------------------------------

(四)【基础知识梳理——JAVAse部分】Java中的集合框架

Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类。

这是我们常用的一些集合,因此我们也主要围绕这些来讲(其中黄色为最为重要的)。

一、什么是Collection接口?

①    Collection接口有两个主要的子接口List和Set,注意Map不是Collection的子接口。

②    Collection中可以存储的元素间无序可以重复组各自独立的元素, 即其内的每个位置仅持有一个元素,同时允许有多个 null元素对象。

二、什么是List接口?

List中存储的元素实现类排序,而且可以重复的存储相关元素。同时List接口又有两个常用的实现类ArrayList和LinkedList。

三、ArrayListLinkedList的有什么区别?

1. ArrayList:

可以这样理解ArrayList就是基于数组的一个线性表,只不过数组的长度可以动态改变而已。

特点:类似数组的形式进行存储,因此它的随机访问速度极快。

缺点:不适合于在线性表中间需要频繁进行插入和删除操作。因为每次插入和删除都需要移动数组中的元素。

需要注意的点:

①    如果在初始化ArrayList的时候没有指定初始化长度的话,默认的长度为10.

②    ArrayList在增加新元素的时候如果超过了原始的容量的话,ArrayList扩容ensureCapacity的方案为“原始容量 *3/2+1"。

③    ArrayList是线程不安全的,在多线程的情况下不要使用。(Vector可以代替ArrayList在多线程情况下使用)。

④    ArrayList的遍历方法:

List<String> list=new ArrayList<String>();
     list.add("Hello");
     list.add("World");
     list.add("HAHAHAHA");
     //第一种遍历方法使用foreach遍历List
     for (String str : list) {            //也可以改写for(int i=0;i<list.size();i++)这种形式
        System.out.println(str);
    }
 
     //第二种遍历,把链表变为数组相关的内容进行遍历
    String[] strArray=new String[list.size()];
    list.toArray(strArray);
    for(int i=0;i<strArray.length;i++) //这里也可以改写为foreach(String str:strArray)这种形式
    {
        System.out.println(strArray[i]);
    }
     
    //第三种遍历 使用迭代器进行相关遍历
     
     Iterator<String> ite=list.iterator();
     while(ite.hasNext())
     {
         System.out.println(ite.next());
     }

 2.LinkedList:

可以这样理解LinkedList就是一种双向循环链表的链式线性表,只不过存储的结构使用的是链式表而已。

特点为: 适合于在链表中间需要频繁进行插入和删除操作。

缺点: 随机访问速度较慢。查找一个元素需要从头开始一个一个的找。速度你懂的。

需要注意的点:

①   LinkedList和ArrayList的区别和联系

②   LinkedList的内部实现。(可以自己在网上去查看,往后可能我也会写在博客上)

③   LinkedList不是线程安全的:如果在对线程下面访问可以自己重写LinkedList,然后在需要同步的方法上面加上同步关键字 synchronized。

④   LinkedList的遍历方法 :

List<String> list=new LinkedList<String>();
    list.add("Hello");
    list.add("World");
    list.add("Hi");
    //LinkedList遍历的第一种方式使用数组的方式
    String[] strArray=new String[list.size()];
    list.toArray(strArray);
    for(String str:strArray)
    {
        System.out.println(str);
    }
    //LinkedList遍历的第二种方式
    for(String str:list)
    {
        System.out.println(str);   
    }

五、什么是Set接口

Set接口也是Collection接口的一个常用子接口。Set接口区别于List接口的特点在于:

Set中的元素实现了不重复,有点象集合的概念,无序,不允许有重复的元素,最多允许有一个null元素对象。需要注意的是:虽然Set中元素没有顺序,但是元素在set中的位置是有由该元素的HashCode决定的,其具体位置其实是固定的。(Set集合中的重复规定和hashcode与equals方法直接相关。)

六、什么是HashSet接口?

HashSet的底层是基于HashMap来实现的,需要注意下面几个特点:

①   HashSet中存放null值:HashSet中时允许出入null值的,但是在HashSet中仅仅能够存入一个null值哦。

②   HashSet中存储元素的位置是固定的:HashSet中存储的元素的是无序的,但是由于HashSet底层是基于Hash算法实现 的,使用了hashcode,所以HashSet中相应的元素的位置是固定的。

七、什么是Map接口?

说到Map接口的话大家也许在熟悉不过了。Map接口实现的是一组Key-Value的键值对的组合。 Map中的每个成员方法由一个关键字(key)和一个值(value)构成。Map接口不直接继承于Collection接口,因为它包装的是一组成对的“键-值”对象的集合,而且在Map接口的集合中也不能有重复的key出现,因为每个键只能与一个成员元素相对应。在我们的日常的开发项目中,我们无时无刻不在使用着Map接口及其实现类。Map有两种比较常用的实现:HashMap和TreeMap。

八、HashMap和HashTbale的区别是什么?

HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性同步,以及速度:

①    HashMap几乎可以等价于Hashtable,除了HashMap是synchronized的,并可以接受null(HashMap可以接受为null的 键值(key) 和值(value),而Hashtable则不行)。

②    HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一 个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是 HashTable的替代,比HashTable的扩展性更好。

③    另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以 当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身 的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。 这条同样也是Enumeration和Iterator的区别。

④    由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要 单一线程,那么使用HashMap性能要好过Hashtable。

⑤    HashMap不能保证随着时间的推移Map中的元素次序是不变的。




阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页