java高级之集合
Map接口
概述
Map
接口与Collection
接口并列,Collection
集合中的元素是独立存在的,而Map
集合中的元素是成对存在的,它用于保存具有映射关系的键-值对:key-value
;因此可以将Collection
集合称为单列集合,Map
集合称为双列集合。Map
中的key
和value
可以是任何引用类型的数据;Map
中的key
值不允许重复,使用Set
来存放,因此,同一个Map
对象所对应的类,必须重写hashCode()
和equals()
方法。- 如果
Map
中的key
值是一个对象的话,如果不重写hashCode()
和equals()
方法,那这两个key的hashcode
永远都不可能相等,因为这两个对象实例的内存地址是不同的,因此我们为了达到逻辑上的相等,需要重写这两个方法。 Map
接口的常用实现类:HashMap
、TreeMap
、LinkedHashMap
和Properties
。
常用方法
map
常用的方法总结
方法的返回值 | 方法名 | 方法的描述 |
---|---|---|
V |
put(K key, V value) |
添加/修改 key-value 到当前map中。 |
void |
putAll(Map m) |
将m中的所有key-value对存放到当前map中 |
V |
remove(Object key) |
移除指定key的key-value对,并返回value |
void |
clear() |
清空当前map中的所有数据 只剩{} |
V |
get(Object key) |
获取指定key对应的value |
boolean |
containsKey(Object key) |
是否包含指定的key |
boolean |
containsValue(Object value) |
是否包含指定的value |
int |
size() |
返回map中key-value对的个数 |
boolean |
isEmpty() |
判断当前map是否为空 |
boolean |
equals(Object o) |
判断当前map和参数对象obj是否相等 |
-
代码试验如下:
@Test public void testMap1(){ Map map = new HashMap(); //1、 Object put(Object key,Object value):添加/修改 key-value 到当前map中。 map.put("AAA", 123); map.put("BBB", 456); map.put("CCC", 789); map.put("AAA", 233); //2、void putAll(Map m): 将m中的所有key-value对存放到当前map中 Map map1 = new HashMap(); map1.put("DDD", 444); map1.put("EEE", 555); map.putAll(map1); System.out.println(map); //3、Object remove(Object key):移除指定key的key-value对,并返回value Object value = map.remove("EEE"); System.out.println(value); //4、void clear():清空当前map中的所有数据 只剩{} map.clear(); System.out.println(map); //5、Object get(Object key):获取指定key对应的value System.out.println(map.get("DDD")); //6、boolean containsKey(Object key):是否包含指定的key System.out.println(map.containsKey("BBB")); //7、boolean containsValue(Object value):是否包含指定的value System.out.println(map.containsValue(444)); //8、int size():返回map中key-value对的个数 System.out.println(map.size()); //9、boolean isEmpty():判断当前map是否为空 System.out.println(map.isEmpty()); //10、boolean equals(Object obj):判断当前map和参数对象obj是否相等 Map map2 = new HashMap(); map2.put("DDD", 444); map2.put("EEE", 555); Map map3 = new HashMap(); map3.put("DDD", 444); map3.put("EEE", 555); System.out.println(map2.equals(map3)); }
-
遍历map的常用方法
方法的返回值 方法名 方法的描述 Set<K>
keySet()
返回所有key构成的Set集合 Collection<V>
values()
返回所有value构成的Collection集合 Set<Map.Entry<K,V>>
entrySet()
返回所有key-value对构成的Set集合 -
代码试验如下
@Test public void testMap2(){ Map map = new HashMap(); map.put("AAA", 123); map.put("BBB", 456); map.put("CCC", 789); map.put("DDD", 333); map.put("EEE", 444); //11、Set keySet():返回所有key构成的Set集合 Set set = map.keySet(); Iterator iterator = set.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } //12、Collection values():返回所有value构成的Collection集合 Collection values = map.values(); System.out.println(values); //13、 Set entrySet():返回所有key-value对构成的Set集合 Set entrySet = map.entrySet(); Iterator iterator1 = entrySet.iterator(); while (iterator1.hasNext()){ Map.Entry entry = (Map.Entry)iterator1.next(); System.out.println("key = "+ entry.getKey() + ",value = " + entry.getValue()); } }
Map存储数据的结构分析
-
Map
集合存储的是key-value
键-值对,如上遍历map时的三个方法中,keySet()
方法的返回值是Set,values()
方法的返回值是Collection
,entrySet()
的返回值中的泛型是Map.Entry
,那么我们可以用一张图形象的概括:
实现类
HashMap
-
HashMap
允许使用null键和null值,不记录映射的顺序。 -
HashMap
的存储结构:- JDK 7及以前版本:
HashMap
是数组+链表结构; - JDK 8版本及以后:
HashMap
是数组+链表+红黑树实现。
- JDK 7及以前版本:
LinkedHashMap
-
LinkedHashMap
是HashMap
的子类,在HashMap
存储结构的基础上,使用了一对双向链表来记录添加
元素的顺序,维护Map
的迭代顺序:迭代顺序与Key-Value
对的插入顺序一致。static class Entry<K,V> extends HashMap.Node<K,V> { //多出来的before, after 可以记录添加的元素的先后顺序 Entry<K,V> before, after; Entry(int hash, K key, V value, Node<K,V> next) { super(hash, key, value, next); } }
TreeMap
TreeMap
存储数据时,要求key必须是由同一个类创建的对象,它会根据key-value
对进行排序, 可以保证所有的key-value
对处于有序状态;TreeMap
的Key
的排序分为自然排序和定制排序。- 自然排序:
Key
必须实现Comparable
接口并重写compareTo()
方法; - 定制排序:创建
TreeMap
时,传入一个Comparator
对象,对象重写compare()
方法。 - 详情见:集合1中的
treeSet
实现类。
- 自然排序:
Hashtable
Hashtable
是线程安全的,不允许使用 null 作为key
和value
,不能保证其中key-value
对的顺序。
Properties
Properties
类是Hashtable
的子类,它主要用于处理属性文件,由于属性文件文件中的key
和value
都是字符串类型,故Properties
里的key
和value
也都是字符串类型。
Collections工具类
概述
Collections
是一个操作Set
、List
和Map
等集合的工具类;Collections
中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作;Collections
提供了对集合对象实现同步控制等方法。
常用方法
方法的返回值 | 方法名 | 方法的描述 |
---|---|---|
static void |
reverse(List<?> list) |
反转 List 中元素的顺序 |
static void |
shuffle(List<?> list) |
对 List 集合元素进行随机排序 |
static <T extends Comparable<? super T>>void |
sort(List<T> list) |
根据元素的自然顺序对指定 List 集合元素按升序排序 |
static <T> void |
sort(List<T> list, Comparator<? super T> c) |
根据指定的 Comparator 产生的顺序对 List 集合元素进行排序 |
static void |
swap(List<?> list, int i, int j) |
将指定 list 集合中的 i 处元素和 j 处元素进行交换 |
static <T extends Object & Comparable<? super T>>T |
max(Collection<? extends T> coll) |
根据元素的自然顺序,返回给定集合中的最大元素 |
static <T> T |
max(Collection<? extends T> coll, Comparator<? super T> comp) |
根据 Comparator 指定的顺序,返回给定集合中的最大元素 |
static int |
frequency(Collection<?> c, Object o) |
返回指定集合中指定元素的出现次数 |
static <T> void |
copy(List<? super T> dest, List<? extends T> src) |
将src中的内容复制到dest中 |
static <T> boolean |
replaceAll(List<T> list, T oldVal, T newVal) |
使用新值替换 List 对象的所有旧值 |
static <T> Collection<T> |
synchronizedCollection(Collection<T> c) |
返回由指定集合支持的同步(线程安全)集合 |
static <T> List<T> |
synchronizedList(List<T> list) |
返回列表支持同步(线程安全)列表 |
static <K,V> Map<K,V> |
synchronizedMap(Map<K,V> m) |
同步(线程安全)Map |
static <T> Set<T> |
synchronizedSet(Set<T> s) |
同步(线程安全)Set |
-
代码试验如下
@Test public void testMap3(){ List list = new ArrayList(); list.add(123); list.add(456); list.add(789); list.add(-111); list.add(0); System.out.println(list); //1、reverse(List):反转 List 中元素的顺序 Collections.reverse(list); System.out.println(list); //2、shuffle(List):对 List 集合元素进行随机排序 Collections.shuffle(list); System.out.println(list); //3、sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序 Collections.sort(list); System.out.println(list); //4、sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序 Collections.sort(list, new Comparator() { @Override public int compare(Object o1, Object o2) { if (o1 instanceof Integer && o2 instanceof Integer){ int i = (Integer)o1; int j = (Integer)o2; return -Integer.compare(i,j); } return 0; } }); System.out.println(list); //5、swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换 Collections.swap(list,1,3); System.out.println(list); } @Test public void testMap4(){ List list = new ArrayList(); list.add(123); list.add(456); list.add(789); list.add(-111); list.add(0); //6、Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素 System.out.println(Collections.max(list)); //7、Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素 System.out.println(Collections.max(list,new Comparator(){ @Override public int compare(Object o1, Object o2) { if (o1 instanceof Integer && o2 instanceof Integer){ int i = (Integer)o1; int j = (Integer)o2; return -Integer.compare(i,j); } return 0; } })); //8、int frequency(Collection,Object):返回指定集合中指定元素的出现次数 System.out.println(Collections.frequency(list, 123)); //9、void copy(List dest,List src):将src中的内容复制到dest中 List dest = Arrays.asList(new Object[list.size()]); Collections.copy(dest,list); System.out.println(dest); //10、boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值 Collections.replaceAll(list,789,799); System.out.println(list); //11、创建线程安全的集合 List list1 = Collections.synchronizedList(list); }
原创不易,欢迎转载,转载时请注明出处,谢谢!
作者:潇~萧下
原文链接:https://www.cnblogs.com/manongxiao/p/13587239.html