集合框架:Java做好的用来管理乱七八糟 的一堆数据的Java库。
集合:[一堆东西];
框架:做好Java类库。
1.Java中集合框架总体分为2个大部分
Collection接口 和 Map接口。
Collection单列数据
Collection接口下面有两个子接口 List/Set接口
List接口是用来处理有序的单列数据的,可以有重复的元素
Set是一个无序的单列数据,不可以重复元素。
1.List接口
是用来处理有序的单列数据,可以有重复的元素。
ArrayList类
1.用来处理有序的单列数据,可以有重复的数据。
2.添加的元素会自动扩展
3.动态数组的结构,查询快,添加删除比较慢。
LinkedList类
1.用来处理有序的单列数据,可以有重复的元素。
2.添加元素会自动扩展
3.双向链表结构,查询速度慢,添加删除速度快
Set接口
是用来处理无序的单列数据,没有重复的元素,重复的元素算一个。
HashSet类
用来处理无序的单列数据,没有重复的元素,重复的元素算一个。
LinkedHashSet类
用来处理无序的单列数据,没有重复的元素,重复的元素算一个。
Map接口
第二个大部分是用来处理键值对数据的集合,最大的接口是Map接口
例如: name[键]=zhangsan[值] 输的目录
HashMap类
1.用来处理键值对数据的集合
2.允许有null【键--null 值--null】
Hashtable类
1.用来处理键值对数据的集合
2.不允许有null
ConcurrentHashMap类
支持检索的完全并发性和更新的高预期并发性的哈希表
2.关于List接口下的常用类
1)ArrayList类
特点:
(1)用来处理有序的单列数据,可以有重复的元素。
(2)添加的元素会自动扩展。
(3)动态数组结构,查询速度快,添加删除速度慢。
构造方法:
ArrayList() 构造一个初始容量为10的空列表。
ArrayList(Collection c) 通过实现Collection 接口的子类/子接口对象创建一个列表。
ArrayList(int initialCapacity) 构造具有指定初始容量的空列表。
例子:
//1.无参构造方法
ArrayList<Object> arrlist = new ArrayList<Object>();
//2,控制初始容量
ArrayList<Object> arraylist1 = new ArrayList<Object>();
//3.Collection接口的子类间的转换
HashSet<Object> test = new HashSet<Object>();
ArrayList<Object> arrayList3 = new ArrayList<Object>(test);
实例方法:
返回值 | 方法结构 | 作用 |
boolean | add(Object o) | 将指定的元素追加到此列表的末尾。 |
boolean | contains(Object o) | 如果此列表包含指定的元素,则返回 true 。 |
Object | get(int index) | 返回此列表中指定位置的元素。 |
int | indexOf(Object o) | 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。 |
int | lastIndexOf(Object o) | 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。 |
Object | remove(int index) | 删除该列表中指定位置的元素。 |
boolean | remove(Object o) | 从列表中删除指定元素的第一个出现(如果存在)。 |
Object | set(int index,Object element) | 用指定的元素替换此列表中指定位置的元素。 |
int | size() | 返回此列表中的元素数。 |
boolean | isEmpty() | 如果此列表不包含元素,则返回 true 。 |
void | clear() | 从列表中删除所有元素。 |
Iterator<E> | iterator() | 以正确的顺序返回该列表中的元素的迭代器。 |
例子:
package com20211111;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
public class ArrayListTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1.无参构造方法
ArrayList<Object> arrlist = new ArrayList<Object>();
//2,控制初始容量
ArrayList<Object> arraylist1 = new ArrayList<Object>();
//3.Collection接口的子类间的转换
HashSet<Object> test = new HashSet<Object>();
ArrayList<Object> arrayList3 = new ArrayList<Object>(test);
/**
* 实例方法
* */
//1.add进行添加
arrlist.add("张三");
arrlist.add(null);
arrlist.add(18);
arrlist.add(true);
arrlist.add(18);
System.out.println(arrlist.size());
arrlist.remove(true);
//2.size查看元素的个数
System.out.println("size方法查询元素的个数==" + arrlist.size());
//3.contains元素是否包含指定的元素
System.out.println("contains方法判断是否存在对应的元素" + arrlist.contains(18));
//4.get通过位置/索引获取指定的元素,arrlist是有序的单列表。
System.out.println("get通过整数下标获取对应的元素" + arrlist.get(0));
System.out.println("get通过整数下标获取对应的元素" + arrlist.get(arrlist.size()-1));
//5.indexOf 和lastIndexOf
System.out.println("和String中的indexOf一样,查询元素,返回元素的下标:" + arrlist.indexOf(18));
System.out.println("和String中的indexOf一样,从末查询元素,返回元素的下标:" + arrlist.lastIndexOf(18));
//6reomve通过下标删除列表中的元素 也可以通过元素删除元素
/*
arrlist.remove(1);
Integer a = 18;
arrlist.remove(a);
System.out.println("列表的长度" + arrlist.size());
*/
//7set替换指定位置的元素通过第二个参数替换
arrlist.set(2, 20);
//8isEmpty判断是否为空
System.out.println("isEmpty判断列表是否为空" + arrlist.isEmpty());
System.out.println("isEmpty判断列表是否为空" + arraylist1.isEmpty());
//9.clear清除列表
//arrlist.clear();
System.out.println("列表的长度为:" + arrlist.size());
//10遍历列表的方式
// (1) 通过arrayList中的迭代方法,返回一个迭代器进行对列表的遍历
System.out.println("-------------遍历列表1");
Iterator<Object> ites = arrlist.iterator();
while (ites.hasNext()) {
System.out.println(ites.next());
}
//(2)通过普通for循环遍历
System.out.println("-------------遍历列表2");
for (int i = 0,le = arrlist.size(); i < le; i++) {
System.out.println(arrlist.get(i));
}
//通过for增强
System.out.println("-------------遍历列表3");
for (Object object :arrlist) {
System.out.println(object);
}
}
}
2)LinkedList类(无初始大小)
特点
(1)用来处理有序的单列数据,可以重复元素。
(2).添加的元素会自动扩展。
(3)双向链表结构,查询慢,添加删除快。
构造方法:
1.LinkedList() :构造一个空列表。 (没有默认长度)
2. LinkedList(Collection c):通过一个实现Collection接口的子类/子接口对象创建一个列表(Collection的子类之间相互转换)
public static void main(String[] args) {
// TODO Auto-generated method stub
//构造方法
//1.无参构造函数 创建一个空列表
LinkedList<Object> linkedList = new LinkedList<Object>();
//2.通过Collect结构的子类/子接口对象穿件一个列表 说白了 就是转换
ArrayList<Object> arrlink = new ArrayList<Object>();
LinkedList<Object> linkedList1 = new LinkedList<Object>(arrlink);
}
实例方法
返回值 | 方法结构 | 作用 |
boolean | add(Object o) | 将指定的元素追加到此列表的末尾。 |
boolean | contains(Object o) | 如果此列表包含指定的元素,则返回 true 。 |
Object | get(int index) | 返回此列表中指定位置的元素。 |
int | indexOf(Object o) | 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。 |
int | lastIndexOf(Object o) | 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。 |
Object | remove(int index) | 删除该列表中指定位置的元素。 |
boolean | remove(Object o) | 从列表中删除指定元素的第一个出现(如果存在)。 |
Object | set(int index,Object element) | 用指定的元素替换此列表中指定位置的元素。 |
int | size() | 返回此列表中的元素数。 |
boolean | isEmpty() | 如果此列表不包含元素,则返回 true 。 |
void | clear() | 从列表中删除所有元素。 |
Iterator<E> | iterator() | 以正确的顺序返回该列表中的元素的迭代器。 |
Object | getFirst() | 返回此列表中的第一个元素。 |
Object | getLast() | 返回此列表中的最后一个元素。 |
Object | removeFirst() | 从此列表中删除并返回第一个元素。 |
Object | removeLast() | 从此列表中删除并返回最后一个元素。 |
为什么LinkedList会比ArrayList多出一组对第一个元素和最后一个元素的操作方法?
因为ArrayList是动态数组结构,他在查找第一个元素和最后一个元素的时很麻烦,而LinkedList采用的是双向链表结构,这种结构在查找第一个元素和最后一个元素的时候是最快的。就像一列火车我们眼前驶过,我们可能不知道这列火车由几节车厢组成,但是我们一定会在第一时间看清第一节与最后一节车厢位置。
例子:
import java.util.ArrayList;
import java.util.LinkedList;
public class LinkedListTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//构造方法
//1.无参构造函数 创建一个空列表
LinkedList<Object> linkedList = new LinkedList<Object>();
//2.通过Collect结构的子类/子接口对象穿件一个列表 说白了 就是转换
ArrayList<Object> arrlink = new ArrayList<Object>();
LinkedList<Object> linkedList1 = new LinkedList<Object>(arrlink);
//测试方法
linkedList.add("张三");
linkedList.add(null);
linkedList.add("18");
linkedList.add(true);
linkedList.add(18);
linkedList.add(18);
System.out.println("元素的个数为1111:"+linkedList.size());
//linkedList.remove(true);
//Boolean c= new Boolean(true);
Boolean c = true;
linkedList.remove(c);
//查看元素的个数size
System.out.println("元素的个数为2222:"+linkedList.size());
//删除元素
// 1.通过下标删除元素
//linkedList.remove(5);
System.out.println("元素的个数为:"+linkedList.size());
// 2.通过元素删除列表中的元素
//linkedList.remove("张三");
System.out.println("元素的个数为:"+linkedList.size());
//3.set通过索引修改对应的值
linkedList.set(0,"李四");
//4.通过;列表的下标获取值
System.out.println(linkedList.get(0));
//5判断是否为空
System.out.println("列表是否为空:"+linkedList.isEmpty());
//6清除列表
//linkedList.clear();
System.out.println(linkedList.size());
//7.indexOf 或者 lastIndexOf 通过元素获取下标,没有找到返回-1
//1.indeOf从前往后
System.out.println(linkedList.indexOf(18));
//2.lastIndexOf从后往前
System.out.println(linkedList.lastIndexOf(18));
/**Linkedlsit类特有的四个方法*/
//1获取第一个元素
System.out.println("第一个元素是--" + linkedList.getFirst());
//2.获取最后一个元素
System.out.println("最后一个元素是--" + linkedList.getLast());
//3.删除第一个元素
System.out.println(linkedList.removeFirst());
//3.删除最后一个元素
System.out.println(linkedList.removeLast());
System.out.println("第一个元素是--" + linkedList.getFirst());
System.out.println("最后一个元素是--" + linkedList.getLast());
}
}
3.关于Set接口的常用类
1.数据是单列的、没有顺序的。(没有索引)
2.没有重复的元素,重复的元素算一个。
1.HashSet类
用来处理无序的单列数据,没有重复的元素,重复的元素算一个。
构造方法:
- HashSet()无惨构造函数,构建一个新的空集合,默认大小(16)和0.75的负载因子。
- HashSet(Collection c) 构造一个包含指定集合中的元素的新集合。 (就是Collection子类得相互转换)
- HashSet(int initialCapacity)构造一个指定大小的空集合,负载因子默认为0.75不变。
- HashSet(int initialCapacity,float loadFactor)指定大小,指定的负载因子(float 小数+f)
例子:
//构造函数
//1.无参数的构造方法 默认大小为16.负载因子为0.75
HashSet<Object> hashSet = new HashSet<Object>();
//2有初始容两个大小,但是没有设置负载因子
HashSet<Object> hashSet2 = new HashSet<Object>(10);
//3可以设置初始大小、负载因子(float类型)
HashSet<Object> hashSet3 = new HashSet<>(12,0.5f);
//4传递Collection的参数进行转换成HashSet
LinkedList<Object> linklist = new LinkedList<Object>();
HashSet<Object> hashSet4 = new HashSet<Object>(linklist);;
事例方法:
返回值 | 方法结构 | 作用 |
boolean | add(Object o) | 将指定的元素追加到此列表的末尾。 |
boolean | contains(Object o) | 如果此列表包含指定的元素,则返回 true 。 |
boolean | remove(Object o) | 从列表中删除指定元素的第一个出现(如果存在)。 |
int | size() | 返回此列表中的元素数。 |
boolean | isEmpty() | 如果此列表不包含元素,则返回 true 。 |
void | clear() | 从列表中删除所有元素。 |
Iterator<E> | iterator() | 以正确的顺序返回该列表中的元素的迭代器。 |
例子:
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
public class HashSetTest {
public static void main(String[] args) {
//构造函数
//1.无参数的构造方法 默认大小为16.负载因子为0.75
HashSet<Object> hashSet = new HashSet<Object>();
//2有初始容两个大小,但是没有设置负载因子
HashSet<Object> hashSet2 = new HashSet<Object>(10);
//3可以设置初始大小、负载因子(float类型)
HashSet<Object> hashSet3 = new HashSet<>(12,0.5f);
//4传递Collection的参数进行转换成HashSet
LinkedList<Object> linklist = new LinkedList<Object>();
HashSet<Object> hashSet4 = new HashSet<Object>(linklist);
//事例方法
//1.添加元素
hashSet.add("张三");
hashSet.add(18);
hashSet.add(true);
System.out.println(hashSet.size());
Boolean a = true;
hashSet.remove(a);
System.out.println(hashSet.size());
hashSet.add(null);
hashSet.add("张三");
//2.删除元素
System.out.println("当前Hashset的元素个数为" + hashSet.size());
//4.remove删除元素
hashSet.remove("张三");
System.out.println("当前Hashset的元素个数为" + hashSet.size());
//5.清空哈希列表
// hashSet.clear();
//6.清空哈希表
hashSet.isEmpty();
//7.返回迭代器
Iterator<Object> ites = hashSet.iterator();
while (ites.hasNext()) {
System.out.println(ites.next());
}
System.out.println("*---------通过for增强遍历");
/**便利hashset集合*/
for (Object object : hashSet) {
System.out.println(object);
}
}
}
2.LinkedHashSet类
用来处理无序的单列数据,没有重复的元素,重复的元素算一个。
特点:按照插入的顺序进行排列
构造方法:
- LinkedHashSet()无惨构造函数,构建一个新的空集合,默认大小(16)和0.75的负载因子。
- LinkedHashSet(Collection c) 构造一个包含指定集合中的元素的新集合。 (就是Collection子类得相互转换)
- LinkedHashSet(int initialCapacity)构造一个指定大小的空集合,负载因子默认为0.75不变。
- LinkedHashSet(int initialCapacity,float loadFactor)指定大小,指定的负载因子(float 小数+f)
例子:
// LinkedHashSet继承了HashSet
//特性基本一样,方法基本一样
//构造函数
//1无惨构造函数默认集合大小为16,负载因子0.75
LinkedHashSet<Object> linkedHashSet = new LinkedHashSet<Object>();
//2.有一个参数的构造函数控制集合的初始大小
LinkedHashSet<Object> linkedHashSet1 = new LinkedHashSet<Object>(8);
//3.有一个参数的构造函数设置集合的初始代大小和负载因子大小
LinkedHashSet<Object> linkedHashSet2 = new LinkedHashSet<Object>(18,0.9F);
//4.可以传递Collection借口的子类 就是转换Set 和List;
ArrayList<Object> fn = new ArrayList<Object>();
LinkedHashSet<Object> linkedHashSet3= new LinkedHashSet<Object>( fn );
事例方法:
返回值 | 方法结构 | 作用 |
boolean | add(Object o) | 将指定的元素追加到此列表的末尾。 |
boolean | contains(Object o) | 如果此列表包含指定的元素,则返回 true 。 |
boolean | remove(Object o) | 从列表中删除指定元素的第一个出现(如果存在)。 |
int | size() | 返回此列表中的元素数。 |
boolean | isEmpty() | 如果此列表不包含元素,则返回 true 。 |
void | clear() | 从列表中删除所有元素。 |
Iterator<E> | iterator() | 以正确的顺序返回该列表中的元素的迭代器。 |
例子:
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
public class HashSetTest {
public static void main(String[] args) {
//构造函数
//1.无参数的构造方法 默认大小为16.负载因子为0.75
HashSet<Object> hashSet = new HashSet<Object>();
//2有初始容两个大小,但是没有设置负载因子
HashSet<Object> hashSet2 = new HashSet<Object>(10);
//3可以设置初始大小、负载因子(float类型)
HashSet<Object> hashSet3 = new HashSet<>(12,0.5f);
//4传递Collection的参数进行转换成HashSet
LinkedList<Object> linklist = new LinkedList<Object>();
HashSet<Object> hashSet4 = new HashSet<Object>(linklist);
//事例方法
//1.添加元素
hashSet.add("张三");
hashSet.add(18);
hashSet.add(true);
System.out.println(hashSet.size());
Boolean a = true;
hashSet.remove(a);
System.out.println(hashSet.size());
hashSet.add(null);
hashSet.add("张三");
//2.删除元素
System.out.println("当前Hashset的元素个数为" + hashSet.size());
//4.remove删除元素
hashSet.remove("张三");
System.out.println("当前Hashset的元素个数为" + hashSet.size());
//5.清空哈希列表
//hashSet.clear();
//6.清空哈希表
hashSet.isEmpty();
//7.返回迭代器
Iterator<Object> ites = hashSet.iterator();
while (ites.hasNext()) {
System.out.println(ites.next());
}
System.out.println("*---------通过for增强遍历");
/**便利hashset集合*/
for (Object object : hashSet) {
System.out.println(object);
}
}
}
4.Map映射(键值对)
Map接口用来处理键值对数据的集合
1.HashMap类
1)允许null的值和null键
2)数据保存无序
3)重复的键别算作一个数据
构造方法
1.HashMap()构造一个空的HashMap,默认初始容量(16)和默认负载稀疏(0.75);
2.HashMap(int initialCapacity)构造一个空的HashMap具有特定的初始容量的和默认负载系数为(0.75)的集合。
3.HashMap(int initialCapacity int loadFactor)构造一个空的HashMap具有特定特定大小,特定负载系数的集合。
4.HashMap(Map m)构造一个新的HashMap与局定的相同的映射Map(即就是Map子类的相互转换)。
例子:
// 构造函数
//1.无参数构造函数 默认初始容量16,负载系数0.75
HashMap<Object, Object> hashMap = new HashMap<Object,Object>();
//2.创建有初始容量的的集合,负载系数0.75
HashMap<Object, Object> hashMap2 = new HashMap<Object,Object>(10);
//3.创建有初始容量的的 初始负载系数float
HashMap<Object, Object> hashMap3 = new HashMap<Object,Object>(10,0.5f);
//4.Map借口的子类对象相互转换
HashMap<Object, Object> hashMap4 = new HashMap<Object,Object>(hashMap3);
实例方法
返回值 | 方法(参数) | 功能 |
void | clear() | 清空集合。 |
Object | put(Object key, Object value) | 向集合中添加键值对数据。 |
boolean | containsKey(Object key) | 判断集合中是否包含指定的键 |
boolean | containsValue(Object value) | 判断集合中是否包含指定的值 |
Object | get(Object key) | 根据指定的键得到该键对应的值 |
boolean | isEmpty() | 判断集合是否为空。 |
int | size() | 得到集合中键值对元素的个数。 |
void | remove(Object key) | 根基指定的键删除对应的键值对数据值 |
Set | keySet() | 得到集合中所有的键保存到Set集合中 |
Collection | values() | 得到集合中所有的值保存到Collection集合中 |
Enumeration<K> | keys() | 返回此散列表中键的枚举。 |
Enumeration<V> | elements() | 返回此散列表中值的枚举。 |
例子:
import java.util.Collection;
import java.util.HashMap;
import java.util.Set;
public class HashMapTest {
public static void main(String[] args) {
// 构造函数
//1.无参数构造函数 默认初始容量16,负载系数0.75
HashMap<Object, Object> hashMap = new HashMap<Object,Object>();
//2.创建有初始容量的的集合,负载系数0.75
HashMap<Object, Object> hashMap2 = new HashMap<Object,Object>(10);
//3.创建有初始容量的的 初始负载系数float
HashMap<Object, Object> hashMap3 = new HashMap<Object,Object>(10,0.5f);
//4.Map借口的子类对象相互转换
HashMap<Object, Object> hashMap4 = new HashMap<Object,Object>(hashMap3);
//实例方法
//1.isEmpty是否为空
System.out.println("这个集合和是否为空" + hashMap.isEmpty());
//2.put添加元素
hashMap.put(1001, "张三");
hashMap.put(1002, "李四");
hashMap.put(1003, "王五");
//3.size查询这个集合的元素个数
System.out.println("hashmap的个数:"+hashMap.size());
//4.clear清空集合
//hashMap.clear();
//System.out.println("hashmap的个数:"+hashMap.size());
//4.查询是存在key值
System.out.println( "是否包含1002" + hashMap.containsKey(1002));
System.out.println( "是否包含1005" + hashMap.containsKey(1005));
//5.查询是否存在val值
System.out.println("张三是否存在:" + hashMap.containsValue("张三"));
//6.get通过key获取对应的值
System.out.println("通过1001获取:"+ hashMap.get(1001));
//7.keySet得到所有的集合返回Set
Set<Object> keyset= hashMap.keySet();
for (Object object : keyset) {
System.out.println(object);
}
//8.values得到所有的值的集合
Collection<Object> valcollection = hashMap.values();
for (Object object : valcollection) {
System.out.println(object);
}
}
}
2.TreeMap
特点:
1.按照键的字母顺序排列。
2.键不能为null。
3.重复的键被算作是一个数据。
4.非线程安全。
构造方法:
1.TreeMap() 使用其键的自然排序构造一个新的空树状图。
2.TreeMap(Map<? extends K,? extends V> m) 构造一个新的树状图,其中包含与给定地图相同的映射,根据其键的自然顺序进行排序 。
//构造方法
//1无参数的构造方法
TreeMap<Object, Object> treeMap = new TreeMap<Object,Object>();
//2构造一个新的ThreeMap
//相互转换 key和val必须事HashMap
HashMap<Object, Object> hashMap = new HashMap<Object,Object>();
TreeMap<Object, Object> treeMap2 = new TreeMap<Object,Object>(hashMap);
实例方法:
返回值 | 方法(参数) | 功能 |
void | clear() | 清空集合。 |
Object | put(Object key, Object value) | 向集合中添加键值对数据。 |
boolean | containsKey(Object key) | 判断集合中是否包含指定的键 |
boolean | containsValue(Object value) | 判断集合中是否包含指定的值 |
Object | get(Object key) | 根据指定的键得到该键对应的值 |
boolean | isEmpty() | 判断集合是否为空。 |
int | size() | 得到集合中键值对元素的个数。 |
void | remove(Object key) | 根基指定的键删除对应的键值对数据值 |
Set | keySet() | 得到集合中所有的键保存到Set集合中 |
Collection | values() | 得到集合中所有的值保存到Collection集合中 |
Enumeration<K> | keys() | 返回此散列表中键的枚举。 |
Enumeration<V> | elements() | 返回此散列表中值的枚举。 |
实例方法:
//实例方法
//1.isEmpty是否为空
System.out.println("这个集合和是否为空" + treeMap.isEmpty());
//2.put添加元素
treeMap.put(1001, "张三");
treeMap.put(1002, "李四");
treeMap.put(1003, "王五");
//3.size查询这个集合的元素个数
System.out.println("hashmap的个数:"+treeMap.size());
//4.clear清空集合
//treeMap.clear();
//System.out.println("hashmap的个数:"+treeMap.size());
//4.查询是存在key值
System.out.println( "是否包含1002" + treeMap.containsKey(1002));
System.out.println( "是否包含1005" + treeMap.containsKey(1005));
//5.查询是否存在val值
System.out.println("张三是否存在:" + treeMap.containsValue("张三"));
//6.get通过key获取对应的值
System.out.println("通过1001获取:"+ treeMap.get(1001));
//7.keySet得到所有的集合返回Set
Set<Object> keyset= treeMap.keySet();
for (Object object : keyset) {
System.out.println(object);
}
//8.values得到所有的值的集合
Collection<Object> valcollection = treeMap.values();
for (Object object : valcollection) {
System.out.println(object);
}
HashMap类与Hashtable类与TreeMap类与ConcurrentHashMap类区别?
特点 | HashMap | Hashtable | TreeMap | ConcurrentHashMap |
结构: | 键值对 | 单列表 | 键值对 | 键值对 |
是否允许null | 可以为null | 不允许有null | 允许有null | 允许有null |
是否线程安全 | 否 | 是 | 否 | 是 支持检索的完全并发性和更新的高预期并发性的哈希表 |
都是无序的都不可以重复 |
特征:
ConcurrentHashMap类线程安全支出检索是的高并发处理。
如果需要线程安全的并发实现,那么建议使用ConcurrentHashMap代替Hashtable。
Set和Collection借口的区别
Set是无序的不能有重复的数据
Collection是有序的可以有重复的数据
ArrList和LinkedList的区别
ArrList存储的机构为动态数组
优点查询快,添加/删除慢
初始容量为10
LinkedList存储的结构为双向链表
优点添加/删除快 , 查询慢。
无初始容量
无奈源于不够强大