Java面试那点事——基础200114

1.java 容器都有哪些?

容器分为三大类:

  • List:有序可重复集合,ArrayList,LinkedList,Vector,Stack
  • Set:无序不可重复集合,HashSet,TreeSet,LinkedHashSet
  • Map:关系映射,HashMap,TreeMap,LinkedHashMap,HashTable

2.Collection 和 Collections 有什么区别?

  • Collection是容器接口,是List和Set的根接口
  • Collections是工具类,提供处理集合的各种方法,

3.List、Set、Map 之间的区别是什么?

容器分为三大类:

  • List:有序可重复集合,ArrayList,LinkedList,Vector,Stack
  • Set:无序不可重复集合,HashSet,TreeSet,LinkedHashSet
  • Map:关系映射,HashMap,TreeMap,LinkedHashMap,HashTable

4.ArrayList 和 LinkedList 的区别是什么?

  • ArrayList 动态数组,索引方便,插入不方便
  • LinkedList 链表,索引不方便,插入方便

5.ArrayList 和 Vector 的区别是什么?

  • ArrayList 线程不安全,扩容 *1.5
  • Vector 方法使用synchronized关键字。线程安全,扩容*2,效率比ArrayList低,适合存大数据并且要求线程安全

6.哪些集合类是线程安全的?

  • Vector:就比 Arraylist 多了个同步化机制(线程安全)。

  • Hashtable:就比 Hashmap 多了个线程安全。

  • ConcurrentHashMap: 是一种高效但是线程安全的集合。

  • Stack:栈,也是线程安全的,继承于 Vector。


7.Iterator 怎么使用?有什么特点?Iterator的 fail-fast属性是什么?

Iterator是一种设计模式,一种轻量级对象,

Iterator使用的时候需要集合调用重写的iterator方法,返回一个iterator对象,通过该对象遍历集合元素。只有collection接口继承了iterator接口,map接口没有。

正在被迭代的集合对象被删除时,必须使用迭代器的删除方法。

所有的java.util包中的集合类都被设计为fail-fast,集合与迭代器一起作用,保证能否安全的删除集合中元素。如果正在被迭代的对象发生结构上的改变时,集合中的两个字段(集合修改次数和迭代器对集合的修改次数)就会不一样,就会抛出异常。


8.Iterator 和 ListIterator 有什么区别?

Iterator是List和Set的迭代器
ListIterator是List的迭代器

Iterator单向,ListIterator双向,ListIterator继承自Iterator,并且实现了更多功能,添加替换等。


9.如何决定使用 HashMap 还是 TreeMap?

HashMap效率高,存取数据快,但是数据无序
TreeMap效率低,但是存储数据是排序的,可以取到最大和最小值


补充:


10.Arrays和Collections的常用方法

Arrsys: 是数组的工具类,提供了对数组操作的工具方法。

Collections: 是集合对象的工具类,提供了操作集合的工具方法。

其中 Arrays 和 Collections 中所有的方法都为静态的,不需要创建对象,直接使用类名调用即可。

Arrays常用方法:

  • sort() 排序
  • asList() 将数组转化为arraylist
  • toString() 返回 数组中元素以逗号分隔,两边是[] 的字符串

Collections常用方法

  • sort() 排序
  • reverse() 反转顺序
  • synchronizedMap、synchronizedSet、synchronizedList 使线程安全

11.如何实现数组和 List 之间的转换?

调用工具类的Arrays的asList方法


12.Array 和 ArrayList 有何区别?

  • Arrays是数组的工具类
  • Array是数组,声明时必须 说明大小和类型
  • ArrayList是动态数组,不比声明大小,数组大小动态扩展,在不使用泛型的情况下都不比声明类型。

补充:

泛型只是在编译期间生效,运行期间会被擦除,保证类型安全,消除了强制类型转换,带来性能上的收益。


13.在 Queue 中 poll()和 remove()有什么区别?

  • poll () 和 remove () 都将移除并且返回对头,但是在 poll () 在队列为空时返回 null,而 remove () 会抛出 NoSuchElementException 异常。
  • peek () 和 element () 都将在不移除的情况下返回队头,但是 peek () 方法在队列为空时返回 null,调用 element () 方法会抛出 NoSuchElementException 异常。
  • add () 和 offer () 都是向队列中添加一个元素。但是如果想在一个满的队列中加入一个新元素,调用 add () 方法就会抛出一个 unchecked 异常,而调用 offer () 方法会返回 false。

14.怎么确保一个集合不能被修改?

(一)、final
我们很容易想到用 final 关键字进行修饰,我们都知道

  • final 修饰的类不能被继承,
  • final 修饰的方法不能被重写,
  • final 修饰的变量不能修改

这里需要特别注意,变量是基本类型的时候,值不可修改,变量是对象的时候,引用不可修改。

        final ArrayList list = new ArrayList();
        list.add(1);
        list.add(2);
        ArrayList list1 = new ArrayList();
        list1.add(3);
        list1.add(4);

        list1 = list;//正常
        list = list1;//报错

可以看到,集合list的值是可以不断添加,但是当引用改变的时候就会报错,所以使用final只能让集合的引用不可修改,而值还是可以修改和添加

(二)

使用 Collections. unmodifiableCollection (Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。

List<String> list = new ArrayList<>();
list. add("A");
Collection<String> unmlist = Collections. unmodifiableCollection(list);
unmlist. add("B"); // 运行时此行报错
System. out. println(list.size());

【Java 面试那点事】

这里致力于分享 Java 面试路上的各种知识,无论是技术还是经验,你需要的这里都有!

这里可以让你【快速了解 Java 相关知识】,并且【短时间在面试方面有跨越式提升

面试路上,你不孤单!
在这里插入图片描述

发布了147 篇原创文章 · 获赞 835 · 访问量 27万+

猜你喜欢

转载自blog.csdn.net/qq_33945246/article/details/103980630