Java面试题(蚂蚁花呗)

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是基于链表实现的,知道这点后就计算时间复杂度很容易了。

ArrayListLinkedList
插入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同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值