问:Java集合类List,Map,Set相关的实现原理。
答:List和Set都是Collection的子类
(1)List的主要实现有:ArrayList、LinkedList、Vectory。
ArrayList、LinkedList线程不安全,ArrayList底层是可变数组非同步实现的,LinkedList底层是基于双向链表非同步实现的。ArrayList在插入删除时,会重新排列位置,速度较慢,根据数组角标查询数据,查询较快。LinkedList在增删时位置不变,效率较高,查询时需要遍历节点,查询较慢。而Vectory与ArrayList类似,只是加了同步对象锁机制,线程安全。基于以上特性,如果程序要求多线程下操作则选择Vectory,如果不要求线程安全且查询速度快的情况下则选择使用ArrayList,如果插入删除需求较多的情况下则选择LinkedList。
(2)在讲Set之前,需要先讲一下Map(键值对存储)
Map的主要实现有:HashMap、LinkedHashMap、HashTable。
HashMap是基于哈希表的Map接口的非同步实现(即线程不安全),底层以数组的形式存储,数组的每一项都是一个单向链表。存取对象时,根据key的hash值来确定数组中的存储位置,根据equals方法来确定在单向链表上的存储位置。
LinkedHashMap继承自HashMap,是基于hash表与双向链表非同步实现的(即线程不安全),在HashMap的数组包了一层双向链表实现的,用于记录前后节点。
HashTable与HashMap类似,只是它加了锁,同步实现的(线程安全的)。三种用法思想和List的三种用法思想一致。
(3)Set与List的区别在于:Set唯一无序,List不唯一有序,主要实现有:HashSet、TreeSet
HashSet基于HashMap实现,其值存储在HashMap的key中,value为一个固定对象。同样的,HashSet为线程不安全的。
TreeSet是一个自动排列顺序的集合类,同样他也是一个非同步实现类,线程不安全。
Set和list选择使用的情况下,就看是否需要去重,是否需要有序来进行选择。
问:Java中String、StringBuilder、StringBuffer有什么区别?
答:String 是final修饰,即终态数据类型,变量的值不可改变,在String字符串拼接时会产生大量的临时变量。如果有大量拼接操作时,使用StringBuilder或StringBuffer,前者线程不安全效率高,后者线程安全效率低。
网友评论