面试实题:No.11

1、list、set集合在项目中的应用场景

list:这个太多了,任何一对多,多的一方并且要有顺序的,都可以拿list来表示
set:有时候会拿来做一些数据过滤。比方说商品表里有1000件商品,每件价格层次不齐,有大量重复的,这时需要查这一批商品有多少种价位。但是还不能直接distinct来查,需要把商品全部查出来做统计,再把价格放入set中去set.size()得出,1000件商品总共有set.size()种价格。其他还有很多例子。
 
2、多线程的安全问题如何保证
一句话,避免不必要的同步;过多的同步会造成死锁以及昂贵的锁竞争代价。除了sync锁之外,Java提供了一些线程安全容器,要活用这些容器。
除此以外,程序设计的时候,如果不得已面临线程安全的情况,要采取对应的措施;能保证线程的机制是锁机制、AQS机制,对象头补齐机制等;根据环境和特定的业务挑选最合适的方法。
对于Java而言,线程安全工具已经足够多了。基本上能满足需求。
(1)同步代码块:
在代码块声明上 加上synchronized
synchronized (锁对象) {
可能会产生线程安全问题的代码
}
同步代码块中的锁对象可以是任意的对象;但多个线程时,要使用同一个锁对象才能够保证线程安全。
(2)同步方法:
在方法声明上加上synchronized
public synchronized void method(){
    可能会产生线程安全问题的代码
}
同步方法中的锁对象是 this
静态同步方法: 在方法声明上加上static synchronized
静态同步方法中的锁对象是 类名.class
(3)同步锁
Lock接口提供了与synchronized关键字类似的同步功能,但需要在使用时手动获取锁和释放锁。
3、多线程在项目中的使用场景
这个太多了。用户请求、数据库连接、轮询任务,端口监听,异步操作等等等等。只要操作涉及到性能和计算,全部要用到多线程。
 
4、hashmap设计的优势(链表中数据为什么存在最前端,而数组中放在后端)
Map<K,V>是一种以键值对存储数据的容器,而HashMap则是借助了键值Key的hashcode值来组织存储,使得可以非常快速和高效地地根据键值key进行数据的存取。
对于键值对<Key,Value>,HashMap内部会将其封装成一个对应的Entry<Key,Value>对象,对于每个对象而言,JVM都会为其生成一个hashcode值。
在HashMap内部,采用了数组+链表的"桶"式来组织键值对Entry<Key,Value>,HashMap在存储Entry<Key,Value>的时候,会根据Key的hashcode值,
以映射关系,决定应当将这对键值对Entry<Key,Value>存储在HashMap中的什么位置上;
当通过Key值取数据的时候,然后根据Key值的hashcode,以及内部映射条件,直接定位到Key对应的Value值存放在什么位置,可以非常高效地将Value值取出。
HashMap的最大设计优势就是查找效率非常高,也因此HashMap是线程不安全的,如果想使用线程安全的,可以使用Hashtable。
 
回答"链表中数据为什么存在最前端,而数组中放在后端"这个问题:
首先链表和数组都是线性表的两种形式,
1. 以顺序存储的线性表就称之为顺序表,内部就是以数组形式进行存储;它是用一组地址连续的存储单元依次存储数据元素的,使用数组存储元素就会在连续的地址空间上存储元素;
2. 以链式存储的线性表就是链表,它的存储地址是不连续的,元素之间通过指针记录下一个元素的地址来保持连接,向链表中存储元素有两种方式,分别是头插法和尾插法。
5、io和nio的区别
面向流与面向缓冲;
Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。
阻塞与非阻塞IO;
Java IO的各种流是阻塞的。Java NIO的非阻塞模式。
发布了441 篇原创文章 · 获赞 1021 · 访问量 53万+

猜你喜欢

转载自blog.csdn.net/A_BlackMoon/article/details/104696870