程序笔记   发布时间:2022-07-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了# Day18-Java基础大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

Day18-Java

文章目录

  • Day18-Java
      • 1、Map集合
        • 1.1 子类:HashMap
      • 面试题:解释HashMap的原理
        • 1.2 子类:Hashtable
        • 1.3 ConcurrentHashMap子类
        • 1.4 Map使用Iterator输出
        • 1.5 Map中的key实现说明
        • 1.6 TreeMap子类

1、Map集合

偶对象指的是一对对象࿰c;即:两个对象同时保存࿰c;这两个对象是按照了“key=value”的形式进行定义的࿰c;即:可以通过key找到对应的value数据࿰c;就好像电话本一样࿰c;例如࿰c;电话本之中保存了如下的信息:

Key =张三c;value=123456;

Key=李四c;value=234567;

现在如果要想找到张三的电话࿰c;那么肯定根据张三的key࿰c;取得对应的value࿰c;而如果现在要想找到王五的电话࿰c;由于没王五这个key࿰c;所以返回的结果就是null。

@H_916_7@map就是实现这样一种操作的数据结构࿰c;这个接口之中的定义的主要操作方法如下。

方法名称类型描述
public V put(K key, V value)普通向集合之中保存数据
public V get(Object key)普通通过指定的key取得对应value
Public Set keyset()普通将Map中的所有key以Set集合的方式返回
Public Set<Map,Entry<K,V>>entrySet()普通将Map集合变为Set集合

在Map接口之中有两个常用的子类:HashMap,Hashtable。

1.1 子类:HashMap

HashMap是Map接口之中使用最多的一个子类

@H_616_133@public class HashMap<K,V> extends AbstractMap<K,V> implements @H_426_139@map<K,V>, Cloneable, serializable

HashMap演示Map接口中各个主要方法的作用

@H_288_197@

验证Map

@H_616_133@package com.day18.demo; import java.util.HashMap; import java.util.Iterator; import java.util.@H_426_139@map; import java.util.Set; public class HashMapDemo { public static void @H_353_278@main(String[] args) { @H_426_139@map<Integer,String> map = new HashMap<>(); map.put(1, "hello,world!!"); map.put(2, "zsr"); map.put(3, ".com"); Set<Integer> keyset = map.keySet();//取得所有的key信息 Iterator<Integer> iterator = keyset.iterator(); while(iterator.hasNext()){ Integer key = iterator.next(); System.out.println(key + "=" + map.get(key)); } } }

面试题:解释HashMap的原理

​ 在数据量小的时候HashMap是按照链表的模式存储的。当数据量变大之后࿰c;为了进行快速的查找࿰c;将这个链表变为一个红黑树(均衡二叉树)࿰c;用hash码作为数据定位࿰c;来进行保存的。

​ 所有的方法都是异步的࿰c;属于线程不安全操作。

1.2 子类:Hashtable

jdk1.0提供三大主要类:Vector、Enumeration、Hashtable。

Hashtable是最早实现这种二元偶对象数据结构࿰c;由于后期的设计也让其与Vector一样多实现了MMap接口。

@H_616_133@package com.day18.demo; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.@H_426_139@map; import java.util.Set; public class HashtableDemo { public static void @H_353_278@main(String[] args) { @H_426_139@map<Integer,String> map = new Hashtable<>(); map.put(1, "hello,world!!"); map.put(2, "zsr"); map.put(3, ".com"); map.put(null, null); System.out.println(@H_431_136@map); } } Exception in thread "main" java.lang.NullPointerException at java.util.Hashtable.put(Hashtable.java:460) at com.day18.demo.HashtableDemo.@H_353_278@main(HashtableDemo.java:15)

以上Hashtable无法传入空值并对其进行输出。而HashMap可以

@H_616_133@package com.day18.demo; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.@H_426_139@map; import java.util.Set; public class HashtableDemo { public static void @H_353_278@main(String[] args) { @H_426_139@map<Integer,String> map = new HashMap<>(); map.put(1, "hello,world!!"); map.put(2, "zsr"); map.put(3, ".com"); map.put(null, null); System.out.println(@H_431_136@map); } } {null=null, 1=Hello,world!!, 2=zsr, 3=.com}
区别HashMapHashtable
时间JDK1.2JDK1.0
性能采用异步处理方式࿰c;性能高采用同步处理方式性能相对较低
安全性线程安全线程不安全
设置null允许key、value设置为null不允许key、value设置为null࿰c;否则出现异常

# Day18-Java基础

1.3 ConcurrentHashMap子类

ConcurrentHashMap 的特点 = Hashtable的线程安全性 + HashMap的高性能࿰c;使用COncurrentHashMap处理的时候既可以保证多个线程更新数据的同步࿰c;又可以保证很高效的查询速度。

@H_616_133@public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>, serializable

如果说现在采用一定的算法࿰c;将保存的大量数据平均分在不同的桶(数据区域)࿰c;这样在进行数据查找的时候就可以避免这种全部的数据扫描。

@H_288_197@

数据分桶

@H_616_133@package com.day18.demo; import java.util.Random; public class ConcurrentHashMapDemo { public static void @H_353_278@main(String[] args) { for(int i = 0; i <10 ; i++){ new Thread(()->{ Random random = new Random(); int temp = random.nexTint(9999); int result = temp % 3; switch(result){ case 0: System.out.println("第0桶" + temp); break; case 1: System.out.println("第1桶" + temp); break; case 2: System.out.println("第2桶" + temp); break; } }).start(); } } }

采用分桶之后每一个数据必须有一个明确的分桶标记࿰c;很明显使用hashCode()。

# Day18-Java基础

# Day18-Java基础

# Day18-Java基础

# Day18-Java基础

1.4 Map使用Iterator输出

在实际的开发之中࿰c;如果你存储数据是为了输出࿰c;那么优先虑一定是Collection࿰c;使用Map的主要操作就是设计我们的内容࿰c;而后通过get()进行查找。使用Map迭代输出的需求会有࿰c;但是不多。

@H_288_197@

通过一个简单的图形来观察Collection与Map保存数据的区别

# Day18-Java基础

# Day18-Java基础

@H_288_197@

通过Iterator输出Map内容

@H_616_133@package com.day18.demo; import java.util.HashMap; import java.util.Iterator; import java.util.@H_426_139@map; import java.util.@H_426_139@map.Entry; import java.util.Set; public class @H_426_139@mapIteratorDemo { public static void @H_353_278@main(String[] args) { @H_426_139@map<Integer,String> map = new HashMap<>(); map.put(1, "hELLO,"); map.put(2, "WORLD!!!"); //1.将map变为Set集合 Set<@H_426_139@map.Entry<Integer,String>> set = map.entrySet(); //2.实例化Iterator接口 Iterator<Entry<Integer, String>> iter = set.iterator(); //3.迭代输出每一个Map.Entry对象 while(iter.hasNext()){ //4.取出Map.Entry @H_426_139@map.Entry<Integer, String> me = iter.next(); //5.取得key和value System.out.println(@H_431_136@me.getKey() + "=" + me.getValue()); } } }

1.5 Map中的key实现说明

@H_288_197@

自定义Key类型

@H_616_133@package com.day18.demo; import java.util.HashMap; import java.util.@H_426_139@map; class Person2{ private String name; public Person2(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public Boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person2 other = (Person2) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } public class PersonDemo { public static void @H_353_278@main(String[] args) { @H_426_139@map<Person2,String> map = new HashMap<Person2,String>(); map.put(new Person2("张三"), new String("zs")); System.out.println(@H_431_136@map.get(new Person2("张三"))); } }

因为实际开发࿰c;对于map集合中key类型࿰c;不是String就是Integer࿰c;这些系统类都帮用户覆写了equals()、hashCode()方法了。

1.6 TreeMap子类

可以排序的Map子类࿰c;他是按照key的内容来进行排序的。

@H_288_197@

TreeMap操作

@H_616_133@package com.day18.demo; import java.util.HashMap; import java.util.@H_426_139@map; import java.util.TreeMap; class Person2{ private String name; public Person2(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public Boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person2 other = (Person2) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } public class PersonDemo { public static void @H_353_278@main(String[] args) { @H_426_139@map<Person2,String> map = new TreeMap<Person2,String>(); map.put(new Person2("张三"), new String("zs")); System.out.println(@H_431_136@map.get(new Person2("张三"))); } } Exception in thread "main" java.lang.ClassCastException: com.day18.demo.Person2 cAnnot be cast to java.lang.Comparable at java.util.TreeMap.compare(TreeMap.java:1294) at java.util.TreeMap.put(TreeMap.java:538) at com.day18.demo.PersonDemo.@H_353_278@main(PersonDemo.java:51)

出现以上问题是因为没有实现Comparable接口。

@H_616_133@package com.day18.demo; import java.util.HashMap; import java.util.@H_426_139@map; import java.util.TreeMap; class Person2 implements Comparable<Person2>{ private String name; public Person2(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public int compareTo(Person2 o) { // TODO Auto-generated method stub return this.name.compareTo(o.name); } @Override public Boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person2 other = (Person2) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } public class PersonDemo { public static void @H_353_278@main(String[] args) { @H_426_139@map<Person2,String> map = new TreeMap<Person2,String>(); map.put(new Person2("张三"), new String("zs")); System.out.println(@H_431_136@map.get(new Person2("张三"))); } }

Collection保存数据的目的是为了输出、Map保存数据的目的是为了根据key查找࿰c;

@H_916_7@map使用Iterator输出(Map.Entry的作用)

一些类的设计原理࿰c;这些是在你面试用得到的࿰c;而我们开发里面就是使用HashMap子类

大佬总结

以上是大佬教程为你收集整理的# Day18-Java基础全部内容,希望文章能够帮你解决# Day18-Java基础所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。