List接口继承了Collection接口,定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。
实际上有两种list:一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的LinkedList,它并不是快速随机访问设计的,而是具有更通用的方法。
-
List : 次序是List最重要的特点:它保证维护元素特定的顺序。
-
ArrayList : 由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。
-
LinkedList : 对顺序访问进行了优化,向List中间插入与删除的开销并不大,随机访问则相对较慢。还具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。
-
Vector:实现一个类似数组一样的表,自动增加容量来容纳你所需的元素。使用下标存储和检索对象就象在一个标准的数组中一样。你也可以用一个迭代器从一个Vector中检索对象Vector是 需要zi料+ 绿色徽【vip1024b】
唯一的同步容器类!!
- stack:这个类从vector派生而来,并增加了方法实现栈,一种后进先出的存储结构。
List的用法示例:
package collection;
import java.util.*;
public class SetExample {
public static void main(String[] args) {
List linkedList = new LinkedList();
for (int i = 0; i <= 5; i++) {
linkedList.add(“a”+i);
}
System.out.println(linkedList);
linkedList.add(3,“a100”);
System.out.println(linkedList);
linkedList.set(6,“a200”);
System.out.println(linkedList);
System.out.println(linkedList.get(2));
System.out.println(linkedList.indexOf(“a3”));
linkedList.remove(1);
System.out.println(linkedList);
}
}
六、list和set对比
Set子接口:无序,不允许重复,检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List子接口:有序,可以有重复元素,和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
Set和List具体子类:
Set
|————HashSet:以哈希表的形式存放元素,插入删除速度很快。
List
|————ArrayList:动态数组
|————LinkedList:链表、队列、堆栈。
七、map
1、map接口不是Collection接口的继承。
不重复的键到值的映射。
2、Map.Entry 接口
map的entrySet()方法返回一个实现map.entry接口的对象集合。集合中每个对象都是底层map中一个特定的键值对。
3、HashMap 类和 TreeMap 类
在map中插入、删除和定位元素,HashMap是最好的选择。但如果您要按顺序遍历键,那么TreeMap 会更好。根据集合大小,先把元素添加HashMap,再把这种映射转换成一个用于有序键遍历的TreeMap 可能更快。
为了优化hashmap空间的使用,您可以调优初始容量和负载因子。这个treeMap没有调优选项,因为该树总处于平衡状态。
-
hashtable:实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类时前面Java实现的一个继承,并且通常能在实现映象的其它类中更好地使用。
-
hashmap:实现一个映象,运行存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个空)。
-
WeakHashMap:如果有一个键对于一个对象而言不再被引用,键将被舍弃,WeakHashMap在具有大量数据时使用。
-
TreeMap: 实现这样一个映象,对象是按键升序排列的。
4、map的使用示例
以下程序演示了具体map类的使用。该程序对自命令行传递的词进行频率计数。hashmap起初用于数据存储。后来,映射被转换为TreeMap以显示有序的键列列表。
package collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class MapExample {
public static void main(String[] args) {
String[] array = {“a”,“b”,“c”,“d”,“e”};
Map map = new HashMap();
Integer ONE = new Integer(1);
for (int i=0, n=array.length; i<n; i++) {
String key = array[i];
int frequency = i+1;
map.put(key, frequency);
}
System.out.println(map);
Map sortedMap = new TreeMap(map);
System.out.println(sortedMap);
//hashmap的同步
Map map1 = Collections.synchronizedMap(map);
System.out.println(map1);
}
}
5、控制台输出
八、HashMap、Hashtable、ConcurrentHashMap的原理与区别
1、HashTable
-
底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化
-
初始size为11,扩容:newsize = olesize*2+1
-
计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length
2、HashMap
-
底层数组+链表实现,可以存储null键和null值,线程不安全
-
初始size为16,扩容:newsize = oldsize*2,size一定为2的n次幂
-
扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入
-
插入元素后才判断该不该扩容,有可能无效扩容(插入后如果扩容,如果没有再次插入,就会产生无效扩容)
-
当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀
-
计算index方法:index = hash & (tab.length – 1)
-
哈希冲突:若干Key的哈希值按数组大小取模后,如果落在同一个数组下标上,将组成一条Entry链,对Key的查找需要遍历Entry链上的每个元素执行equals()比较。
-
加载因子:为了降低哈希冲突的概率,默认当HashMap中的键值对达到数组大小的75%时,即会触发扩容。因此,如果预估容量是100,即需要设定100/0.75=134的数组大小。
-
空间换时间:如果希望加快Key查找的时间,还可以进一步降低加载因子,加大初始大小,以降低哈希冲突的概率。
HashMap和Hashtable都是用hash算法来决定其元素的存储,因此HashMap和Hashtable的hash表包含如下属性:
-
容量(capacity):hash表中桶的数量
-
初始化容量(initial capacity):创建hash表时桶的数量,HashMap允许在构造器中指定初始化容量
-
尺寸(size):当前hash表中记录的数量
-
负载因子(load factor):负载因子等于“size/capacity”。负载因子为0,表示空的hash表,0.5表示半满的散列表,依此类推。轻负载的散列表具有冲突少、适宜插入与查询的特点(但是使用Iterator迭代元素时比较慢)
除此之外,hash表里还有一个“负载极限”,“负载极限”是一个0~1的数值,“负载极限”决定了hash表的最大填满程度。当hash表中的负载因子达到指定的“负载极限”时,hash表会自动成倍地增加容量(桶的数量),并将原有的对象重新分配,放入新的桶内,这称为rehashing。
HashMap和Hashtable的构造器允许指定一个负载极限,HashMap和Hashtable默认的“负载极限”为0.75,这表明当该hash表的3/4已经被填满时,hash表会发生rehashing。
笔者福利
以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。
有了这个,面试踩雷?不存在的!
回馈粉丝,诚意满满!!!
,hash表会发生rehashing。
笔者福利
以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。
有了这个,面试踩雷?不存在的!
回馈粉丝,诚意满满!!!
[外链图片转存中…(img-GEgc3vXh-1710358195397)]
[外链图片转存中…(img-7u9zz3mh-1710358195398)]
[外链图片转存中…(img-s1kdbJeB-1710358195399)]
[外链图片转存中…(img-6cV4LgY7-1710358195399)]