JavaSE - 练习面试题目 [8] 集合框架

1.Collection 和 Collections的区别

答:Collection是集合类的上级接口,继承于他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

2.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别

答:Set里的元素是不能重复的,用equals()方法判读两个Set是否相等 equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值

3.List, Set, Map是否继承自Collection接口

答: List,Set是,Map不是

4.两个对象值相同(x.equals(y) == true),但却可有不同的hashcode,这句话对不对

答:不对,有相同的 hashcode

5.说出ArrayList,Vector, LinkedList的存储性能和特性

答:ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

6.HashMap和Hashtable的区别

答:
1.HashMap与Hashtable都实现了Map接口。由于HashMap的非线程安全性,效率上可能高于Hashtable。Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
2.HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
3.HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
4.Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
5.Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

7.ArrayList和Vector的区别

答:就ArrayList与Vector主要从二方面来说.
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

8.你所知道的集合类都有哪些?主要方法?

答:最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。
Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值。

9.定义一个Collection接口类型的变量,引用一个Set集合的实现类,实现添加单个元素,添加另一个集合,删除元素,判断集合中是否包含一个元素,判断是否为空,清除集合,返回集合里元素的个数等常用操作。
10.创建Set接口的实现类,添加10个以上的元素,通过Iterator遍历此集合元素。
11.创建Set接口的实现类,添加10个以上的元素,通过foreach遍历此集合元素。
12.创建Set接口的实现类,添加10个以上的元素,要求能够排序。
13.创建Car类,包含name,price属性,构造器等方法,创建测试类,在main方法中创建Set接口的实现类,添加5个以上的Car对象,遍历集合元素,验证重复元素是否过滤了;如果没有过滤,实现过滤功能;把每个小车的price降10000元,再遍历,查看price是否已改变
14.定义一个Collection接口类型的变量,引用一个List集合的实现类,实现添加单个元素,添加另一个集合,删除元素,判断集合中是否包含一个元素,判断是否为空,清除集合,返回集合里元素的个数等常用操作。

创建ArrayList实例化对象,添加10个以上的元素,在2号位插入一个元素,获得5号位元素,删除6号位元素,修改7号位的元素;

15.通过四种方法遍历上题中的集合
16.创建LinkedList实例化对象,练习具有队列特点的方法
17.按要求实现下列问题:

1)封装一个新闻类,包含标题和内容属性,提供get、set方法,重写toString方法,打印对象时只打印标题;(10分)
2)只提供一个带参数的构造器,实例化对象时,只初始化标题;并且实例化两个对象:
新闻一:中国多地遭雾霾笼罩空气质量再成热议话题
新闻二:春节临近北京“卖房热”
3)将新闻对象添加到ArrayList集合中,并且使用ListIterator倒序遍历;
4)在遍历集合过程中,对新闻标题进行处理,超过15字的只保留前14个,然后在后边加“…”
5)在控制台打印遍历出经过处理的新闻标题;

18.定义一个Map接口类型的变量,引用一个实现类,添加键值对,判断集合中是否包含某一key值,通过某一key值得到value值,通过某一key删除键值对,把另一个map集合添加到此map集合,判断是否为空,清除集合,返回集合里元素的个数等常用操作。
19.通过两种方法遍历上题中的map集合
20.使用Map接口的实现类完成员工工资(姓名--工资)的摸拟:

1)添加几条信息
2)列出所有的员工姓名
3)列出所有员工姓名及其工资
4)删除名叫“Tom”的员工信息
5)输出Jack的工资,并将其工资加1000元(通过取值实现)
6)将所有工资低于1000元的员工的工资上涨20%(通过取值实现)

21.创建有序的map集合的实例化对象,添加元素,查看排序结果
22.封装一个新闻类,包含标题、作者、新闻内容和发布时间,新闻标题如下:

新闻一:中国多地遭雾霾笼罩空气质量再成热议话题
新闻二:民进党台北举行“火大游行”
新闻三:春节临近北京“卖房热”
新闻四:春节临近北京“卖房热”

1)完成对新闻类的设计,要求在初始化新闻类对象时 ,通过构造传参的形式对新闻标题赋值,并要求实例化四个对象,标题内容如题。
2)要求打印新闻对象时,直接打印新闻标题;
3)要求使用equals方法比较新闻时,只要标题相同,就认为是同一新闻,请输出新闻一与新闻二的比较结果,新闻三与新闻四的比较结果。
4)将新闻对象存入HashSet集合中,并且遍历集合,打印新闻类对象;
5)打印集合中新闻数量。

23.使用HashMap类实例化一个Map类型的对象m1,键(String类型)和值(int型)分别用于存储员工的姓名和工资,存入数据如下:

张三——800元;李四——1500元;王五——3000元;
1)将张三的工资更改为2600元
2)为所有员工工资加薪100元;
3)遍历集合中所有的员工
4)遍历集合中所有的工资

24.创建一个List集合的对象,添加几个数字,反转对象中元素的顺序;根据元素的自然顺序排序;
25.创建一个List集合的对象,添加几个字符串,反转对象中元素的顺序;根据元素的自然顺序排序;
26.创建一个List集合的对象,添加几条数据,将1号位和2号位交换;获得最大值,最小值,
27.叙述主要集合实现类的遍历方法
28.按要求完成如下操作
  1. 生成10个随机数,值在100到200之间;
  2. 将这十个数存入HashSet集合中(有可能集合的长度小于10)。
  3. 将这个HashSet集合转换成ArrayList集合
  4. 重新为ArrayList集合排序,按照从小到大的顺序;
  5. 使用foreach遍历集合;
29.按要求完成如下操作

1 )封装一个汽车类,包含String name、int speed属性,在测试类中实例化三个对象:c1,c2,c3,分别设置name为:“奥拓”,“宝马”,“奔驰”,速度分别设置为:100,200,300
2 )使用Map集合对象m1将这三个汽车类对象保存成key,然后将int型的汽车价钱作为值保存在m1的value中,上述三款汽车分别对应的价钱是10000,500000,2000000
3 )遍历m1的键,打印name属性
4 )通过合适的方法,求出m1中“宝马”的价格,并打印结果;
5 )经过折旧,所有汽车都降价到原来的80%,请打印降价后“宝马”的价格

30.按要求完成如下操作

1 ) 要求集合对象c1中,只能添加字符串形式的单个元素,元素可以重复,在测试类中为c1集合添加字符串“这是一个可以重复的集合”三遍,然后遍历打印结果。
2 )要求集合对象c2中只能添加整型数值,并且不可重复,按自然顺序排序。要求遍历集合对象,打印添加进1,2,3,4,5五个数字的c2集合
3 )要求创建一个合适的Map集合对象m1,它的键和值都只能是字符串,并且值可以是null,像map集合中添加三组字符串,其中一个只有键,值是空,遍历这个集合对象的键,并打印键。
4)想办法将m1中所有值为null都替换成一个字符串”这里是空值”
5)遍历m1的所有值。

31.以下代码的运行结果?
public class Test7 {
    public static void main(String[] args) {
        Integer[] datas = {1, 2, 3, 4, 5};
        List list = Arrays.asList(datas);
        list.add(6);
        list.remove(1);
        System.out.println(list.size());
    }
}

运行异常,不允许添加元素
为什么? 因为Arrays里面的 源码决定的

 private static class ArrayList extends AbstractList
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }

        @Override
        public int size() {
            return a.length;
        }

        @Override
        public Object[] toArray() {
            return a.clone();
        }

        @Override
        @SuppressWarnings("unchecked")
        public  T[] toArray(T[] a) {
            int size = size();
            if (a.length < size)
                return Arrays.copyOf(this.a, size,
                                     (Class) a.getClass());
            System.arraycopy(this.a, 0, a, 0, size);
            if (a.length > size)
                a[size] = null;
            return a;
        }

具体可以参见 @为啥报错异常

你可能感兴趣的:(JavaSE - 练习面试题目 [8] 集合框架)