Java基础知识点汇总 三 集合

一、Java中的集合

        Collection 框架的层次结构。java.util包包含Collection 框架的所有类和接口。Java 集合框架的核心元素——接口、实现、聚合操作和算法。

        Java的集合类定义在java.util包中,支持泛型,主要提供了3种集合类,包括ListSetMap。Java集合使用统一的Iterator遍历,尽量不要使用遗留接口。

Java 中的集合层次结构

1、List

        List是最基础的一种集合:它是一种有序列表。在实际应用中,需要增删元素的有序列表,我们使用最多的是ArrayList

2、Map

        Map这种键值(key-value)映射表的数据结构,作用就是能高效通过key快速查找value(元素)。

3、Set

        如果我们只需要存储不重复的key,并不需要存储映射的value,那么就可以使用Set。

4、Queue

        队列(Queue)是一种经常使用的集合。Queue实际上是实现了一个先进先出(FIFO:First In First Out)的有序表。

5、Iterator

        把这种通过Iterator对象遍历集合的模式称为迭代器。使用迭代器的好处在于,调用方总是以统一的方式遍历各种集合类型,而不必关系它们内部的存储结构。

        如果我们自己编写了一个集合类,想要使用for each循环,只需满足以下条件:

        (1)集合类实现Iterable接口,该接口要求返回一个Iterator对象;
        (2)用Iterator对象迭代集合内部数据。

6、Properties

        用Properties读取配置文件非常简单。Java默认配置文件以.properties为扩展名,每行以key=value表示,以#课开头的是注释。以下是一个典型的配置文件:

# setting.properties

last_open_file=/data/hello.txt
auto_save_interval=60

        Properties内部本质上是一个Hashtable。 

        可以从文件读取,也可以从ar包中读取。

7、Collections

        Collections是JDK提供的工具类,同样位于java.util包中。它提供了一系列静态方法,能更方便地操作各种集合。

        创建空集合;

        创建单元素集合;

        创建不可变集合;

        排序/洗牌等操作。

        把线程不安全的集合变为线程安全的集合

8、例题

1、问:你知道那些遗留类和接口?

答: 遗留类:Hashtable、Vector、Stack;不应该继续使用。

        遗留接口:Enumeration<E>:已被Iterator<E>取代。

2、问:Set 和 Map 有什么区别?

答: Set 仅包含值,而 Map 包含键和值。
        Set 包含唯一值,而 Map 可以包含具有重复值的唯一键。
        Set 包含单个空值,而 Map 可以包含单个空键和 n 个空值。


3、问:List, Set, Map 是否继承自 Collection 接口?

答: List,Set 是,Map 不是

4、问:数组和集合之间的主要区别是什么?

答:(1)数组始终是固定大小的,即用户不能根据自己的需要或在运行时增加或减少数组的长度,但在 Collection 中,大小可以根据需要动态更改。
        (2)数组只能存储同种或相似类型的对象,但在Collection中可以存储异构对象。
        (3)数组不提供现成的如排序、搜索方法等,但 Collection 包括现成的使用方法。

5、问:Iterator 和 ListIterator 有什么区别?

答:Iterator 仅向前遍历元素,而 ListIterator 向前和向后遍历元素。

6、问:ConcurrentHashMap、HashMap、HashTable有什么区别?

答:(1)包不同java.util.HashMap; java.util.concurrent.ConcurrentHashMap;

        (2)ConcurrentHashMap实现了 ConcurrentMap 以及 Serializable 接口。此类是线程安全的HashMap。 

        (3)Hashtable 继承自 Dictionary 类,底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化。

7、问:Set 里的元素是不能重复的,是怎么保证不重复的?

答:Set 里的元素是不能重复的,在put的时候,会进行hash和值的比较,如果hash不存在,则允许存入。如果hash码值相同,且equles判断相等,说明元素已经存在,不存;如果hash码值相同,且equles判断不相等,说明元素不存在,存;

8、问:ArrayList 和 LinkedList 有什么区别?

答:(1)ArrayList 使用动态数组;LinkedList 使用双向链表。

       (2)ArrayList 更适合存储,读取更快;LinkedList 操作更快。

        (3)ArrayList 提供随机访问;LinkedList 不提供随机访问。

9、问:HashMap 和 TreeMap 有什么区别?

答:HashMap 保持无序,而 TreeMap 保持升序。
        HashMap 是通过哈希表实现的,而 TreeMap 是通过 Tree 结构实现的。
        HashMap 可以按 Key 或 value 排序,而 TreeMap 可以按 Key 排序。
        HashMap 可能包含具有多个空值的空键,而 TreeMap 不能包含空键但可以具有多个空值。

10、问:如何同步ArrayList?

答:(1)Collections.synchronizedList

        (2)使用CopyOnWriteArrayList,CopyOnWriteArrayList就是线程安全版本的ArrayList。

import java.util.*;  
public class SyncronizeArrayList {  
    public static void main(String args[]) {  
        // Non Synchronized ArrayList   
        List<String> fruitList = new ArrayList<String>();  
  
        fruitList.add("Mango");  
        fruitList.add("Banana");  
        fruitList.add("Apple");  
        fruitList.add("Strawberry");  
        fruitList.add("Pineapple");  
  
        // 同步 ArrayList 
        furitList = Collections.synchronizedList(fruitList);  
  
        // 使用同步块来避免非确定性行为  
        synchronized (fruitList) {  
            Iterator<String> itr = fruitList.iterator();  
            while (itr.hasNext()) {  
                System.out.println(itr.next());  
            }  
        }  
    }  
}  

11、问:如何使Java ArrayList 只读? 

答:通过调用 Collections.unmodifiableCollection() 方法获取 java ArrayList Read-only。当我们将 ArrayList 定义为只读时,我们无法通过 add()、remove() 或 set() 方法对集合进行任何修改。

12、问:以下哪个说法错误? 

    (A)java.util.List可用来存放一组按索引位置存放的有序的元素。
    (B)java.util.Set集合中允许存放Java对象以及基本类型的数据。
    (C)当一个线程执行Thread类的sleep()方法开始睡眠时,不会释放所占有的对象锁。
    (D)当Java虚拟机初始化一个类时,如果它的父类还没有初始化,那么会先初始化它的父类。

答:B;java.util.Set集合中只允许存放Java对象,不允许存放Java基本类型的数据。

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/123598818