java集合框架(习题和答案及解析)_第1页
java集合框架(习题和答案及解析)_第2页
java集合框架(习题和答案及解析)_第3页
java集合框架(习题和答案及解析)_第4页
java集合框架(习题和答案及解析)_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

...wd......wd......wd...java集合框架〔习题〕集合框架KeyPoint*Collection接口、Set接口、List接口基本操作*List接口及其实现类*Set接口及其实现类*迭代遍历*Hash算法与hashCode方法*Comparable接口*Map接口及其实现类*遍历Map*泛型练习1.填空Collection接口的特点是元素是对象;List接口的特点是元素有〔有|无〕顺序,可以〔可以|不可以〕重复;Set接口的特点是元素无〔有|无〕顺序,不可以〔可以|不可以〕重复;Map接口的特点是元素是键值对,其中值可以重复,键不可以重复。2.〔List〕有如下代码importjava.util.*;publicclassTestList{publicstaticvoidmain(Stringargs[]){Listlist=newArrayList();list.add(“Hello〞);list.add(“World〞);list.add(1,“Learn〞);list.add(1,“Java〞);printList(list);}publicstaticvoidprintList(Listlist){for(Objectobj:list){Stringstr=(String)obj;System.out.println(obj);}}}要求:1)把//1处的代码补充完整,要求输出list中所有元素的内容2)写出程序执行的结果HellojavaLearnWorld3)如果要把实现类由ArrayList换为LinkedList,应该改哪里ArrayList和LinkedList使用上有什么区别实现上有什么区别把实例化的语句改为newLinkedList();ArrayList数组实现查询快增删慢LinkedList链表实现查询慢增删快4)如果要把实现类由ArrayList换为Vector,应该改哪里ArrayList和Vector使用上有什么区别实现上有什么区别ArrayList是线程不同步的,轻量级的,线程不安全,速度快Vector是线程同步的,多线程访问对比安全,速度慢3.〔List〕写出下面程序的运行结果importjava.util.*;publicclassTestList{publicstaticvoidmain(Stringargs[]){Listlist=newArrayList();list.add(“Hello〞);list.add(“World〞);list.add(“Hello〞);list.add(“Learn〞);list.remove(“Hello〞);list.remove(0);for(inti=0;i<list.size();i++){System.out.println(list.get(i));}}}HelloLearn4.〔Set,List〕importjava.util.*;publicclassTestListSet{publicstaticvoidmain(Stringargs[]){Listlist=newArrayList();list.add(“Hello〞);list.add(“Learn〞);list.add(“Hello〞);list.add(“Welcome〞);Setset=newHashSet();set.addAll(list);System.out.println(set.size());}}选择正确答案A.编译不通过B.编译通过,运行时异常C.编译运行都正常,//输出HashSet中不能放重复值D.编译运行都正常,输出45.〔List〕有一个Worker类如下:publicclassWorker{privateintage;privateStringname;privatedoublesalary;publicWorker(){}publicWorker(Stringname,intage,doublesalary){=name;this.age=age;this.salary=salary;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=name;}publicdoublegetSalary(){returnsalary;}publicvoidsetSalary(doublesalary){this.salary=salary;}publicvoidwork(){System.out.println(name+“work〞);}}完成下面的要求1)创立一个List,在List中增加三个工人,基本信息如下:姓名年龄工资zhang3183000li4253500wang52232002)在li4之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资33003)删除wang5的信息4)利用for循环遍历,打印List中所有工人的信息5)利用迭代遍历,对List中所有的工人调用work方法。6)为Worker类添加equals方法6.〔Set,Hash算法〕为上一题的Worker类,在添加完equals方法的根基上,添加一个hashCode方法。publicinthashCode(){//1}有几种写法:1〕return0;2〕intresult=0;if(name!=null)result=name.hashCode();returnresult+age;3〕returnsuper.hashCode();现在要把Worker类放入HashSet中,并希望在HashSet中没有重复元素,那么下面说法正确的是:A.三种写法都正确B.1),2)写法正确,2)效率更高C.2)写法正确,1),3)写法都不正确7.〔Set,Hash算法,方法覆盖〕代码改错importjava.util.*;classWorker{Stringname;intage;doublesalary;publicWorker(){}publicWorker(Stringname,intage,doublesalary){=name;this.age=age;this.salary=salary;}publicinthashCode(){//hashCode必须声明为公共的。return〔int〕〔name.hashCode()+age+salary〕;//返回值类型为整形〔}//equals方法实现有错publicbooleanequals(Workerw){if(==name&&w.salary==salary&&w.age==age){returntrue;}elsereturnfalse;}}publicclassTestWorker{publicstaticvoidmain(Stringargs[]){Setset=newHashSet();set.add(newWorker(“tom〞,18,2000));set.add(newWorker(“tom〞,18,2000));set.add(0,newWorker(“jerry〞,18,2000));//HashSet中没有定义带下标的add方法。System.out.println(set.size());}}8.〔Set,Hash算法〕在前面的Worker类根基上,为Worker类增加相应的方法,使得Worker放入HashSet中时,Set中没有重复元素。并编写相应的测试代码。classWorker{Stringname;intage;doublesalary;publicWorker(){}publicWorker(Stringname,intage,doublesalary){=name;this.age=age;this.salary=salary;}publicinthashCode(){return〔int〕〔name.hashCode()+age+salary〕;}publicbooleanequals(Workerw){if(==name&&w.salary==salary&&w.age==age){returntrue;}elsereturnfalse;}}9.〔Set,Comparable接口〕在前面的Worker类根基上,为Worker类添加相应的代码,使得Worker对象能正确放入TreeSet中。并编写相应的测试代码。注:对比时,先对比工人年龄大小,年龄小的排在前面。如果两个工人年龄一样,那么再对比其收入,收入少的排前面。如果年龄和收入都一样,那么根据字典顺序对比工人姓名。例如:有三个工人,基本信息如下:姓名年龄工资zhang3181500li4181500wang5181600zhao6172000放入TreeSet排序后结果为:zhao6li4zhang3wang5importjava.util.HashSet;publicclassTest1{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubHashSet<Worker>hs=newHashSet<Worker>();Workerw1=newWorker("zhang3",18,1500);Workerw2=newWorker("lis4",18,1500);Workerw3=newWorker("wang5",18,1600);Workerw4=newWorker("zhao6",17,2000);hs.add(w1);hs.add(w2);hs.add(w3);hs.add(w4);System.out.println(hs.size());System.out.println(hs);}}classWorkerimplementsComparable<Worker>{Stringname;intage;doublesalary;publicWorker(){}publicWorker(Stringname,intage,doublesalary){=name;this.age=age;this.salary=salary;}@OverridepublicintcompareTo(Workero){//TODOAuto-generatedmethodstubif(this.age!=o.age){returnthis.age-o.age;}elseif(this.salary!=o.salary){//Integerinteger1=newInteger(this.salary)returnnewDouble(this.salary)pareTo(newDouble(o.salary));}elseif(.equals()){returnpareTo();}return0;}@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+age;result=prime*result+((name==null)?0:name.hashCode());longtemp;temp=Double.doubleToLongBits(salary);result=prime*result+(int)(temp^(temp>>>32));returnresult;}@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null)returnfalse;if(getClass()!=obj.getClass())returnfalse;Workerother=(Worker)obj;if(age!=other.age)returnfalse;if(name==null){if(!=null)returnfalse;}elseif(!name.equals())returnfalse;if(Double.doubleToLongBits(salary)!=Double.doubleToLongBits(other.salary))returnfalse;returntrue;}@OverridepublicStringtoString(){//TODOAuto-generatedmethodstubreturnage+"/"+salary+"/"+name;}}10.〔Map〕关于以下Map接口中常见的方法put方法表示放入一个键值对,如果键已存在那么新值替换旧值,如果键不存在那么增加一个键值对。remove方法承受一个参数,表示从映射中移除其映射关系的键。get方法表示返回指定键所映射的值,get方法的参数表示移除的其映射关系的键,返回值表示与key关联的值。要想获得Map中所有的键,应该使用方法ketSet,该方法返回值类型为Set集合。要想获得Map中所有的值,应该使用方法get,该方法返回值类型为指定键所映射的值。要想获得Map中所有的键值对的集合,应该使用方法entrySet,该方法返回一个Map.Entry类型所组成的Set。11.〔Map〕利用Map,完成下面的功能:从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该年没有举办世界杯,那么输出:没有举办世界杯。附:世界杯冠军以及对应的夺冠年份,请参考本章附录。publicclassBk18{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubBufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));Stringyear=null;try{year=br.readLine();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}Map<String,String>map=newHashMap<String,String>();map.put("2002","巴西");map.put("2006","意大利");map.put("2010","南非");if(map.containsKey(year)){System.out.println(map.get(year));}else{System.out.println("这一年没有承办世界杯!");}}}12.〔Map〕某学校的教学课程内容安排如下:集合框架〔习题〕"o:button="t"target="_blank"href="://photo.blog.sina.cn/showpic.html#blogid=714a83710100ptie&url=:///orignal/714a8371t9dbaa80ef64e">集合框架〔习题〕"src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image002.png">完成以下要求:1〕使用一个Map,以教师的名字作为键,以教师教授的课程名作为值,表示上述课程安排。2〕增加了一位新教师Allen教JDBC3〕Lucy改为教CoreJava4〕遍历Map,输出所有的教师及教师教授的课程5〕*利用Map,输出所有教JSP的教师。publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubMap<String,String>map=newTreeMap<String,String>();map.put("Tom","CoreJava");map.put("John","Oracle");map.put("Susan","Oracle");map.put("Jerry","JDBC");map.put("Jim","Unix");map.put("Kevin","JSP");map.put("Lucy","JSP");System.out.println(map.size());map.put("Allen","JSP");System.out.println(map.size());map.remove("Lucy");map.put("Lucy","CoreJava");Set<String>set=map.keySet();for(Objectobj:set){System.out.println(map.get((String)obj));}for(Stringstr:set){if(map.get(str).equals("JSP")){System.out.println("教JSP的教师有:"+str);}}}13.〔泛型〕使用泛型,改写第5题packagelist;importjava.util.Iterator;importjava.util.LinkedList;publicclassTest2{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubLinkedList<Worker1>ll=newLinkedList<Worker1>();Worker1w1=newWorker1("zhang3",18,3000);Worker1w2=newWorker1("li4",25,3500);Worker1w3=newWorker1("wang5",22,3200);ll.add(w1);ll.add(w2);ll.add(w3);ll.add(1,newWorker1("zhao6",24,2200));ll.remove(w3);//用for循环遍历for(inti=0;i<ll.size();i++){System.out.println(ll.get(i));}System.out.println("==================");//用迭代器遍历Iteratoriterator=ll.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}}classWorker1{privateintage;privateStringname;privatedoublesalary;publicWorker1(){}publicWorker1(Stringname,intage,doublesalary){=name;this.age=age;this.salary=salary;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=name;}publicdoublegetSalary(){returnsalary;}publicvoidsetSalary(doublesalary){this.salary=salary;}publicvoidwork(){System.out.println(name+"work");}@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+age;returnresult;}@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null)returnfalse;if(getClass()!=obj.getClass())returnfalse;Worker1other=(Worker1)obj;if(age!=other.age)returnfalse;returntrue;}@OverridepublicStringtoString(){//TODOAuto-generatedmethodstubreturnname+"/"+age+"/"+salary;}}14.〔泛型〕使用泛型和Map.Entry接口,改写第12题的前4问15.*〔List〕写出下面程序的输出结果importjava.util.*;classMyClass{intvalue;publicMyClass(){}publicMyClass(intvalue){this.value=value;}publicStringtoString(){return“〞+value;}}publicclassTestList{publicstaticvoidmain(Stringargs[]){MyClassmc1=newMyClass(10);MyClassmc2=newMyClass(20);//实例化的对象实际上就是一个对象的地址,//list中保存的是对象的引用,因此mc4,mc1,和list下标为1的对象都是指向的同一个对象MyClassmc3=newMyClass(30);Listlist=newArrayList();list.add(mc1);list.add(mc2);list.add(mc3);MyClassmc4=(MyClass)list.get(1)//这句话实际上就是把mc4指向了mc2对象的那个地址MyClassmc4=(MyClass)mc2;mc4.value=50;for(inti=0;i<list.size();i++){System.out.println(list.get(i));}}}16.*〔Set,HashSet,空指针〕有下面代码importjava.util.*;classStudent{intage;Stringname;publicStudent(){}publicStudent(Stringname,intage){=name;this.age=age;}publicinthashCode(){returnname.hashCode()+age;}publicbooleanequals(Objecto){if(o==null)returnfalse;if(o==this)returntrue;if(o.getClass()!=this.getClass())returnfalse;Studentstu=(Student)o;if(.equals(name)&&stu.age==age)returntrue;elsereturnfalse;}}publicclassTestHashSet{publicstaticvoidmain(Stringargs[]){Setset=newHashSet();Studentstu1=newStudent();Studentstu2=newStudent(“Tom〞,18);Studentstu3=newStudent(“Tom〞,18);set.add(stu1);在添加stu1的时候会自动调用hashcode和equals方法,而在这两方法中,name的值为空,所以会出现空指针异常。set.add(stu2);set.add(stu3);System.out.println(set.size());}}以下说法正确的选项是:A.编译错误B.编译正确,运行时异常C.编译运行都正确,输出结果为3D.编译运行都正确,输出结果为217.*〔Set〕有如下两个类〔只写了类的属性,请自行添加相应的构造方法和get/set方法〕集合框架〔习题〕"o:spid="_x0000_i1032"o:button="t"target="_blank"href="://photo.blog.sina.cn/showpic.html#blogid=714a83710100ptie&url=:///orignal/714a8371t9dbaa4c923c6">集合框架〔习题〕"src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.gif">要求,完善Worker和Address类,使得Worker对象能够正确放入HashSet中:即将Worker放入HashSet中时不会出现重复元素。并编写相应测试代码。18.*〔Map〕在原有世界杯Map的根基上,增加如下功能:读入一支球队的名字,输出该球队夺冠的年份列表。例如,读入“巴西〞,应当输出19581962197019942002读入“荷兰〞,应当输出没有获得过世界杯19.*〔Map〕设计Account对象如下:集合框架〔习题〕"o:button="t"target="_blank"href="://photo.blog.sina.cn/showpic.html#blogid=714a83710100ptie&url=:///orignal/714a8371t9dba9df86404">集合框架〔习题〕"src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.gif">要求完善设计,使得该Account对象能够自动分配id。给定一个List如下:Listlist=newArrayList();list.add(newAccount(10.00,“1234〞));list.add(newAccount(15.00,“5678〞));list.add(newAccount(0,“1010〞));要求把List中的内容放到一个Map中,该Map的键为id,值为相应的Account对象。最后遍历这个Map,打印所有Account对象的id和余额。importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.Random;importjava.util.Set;publicclassBK20{publicstaticvoidmain(String[]args){Randomran=newRandom();System.out.println(ran.nextLong());Listlist=newArrayList();list.add(newAccount(10.00,"1234"));list.add(newAccount(15.00,"5678"));list.add(newAccount(0.0,"1010"));Mapmap=newHashMap();for(inti=0;i<list.size();i++){Accountaccount=(Account)list.get(i);map.put(account.getId(),account);}Set<Map.Entry<Long,Object>>set=map.entrySet();for(Map.Entry<Long,Object>obj:set){Accountacc=(Account)obj.getValue();System.out.println(obj.getKey()+"/"+acc.getBalance());}}}classAccount{privatelongid;privatedoublebalance;privateStringpassword;publicAccount(){}publicAccount(doublebalance,Stringpassword){this.id=newRandom().nextLong();this.balance=balance;this.password=password;}publiclonggetId(){returnid;}publicvoidsetId(longid){this.id=id;}publicdoublegetBalance(){returnbalance;}publicvoidsetBalance(doublebalance){this.balance=balance;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}}20.*〔List〕写一个函数reverseList,该函数能够承受一个List,然后把该List倒序排列。例如:Listlist=newArrayList();list.add(“Hello〞);list.add(“World〞);list.add(“Learn〞);//此时list为HelloWorldLearnreverseList(list);//调用reverseList方法之后,list为LearnWorldHello21.**〔Map,Hash算法〕有如下代码:importjava.util.*;classMyKey{intkeyValue;publicMyKey(){}publicMyKey(intvalue){this.keyValue=value;}}classMyValue{Stringvalue;publicMyValue(){}publicMyValue(Stringvalue){this.value=value;}publicStringtoString(){returnvalue;}}publicclassTestMap{publicstaticvoidmain(Stringargs[]){Mapmap=newHashMap();MyKeykey1=newMyKey(10);map.put(key1,newMyValue(“abc〞));map.put(newMyKey(10),newMyValue(“cde〞));System.out.println(map.get(key1));System.out.println(map.size());}}写出该代码的输出结果。abc222.**〔Id,hashCode,equals〕为Worker类增加id属性,用来唯一标识一个员工。即:如果员工的id不同,那么不管其姓名、年龄、工资是否一样,都认为是不同的员工。局部代码如下:classWorker{privatefinalLongid;privateStringname;privatedoublesalary;privateintage;//构造方法…//get/set方法…publicbooleanequals(Objectobj){//1此处仅判断id是否一样if(this.id==obj.id){returntrue;}returnfalse;}publicinthashCode(){//2此处返回hashCode}}要求:1〕完善构造方法和get/set方法。要求自动分配Worker的id2〕完善equals方法。要求仅判断id是否一样3〕//2处,如果写成return(int)(name.hashCode()+id.hashCode()+age+salary);是否正确为什么//这里对比的dquals方法任务只要id一样就是同一个对象,23.**〔综合〕有如下Student对象集合框架〔习题〕"o:button="t"target="_blank"href="://photo.blog.sina.cn/showpic.html#blogid=714a83710100ptie&url=:///orignal/714a8371t9dba99085eb8">集合框架〔习题〕"src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.gif">其中,classNum表示学生的班号,例如“class05〞。有如下ListListlist=newArrayList();list.add(newStudent(“Tom〞,18,100,“class05〞));list.add(newStudent(“Jerry〞,22,70,“class04〞));list.add(newStudent(“Owen〞,25,90,“class05〞));list.add(newStudent(“Jim〞,30,80,“class05〞));list.add(newStudent(“Steve〞,28,66,“class06〞));list.add(newStudent(“Kevin〞,24,100,“class04〞));在这个list的根基上,完成以下要求:1〕计算所有学生的平均年龄2〕计算各个班级的平均分packageset;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importjava.util.Set;publicclassBK24{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubList<Student>list=newArrayList<Student>();list.add(newStudent("Tom",18,100,"class05"));list.add(newStudent("Jerry",22,70,"class04"));list.add(newStudent("Owen",25,90,"class05"));list.add(newStudent("Jim",30,80,"class05"));list.add(newStudent("Steve",28,66,"class06"));list.add(newStudent("Kevin",24,100,"class04"));Mapmap=newHashMap();for(inti=0;i<list.size();i++){Studentstu=list.get(i);Stringstr=stu.getClassNum();if(map.containsKey(str)){Listl=(List)map.get(str);l.add(stu);}else{Listl=newArrayList();l.add(stu);map.put(str,l);}}Setset=map.keySet();Iteratoriterator=set.iterator();while(iterator.hasNext()){intsum=0;ObjectobjStu=iterator.next();Listl=(List)map.get(objStu);for(inti=0;i<l.size();i++){sum+=((Student)l.get(i)).getScore();}System.out.println(sum/l.size());}}}classStudent{privateStringname;privateintage;privateintscore;privateStringclassNum;publicStudent(Stringname,intage,intscore,StringclassNum){super();=name;this.age=age;this.score=score;this.classNum=classNum;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicintgetScore(){returnscore;}publicvoidsetScore(intscore){this.score=score;}publicStringgetClassNum(){returnclassNum;}publicvoidsetClassNum(StringclassNum){this.c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论