牛客面试题库(5)

String、StringBuilder、StringBuffer有什么区别

String:底层private final修饰的char[],因为由于private修饰,而且没有对外提供修改方法,所以是不可变的,每次str+=新字符串,其实底层是创建StringBuilder对象,值为String原来的值,然后调用append方法,最后调用toString方法转为字符串

StringBuilder:底层char[],父类AbstractStringBuilder,可变,线程不安全

StringBuffer:底层char[],父类AbstractStringBuilder,可变,线程安全

请你说说HashMap底层原理

底层数据结构:1.8之前数组+链表,1.8之后数组+链表/红黑树

put:根据key计算哈希值,然后用哈希值按位与&集合的长度从而确定元素的位置,如果位置有其他元素,发生哈希碰撞,则使用链表来连接这些元素,1.8之前是头插法,1.8之后是尾插法,当链表长度达到8时,就会发生扩容,如果链表长度达到8时并且数组容量达到64,就会转变为红黑树

扩容机制:初始容量为16,负载因子为0.75,当容量达到负载因子,会以2^n指数倍扩容

说说你了解的JVM内存模型

由三部分组成:类加载子系统、执行引擎、运行时数据区

类加载子系统:根据类的全限定名称来载入类

执行引擎:执行被载入类中方法的指令

运行时数据区:线程私有虚拟机栈、本地方法栈、程序计数器,线程共享堆、方法区

  • 虚拟机栈:存储方法执行中的局部变量
  • 本地方法栈:存储native method 本地方法
  • 程序计数器:记录线程执行的位置
  • 堆:存储对象的实例,分为新生代和老年代,新生代又分为Eden、from、to(两个survivor),新生代存储新创建的对象,老年代存储存活时间较久的对象,垃圾回收主要回收堆,垃圾回收算法有标记-清除、标记-整理、标记-复制
  • 方法区:存储常量、静态变量

说说JVM的垃圾回收机制

GC:garbage collection,垃圾回收

minor GCmixed GCfull GCminor使用标记-复制算法回收新生代;mixed标记-复制回收新生代,标记-整理回收部分老年代;而full回收整个堆

主要完成三件事:

  • 哪些需要回收:不被使用的对象、废弃的常量
  • 什么时候回收:通过引用计数器、可达性分析法判断
  • 如何回收:通过垃圾回收器

垃圾回收器分为串行、并行、并发回收器,常见垃圾回收器有serial(串行)、parallel(并行)、CMS(concurrent Mark sweep)G1

  • parallel:新生代minor GCold老年代full GC
  • CMSminor GC,回收跟不上创建,full GC
  • G1minor GCmixed GC,回收跟不上创建,full GC

说说类加载机制

包括五个阶段,加载,验证,准备,解析,初始化,其中验证,准备,解析合称为链接

加载:首先判断类是否加载过,没有加载过使用类加载器进行加载,把.class文件加载到内存,生成class对象

验证:验证类的格式是否正确

准备:为静态变量分配空间,分配默认值

解析:将符号引用转为直接引用,符号引用是使用一堆符号来描述引用的目标,直接引用,直接指向目标的指针

初始化:为静态变量、静态代码块赋值

类加载器:主要分为三种,启动类加载器(bootstrap ClassLoader)、扩展类加载器(extension ClassLoader)、应用程序类加载器(application ClassLoader);优先加载核心加载器,保证核心加载器不被篡改,上级对下级共享,从上到下加载,上级加载不了,下级加载;可以自定义加载器,其上级为应用程序加载器(application ClassLoader

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值