尚学堂__百战程序员__1573题------第八章 容器

1、容器指的是“可以容纳其他对象的对象”,这种说法对吗?

        对的

2、Collection/Set/List的联系跟区别?

        (1)collection是Java集合顶级接口,存储一组不唯一,无序的对象;

        (2)list接口和set接口是collections接口的两个子接口;

        (3)list接口存储一组不唯一,有序(插入顺序)的对象;

                 Set接口存储一组唯一,无序的对象;

      

3、Set和List的特点跟区别?

         (1)list:

           1)是有序的collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引来访问list中的元素,这类似于Java的数组。

        2)凡是可以操作索引的方法都是list接口特有方法。

(2)set:

        1)接口存储一组唯一、无序的对象(存入和取出的顺序不一定一致)。

        2)操作数据的方法与list类似,set接口不存在索引相关的方法。

4、【上机】练习Collection接口中常用的方法

        add(Object obj):添加,存储的是对象的引用;
        size():容器中元素的实际个数;
        remove(Object obj):删除一个元素;
        removeAll(Collection c):删除与集合c中的元素相同的元素;
        retainAll(Collection c): 只保留当前集合(调用此方法的集合)与集合c(此方法的参数)

        中相同的元素;
        contains(Object obj):判断集合中是否存在元素obj;
        isEmpty():判断集合是否为空;
        Iterator():生成此集合的迭代器;

5、【上机】下面的代码,效果一致吗? 分析说明之。


Collection c = new HashSet();

              Collection c2 = new HashSet();

              Apple a = new Apple();

              c.add(a);

              c2.addAll(c); 

//增加另一个容器中所有的元素!      

              Collection c = new HashSet();

              Collection c2 = new HashSet();

              Apple a = new Apple();

              c.add(a);

              c2.add(c);

c2.addAll(c)是把【集合c中的元素】添加到集合c2里;

c2.add(c)是把【集合c】当作一个元素添加到集合c2里;

6、想取两个容器中元素的交集,使用哪个方法?

retainAll(Collection c): 只保留当前集合(调用此方法的集合)与集合c(此方法的参数)中相同的元素。

7、说明isEmpty的作用,并说明下面代码有问题吗?

Collection c = null;
System.out.println(c.isEmpty());

isEmpty():判断集合是否为空,也就是集合中实际元素个数是否为0,由此得知调用此方法时集合是存在的(如果集合都不存在,也就谈不上为空与否了)。要区分集合为空和集合不存在的含义是不同的。

下列代码Collection c = null,c没有指向任何集合,即集合并不真实存在,调用isEmpty()方法会出现空指针异常。

8、我想定义一个数组。该数组既可以放:Dog对象、也可以放Cat对象、还可以放
     Integer对象,怎么定义?

实例:

Object[] objArr = new Object[]{56,123,"hello world",new Dog(),new Cat()};


class Dog{

}
class Cat{

}

9、List接口中增加了一些与顺序相关的操作方法,下面两个方法的作用是什么?

add(int index, E element) , get(int index);

         add(int index, E element) :把元素element添加到索引为index的位置;
         get(int index):得到索引为index的元素。

10、ArrayList底层使用什么来实现的?

         LinkedList是用什么实现的?

        

11、说出ArrayLIst、LinkedList、Vector的区别。


ArrayLIst、LinkedList两者都实现了List接口,都具有List中元素有序、不唯一的特点。
ArrayList实现了长度可变的数组,在内存中分配连续空间。遍历元素和随机访问元素的效率比较高;

LinkedList采用链表存储方式。插入、删除元素时效率比较高

Vector和ArrayList的区别联系:见294题。

12、我有一些数据,需要频繁的查询,插入和删除操作非常少,并且没有线程之间的共享,使用List下面的哪个实现类好一些? 

ArrayList。

ArrayList实现了长度可变的数组,在内存中分配连续空间。遍历元素和随机访问元素的效率比较高。

13、【上机】针对List中新增的有关顺序的方法,每个都进行测试。并且使用debug来帮助我们理

解程序运行。

add(int index, Object obj):在指定索引位置(index)添加元素obj;
addAll(int index,Collections c):在指定索引位置(index)添加集合c中所有元素;
remove(int index):删除索引位置为index的元素;
set(int index, Object obj):使用元素obj替代指定索引位置上的元素;
get(int index):获取指定索引位置上的元素;
subList(int beginIndex,int endIndex):得到个List对象包含指定索引区间里元素。

14、定义Computer类,使用价格排序。(使用Comparable接口) 定义computer类

        

(1)定义Computer类,实现Comparable接口:
publicclass Computer implementsComparable {
privatedouble price;//私有属性;
//构造方法;
public Computer(double price) {
super();
this.price = price;
}

//实现Comparable接口中的compareTo方法;
@Override
publicint compareTo(Object o) {
Computer c=(Computer)o;

if(this.price>c.price){
return 1;
}elseif(this.price<c.price){
return -1;
}else{
return 0;
}
}

//重写toString()方法;
@Override
public String toString() {
return"Computer [price=" + price + "]";
}

}

(2)加入TreeSet;
import java.util.Iterator;
import java.util.TreeSet;

publicclass Test {
publicstaticvoid main(String[] args) {
//创建TreeSet;
TreeSet<Computer> treeSet=new TreeSet<Computer>();

//创建Computer对象;
Computer computer1=new Computer(3000);
Computer computer2=new Computer(2650);
Computer computer3=new Computer(5878.8);
Computer computer4=new Computer(6000.78);

//将Computer对象加入到treeSet中;
treeSet.add(computer1);
treeSet.add(computer2);
treeSet.add(computer3);
treeSet.add(computer4);
//为treeSet创建迭代器;
Iterator<Computer> it=treeSet.iterator();
//遍历treeSet
while(it.hasNext()){
System.out.println(it.next());
}

}

}

结果:实现价格排序;
Computer [price=2650.0]
Computer [price=3000.0]
Computer [price=5878.8]
Computer [price=6000.78]

15、equals返回true,hashcode一定相等吗?

        是的

16、HashSet和TreeSet的区别

HashSet:
(1)存储结构:采用Hashtable哈希表存储结构
(2)优缺点:
优点:添加速度快,查询速度快,删除速度快
缺点:无序

TreeSet
(1)存储结构: 采用二叉树的存储结构
(2) 优缺点:
优点:有序(排序后的升序)查询速度比List快
(按照内容查询)
缺点:查询速度没有HashSet快

17、使用HashSet存储自定义对象,为什么需要重写hashCode()和equals()?

        HashSet存储用的哈希表结构,哈希表需要用到hashCode()和equals()方法:
        hashCode()产生hash值以计算内存位置;
        当hash值相同时要调用equals()方法进行比较。
        如果不重写,调用的是Object的hashcode,而Object的hashCode实际上是地址。系统类已经覆盖了hashCode方法。
        所以HashSet存储自定义对象的化要重写hashCode()和equals()方法,目的是告诉程序去除重复元素的策略。

18、使用TreeSet存储多个学生数据,实现按照不同属性值进行排序?

        

(1)创建一个Student类, 实现Comparable接口;
publicclass Student implementsComparable {
//私有属性;
privateint id;
privateint score;
//getter和setter方法;
publicint getScore() {
return score;
}

publicvoid setScore(int score) {
this.score = score;
}

publicint getId() {
return id;
}

publicvoid setId(int id) {
this.id = id;
}
//构造方法;
public Student(){

}

public Student(int id, int score) {
super();
this.id = id;
this.score = score;
}

@Override
public String toString() {
return"Person [id=" + id + ", score=" + score + "]";
}
//实现compareTo方法,这里是用id比较;
publicint compareTo(Object obj){
Student other=(Student)obj;
int result=this.id-other.id;
return result;
}

}

(2)加入TreeSet;
publicclass Test2 {
publicstaticvoid main(String[] args) {
/*
参看下面创建TreeSet时有两种方法:
代码1:使用无参构造方法TreeSet(),当 Student对象添加进去后,排序时的比较策略用的是Student内部实现的
compareTo方法(内部比较器,此例中按照学生id排序)。
代码2:使用有参构造方法new TreeSet(scoreComp);那么参数scoreComp是什么呢?它表示的是一个外部比较器的对
象。在什么情形下使用呢?当用TreeSet实现排序时,我们不想用Student的内部比较器(也就是说不想用id排序),
想用学生score排序?那怎么办呢?有同学说,把内部比较器改一下呗,改成用score排序的。但改来改去是不是不够
灵活呢?我们有另外一种方法。还记得外部比较器吗?Student的内部比较器我们可以不改,再为Student类定义一个
外部比较器(见以下代码中“定义外部比较器”的部分),定义外部比较器要实现Comparator接口中的compare
(Object obj1,Object obj2)(如果忘记了就往前翻翻吧),在这个方法中实现用分数(score)比较。
以此类推,如果你想用其它属性比较(如年龄,姓名等),可以继续定义相应的外部比较器,使
用方法参见代码2.
*/


/*
代码1:
Set treeSet=new TreeSet();
*/

/*
代码2:
ScoreComp scoreComp=new ScoreComp();//定义一个外部比较器的对象;
Set treeSet=new TreeSet(scoreComp);//把外部比较器对象作为TreeSet构造方法的参数;
*/
Student p1=new Student(1,78);
Student p2=new Student(2,67);
Student p3=new Student(3,96);
Student p4=new Student(4,87);

treeSet.add(p3);
treeSet.add(p4);
treeSet.add(p1);
treeSet.add(p2);

Iterator it=treeSet.iterator();

while(it.hasNext()){
System.out.println(it.next());
}

}

}

//定义外部比较器;
class ScoreComp implementsComparator{

publicint compare(Object obj1,Object obj2){

Student p1=(Student)obj1;
Student p2=(Student)obj2;
int result=p1.getScore()-p2.getScore();//用学生分数排序;
return result;

}

}

19、【上机】说明Comparable接口作用。并定义一个学生类,使用分数来比较大小。

        自定义类如Student,Product,Person等虽然不是同一类事物,但是都有比较的权利,都可以实现比较的功能。既然
是同一功能(比较),就定义一个接口吧,把方法定义在接口里,由各个类去具体实现。
实现Comparable接口的类需要实现compareTo方法,根据该方法可以根据具体的排序规则对容器中的对象进行排序。
publicclass Student implementsComparable{
privateintid;
private String sex;
private String name;
privateint score;
privateintage;

public Student() {
}
public Student(int id, String sex, String name, int score, int age) {
this.id = id;
this.sex = sex;
this.name = name;
this.score = score;
this.age = age;
}
publicint compareTo(Object o) {
Student s = (Student)o;
returnthis.score-s.score;
}
}

 

20、Map中,key能否重复?如果重复,会有什么现象?

        key:无序,唯一;
        添加重复的key不报错,会把之前重复的key覆盖了。

21、Set和Map的集合类名称相似,有没有内在的联系?

        HashMap和HashSet这些集合类采用的是哈希表结构,需要用到hashCode哈希码和equals方法

22、【上机】综合使用List、Map容器存放如下数据, 并从map中取出“李四”。

        

姓名:张三 年龄:18 体重:90 地址:北京
姓名:李四 年龄:28 体重:50 地址:上海
注:不能使用Javabean封装!

(1)先创建Person类;
publicclass Person {
//私有属性;
private String name;
privateint age;
privatedouble weight;
private String address;

//getter和setter方法(略);
//构造方法;
public Person(String name, int age, double weight, String address) {
super();
this.name = name;
this.age = age;
this.weight = weight;
this.address = address;
}

@Override
public String toString() {
return"Person [name=" + name + ", age=" + age + ", weight=" + weight + ", address=" +
address + "]";
}
}
(2)用List存放数据:
List<Person> personList=new ArrayList<Person>();

Person p1=new Person("张三",18,90,"北京");
Person p2=new Person("李四",28,60,"上海");

//把Person对象添加到personList里;
personList.add(p1);
personList.add(p2);

(3)用Map存放数据:
Map<String,Person> map=new HashMap<String,Person>();
//把Person对象添加到map里,用name作为key,Person对象作为value;
map.put(p1.getName(), p1);
map.put(p2.getName(), p2);
//提取名为“李四”的人的信息,用map.get(key)方法,返回的是此key对应的value值;
System.out.println(map.get("李四"));

23、【上机】使用JavaBean封装,完成上个题目的练习

        

24、【上机】写出List、Set、Map中使用泛型的例子。

        ArrayList<String> aList=new ArrayList<String>();//只能接收String类型的对象;
        Set<Integer> set=new HashSet<Integer>();//只能接收Integer类型的对象;
        Map<Integer,String> map=new Map<Integer,String>();//只能接收key类型为Integer,value类型为String。

25、使用泛型有什么好处?

        泛型是JavaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 

        Java语言引入泛型的好处是安全简单。 

26、【上机】用代码写出遍历List的四种方式

finalintSIZE = list.size();
for (int i = 0; i <SIZE; i++) {
String s = list.get(i);
System.out.print(s+"");
}
System.out.println();
for (String string : list) {
System.out.print(string+"");
}
System.out.println();
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.print(s+"");
}
}

27、【上机】用代码写出遍历Set的两种方式

        1)增强for循环遍历
for (Integer integer : set) {
System.out.print(integer.intValue() + "");
}
2)Iterator 遍历
Iterator<Integer> iterator = set.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next().intValue() + "");
}

28、【上机】用代码写出遍历map的方式

        1:得到所有的key
Set<String> set = map.keySet();
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
String key = iterator.next();
System.out.println(key + "--->"+map.get(key));
}
2:得到所有的value
Collection<String> collection = map.values();
for (String string : collection) {
System.out.println("value--->"+string);
}
3:得到所有的key和value
Set<Entry<String, String>> entries = map.entrySet();
Iterator<Entry<String, String>>iterator2 = entries.iterator();
while (iterator2.hasNext()) {
Entry<String, String> entry = iterator2.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "--->"+value);
}

29、采用增强for循环遍历List或者Set,如果List或者Set没有加泛型,能遍历吗? 

        能。

30、如果我想在遍历时删除元素,采用哪种遍历方式最好?

         Iterator接口,接口有remove方法

31、Iterator是一个接口还是类?

        Iterator接口。

32、Collection和Collections有什么区别?

        Collection是Java提供的集合接口,存储一组不唯一,无序的对象。它有两个子接口List和Set。
        Java中还有一个Collections类,专门用来操作集合类 ,它提供一系列静态方法实现对各种集合的搜索、排序、线程、安全化等操作。

33、资源文件有什么作用?

        资源文件是用来配置信息的,如数据库信息,键值对信息等。

        程序里需要有个方法来读取资源文件中的配置信息。

        如果没有资源文件,配置信息就得写在代码里;需要修改信息时就不得不修改代码。

        有了资源文件之后,一旦信息需要改变,修改资源文件就可以,不用修改代码,

        更好的保证了代码的封装性。 

34、【上机】在src下建立一个资源文件(不包含中文),尝试使用Property类读取里
        面的属性。
   

        (1)创建资源文件,我的是fruit.properties; “fruit”可以自定义,后缀名是“properties”。我写的文件内容如下
      (水果名对应的水果信息:名称,产地,价钱):
        apple=name:apple,place:ShanDong,price:7.00RMB/500g
        orange=name:orange,place:GuangDong,price:3.99RMB/500g
        banana=name:banana,place:HaiNan,price:2.99RMB/500g
        carrot=name:carrot,place:Beijing,price:2.98RMB/500g
       

   Properties pro = new Properties();
        String path = StreamTest.class.getClassLoader().getResource("fruit.properties").getPath(); //当前类的类名
        System.out.println(path);
        FileInputStream in =new FileInputStream(path);

        pro.load(in);

        String info  = pro.getProperty("carrot");
        System.out.println(info);

35、【上机】使用entrySet方法遍历Map。

        Set<Entry<String, String>> entries = map.entrySet();
        Iterator<Entry<String, String>>iterator2 = entries.iterator();
        while (iterator2.hasNext()) {
        Entry<String, String> entry = iterator2.next();
        String key = entry.getKey();
        String value = entry.getValue();
        System.out.println(key + "--->"+value);
        }

36、Vector和ArrayList的区别联系

        Vector和ArrayList的区别和联系
        实现原理相同,功能相同,都是长度可变的数组结构,很多情况下可以互用
        两者的主要区别如下
        1)Vector是早期JDK接口,ArrayList是替代Vector的新接口
        2)Vector线程安全,ArrayList重速度轻安全,线程非安全
        3)长度需增长时,Vector默认增长一倍,ArrayList增长50%

37、Hashtable和HashMap的区别联系

        实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用

        两者的主要区别如下
        1)Hashtable是早期JDK提供的接口,HashMap是新版JDK提供的接口
        2)Hashtable继承Dictionary类,HashMap实现Map接口
        3)Hashtable线程安全,HashMap线程非安全
        4)Hashtable不允许null值,HashMap允许null值

38、Java主要容器的选择依据和应用场合

(1) HashTable,Vector类是同步的,而HashMap,ArrayList不是同步的。 因此当在多线程的情况下,应使用HashTable和 Vector,相反则应使用HashMap,ArrayList.
(2) 除需要排序时使用TreeSet,TreeMap外,都应使用HashSet,HashMap,因为他们 的效率更高。
(3) ArrayList 由数组构建, LinkList由双向链表构建,因此在程序要经常添加,删除元素时速度要快些,最好使用
        LinkList,而其他情况下最好使用ArrayList.因为他提供了更快的随机访问元素的方法。

show your code,say is esay

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值