JAV练习题(Map双列集合)
2022/1/26 23:09:59
本文主要是介绍JAV练习题(Map双列集合),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.利用Map,完成下面的功能:
从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该年没有举办世界杯,则输出:没有举办世界杯。
历届世界杯冠军
届数 举办年份 冠军
第一届 1930年 乌拉圭
第二届 1934年 意大利
第三届 1938年 意大利
第四届 1950年 乌拉圭
第五届 1954年 西德
第六届 1958年 巴西
第七届 1962年 巴西
第八届 1966年 英格兰
第九届 1970年 巴西
第十届 1974年 西德
第十一届 1978年 阿根廷
第十二届 1982年 意大利
第十三届 1986年 阿根廷
第十四届 1990年 西德
第十五届 1994年 巴西
第十六届 1998年 法国
第十七届 2002年 巴西
第十八届 2006年 意大利
第十九届 2010年 西班牙
第二十届 2014年 德国
第二十一届 2018年 法国
在原有世界杯Map 的基础上,增加如下功能:
package com.ffyc.javaoop.day12.HM; import java.util.HashMap; import java.util.Map; import java.util.Scanner; import java.util.Set; public class Demo1 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Map<String,String> map = new HashMap<>(); map.put("1930", "乌拉圭"); map.put("1934", "意大利"); map.put("1938", "意大利"); map.put("1950", "乌拉圭"); map.put("1954", "西德"); map.put("1958", "巴西"); map.put("1962", "巴西"); map.put("1966", "英格兰"); map.put("1970", "巴西"); map.put("1974", "西德"); map.put("1978", "阿根廷"); map.put("1982", "意大利"); map.put("1986", "阿根廷"); map.put("1990", "西德"); map.put("1994", "巴西"); map.put("1998", "法国"); map.put("2002", "巴西"); map.put("2006", "意大利"); map.put("2010", "西班牙"); map.put("2014", "德国"); map.put("2018", "法国"); System.out.println("输入一个年份"); String year = scanner.next(); if(map.containsKey(year)) { System.out.println("该年夺得世界杯的是" + map.get(year)); } if (map.containsKey(year)==false){ System.out.println("该年没有举办世界杯"); } System.out.println("输入一个国家查看获得大力神杯的年份"); String country = scanner.next(); Set<Map.Entry<String,String>> entries = map.entrySet(); for(Map.Entry<String,String>entry:entries){ if((entry.getValue()).equals(country)){ System.out.println(entry.getKey()); } } } }
2.有这样一个字符串"babcabcdaebcdeaa", 统计字符串中每一个字母出现的次数.
要求结果:{a=5,b=4,c=3,d=2,e=2} 要考虑字符串内容是可变的
package com.ffyc.javaoop.day12.HM; import java.util.Map; import java.util.TreeMap; /* 2.有这样一个字符串"babcabcdaebcdeaa", 统计字符串中每一个字母出现的次数. 要求结果:{a=5,b=4,c=3,d=2,e=2} 要考虑字符串内容是可变的 */ public class Demo2 { public static void main(String[] args) { String s = "babcabcdaebcdeaa"; char[] ch = s.toCharArray(); int a = 0; int b = 0; int c = 0; int d = 0; int e = 0; for (int i = 0; i < ch.length; i++) { if(ch[i]=='a'){ a++; }else if(ch[i]=='b'){ b++; }else if(ch[i]=='c'){ c++; }else if(ch[i]=='d'){ d++; }else if(ch[i]=='e'){ e++; } } Map<String,Integer> map = new TreeMap<>(); map.put("a", a); map.put("b", b); map.put("c", c); map.put("d", d); map.put("e", e); System.out.println(map); } }
3.有2个数组,第一个数组内容为:[黑龙江省,浙江省,江西省,广东省,福建省],第二个数组为:[哈尔滨,杭州,南昌,广州,福州],将第一个数组元素作为key,第二个数组元素作为value存储到Map集合中。如{黑龙江省=哈尔滨, 浙江省=杭州, …}。
package com.ffyc.javaoop.day12.HM; import java.util.Map; import java.util.TreeMap; /* 3.有2个数组,第一个数组内容为:[黑龙江省,浙江省,江西省,广东省,福建省], 第二个数组为:[哈尔滨,杭州,南昌,广州,福州], 将第一个数组元素作为key,第二个数组元素作为value存储到Map集合中。 如{黑龙江省=哈尔滨, 浙江省=杭州, …}。 */ public class Demo3 { public static void main(String[] args) { String[] s1 = {"黑龙江省","浙江省","江西省","广东省","福建省"}; String[] s2 = {"哈尔滨","杭州","南昌","广州","福州"}; Map<String,String> map = new TreeMap<>(); for (int i = 0; i < s1.length; i++) { for (int j = 0; j < s2.length; j++) { if(i==j){ map.put(s1[i],s2[j]); } } } System.out.println(map); } }
4.简答
画图整理集合章节中的体系结构图,说明每个接口的作用,每个实现类的特点.
说一说ArrayList添加元素的过程及扩容机制?
答:在底层创建一个默认长度数组,当数组内容添加满了之后,会扩容一个新数组,长度为原来的1.5倍
ArrayList和LinkedList的区别及使用场景?
ArrayList基于数组实现,初始化时,默认长度为10,线程不安全,查询快,增删慢
适用于对各个索引位置的元素进行大量的存取或删除
LinkedList基于双链表实现,查询慢,增删快。
适用于对列表进行循环,循环时进行插入或删除
说一下HashMap的底层实现原理?
答:有一个每个元素都是链表的数组,当添加一个元素时,首先计算元素的hash值,来确定插入的位置,如果存在同一hash值的元素已经被放在这个位置,就添加到后面,形成链表,同一链表的hash值是相同的,当链表长度太大时,链表就转换为红黑树。当链表数组的容量超过初始容量的0.75时,散列将数组扩大两倍,把原链表搬到新链表数组中
以下源码可供参考
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { //Node类型的数组(哈希表) 节点 HashMap.Node<K,V>[] tab; HashMap.Node<K,V> p; int n(哈希表长度), i(就是哈希数组的索引); if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length;//resize()方法就用来扩容hash表 //16-1 & hash (a=97) == 97%16 计算=元素在哈希表中的位置 if ((p = tab[i = (n - 1) & hash]) == null) //当哈希表中的第一个位置没有值,直接将数据包装在Node节点中 tab[i] = newNode(hash, key, value, null); //放在第一个位置中 else { // e记录重复key HashMap.Node<K,V> e; K k; //判断hash值有没有重复的 if (p.hash == hash && 哈希值相等,调用equals() ((k = p.key) == key || (key != null && key.equals(k)))) e = p; //如果哈希值相等, equals结果也相等,那么就是重复元素 else if (p instanceof TreeNode)//判断是否已经转为红黑树, 已经转了,将元素添加到红黑树中 e = ((HashMap.TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value); else {//还是链表 for (int binCount = 0; ; ++binCount) { if ((e = p.next) == null) { p.next = newNode(hash, key, value, null);//把元素添到链表中 if (binCount >= TREEIFY_THRESHOLD - 1) //当链表长度为8时,触发转红黑树机制 treeifyBin(tab, hash);//链表转红黑树, 当哈希长度>64&&链表长度>=8 真正的转红黑树 break; } if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; } } if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; //用后来相同键的值,将原来键的值替换掉 afterNodeAccess(e); return oldValue; } } ++modCount; if (++size > threshold) resize(); afterNodeInsertion(evict); return null; }
这篇关于JAV练习题(Map双列集合)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16使用vue3+springboot构建简单Web应用教程
- 2024-11-15全栈开发项目实战:从入门到初级项目的实现
- 2024-11-15数据库项目实战:从入门到初级应用教程
- 2024-11-15IDEA项目实战入门教程
- 2024-11-15IT编程项目实战:新手入门的全面指南
- 2024-11-15Java开发项目实战:新手入门与初级技巧
- 2024-11-15Java零基础项目实战:从入门到独立开发
- 2024-11-15MyBatis Plus教程:入门与基础操作详解
- 2024-11-15MyBatis-Plus教程:新手入门与实战技巧
- 2024-11-15MyBatis教程:从入门到实践