Java面试题p2
HashMap和TreeMap
插入、删除、定位-->HashMap(速度更快)
有序遍历--->TreeMap
HashMap的实现原理
HashMap:基于Hash算法实现的。我们通过put(key,value)存储,get(key)来获取。当传入key时,HashMap会根据key.hashCode()计算hash值,根据hash值将value保存在bucket里。当计算出的hash值相同时,我们称之为hash冲突,HashMap的做法是用链表和红黑树存储相同hash值的value。当hash值冲突较少时,使用链表结构。
HashSet的实现原理
HashSet是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此,HashSet的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成,HashSet不允许重复的值
ArrayList和LinkedList区别
数据结构实现:
- ArrayList是 动态数组 的数据结构实现。
- LinkedList是 双向链表 的数据结构实现
随机访问效率:ArrayList比LinkedList在随机访问的时候效率要高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
增加和删除效率:在非首尾的添加和删除操作,LinkedList要比ArrayList效率高。tip:ArrayList增删操作要影响组内其他数据的下标
综合来说:在需要频繁读取集合中的元素时,更推荐使用ArrayList。在插入和删除较多时,推荐使用LinkedList
数组和List转换
数组转List:使用Arrays.asList(array)方法
List转数组:使用List自带的toAraay()方法
ArrayList和Vectory的区别
线程安全:Vectory使用Synchronized来实现线程同步,是线程安全的,而ArrayList是非线程安全的
性能:ArrayList优于Vectory
扩容:两者都会动态扩容,Vectory每次扩容1倍,ArrayList一次扩容50%
ArrayList 和Array区别
Array可以存储基本类型的数据和对象,ArraList只能存储对象
Array是指定固定大小的,ArrayList是自动扩容的
Array内置方法没有ArrayList多。
Queue中poll()和remove()区别
相同点 :都是返回第一个元素,并在队列中删除返回的元素
不同点:若没有元素poll()会返回null,而remove()会直接抛出NoSuchElementException异常
Queue queue = new LinkedList();
queue.offer("string"); // 添加一个元素
System.out.println(queue.poll()); // 取出并删除元素,输出 "string",队列变空
System.out.println(queue.remove()); // ❌ 队列为空时,remove() 会抛出 NoSuchElementException
System.out.println(queue.size()); 线程安全的集合类
Vectory、Hashtable、Stack都是线程安全的。
迭代器Iterator是什么
iterator接口提供遍历任何Collection的接口。迭代器取代了Java集合框架中Enumeration,迭代器允许调用者在迭代过程中移除元素
Iterator使用及特点
List list = new ArrayList<>(); // 创建了一个空列表
Iterator it = list.iterator();
String obj = it.next(); // ❌ 空列表没有下一个元素,抛出异常
System.out.println(obj);
Iterator特点是更加安全。确保在当前遍历的集合元素被修改的时候,不会抛出ConcurrentModificationException(并发修改异常)
Iterator和ListIterator区别
Iterator 可以遍历Set和List集合,ListIterator只能遍历List
Iterator只能单向遍历,ListIterator可以双向遍历
ListIterator 从Iterator接口继承,然后添加了一些额外的功能。
确保集合不被修改
使用Collections.unmodifiableCollection(Collection c)方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java lang UnmodifiableCollection异常
List list = new ArrayList<>();
Collection clist = Collections. unmodifiableCollection(list);
clist. add("y"); // 运行时此行报错
System. out. println(list. size()); 并行和并发
并行:多个处理器或多核处理器同时处理多个任务
并发:多个任务在同一个CPU上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行
线程和进程
一个程序下至少有一个进程
一个进程下至少有一个线程
一个进程下也可以有多个线程 --> 来增加程序的执行速度
守护线程
守护线程:运行在后台的一种特殊进程,它独立控制终端并且周期性的执行某种任务或等待处理某些发生的事件,在Java中垃圾回收线程就是特殊的守护线程
创建线程的方式
- 继承Thread,重写run方法
- 实现Runnable接口
- 实现Callable接口
runnable和callable区别
runnable没有返回值,callable可以拿到有返回值,callable可以看作是runnable的补充
线程的状态
| 状态 | 释义 |
|---|---|
| NEW | 尚未启动 |
| RUNNABLE | 正在执行中 |
| BLOCKED | 阻塞的 |
| WAITING | 永久等待状态 |
| TIMED_WAITING | 等待指定的时间重新被唤醒的状态 |
| TERMINATED | 执行完成 |
- 本文标签: Java
- 本文链接: http://119.91.109.247:8443//article/49
- 版权声明: 本文由张亚东原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权