java 集合框架(习题与答案)
更新时间:2024-04-15 20:19:01 阅读量: 综合文库 文档下载
- java培训班推荐度:
- 相关推荐
java 集合框架(习题)
集合框架 Key Point
* Collection 接口、Set 接口、List 接口基本操作 * List 接口及其实现类 * Set 接口及其实现类 * 迭代遍历
* Hash 算法与hashCode 方法 * Comparable 接口 * Map 接口及其实现类 * 遍历Map * 泛型 练习 1. 填空
Collection 接口的特点是元素是对象;
List 接口的特点是元素有(有|无)顺序,可以(可以|不可以)重复; Set 接口的特点是元素无(有|无)顺序,不可以(可以|不可以)重复; Map 接口的特点是元素是键值对,其中值可以重复,键不可以重复。 2. (List)有如下代码 import java.util.*; public class TestList{
public static void main(String args[]){ List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(1, “Learn”); list.add(1, “Java”); printList(list); }
public static void printList(List list){ for(Object obj:list){ String str=(String)obj; System.out.println(obj); } } }
要求:
1) 把//1 处的代码补充完整,要求输出list 中所有元素的内容 2) 写出程序执行的结果 Hello java Learn World
3) 如果要把实现类由ArrayList 换为LinkedList,应该改哪里?ArrayList 和 LinkedList 使用上有什么区别?实现上有什么区别?
把实例化的语句改为new LinkedList();
ArrayList 数组实现 查询快 增删慢 LinkedList 链表实现 查询慢 增删快
4) 如果要把实现类由ArrayList 换为Vector,应该改哪里?ArrayList 和Vector 使 用上有什么区别?实现上有什么区别?
ArrayList是线程不同步的,轻量级的,线程不安全,速度快 Vector是线程同步的 ,多线程访问比较安全,速度慢 3. (List)写出下面程序的运行结果 import java.util.*; public class TestList{
public static void main(String args[]){ List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(“Hello”); list.add(“Learn”); list.remove(“Hello”); list.remove(0);
for(int i = 0; i Hello Learn 4. (Set,List) import java.util.*; public class TestListSet{ public static void main(String args[]){ List list = new ArrayList(); list.add(“Hello”); list.add(“Learn”); list.add(“Hello”); list.add(“Welcome”); Set set = new HashSet(); set.addAll(list); System.out.println(set.size()); } } 选择正确答案 A. 编译不通过 B. 编译通过,运行时异常 C. 编译运行都正常,//输出HashSet中不能放重复值 D. 编译运行都正常,输出4 5. (List)已知有一个Worker 类如下: public class Worker { private int age; private String name; private double salary; public Worker (){} public Worker (String name, int age, double salary){ this.name = name; this.age = age; this.salary = salary; } 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 getSalary(){ return salary; } public void setSalary(double salary){ this.salary = salary; } public void work(){ System.out.println(name + “ work”); } } 完成下面的要求 1) 创建一个List,在List 中增加三个工人,基本信息如下: 姓名 年龄 工资 zhang3 18 3000 li4 25 3500 wang5 22 3200 2) 在li4 之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资3300 3) 删除wang5 的信息 4) 利用for 循环遍历,打印List 中所有工人的信息 5) 利用迭代遍历,对List 中所有的工人调用work 方法。 6) 为Worker 类添加equals 方法 6. (Set,Hash 算法)为上一题的Worker 类,在添加完equals 方法的基础上,添加一个 hashCode 方法。 public int hashCode(){ //1 } 有几种写法: 1) return 0; 2) int result = 0; if (name != null) result = name.hashCode(); return result + age; 3) return super.hashCode(); 现在要把Worker 类放入HashSet 中,并希望在HashSet 中没有重复元素,则下面说法正 确的是: A. 三种写法都正确 B. 1), 2)写法正确,2)效率更高 C. 2)写法正确,1),3)写法都不正确 7. (Set,Hash 算法,方法覆盖)代码改错 import java.util.*; class Worker{ String name; int age; double salary; public Worker(){} public Worker(String name, int age, double salary){ this.name = name; this.age = age; this.salary = salary; } public int hashCode(){//hashCode必须声明为公共的。 return (int)(name.hashCode() + age + salary);//返回值类型为整形( } //equals方法实现有错 public boolean equals(Worker w){ if (w.name == name && w.salary == salary && w.age == age){ return true; }else return false; } } public class TestWorker{ public static void main(String args[]){ Set set = new HashSet(); set.add(new Worker(“tom”, 18, 2000)); set.add(new Worker(“tom”, 18, 2000)); set.add(0, new Worker(“jerry”, 18, 2000));//HashSet中没有定义带下标的add方法。 System.out.println(set.size()); } } 8. (Set,Hash 算法)在前面的Worker 类基础上,为Worker 类增加相应的方法,使得Worker 放入HashSet 中时,Set 中没有重复元素。 并编写相应的测试代码。 class Worker{ String name; int age; double salary; public Worker(){} public Worker(String name, int age, double salary){ this.name = name; this.age = age; this.salary = salary; } public int hashCode(){ return (int)(name.hashCode() + age + salary); } public boolean equals(Worker w){ if (w.name == name && w.salary == salary && w.age == age){ return true; }else return false; } } 9. (Set,Comparable 接口)在前面的Worker 类基础上,为Worker 类添加相应的代码, 使得Worker 对象能正确放入TreeSet 中。并编写相应的测试代码。 注:比较时,先比较工人年龄大小,年龄小的排在前面。如果两个工人年龄相同,则再 比较其收入,收入少的排前面。如果年龄和收入都相同,则根据字典顺序比较工人姓名。例 如:有三个工人,基本信息如下: 姓名 年龄 工资 zhang3 18 1500 li4 18 1500 wang5 18 1600 zhao6 17 2000 放入TreeSet 排序后结果为: zhao6 li4 zhang3 wang5 import java.util.HashSet; public class Test1 { public static void main(String[] args) { // TODO Auto-generated method stub HashSet Worker w1=new Worker(\ Worker w2=new Worker(\ Worker w3=new Worker(\ Worker w4=new Worker(\ hs.add(w1); hs.add(w2); hs.add(w3); hs.add(w4); System.out.println(hs.size()); System.out.println(hs); } } class Worker implements Comparable String name; int age; double salary; public Worker(){} public Worker(String name, int age, double salary){ this.name = name; this.age = age; this.salary = salary; } @Override public int compareTo(Worker o) { // TODO Auto-generated method stub if(this.age!=o.age){ return this.age-o.age; } else if(this.salary!=o.salary){ //Integer integer1=new Integer(this.salary) return new Double(this.salary).compareTo(new Double(o.salary)); } else if(this.name.equals(o.name)){ return this.name.compareTo(o.name); } return 0; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); long temp; temp = Double.doubleToLongBits(salary); result = prime * result + (int) (temp ^ (temp >>> 32)); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Worker other = (Worker) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (Double.doubleToLongBits(salary) != Double .doubleToLongBits(other.salary)) return false; return true; } @Override public String toString() { // TODO Auto-generated method stub return age+\ } } 10. (Map)关于下列Map 接口中常见的方法 put 方法表示放入一个键值对,如果键已存在则新值替换旧值,如果键不存在则 增加一个键值对。 remove 方法接受一个参数,表示从映射中移除其映射关系的键。 get 方法表示返回指定键所映射的值,get 方法的参数表示移除的其映射关系的键,返回值表示与key关联的值。 要想获得Map 中所有的键,应该使用方法ketSet,该方法返回值类型为Set集合。 要想获得Map 中所有的值,应该使用方法get,该方法返回值类型为指定键所映射的值。 要想获得Map 中所有的键值对的集合,应该使用方法entrySet,该方法返回一个 Map.Entry类型所组成的Set。 11. (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。 附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 public class Bk18 { public static void main(String[] args) { // TODO Auto-generated method stub BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String year=null; try { year=br.readLine(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Map map.put(\巴西\ map.put(\意大利\ map.put(\南非\ if(map.containsKey(year)){ System.out.println(map.get(year)); } else{ System.out.println(\这一年没有承办世界杯!\ } } } 12. (Map)已知某学校的教学课程内容安排如下: 集合框架(习题)\o:button=\target=\href=\mg.cn/orignal/714a8371t9dbaa80ef64e\集合框架(习题)\src=\> 完成下列要求: 1) 使用一个Map,以老师的名字作为键,以老师教授的课程名作为值,表示上述 课程安排。 2) 增加了一位新老师Allen 教JDBC 3) Lucy 改为教CoreJava 4) 遍历Map,输出所有的老师及老师教授的课程 5) *利用Map,输出所有教JSP 的老师。 public static void main(String[] args) { // TODO Auto-generated method stub Map map.put(\ map.put(\ map.put(\ map.put(\ map.put(\ map.put(\ map.put(\ System.out.println(map.size()); map.put(\ System.out.println(map.size()); map.remove(\ map.put(\ Set for(Object obj:set){ System.out.println(map.get((String)obj)); } for(String str:set){ if(map.get(str).equals(\ System.out.println(\教JSP的老师有:\ } } } 13. (泛型)使用泛型,改写第5 题 package list; import java.util.Iterator; import java.util.LinkedList; public class Test2 { public static void main(String[] args) { // TODO Auto-generated method stub LinkedList Worker1 w1=new Worker1(\ Worker1 w2=new Worker1(\ Worker1 w3=new Worker1(\ ll.add(w1); ll.add(w2); ll.add(w3); ll.add(1, new Worker1(\ ll.remove(w3); //用for循环遍历 for(int i=0;i System.out.println(ll.get(i)); } System.out.println(\ //用迭代器遍历 Iterator iterator=ll.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } } class Worker1 { private int age; private String name; private double salary; public Worker1 (){} public Worker1 (String name, int age, double salary){ this.name = name; this.age = age; this.salary = salary; } 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 getSalary(){ return salary; } public void setSalary(double salary){ this.salary = salary; } public void work(){ System.out.println(name + \ } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Worker1 other = (Worker1) obj; if (age != other.age) return false; return true; } @Override public String toString() { // TODO Auto-generated method stub return name+\ } } 14. (泛型)使用泛型和Map.Entry 接口,改写第12 题的前4 问 15. *(List)写出下面程序的输出结果 import java.util.*; class MyClass{ int value; public MyClass(){} public MyClass(int value){ this.value = value; } public String toString(){ return “”+value; } } public class TestList{ public static void main(String args[]){ MyClass mc1 = new MyClass(10); MyClass mc2 = new MyClass(20);//实例化的对象实际上就是一个对象的地址, //list中保存的是对象的引用,因此mc4,mc1,和list下标为1的对象都是指向的同一个对象 MyClass mc3 = new MyClass(30); List list = new ArrayList(); list.add(mc1); list.add(mc2); list.add(mc3); MyClass mc4 = (MyClass) list.get(1)//这句话实际上就是把mc4指向了mc2对象的那个地址 MyClass mc4=(MyClass)mc2; mc4.value = 50; for(int i = 0; i 16. *(Set,HashSet,空指针)有下面代码 import java.util.*; class Student { int age; String name; public Student(){} public Student(String name, int age){ this.name = name; this.age = age; } public int hashCode(){ return name.hashCode() + age; } public boolean equals(Object o){ if (o == null) return false; if (o == this) return true; if (o.getClass() != this.getClass()) return false; Student stu = (Student) o; if (stu.name.equals(name) && stu.age == age) return true; else return false; } } public class TestHashSet{ public static void main(String args[]){ Set set = new HashSet(); Student stu1 = new Student(); Student stu2 = new Student(“Tom”, 18); Student stu3 = new Student(“Tom”, 18); set.add(stu1);在添加stu1的时候会自动调用hashcode和equals方法,而在这两方法中,name的值为空,所以会出现空指针异常。 set.add(stu2); set.add(stu3); System.out.println(set.size()); } } 下列说法正确的是: A. 编译错误 B. 编译正确,运行时异常 C. 编译运行都正确,输出结果为3 D. 编译运行都正确,输出结果为2 17. *(Set)有如下两个类(只写了类的属性,请自行添加相应的构造方法和get/set 方法) 集合框架(习题)\o:spid=\o:button=\target=\href=\mg.cn/orignal/714a8371t9dbaa4c923c6\集合框架(习题)\src=\ > 要求,完善Worker 和Address 类,使得Worker 对象能够正确放入HashSet 中:即将 Worker 放入HashSet 中时不会出现重复元素。并编写相应测试代码。 18. *(Map)在原有世界杯Map 的基础上,增加如下功能: 读入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1994 2002 读入“荷兰”,应当输出 没有获得过世界杯 19. *(Map)设计Account 对象如下: 集合框架(习题)\o:button=\target=\href=\mg.cn/orignal/714a8371t9dba9df86404\集合框架(习题)\src=\> 要求完善设计,使得该Account 对象能够自动分配id。 给定一个List 如下: List list = new ArrayList(); list.add(new Account(10.00, “1234”)); list.add(new Account(15.00, “5678”)); list.add(new Account(0, “1010”)); 要求把List 中的内容放到一个Map 中,该Map 的键为id,值为相应的Account 对象。 最后遍历这个Map,打印所有Account 对象的id 和余额。 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; public class BK20 { public static void main(String[] args) { Random ran=new Random(); System.out.println(ran.nextLong()); List list=new ArrayList(); list.add(new Account(10.00, \ list.add(new Account(15.00, \ list.add(new Account(0.0, \ Map map=new HashMap(); for(int i=0;i Account account=(Account)list.get(i); map.put(account.getId(), account); } Set for(Map.Entry Account acc=(Account)obj.getValue(); System.out.println(obj.getKey()+\ } } } class Account{ private long id; private double balance; private String password; public Account(){} public Account(double balance,String password){ this.id=new Random().nextLong(); this.balance=balance; this.password=password; } public long getId() { return id; } public void setId(long id) { this.id = id; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } 20. *(List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如: List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(“Learn”); //此时list 为Hello World Learn reverseList(list); //调用reverseList 方法之后,list 为Learn World Hello 21. **(Map,Hash 算法)有如下代码: import java.util.*; class MyKey{ int keyValue; public MyKey(){} public MyKey(int value){this.keyValue = value;} } class MyValue{ String value; public MyValue(){} public MyValue(String value){this.value = value;} public String toString(){return value;} } public class TestMap{ public static void main(String args[]){ Map map = new HashMap(); MyKey key1 = new MyKey(10); map.put(key1, new MyValue(“abc”)); map.put(new MyKey(10), new MyValue(“cde”)); System.out.println(map.get(key1)); System.out.println(map.size()); } } 写出该代码的输出结果。abc 2 22. **(Id,hashCode,equals)为Worker 类增加id 属性,用来唯一标识一个员工。即:如 果员工的id 不同,则不管其姓名、年龄、工资是否相同,都认为是不同的员工。部分代 码如下: class Worker{ private final Long id; private String name; private double salary; private int age; //构造方法? //get/set 方法? public boolean equals(Object obj){ //1 此处仅判断id 是否相同 if(this.id==obj.id){ return true; } return false; } public int hashCode(){ //2 此处返回hashCode } } 要求: 1) 完善构造方法和get/set 方法。要求自动分配Worker 的id 2) 完善equals 方法。要求仅判断id 是否相同 3) //2 处,如果写成 return (int)(name.hashCode() + id.hashCode() + age + salary); 是否正确?为什么?//这里比较的dquals方法任务只要id相同就是同一个对象, 23. **(综合)有如下Student 对象 集合框架(习题)\o:button=\target=\href=\mg.cn/orignal/714a8371t9dba99085eb8\集合框架(习题)\src=\> 其中,classNum 表示学生的班号,例如“class05”。 有如下List List list = new ArrayList(); list.add(new Student(“Tom”, 18, 100, “class05”)); list.add(new Student(“Jerry”, 22, 70, “class04”)); list.add(new Student(“Owen”, 25, 90, “class05”)); list.add(new Student(“Jim”, 30,80 , “class05”)); list.add(new Student(“Steve”, 28, 66, “class06”)); list.add(new Student(“Kevin”, 24, 100, “class04”)); 在这个list 的基础上,完成下列要求: 1) 计算所有学生的平均年龄 2) 计算各个班级的平均分 package set; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; public class BK24 { public static void main(String[] args) { // TODO Auto-generated method stub List list.add(new Student(\ list.add(new Student(\ list.add(new Student(\ list.add(new Student(\ list.add(new Student(\ list.add(new Student(\ Map map=new HashMap(); for(int i=0;i Student stu=list.get(i); String str=stu.getClassNum(); if(map.containsKey(str)){ List l=(List)map.get(str); l.add(stu); }else{ List l=new ArrayList(); l.add(stu); map.put(str, l); } } Set set=map.keySet(); Iterator iterator=set.iterator(); while(iterator.hasNext()){ int sum=0; Object objStu=iterator.next(); List l=(List)map.get(objStu);
正在阅读:
java 集合框架(习题与答案)04-15
水作文600字07-03
不可说不可说心情日记10-29
可持续增长率与中小企业的财务管理08-12
考试后的感受作文500字07-02
3楼土方回填施工方案--西山银杏106-10
高一数学 新教材 新理念 新设计(必修1)第一章 集 合109-29
游隐贤山庄作文600字06-12
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 习题
- 框架
- 集合
- 答案
- java
- 粗甲苯项目可行性研究报告 - 图文
- 2015北京各区中考一模选择16--20及实验原理分析
- 人教a版必修三分层训练:1.1.2(第3课时)程序框图的画法(含答
- 美丽莎住宅小区物业管理方案
- 高中语文必修一-五文言文实词虚词全译练习题目
- 中式烹调师初级工理论模拟试题 答案
- 语言学概论的试题及答案
- 进口关税计算与进口消费税
- 沈阳师范大学汉语言文学专业专升本复习大纲最新
- 苏价费(2009)278号
- 成都东山地区阴阳用:开路,掩殓,发丧,呼龙,谢坟 (全录)
- 学校人到职业人角色转换说课稿
- 《经济法与建设法规》期末复习资料130326
- 交通工程、汽车理论、汽车检测维修、汽车新技术知识题库(160题
- 2013年“立德树人 立教圆梦”师德征文获奖名单 - 图文
- 毕业论文当前房价问题分析
- 希望杯初二第1试 - 图文
- 领导视察集团公司汇报材料(精选多篇)
- (重点答案)五年级上册测验
- 80211帧格式解析