一、Map集合
1.1 概述
用来存放具有一一对应这种映射关系数据的容器,即为java.util.Map集合。
。特点:
- 元素是成对存在的(key-value)。
- 双列集合,无序。
- 集合不能包含重复的键,值可以重复,每个键只能对应一个值。
1.2 Map接口中的常用方法
Map接口中定义了很多方法,常用的如下:
-
public V put(K key, V value)
: 把指定的键与指定的值添加到Map集合中。
ps:使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中。
-
public V remove(Object key)
: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。 -
public V get(Object key)
根据指定的键,在Map集合中获取对应的值。 -
boolean containsKey(Object key)
判断集合中是否包含指定的键。 -
public Set<K> keySet()
-
public Set<Map.Entry<K,V>> entrySet()
: 获取到Map集合中所有的entry键值对对象的集合(Set集合)。
ps:既然Entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法:
-
- Collection<V> values():返回此映射中包含的值的
Collection
视图。
ps:可以通过values方法返回的Collection
对象来调用iterator()方法,从而实现取数据。(先存后取,后存先取)
1.3 Map常用子类
1.3.1
- 集合初始化时,最好指定集合初始值的大小。
比如HashMap初始化HashMap(int initialCapacity):initialCapacity=(需要存储的元素个数│负载因子)+1.注意负载因子(即loaderfactor)默认为0.75
1.3.1.2 LinkedHashMap<K,V>
LinkedHashMap是HashMap的子类,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致(有序);通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。会保存记录的插入顺序。
1.3.2 Hashtable<K,V>
存储数据采用的哈希表结构,此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null
对象都可以用作键或值。
/** HashMap 与 HashTable 的异同: 相同点:① 都是哈希表数据结构; 不同点:① HashMap 线程不安全,效率比较高,1.2版本才有; (如果需要满足线程安全,可以用 Collections 的 synchronizedMap 方法使HashMap 具有线程安全的能力,或者使用 ConcurrentHashMap。) HashTable 线程安全,效率不高,1.0之前就有。 ② HashMap 可以存储null;HashTable 不可以存储null。 (HashMap 最多只允许一条记录的键为 null,允许多条记录的值为 null。) */
1.3.3 TreeMap<K,V>
基于红黑树(Red-Black tree)的 NavigableMap
实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator
进行排序,具体取决于使用的构造方法。
在使用 TreeMap 时,key 必须实现 Comparable 接口或者在构造 TreeMap 传入自定义的Comparator,否则会在运行时抛出 java.lang.ClassCastException 类型的异常。
1.3.4 ConcurrentHashMap<K,V>
1.3.4.1 并行度(默认 16)
concurrencyLevel:并行级别、并发数、Segment 数,怎么翻译不重要,理解它。默认是 16,也就是说 ConcurrentHashMap 有 16 个 Segments,所以理论上,这个时候,最多可以同时支持 16 个线程并发写,只要它们的操作分别分布在不同的 Segment 上。这个值可以在初始化的时候设置为其他值,但是一旦初始化以后,它是不可以扩容的。再具体到每个 Segment 内部,其实每个 Segment 很像之前介绍的 HashMap,不过它要保证线程安全,所以处理起来要麻烦些。
1.3.4.2 Java8实现(引入了红黑树)
Java8 对 ConcurrentHashMap 进行了比较大的改动,Java8 也引入了红黑树。
Hashtable 是遗留类,很多映射的常用功能与 HashMap 类似,不同的是它承自 Dictionary 类,并且是线程安全的,任一时间只有一个线程能写 Hashtable,并发性不如 ConcurrentHashMap,因为 ConcurrentHashMap 引入了分段锁。Hashtable 不建议在新代码中使用,不需要线程安全的场合可以用 HashMap 替换,需要线程安全的场合可以用 ConcurrentHashMap 替换。
1.4 JDK9对集合添加的优化
Java 9,添加了几种集合工厂方法,更方便创建少量元素的集合、map实例。新的List、Set、Map的静态工厂方法可以更方便地创建集合的不可变实例。
public class HelloJDK9 { public static void main(String[] args) { Set<String> str1 = Set.of("a","b","c"); //str1.add("c");这里编译的时候不会错,但是执行的时候会报错,因为是不可变的集合 System.out.println(str1); Map<String,Integer> str2 = Map.of("a",1,"b",2); System.out.println(str2); List<String> str3 = List.of("a","b"); System.out.println(str3); } }
1:of() 方法只是Map,List,Set这三个接口的静态方法,其父类接口和子类实现并没有这类方法;
2:返回的集合是不可变的。
二、
-
-
public String getProperty(String key)
:使用此属性列表中指定的键搜索属性值。 -
public Set<String> stringPropertyNames()
public class ProDemo { public static void main(String[] args) throws FileNotFoundException { // 创建属性集对象 Properties pro = new Properties(); // 加载文本中信息到属性集 pro.load(new FileInputStream("read.txt")); // 遍历集合并打印 Set<String> strings = pro.stringPropertyNames(); for (String key : strings ) { System.out.println(key+" -- "+pro.getProperty(key)); } } } 输出结果: filename -- wfx.txt length -- 20200819 location -- D:wfx.txt
- stroe(Writer, comments):把集合中的数据,保存到指定的流所对应的文件中,参数commonts代表描述信息
Public class PropertiesDemo { Public static void main(String[] args) throws IOException { //1,创建Properties集合 Properties prop = new Properties(); //2,添加元素到集合 prop.setProperty("name", "jack"); prop.setProperty("age", "25"); prop.setProperty("address", "usa"); //3,创建流 FileWriter out = new FileWriter("prop.properties"); //4,把集合中的数据存储到流所对应的文件中 prop.store(out, "save data"); //5,关闭流 out.close(); } }
小贴士:文本中的数据,必须是键值对形式,可以使用空格、等号、冒号等符号分隔。