JavaSE中级之集合五
Map
接口
常用方法
-
put、clear、remove、containsKey、containsValue、size、equals、isEmpty、get
put
--------------->添加元素到集合clear
--------------->清除集合里面所有元素remove
--------------------->移除集合里的某一个元素containsKey
---------------------->查看集合中是否有某个key
值containsValue
---------------->查看集合中是否有某个Value
值size
------------->查看集合元素个数,Key
值相同的只会记录一个equals
------------->判断集合中的值是否一致isEmpty
----------------------->判断集合是否为空get
------------------>得到集合中与Key
值相对应的Value
值
Map<String,Integer> map = new HashMap<>(); System.out.println(map.put("lolp", 123)); map.put("aszx",456); map.put("erdf",789); System.out.println(map.put("lolp", 900)); map.put("zxc",123); map.put("plm",123); //map.clear(); //map.remove("zxc"); System.out.println(map.containsKey("plm")); System.out.println(map.containsValue(456)); System.out.println(map.size()); System.out.println(map); System.out.println("==============="); Map<String,Integer> map1 = new HashMap<>(); map1.put("lolp", 123); map1.put("aszx",456); map1.put("erdf",789); map1.put("lolp", 900); map1.put("zxc",123); map1.put("plm",123); System.out.println(map == map1); System.out.println(map.equals(map1));//对equals进行重写,判断集合中的值是否一致 System.out.println(map.isEmpty());//判断集合是否为空 System.out.println(map.get("erdf"));
Map
接口遍历
增强for
循环
-
通过
Set
进行循环Set<String> set = map.keySet(); for (String s : set) { System.out.println(s); }
-
通过
values
进行循环System.out.println("==============="); //方式一 for (Integer value : map.values()) { System.out.println(value); } System.out.println("==============="); //方式二 Collection<Integer> values = map.values(); for (Integer integer : values) { System.out.println(integer); }
-
通过
get(Object key) keySet()
进行循环Set<String> set1 = map.keySet(); for (String s : set1) { System.out.println(map.get(s)); }
-
通过
entrySet
进行循环Set<Map.Entry<String,Integer>> entries = map.entrySet(); for (Map.Entry<String,Integer> entry : entries) { System.out.println(entry.getKey() + "-----" + entry.getValue()); }
HashMap
实现类
特点
- 无序且唯一
- 按照
key
排序,底层是哈希表结构
HashMap
、LinkedHashMap
和Hashtable
的区别
HashMap
HashMap
出现在JDK1.2中HashMap
的效率高,但是线程不安全key
可以存null
值,并且也遵循唯一的特点- 自定义数据类型需要对
equals
和hashCode
进行重写
Hashtable
Hashtable
出现在JDK1.0中Hashtable
的效率低,但是线程安全Hashtable
的key
不能存null
值
LinkedHashMap
- 唯一且有序,并按照输入顺序输出
TreeMap的使用
特点
-
唯一且有序,按照输入顺序输出
-
String
类型Map<String,Integer> map = new TreeMap<>(); map.put("wsx",123); map.put("qaz",234); map.put("edc",345); map.put("rfv",456); map.put("wsx",567); map.put("tgb",678); System.out.println(map.size()); System.out.println(map);
-
自定义引用数据类型
-
内部比较器
-
自定义类
private int age; private String name; private double height; public Pretty() { } public Pretty(int age, String name, double height) { this.age = age; this.name = name; this.height = height; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } @Override public String toString() { return "Pretty{" + "age=" + age + ", name='" + name + '\'' + ", height=" + height + '}'; } @Override public int compareTo(Pretty o) { //return this.getAge() - o.getAge(); //return this.getName().compareTo(o.getName()); return ((Double) (this.getHeight())).compareTo((Double) (o.getHeight())); }
-
测试类
Map<Pretty,Integer> map = new TreeMap<>(); map.put(new Pretty(18,"qwe",165.7),123); map.put(new Pretty(19,"rty",175.5),345); map.put(new Pretty(20,"asd",155.6),123); map.put(new Pretty(17,"zxc",166.0),123); map.put(new Pretty(21,"qwe",169.5),123); map.put(new Pretty(18,"fgh",172.3),123); System.out.println(map.size()); System.out.println(map);
-
-
外部比较器
-
自定义类
private int age; private String name; private double height; public Asked() { } public Asked(int age, String name, double height) { this.age = age; this.name = name; this.height = height; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } @Override public String toString() { return "Asked{" + "age=" + age + ", name='" + name + '\'' + ", height=" + height + '}'; }
-
测试类
Map<Asked,Integer> map = new TreeMap<>(new Comparator<Asked>() { @Override public int compare(Asked o1, Asked o2) { //return o1.getAge() - o2.getAge(); //return o1.getName().compareTo(o2.getName()); return ((Double) (o1.getHeight())).compareTo((Double) (o2.getHeight())); } }); map.put(new Asked(18,"qwe",165.7),123); map.put(new Asked(19,"rty",175.5),345); map.put(new Asked(20,"asd",155.6),123); map.put(new Asked(17,"zxc",166.0),123); map.put(new Asked(21,"qwe",169.5),123); map.put(new Asked(18,"fgh",172.3),123); System.out.println(map.size()); System.out.println(map);
-
-
HashMap
面试题
- 为什么装填因子、负载因子和加载因子的值是0.75
- 设为1,空间利用率得到了很大的满足,很容易碰撞,碰撞会产生链表,然后导致查询效率低
- 设为0.5,碰撞的概率低,扩容、产生链表的概率低,查询效率高,但是空间利用率太低了
- 为什么主数组的长度必须为2^n
- 为了防止哈希冲突和位置冲突
h & (lenght - 1)
等效h % lenght
的操作,但是前提是要lenght必须是2的整数倍
Collections工具类
- 构造器私有化,不支持创建对象
常用类
-
add()、addll()、sort()、binarySearch()、copy()、fill()
add();
--------> 添加元素到集合中addll();
-------> 添加大量的集合元素sort();
-------> 将集合升序排列binarySearch();
-------> 对集合内的某个元素进行二分查找copy();
-------> 将一个集合内的元素替换为另一个集合的元素fill();
-------> 将集合内的元素全部填充为一个元素
ArrayList<String> arrayList = new ArrayList<>(); arrayList.add("qq"); arrayList.add("aa"); arrayList.add("zz"); Collections.addAll(arrayList,"xx","cc","vv"); Collections.addAll(arrayList,new String[]{"bb","nn","mm"}); System.out.println(arrayList); Collections.sort(arrayList);//升序排列 System.out.println(arrayList); System.out.println(Collections.binarySearch(arrayList,"vv")); ArrayList<String> arrayList1 = new ArrayList<>(); Collections.addAll(arrayList1,"ee","dd","ff"); Collections.copy(arrayList,arrayList1);//a1的元素替换给a System.out.println(arrayList); System.out.println(arrayList1); Collections.fill(arrayList1,"ll"); System.out.println(arrayList1);