1、Java容器有哪些,哪些是同步容器,哪些是并发容器?
Java容器类类库的用途是“持有对象”,并将其划分为两个不同的概念:
- Collection:一个独立元素的序列,这些元素都服从一条或者多条规则。 List必须按照插入的顺序保存元素,而set不能有重复的元素。Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。
- Map:一组成对的“键值对”对象,允许你使用键来查找值。
Java中容器间的继承关系如下:
同步容器有:
- vector
- Stack
- HashTable
- Collections.synchronized方法生成
并发容器有:
- ConcurrentHashMap:线程安全的HashMap的实现
- CopyOnWriteArrayList:线程安全且在读操作时无锁的ArrayList
- CopyOnWriteArraySet:基于CopyOnWriteArrayList,不添加重复元素
- ArrayBlockingQueue:基于数组、先进先出、线程安全,可实现指定时间的阻塞读写,并且容量可以限制
- LinkedBlockingQueue:基于链表实现,读写各用一把锁,在高并发读写操
2、ArrayList和LinkedList插入和访问的时间复杂度?
ArrayList是基于动态数组实现的,LinkedList是基于链表实现的,知道这点后就计算时间复杂度很容易了。
ArrayList | LinkedList | |
---|---|---|
插入 | O(n) | O(1) |
访问 | O(1) | O(1) |
3、Java反射、注解原理?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
注解可以看作是对机器的注释,也叫元数据,一种代码级别的说明,与类,接口,枚举是在同一个层次的,它可以声明在包,类,字段,方法,局部变量前面,对这些元素后进行说明,注释。Java中预定义了一些注解,如@Override,@Depreciate,@SuppressWarnings等。
4、新生代分为几个区?使用什么垃圾回收算法?为什么使用这个算法?
新生代分为3个区,分别为Eden、From Survivor、To Survivor,大小比例为:8:1:1。
使用的是复制算法,复制算法适用于对象比较少的情况,当Eden区的内存被填满,会触发minorGC ,Eden区对象会从Eden转移到Survivor区,随着年龄的增加再到老年代。
Java的堆区域划分一般如下图:
5、HashMap在什么情况下会扩容?哪些操作可能导致扩容?
新创建一个HashMap,其初始化容量为DEFAULT_INITIAL_CAPACITY=16,并且设置了一个负载系数DEFAULT_LOAD_FACTOR=0.75,当元素个数>=阈值,即16*0.75=12, 会扩容一倍,以后以此类推。导致扩容的操作有插入、合并等。
多线程情况下使用hashmap可能出现哪些错误?
- 循环链表:
- 数据丢失:假设线程1,线程2都在使用hashmap,如果hash函数为n%16,线程1 插入数字17,计算应该是插在1的位置,但是同时线程2对hashmap进行扩容,扩容后使用hash函数是n%32,那么实际上线程1插入的17应该在17的位置,但是它使用的是扩容之前的函数,导致插入在1的位置,后面查找17时就会查找不到,造成数据丢失。
6、HashMap检测到hash冲突后,是将元素插入到开头还是结尾?
因为JDK1.7是用单链表进行的纵向延伸,采用头插法就是能够提高插入的效率,但是也会容易出现逆序且环形链表死循环问题。但是在JDK1.8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。
在 Java8 中,当链表中的元素超过了 8 个以后,会将链表转换为红黑树,在这些位置进行查找的时候可以降低时间复杂度为 O(logN)。其结构如下
7、1.8还使用了红黑树,讲讲红黑树的特性,为什么要用红黑树而不是AVL,B树之类的?
红黑树,Red-Black Tree 「RBT」是一个自平衡(不是绝对的平衡)的二叉查找树(BST),树上的每个节点都遵循下面的规则:
- 每个节点都有红色或黑色
- 树的根始终是黑色的 (黑土地孕育黑树根, )
- 没有两个相邻的红色节点(红色节点不能有红色父节点或红色子节点,并没有说不能出现连续的黑色节点)
- 从节点(包括根)到其任何后代NULL节点(叶子结点下方挂的两个空节点,并且认为他们是黑色的)的每条路径都具有相同数量的黑色节点。
它的创建过程和平衡二叉树的创建过程差不多,多了一些着色过程。红黑树的关键性质: 内部保证有序,旋转开销小,整体相对平衡。
为什么要用红黑树而不是AVL,B树之类的?
- 在CurrentHashMap中是加锁了的,实际上是读写锁,如果写冲突就会等待,如果插入时间过长必然等待时间更长,而红黑树相对AVL树B树的插入更快,AVL树查询确实更快一些,但是对于操作密集型,红黑树的旋转更少,效率更高。
8、HTTP和HTTPS的区别?
- 1、HTTPS 协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(以前的网易官网是http,而网易邮箱是 https 。)
- 2、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。
- 3、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- 4、HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)
9、线程池的工作原理,几个重要参数。
先看源码
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, defaultHandler);
}
- corePoolSize, 核心线程数
- maximumPoolSize, 最大线程数
- keepAliveTime, 线程最大存活时间
- unit 指定存活时间的单位,TimeUnit.HOURS,TimeUnit.SECONDS等等。
- worlQueue,阻塞队列。
10、Linux怎么查看负载情况?
使用命令uptime、top等查看,更多信息也可参考这篇文章。
11、spring 一个bean的装配过程
- 1、读取配置文件
- 2、实例化bean
ApplicationContext context=new ClassPathXmlApplicationContext("Car.xml");
Car car=(Car) context.getBean("car1");
12、CAS算法
CAS是英文单词CompareAndSwap的缩写,中文意思是:比较并替换。CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。
CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。
CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。