标签:map Day03 age put User 集合 new public
Map
/----Map : 存储双列数据[key-value]
/----HashMap : 作为Map的主要实现类 (线程不安全,效率高,可以存储null的key和value)
/----LinkedHashMap : 保证在遍历map元素时,可以按照添加的顺序遍历
(在原有的HashMap的层结构基础上,添加的了一对指针,只想前一个节点和后一个节点)
(对于频繁的遍历操作,此类执行效率高于HashMap)
/----TreeMap : 保证按照添加的key-value进行排序,实现遍历排序,默认使用key来排序
(底层使用红黑树)
/----Hashtable : 作为古老的实现类 JDK1.0 (线程安全,效率低,不可以存储null的key和value)
/----Properties : 常用来处理配置文件,key和value都是String类型
- Map中的key : 无序的,不可重复的,使用Set存储 ---->所在类需要重写equals和hashcode方法
Map中的value : 无序的, 可重复的,使用Collection来存储 ---->所在类需要重写equal方法
一个key-value键值对购政策和那个一个Entry对象
HashMap
JDK7.0及之前
- 底层结构 : 数组 + 链表
-
Map map = new HashMap<>(); map.put(key1,value1);
- 1.在HashMap实例化后,底层创建了长度为16的一维数组Entry[] table
- 2.调用key1.hashcode()方法,计算其哈希值,此哈希值经过算法计算,得到在Entry数组的存放位置
- 3.如果此位置为空,则key1-value1添加成功
- 4.如果此位置上的数据不为空(此位置上存在一个或者多个数据(以链表的形式存在)),比较key1的哈希值和已经存在的多个数据的哈希值.
- 4.1如果key1的哈希值与已经存在的哈希值都不一样,此时key1-value1添加成功
- 4.2如果key1的哈希值与已经存在的某一个数据的哈希值相同,继续调用key1.equals()方法进行比较
- 5.1如果equals方法返回false,此时key1-value1添加成功
- 5.2如果equals方法返回true,使用value1替换
JDK8.0
- 底层结构 : 数据 + 链表 + 红黑树
- jdk8的底层实现方面与jdk7的不同
- new Hashmap()底层没有创建一个长度为16的数组
- jdk8底层数组是 Node[] 而非 Entry[]
- 首次调用put方法时,底层创建长度为16的数组
- jdk7 底层只有数组+链表,jdk8中的底层有数组+链表+红黑树
当数的某一个索引位置上以链表形式存在的数据个数大于8,且当前数组长度大于64,此时此索引位置上的所有数据改为用红黑树存储
public class Test1 {
public static void main(String[] args) {
Map map = new HashMap<>();
map.put("1","a");
map.put("2","b");
map.put("3","c");
map.put("4","d");
map.put("5","e");
map.put("6","f");
map.put("7","g");
// keySet()方法
Set set = map.keySet();
System.out.println(set);
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
// values()方法
Collection collection = map.values();
System.out.println(collection);
for (Object o : collection){
System.out.println(o);
}
// entrySet()方法
Set entrySet = map.entrySet();
System.out.println(entrySet);
Iterator iterator2 = entrySet.iterator();
while (iterator2.hasNext()){
Map.Entry entry = (Map.Entry)iterator2.next();
System.out.println(entry.getKey()+" : "+entry.getValue());
}
}
}
TreeMap
- 应为要根据key排序,所以key必须同一类型
- 排序分为自然排序 和 定制排序
public class Test2 {
public static void main(String[] args) {
// 定制排序 (从大到小)
Comparator comparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof User && o2 instanceof User){
User u1 = (User) o1;
User u2 = (User) o2;
return -Integer.compare(u1.getAge(),u2.getAge());
}else{
throw new RuntimeException("Yes, Error!");
}
}
};
TreeMap treeMap = new TreeMap(comparator);
// 自然排序(从小到大)
//TreeMap treeMap = new TreeMap();
User user1 = new User(33);
User user2 = new User(23);
User user3 = new User(90);
User user4 = new User(45);
User user5 = new User(-12);
User user6 = new User(34);
treeMap.put(user1,98);
treeMap.put(user2,85);
treeMap.put(user3,34);
treeMap.put(user4,123);
treeMap.put(user5,-23);
treeMap.put(user6,128);
Set set = treeMap.entrySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()){
Map.Entry entry = (Map.Entry)iterator.next();
System.out.println(entry.getKey()+" : "+entry.getValue());
}
}
}
public class User implements Comparable{
private int age ;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public User(int age) {
this.age = age;
}
public User() {
}
@Override
public int compareTo(Object o) {
if (o instanceof User){
User u = (User) o;
return Integer.compare(this.age,u.age);
}else{
throw new RuntimeException("Yes, Error!");
}
}
@Override
public String toString() {
return "User{" +
"age=" + age +
'}';
}
}
Collections
- 是一个操作Collection和Map的工具类
标签:map,Day03,age,put,User,集合,new,public 来源: https://blog.csdn.net/qq_42091436/article/details/113803808
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。