本答案为本人个人编辑,仅供参考,如果读者发现错误,请私信本人或在下方评论,一起进步!
题目链接:https://www.sxt.cn/Java_jQuery_in_action/nine-task.html
一、选择题
1、AC
2、A
3、D
4、C
5、C
二、简答题
1、集合和数组的比较。
-
数组不是面向对象的,存在明显的缺陷,集合完全弥补了数组的一些缺点,比数组更灵活更实
用,可大大提高软件的开发效率而且不同的集合框架类可适用于不同场合。具体如下:
-
1容量: 数组容量固定且无法动态改变,集合类容量动态改变。
-
2数据类型: 数组能存放基本数据类型和引用数据类型的数据,而集合类中只能放引用数据类型的数据。
-
3实际大小: 数组无法判断其中实际存有多少元素,length只告诉了array容量;集合可以判断实际存有多少元素,而对总的容量不关心
-
4数据结构: 集合有多种数据结构(顺序表、链表、哈希表、树等)、多种特征(是否有序,是否唯一)、
不同适用场合(查询快,便于删除、有序),不像数组仅采用顺序表方式
-
5形式:集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作。
数组的特点:有序;一旦创建,长度固定;通过索引访问;存储相同类型的数据;数据可以是基本数据类型也可以是引用类型。
2、简述List、Set、Collection、Map的区别和联系。
• Collection接口存储一组不唯一,无序的对象
• List接口存储一组不唯一,有序(索引顺序)的对象
• Set接口存储一组唯一,无序的对象
• Map接口存储一组键值对象,提供key到value的映射: Key唯一无序,value 不唯一无序
集合类型 | 有序 | 唯一 |
---|---|---|
List | 是 | 否 |
Set | 否 | 是 |
Collection | 否 | 否 |
Map | 否 | 是 |
3、ArrayList和LinkedList的区别和联系。它们的底层分别是用什么实现的?
底层结构 | 顺序 | 唯一 | 效率 | |
ArrayList | 顺序表 | 有序 | 不唯一 | 查询快 |
LinkedList | 双向链表 | 有序 | 不唯一 | 增删快 |
4、HashSet采用了哈希表作为存储结构,请说明哈希表的特点和实现原理。
提示:结合Object类的hashCode()和equals()说明其原理。
在Hashset中的元素作为内部Map的key
public void add(Object o) {
map.put(0,PRESENT);
}
5、使用泛型有什么好处?
1) 向集合添加数据时保证数据安全。
2) 遍历集合元素时不需要强制转换。
三、编码题
1、使用List和Map存放多个图书信息,遍历并输出。其中商品属性:编号,名称,单价,出版社;使用商品编号作为Map中的key。
/**
* @author louhua
* @date 10/04/2019 19:56:32
*/
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.ArrayList;
public class ListAndMapStoreBook{
public static void main(String[] args){
List<Book> list = new ArrayList<>();
Book book1 = new Book(1001,"高数",69,"高等教育出版社");
Book book2 = new Book(1002,"大英",56,"机械工业出版社");
Book book3 = new Book(1005,"Java1101集",89,"机械工业出版社");
list.add(book1);
list.add(book2);//new Book(1002,"大英",56,"机械工业出版社"));
list.add(book3);//new Book1005,"Java1101集",89,"机械工业出版社"));
for(Book book:list){
System.out.println(book);
}
Map<Integer,Book> map1 = new HashMap<>();
map1.put(1001,book1);
map1.put(1002,book2);
map1.put(1003,book3);
Set<Entry<Integer,Book>> set = map1.entrySet();
for(Iterator<Entry<Integer,Book>> iter = set.iterator();iter.hasNext();){
Entry<Integer,Book> e = iter.next();
System.out.println(e.getKey()+":"+e.getValue());
}
}
}
class Book{
int id;
String name;
double price;
String press;
public Book(){}
public Book(int id,String name,double price,String press){
this.id = id;
this.name = name;
this.price = price;
this.press = press;
}
@Override
public String toString(){
return "编号:"+id+",书名:"+name+",价格:"+price+",出版社:"+press;
}
}
2、(暂略)使用HashSet和TreeSet存储多个商品信息,遍历并输出;其中商品属性:编号,名称,单价,出版社;要求向其中添加多个相同的商品,验证集合中元素的唯一性。
提示:向HashSet中添加自定义类的对象信息,需要重写hashCode和equals( )。
向TreeSet中添加自定义类的对象信息,需要实现Comparable接口,指定比较 规则。
3、实现List和Map数据的转换。具体要求如下:
功能1:定义方法public void listToMap( ){ }将List中Student元素封装到Map中
1) 使用构造方法Student(int id,String name,int age,String sex )创建多个学生信息并加入List;
2) 遍历List,输出每个Student信息;
3) 将List中数据放入Map,使用Student的id属性作为key,使用Student对象信息作为value;
4) 遍历Map,输出每个Entry的key和value。
功能2:定义方法public void mapToList( ){ }将Map中Student映射信息封装到List
1) 创建实体类StudentEntry,可以存储Map中每个Entry的信息;
2) 使用构造方法Student(int id,String name,int age,String sex )创建多个学生信息,并使用Student的id属性作为key,存入Map;
3) 创建List对象,每个元素类型是StudentEntry;
4) 将Map中每个Entry信息放入List对象。
功能3:说明Comparable接口的作用,并通过编号来对学生进行排序。(暂略)
/**
* @author louhua
* @date 10/04/2019 20:50:28
*/
import java.util.List;
import java.util.Collections;
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.ArrayList;
public class ListMap{
public static void main(String[] args){
listToMap();
mapToList();
}
//list放到Map
public static void listToMap( ){
System.out.println("******************************listToMap Begin*****************************");
Map<Integer,Student> map = new HashMap<>();
List<Student> list = new ArrayList<>();
list.add(new Student(1002,"罗总",18,"男"));
list.add(new Student(1001,"李干事",20,"男"));
System.out.println("遍历List");
for(Student stu : list){
System.out.println(stu);// 2) 遍历List,输出每个Student信息;
map.put(stu.id,stu);//3) 将List中数据放入Map,使用Student的id属性作为key,使用Student对象信息作为value;
}
//遍历Map方法一,输出每个Entry的key和value。
System.out.println("遍历map方法一:");
Set<Integer> ss = map.keySet();
for(Iterator<Integer> iter = ss.iterator();iter.hasNext();){
Integer key = iter.next();
System.out.println(map.get(key));
}
//遍历Map方法二,输出每个Entry的key和value。
System.out.println("遍历map方法二:");
Set<Entry<Integer,Student>> set = map.entrySet();
for(Iterator<Entry<Integer,Student>> iter = set.iterator();iter.hasNext();){
Entry<Integer,Student> e = iter.next();
System.out.println(e.getKey()+":"+e.getValue());
}
System.out.println("******************************listToMap end*****************************");
}
public static void mapToList( ){
System.out.println("******************************mapToList Begin*****************************");
Map<Integer,Student> map = new HashMap<>();
List<Entry<Integer,Student>> list = new ArrayList<>();
map.put(2004,new Student(2004,"小胡",24,"男"));
map.put(2002,new Student(2002,"王跑腿",25,"男"));
//list.add();
System.out.println("遍历Map");
Set<Entry<Integer,Student>> set = map.entrySet();
for(Iterator<Entry<Integer,Student>> iter = set.iterator();iter.hasNext();){
Entry<Integer,Student> e = iter.next();
list.add(e);
System.out.println(e.getKey()+":"+e.getValue());
}
System.out.println("遍历List:");
System.out.println(list);
System.out.println("******************************mapToList end*****************************");
}
}
class Student implements Comparable<Student>{
int id;
String name;
int age;
String sex;
public Student(){}
public Student(int id,String name,int age,String sex){
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString(){
return "学号:"+id+",姓名:"+name+",年龄:"+age+",性别:"+sex;
}
@Override
public int compareTo(Student o){
if(this.id > o.id){
return 1;
}
return 0;
}
}