今天主要学了Map集合直接实现或间接实现类有HashMap,LinkedMap,TreeMap,Hashtable,Properties其中最常用的是HashMap,里面存储的键值对是无序的,不可重复的。HashMap的存储结构为数组+链表+红黑树。LinkedMap是HashMap的子类,通过链表存储键值对,保证了数据的顺序。TreeMap也是有序的,可通过自然排序或自定义排序实现。Collections工具类是针对List,Map,Set集合的工具类,可以实现数据排序、翻转等操作。这些集合的底层实现还是等后期再来研究吧。
Map集合概述
lnterface Map<K,V>K:键的类型;V:值的类型
将键映射到值的对象;不能包含重复的键;每个键可以映射到最多一个值
创建Map集合的对象
多态的方式
Map
HashMap:作为Map的主要实现类,线程不安全,效率高,可以存储null的key和value
LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历,在原有的HashMap底层基础上添加了一对指针,指向前一个和后一个元素,对于频繁的遍历其效率高于HashMap
TreeMap:按照添加的key-value对进行排序,实现排序遍历,此时考虑key的自然排序或定义排序底层使用红黑树
Hashtable:作为古老的实现类,线程安全,效率低,不能存储null的key和value
Properties:常用来处理配置文件,key和value都是String类型
Map结构的理解
Map中key:无序的,不可重复的,使用Set存储所有的key----->key所在的类要重写equals方法和hashCode方法 (以HashMap为例)
Map中value:无序的,可重复的,使用Collection存储所有的value--------->value所在的类要重写equals方法
一个键值对key-value构成了一个Entry对象
Map中的Entry:无序的、不可重复的使用Set存储所有的Entry
Map<String,String> map = new HashMap<>(); map.put("张无忌","赵敏"); map.put("郭靖","黄蓉"); map.put("杨过","小龙女"); System.out.println(map.remove("郭靖")); System.out.println(map.containsValue("小龙女")); System.out.println(map); System.out.println(map.size()); ========== 黄蓉 true {杨过=小龙女, 张无忌=赵敏}
Map<String,String> map = new HashMap<>(); map.put("张无忌","赵敏"); map.put("郭靖","黄蓉"); map.put("杨过","小龙女"); //获取键对应的值 System.out.println(map.get("张无忌")); System.out.println("==========="); //获取键的集合返回的是set集合 Set<String> set = map.keySet(); for (String s : set) { System.out.println(s); } System.out.println("==========="); //获取值的集合返回的是Collection Collection<String> cle = map.values(); for (String s : cle) { System.out.println(s); }
上面是遍历方法一
下面是遍历方法二通过entrySet方法
Map map = new HashMap<>(); map.put("张无忌","赵敏"); map.put("郭靖","黄蓉"); map.put("杨过","小龙女"); //entrySet Set entry = map.entrySet(); Iterator iterator = entry.iterator(); while (iterator.hasNext()){ Object obj = iterator.next(); //Entry中的元素都是entry Map.Entry et = (Map.Entry) obj; System.out.println(et.getKey()+","+et.getValue()); }
第三种遍历key取出对应的value
Set set = map.keySet(); for (Object o : set) { Object obj = map.get(o); System.out.println(o+","+obj); }
public static void main(String[] args) { TreeMap map = new TreeMap(); Student s1 = new Student("Tom",23); Student s2 = new Student("Bob",20); Student s3 = new Student("Jack",18); Student s4 = new Student("Jerry",17); map.put(s1,95); map.put(s2,96); map.put(s3,94); map.put(s4,97); Set set = map.entrySet(); Iterator iterator = set.iterator(); while (iterator.hasNext()){ Object obj = iterator.next(); Map.Entry me = (Map.Entry) obj; System.out.println(me.getKey()+","+me.getValue()); } private String name; private int age; public Student(){} public Student(String name, int age){ this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compareTo(Object o) { //按照年龄从小到大排序 Student student = (Student) o; int num = this.age - student.age; //如果年龄相同那么判断名字是否相同 int num2 = num == 0 ? this.name.compareTo(student.name) : num; return num2; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } ========= Student{name='Jerry', age=17},97 Student{name='Jack', age=18},94 Student{name='Bob', age=20},96 Student{name='Tom', age=23},95
Properties类是Hashtable的子类,该对象用于处理属性文件
由于属性文件里的key、value都是字符串类型,所以Properties里的 key和l value都是字符串类型
存取数据时,建议使用setProperty(String key,String value)方法和getProperty(String key)方法
/ /Properties:常用来处理配置文件。key和value都是string类型public static void main(String[] args) throws Exception { Properties pros = new Properties(); FileInputStream fis = new FileInputstream( name:"jdbc.properties");pros. load(fis);//加载流对应的文件 string name = pros.getProperty( "name" ) ; String password = pros.getProperty( "password" ); system.out.println("name = " + name + ", password = " + password);
Collections是一个操作Set、List和l Map 等集合的工具类
collections 中提供了一系列静态的万法对集合元系进行排序、查询和修改器等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法
排序操作:(均为static方法)
reverse(List):反转List中元素的顺序 shuffle(List):对List集合元素进行随机排序 sort(List):根据元素的自然顺序对指定List集合元素按升序排序 sort(List,Comparator):根据指定的Comparator一生的o对-S六施东L11/>swap(List,int,int):将指定list集合中的i处元素和j处元素进行交换
//copy方法的正确用法 List src = new ArrayList(); List list = Arrays.asList(new Object[src.size()]); Collections.copy(list,src); //返回的list1就是线程安全的list List list1 = Collections.synchronizedList(list);