目录
一.Map集合
Map集合的特点
* 1.Map集合 和 Collection集合 没有继承关系,所以不能直接用迭代器
* 2.Collection集合 每一个元素都是单独存在
* Map集合的每一个元素都是成对存在的
* 3.Collection<E>一个泛型
* Map<K,V>两个泛型, K代表键的类型,V代表值的类型
* K,V可以相同 也可以不同,必须都是引用类型
* 4.在Map集合的元素中,键是唯一的,值是可以重复的
常用的实现类:
* HashMap:无序
* 底层哈希表结构,保证键的唯一性,需要重写键对应类的hashCode和equals方法ps:HashTable与HashMap方法一样,但是前者是线程安全的,后者是线程不安全的。
* HashTable和ConcurrentHashMap :(根据并发级别得到数组大小size,默认16 )
* HashTable因为使用了synchronized 同步方法,在竞争激烈的情况下效率会非常低。
* ConcurrentHashMap使用了锁分段的技术,来处理了这个问题。
* LinkedHashMap:有序
* 底层哈希表结构+链表,哈希表保证键的唯一,链表保证元素的有序
* 需要重写键对应类的hashCode和equals方法ps:TreeMap类似于TreeSet,都使用了红黑树作为数据结构,保证了元素的有序性。
Map<K,V>集合常用的方法:
* 增: V put(K key,V value);//向集合中添加键值对
ps:如果集合中已存在该键,覆盖整个键值对,并返回被覆盖的键值对的值
* 删: V remove(OBject key);//根据键 从map集合中删除 键值对,返回值表示被删除的键值对的值
* 改: 隐藏到了put方法!!!
* 查: V get(K key);//根据键 从map集合中找到唯一对应的值,未找到默认返回null
Map集合第一种遍历方法:以键找值
* 1.先获取map集合的键的集合,这个集合是一个Set集合
* Set<K> keys = map集合.keySet();
* 2.遍历keys集合
* a.增强for循环 b.迭代器
* 3.在遍历的过程中,从map集合获取键对应的值
map集合第二种遍历 :键值对遍历
* 1.获取map集合中所有 entry对象
* Set<Map.Entry<K,V>> set = map集合.entrySet();
* 2.遍历这个set集合,获取每一个Map.Entry类型的对象
* a.迭代器 b.增强for循环
* 3.获取到 Map.Entry类型的对象之后
* K key = entry.getKey();
* V value = entry.getValue();
二.Properties类(属性映射)
1.Properties类到底是什么?
* 属性集,
* class Propeties extends HashTable implements Map
* 所以:Properties本质上 就是一个Map集合(实现了Map接口)
2.Properties是一个持久的属性集
* 所谓持久 就是 它具有自己写数据到文件的方法
3.Properties是没有泛型,泛型是固定,String 和 String
4.Properties类,具有Map接口的一切方法
* 还有具有一些自己特有的方法:
* public String getProperty(String key)用指定的键在此属性列表中搜索属性的值,功能和Map中的get是一样
* public Object setProperty(String key, String value);添加键值对,功能和Map的put方法是一样
* public Set<String> stringPropertyNames()://和Map中的keySet方法是一样
5.Properties具有持久化到文件的功能
* store();//保存数据到文件,实际上不是保存到文件 而是写入到流中,由流写到文件ps:data.store(new FileWriter("phones.properties"), "");
* load();//从文件中加载数据,实际上不是直接加载文件,而是加载流中的数据,而流的数据是从该文件中读取的ps:data.load(new FileReader("phones.properties"));
6.遍历Properties对象
Properties ps = new Properties();
............
Set<String> propertyNames = ps.stringPropertyNames(); //获取property的键集合。
for (String propertyName : propertyNames) {
//根据属性名 propertyName获取属性值
String propertyValue = ps.getProperty(propertyName);
System.out.println(propertyName+"="+propertyValue);
}
三.可变参数
* 说的不是参数类型可变,而是参数的个数可以变化
*
* 语法: JDK1.5 出现新特性
* public 返回值类型 方法名(数据类型... 参数名){}
*
* 注意:
* 1.可变参数只是参数的个数是任意个,参数的类型不能改变
* 2.一个方法中 只能有一个可变参数
* 3.当一个方法中有多个参数,并且有一个是可变参数的时候,要求这个可变参数必须在最后
*
* 可变参数的本质: 就是一个数组
四.Collections中的静态方法:
* public static void shuffle(List list);//打乱顺序
* public static void sort(List list);//把集合元素按照自然顺序(123,abc)排序