目录
4.9.1 void clear():删除该Map对象中所有的键值对
4.9.2 boolean containsKey(Object key) :查询Map中是否包含指定key。
4.9.3 boolean containsValue(Object value):查询Map中是否包含一个或多个value。
4.9.4 Set entrySet():返回Map中所包含的键值对所组成的Set集合,每个集合元素都是Map.Entry对象。
4.9.5 Object get(Object obj):返回指定key所对应的value。如果没有,这返回null。
4.9.6 boolean isEmpty():查询该Map是否为空,如果为空则返回true。
4.9.7 Set keySet():返回该Map中所有key组成的Set集合。
4.9.8 Object put(Object key, Object value):添加一个键值对,如果当前Map中已经有一个与该key相等的键值对,则新的键值对将覆盖原来的键值对。
4.9.9 void putAll(Map m):将指定Map中的键值对复制到m中
4.9.10 Object remove(Object key):删除指定key所对应的键值对,如果不存在,则返回null。
4.9.11 int size():返回Map里的键值对个数。
4.9.12 Collection values():返回该Map里所有的vlaue组成的Collection。
5.0 Map中包括一个内部类Entry。该类封装了一个键值对。
5.1 Map接口中的子类--可以将数据存储在本地 (Properties类)
5.5 Collections提供了如下几个方法对List集合元素进行排序
5.6 Collections还提供了如下用于查找、替换集合元素的常用方法
框架架构图
Collections集合框架
1.List接口
Vector:使用比较久的子类,线程安全,同步,有序不唯一的特征,使用数组的存储结构
Stack:堆栈
LinkedList:线程不安全,不同步,无序不唯一,使用链表存储结构
ArrayList:替代Vector,线程不安全,不同步
2.Set接口
2.1 HashSet集合特点:
(1)不能保证元素的排列顺序,顺序有可能发生变化。
(2)HashSet不是同步的,如果多个线程同时访问一个HashSet,如果有2条或2条以上线程同时修改HashSet集合时,必须通过代码实现线程同步。
(3)集合元素值可以是null。
向HastSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值来决定该对象在HashSet中存储位置。如果有两个元素通过equals方法比较返回true,但它们的hashCode()方法返回值不相等,HashSet将会把它们存储在不同的位置,就可以添加成功(简单的理解HastSet集合判断两个元素是否相等的标准是两个对象通过equals方法比较相等,且两个对象的hashCode()方法返回的值也要相等)。
2.2 TreeSet类:
TreeSet是SortedSet接口的唯一实现,TreeSet可以确保集合元素处于排序状态。
3. Map接口
键值对,键唯一值不唯一,无序
HashMap HashTable TreeMap
HashMap:线程不安全
HashTable:线程安全
TreeMap:结果是按照字母表的顺序进行存储的
4. Map、Set、List的简单实用
4.1 三者之间的区别
答: LIst:有序(包含下标)不唯一(数据可以重复)
Set: 无序(不包含下标)唯一(数据不可以重复)
Map:键值对,键唯一值不唯一
4.2 三者的查询数据方法
答: List:for循环,foreach遍历,迭代器
Set:迭代器,foreach遍历
Map:只能通过keySet()获得所有键、values()获得所有值,Map.Entry<>
4.3 Map的使用方法
4.4 set集合的使用方法
4.5 list集合的使用方法
4.6 迭代器遍历
4.7 使集合框架中线程变成同步
同步控制
Collections类提供了多个synchronizedXxx方法,该方法返回指定集合对象对应的同步对象,从而可以解决多线程并发访问集合时的线程安全问题。
案例:
/*
* 同步控制
*/
//可以当ArrayList使用
Collection<String> c = Collections.synchronizedCollection(new ArrayList<>());
//可以当Set集合使用
Collection<Object> s = Collections.synchronizedCollection(new HashSet<>());
List<Object> list =Collections.synchronizedList(new ArrayList<Object>());
Set<Object> set = Collections.synchronizedSet(new HashSet<>());
Map<String,Object>map=Collections.synchronizedMap(new HashMap<String,Object>());
4.8 Map集合的功能
4.9.0 快速遍历Map集合的方法
4.9.1 void clear():删除该Map对象中所有的键值对
map2.clear();
4.9.2 boolean containsKey(Object key) :查询Map中是否包含指定key。
//查询键是否已存在。。如果存在就返回true,不然返回false
// boolean boo1 = map2.containsKey(11);
// System.out.println(boo1);
4.9.3 boolean containsValue(Object value):查询Map中是否包含一个或多个value。
//查询值是否已存在。。如果存在就返回true,不然返回false
// boolean boo2 = map2.containsValue(xx);
// System.out.println(boo2);
4.9.4 Set entrySet():返回Map中所包含的键值对所组成的Set集合,每个集合元素都是Map.Entry对象。
//查询map2中的全部键值对
// Set<Entry<String, Student>> set2 = map2.entrySet();
// for (Entry<String, Student> e2 : set2) {
// System.out.println(e2);
// }
4.9.5 Object get(Object obj):返回指定key所对应的value。如果没有,这返回null。
//通过键得到元素
// Student stu = map2.get(2);
// System.out.println(stu);
4.9.6 boolean isEmpty():查询该Map是否为空,如果为空则返回true。
//查询map集合是否为空,如果为空就返回true,不然返回为false
// boolean boo3 = map2.isEmpty();
// System.out.println(boo3);
4.9.7 Set keySet():返回该Map中所有key组成的Set集合。
//返回所有的键
// Set<Integer> set4 = map2.keySet();
// for (Integer i : set4) {
// System.out.println(i);
// }
4.9.8 Object put(Object key, Object value):添加一个键值对,如果当前Map中已经有一个与该key相等的键值对,则新的键值对将覆盖原来的键值对。
//添加值
Map<Integer, Student> map2 = new HashMap<>();
map2.put(1, new Student(1, "张三"));
map2.put(2, new Student(2, "李四"));
map2.put(3, new Student(3, "万五"));
map2.put(4, new Student(4, "赵六"));
map2.put(5, new Student(5, "承认"));
4.9.9 void putAll(Map m):将指定Map中的键值对复制到m中
//将map2的数据复制到ma中
Map<Integer , Student> ma = new HashMap<>();
ma.putAll(map2);
Set<Entry<Integer, Student>> set6 = ma.entrySet();
for (Entry<Integer, Student> e6 : set6) {
System.out.println(e6);
}
4.9.10 Object remove(Object key):删除指定key所对应的键值对,如果不存在,则返回null。
//删除map中键为2的
Student stu = ma.remove(2);
System.out.println(stu);
4.9.11 int size():返回Map里的键值对个数。
//返回当前的键值对数
int n = ma.size();
System.out.println(n);
4.9.12 Collection values():返回该Map里所有的vlaue组成的Collection。
//返回所有的value值
Collection<Student> coll = ma.values();
5.0 Map中包括一个内部类Entry。该类封装了一个键值对。
(1)Object getKey():返回该Entry里包含的key值。
(2)Object getValue():返回该Entry里包含的value值。
(3)Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值。
Set set7 = map2.entrySet(); //通过map点entrySet得到map集合的所有数据
Iterator it = set7.iterator(); //通过得到的set集合点出迭代器
while(it.hasNext()) { //循环迭代器
Map.Entry entry2 = (Entry) it.next(); //通过得到的数据得到Map的内部类Entry
Object key = entry2.getKey(); //通过得到内部类Entry得到getKey()和getValue()
Object value = entry2.getValue();
entry2.setValue("11111"); //通过得到内部类设置元素的值
System.out.println(key); //输出键
System.out.println(value); //输出值
System.out.println(entry2); //输出所有的数据
}
5.1 Map接口中的子类--可以将数据存储在本地 (Properties类)
Properties类是Hashtable的子类。该对象在处理属性文件时特别方便。Properties类可以把Map对象和属性文件关联起来,从而可以把Map对象中的键值对写入属性文件,也可以把属性文件中的属性名=属性值加载到Map对象中。由于属性文件中的属性名和属性值只能是字符串类型,所以Properties里的key和value都是字符串类型。Properties提供的常用方法:
(1)String getProperty(String key):获取Properties中指定属性名对应的属性值,类似于Map的get方法。
(2)String getProperty(String key, String defaultValue):该方法与上面的方法基本类似,如果Properties中不存在指定的key值,该方法返回默认值。
(3)Object setProperty(String key,String value):设置属性值,类似Hashtable的put方法。
(4)void load(InputStream inStream):从属性文件(以输入流表示)中加载属性名=属性值,把加载到的属性名=属性值对追加到Properties里。
(5)void store(OutputStream out,String comments):将Properties中的键值对写入指定属性文件(以输出流表示)。
Test.txt文件的内容为:
#aa
#Fri May 04 21:36:47 CST 2018
\u738B\u4E94=\u597D\u597D\u52A0\u6CB9\u5427
22=\u6211\u6C38\u8FDC\u5C5E\u4E8E\u4F60\uFF09
\u5F20\u4E09=\u559C\u6B22\u4F60
123=\u9EC4\u6021\u6211\u559C\u6B22\u4F60
\u674E\u56DB=\u8FD8\u662F\u559C\u6B22\u4F60
Properties还可以把键值对以XML文件的形式保存,也可以从XML文件中加载属性名-属性值。 --没测试过
// //向Properties中添加属性
// prop.setProperty("张三", "喜欢你");
// prop.setProperty("李四", "还是喜欢你");
// prop.setProperty("王五", "好好加油吧");
// prop.setProperty("123", "\u9EC4\u6021\u6211\u559C\u6B22\u4F60");
// prop.setProperty("22", "\u6211\u6c38\u8fdc\u5c5e\u4e8e\u4f60\uff09");
// try {
// //将Properties对象存入本地文件中
// prop.store(new FileOutputStream("E:\\test.txt"), "aa");
// //实例化一个Properties对象
// Properties prop2 = new Properties();
// //提取E:\\\\test.txt
// prop2.load(new FileInputStream("E:\\test.txt"));
// System.out.println(prop2);
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
5.2 SortedMap接口和TreeMap实现类
Map接口和set接口一样,也派生出一个SortedMap子接口,TreeMap是SortedMap接口的实现类。与TreeSet类似,TreeMap也是基于红黑树对TreeMap中所有key进行排序,从而保证TreeMap中所有键值对处于有序状态。
TreeMap同样有两种排序方式:自然排序,定制排序。
TreeMap判断两个key相等的标准和TreeSet判断两个元素相等的标准是一样的。TreeMap提供的方法也和TreeSet的类似
通过TreeMap集合排序:
5.3 写compareTo规则
第一种方法:
//写TreeMap中的Comparator规则
Map<String, Student> map = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2);
}
});
第二种写法(jdk 8新特性)
Map<String,Student>map4 = new TreeMap<>((o1,o2)->o1.compareTo(o2));
5.4 IdentityHashMap实现类
IdentityHashMap和HashMap基本相似,但它在处理两个key相等时比较独特:在IdentityHashMap中,当且仅当两个key严格相等(key1==key2)时,IdentityHashMap才认为两个key相等,而HashMap,只要key1和key2通过equals比较返回true,并且他们的hashCode值相等才认为两个可以相等。
IdentityHashMap提供了与HashMap基本相似的方法,也允许使用null作为key和value。
EnumMap实现类
EnumMap是一个与枚举类一起使用的Map实现。EnumMap中所有key都必须是单个枚举类的枚举值。
EnumMap在内部以数组形式保存,所以这种实现形式非常紧凑、高效。
EnumMap根据key的自然顺序(枚举值在枚举类中定义的顺序)来维护键值对的次序,
EnumMap不允许使用null作为key值,但允许使用null作为value。
5.5 Collections提供了如下几个方法对List集合元素进行排序
(1)static void reverse(List list):反转指定List集合中元素的顺序。
(2)static void shuffle(List list):对List集合元素进行随机排序。
(3)static void sort(List list):根据元素的自然顺序对指定List集合的元素按升序进行排序。
(4)static void sort(List list,Comparator c):根据指定Comparator产生的顺序对List集合的元素进行排序。
(5)static void swap(List list,int i,int j):将指定List集合中i处元素和j处元素进行交换。
(6)static void rotate(List list,int distance):当distance为正数时,将list集合的后distance个元素移到前面;当distance为负数时,将list集合中的前distance个元素移到后面。该方法不会改变集合的长度。
查找,替换操作
5.6 Collections还提供了如下用于查找、替换集合元素的常用方法
(1)static int binarySearch(List list,Object key):使用二分搜索法搜索指定List集合,以获得指定对象在List集合中的索引。记得必须保证List中的元素已经处于有序状态。
(2)static Object max(Collection coll):根据元素的自然顺序,返回给定集合中最大元素。
(3)static Object max(Collection coll,Comparator comp):根据指定Comparator产生的顺序,返回给定集合的最大元素。
(4)static Object min(Collection coll):根据元素的自然顺序,返回给定集合中最小元素。
(5)static Object min(Collection coll,Comparator comp):根据指定Comparator产生的顺序,返回给定集合的最小元素。
(6)static void fill(List list,Object obj):使用指定元素obj替换指定List集合中的所有元素。
(7)static int frequency(Collection c,Object o):返回指定集合中等于指定对象的元素数量。
(8)static int indexOfSubList(List source,List targer):返回子List对象在母List对象中第一次出现的位置索引;如果母List中没有出现子List,返回-1。
(9)static int lastIndexOfSubList(List source,List targer):返回子List对象在母List对象中最后一次出现的位置索引;如果母List中没有出现子List,返回-1。
(10)static boolean replaceAll(List list,Object oldVal,Object newVal):使用一个新值newVal替换List对象所有的旧值oldVal。
5.7 设置不可变集合
Collections提供了入下三类方法来返回一个不可以变的集合:
(1)emptyXxx():返回一个空的,不可以变的集合对象,此处的集合既可以是List,也可以是Set,还可以是Map。
(2)singletonXxx():返回一个值包含指定对象(只有一个或一项元素)的,不可以变的集合对象,此处的集合既可以是List,也可以是Set,还可以是Map。
(3)unmodifiableXxx():返回指定集合对象的不可变视图。此处的集合既可以是List,也可以是Set,还可以是Map。
//当给集合添加unmodifiablexxx方法之后变成不可改变的集合对象
Map<Integer, Student> map4 = Collections.unmodifiableMap(map2);
try {
map4.put(6, new Student(6, "陈八"));
} catch (UnsupportedOperationException e) {
// TODO: handle exception
System.out.println("没添加进去");
}