面试-java常见问题

这篇具有很好参考价值的文章主要介绍了面试-java常见问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JVM 配置

  • 程序计数器:当前线程所执行的字节码的行号指示器
  • java虚拟机栈:临时变量
  • 元空间:类常量池,运行时常量池
  • 方法区:类信息,静态变量
  • 堆:对象实例,Sting常量池等

类加载过程

加载->链接(验证+准备+解析)->初始化->使用->卸载

加载:将硬盘中的二进制文件转为内存中的class对象

链接:给静态变量赋初始值,符号引用替换为直接引用

  • 验证:检查载入的class 文件数据正确性。
  • 准备:给类变量(静态变量)分配内存(方法区),直接赋值为最终值。
  • 解析:将常量池内的符号引用替换为直接引用。

初始化:执行类变量(静态变量)的赋值和静态语句块
使用:若是第一次创建对象(对象所属的类没有加载到内存中),先执行初始化操作,再堆上为对象分配空间,所有属性设设置默认值,给实例变量赋值,初始化语句,检查是否有父类,有就先执行父类的构造函数。

GC垃圾回收流程

GC垃圾回收,是对堆内存的一清理。
堆内存:
年轻代:(eden[伊甸园],survior[存活区],vlrtual[伸缩区])
老年代:(tenured[旧生代],vlrtual[伸缩区])
永久代:(1.8后就不存在了,换为了元空间)
面试-java常见问题

ArrayList是否线程安全?如何线程安全地操作ArrayList?

ArrayList 是线程不安全的,如果需要线程安全的List,可以从采用Vector/Collections.synchronizedList/CopyOnWriteArrayList
Vector: 使用synchronized关键字
Collections.synchronizedList: 内每一个方法都加了synchronized 关键字
CopyOnWriteArrayList: 在写操作的时候总是要复制,将原来的数据复制到新的数组进行操作,任何可变的操作都是通过ReentrantLock 控制并发。

线程不安全的原因:
当多个线程同时对一个数组进行操作时,如果线程1 执行 list[i] = “a” ,i++;线程2执行 list[i] = “b” ,i++;
如果线程同步执行了list[i] = 的操作,在执行i++,那么i+1 就有可能出现空值,list[i]的值同样可能出现被覆盖的情况。所以说ArrayList 线程不安全。

HashMap、TreeMap、LinkedHashMap的区别?

相同点:都是属于Map,都是通过K-V存储,K不允许重复。都是线程不安全的。
不同点:

HashMap TreeMap LinkedHashMap
按顺序插入存放 不支持 不支持 支持,遍历时按插入的顺序输出
按Key排序 不支持 支持,默认按key升序 不支持
数据结构 数组+链表+红黑树 红黑树 HashMap+双向链表
null key,value都可以为空,但是Key只能有一个为空 不允许key,value为空 key,value都可以为空,但是Key只能有一个为空

HashMap为什么线程不安全?如何线程安全地操作?

安全使用Map的三种方法:
1.HashTable,在get/put方法上加上了synchronized关键字,性能很差。
2.Collections.synchronizedMap,所有的方法都加上了synchronized关键字,性能很差。
3.ConcurrentHashMap,每次只给一个桶(数组项)加锁,性能好。

HashMap线程不安全的原因:
1.数据覆盖,
2.读出为null
3.JDK1.7会出现死循环。

ConcurrentHashMap原理?

在JDK1.8后,ConcurrentHashMap采用的是HashMap(数组+链表+红黑树)+synchronized +CAS的设计来实现线程安全。
CAS:在判断数组中当前位置为null时,使用CAS把这个新的节点写入对应数组中的位置。
synchronized:当数组中当前位置不为空时,通过加锁来添加这个节点进入数组(链表<8)或者红黑树(链表>=8)

线程池有哪些参数?

1.corePoolSize:线程池的核心线程数,即便没有任务也会有这么多的线程在等候;
2.maximunPoolSize:最大线程数,超过这个数量会触发拒绝策略。
3.keepAliveTime:线程存活时间,当线程大于corePoolSize时,等到这个时间还没有任务执行的话,线程退出。
4.unit:指定keepAliveTime的单位,如TimeUnit.SECONDS 秒。
5.workQueue:阻塞队列,提交的任务会被放在这个队列里。
6.threadFactory:线程工场,用来创建线程。
7.handler:拒绝策略

ArrayList扩容机制

当我们直接new 一个ArrayList对象时(未指定大小),new 出来的是一个空数组,容量为0;
当第一次调用add 方法时,分配容量,如果是空数组,最小默认容量为10,当需求容量大于此时的容量是,执行扩容方法grow(),扩容为当前容量的1.5倍,然后比较需求容量与扩容后的容量,如果需求容量大于扩容后的容量,那么就将需求容量作为新的容量值,否则去扩容后的容量,然后再进行复制操作,将数据复制到新的数组中。

HashMap数据结构、哈希冲突解决方法?

HashMap其实就是一个大的数组,将Key的HashCode作为数组的下标,value 作为数组的值,当key的hash值冲突时,将新key和旧Key放到链表中。
链表的长度大于8且小于64,会自动扩容,当链表长度大于8且大于64,会自动转为红黑树。如果红黑树的节点数小于6,则将红黑树转为链表。
当发生hash冲突时,通过链地址法将指向下一个entry

HashMap扩容的原理?

HashMap是懒加载,再构建完对象后,没有发生put操作之前,不会初始化和扩容。
当发生首次put时,会调用resize方法进行初始化。初始化的容量为2^4;
当put发现数组大小大于阈值(当前大小的75%)时调用resize方法进行扩容;
扩容大小为当前的大小的2倍,扩容后判断新的容量是否大于最大容量,如果大于最大容量,实际大小为最大容量,最大容量为:2^30。

JVM通常设置哪些参数来调优?

-Xms 初始堆大小
-Xmx 最大堆大小
-Xss 线程栈大小
-XX:NewSize=n 设置年轻代大小
-Xmn 设置年轻代初始大小和最大大小,年轻代增大,老年代就会减小,Sun官方推荐的配置时年轻代占整个堆的3/8

GC信息

-XX:+PrintGC 打印GC日志
-XX:+PrintGCDetails 打印详细的GC日志信息
-XX:+PrintGCTimeStamps 打印进程启动到现在经历的时间文章来源地址https://www.toymoban.com/news/detail-480486.html

到了这里,关于面试-java常见问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 面试-Dubbo常见问题

    Dubbo 是一个RPC框架,包含注册中心,服务提供方,服务消费方,控制台,监控中心。 Dubbo 启动时会从注册中心拉取消费者需要的提供方信息,如果依赖的服务提供方不可用,Dubbo消费方会启动失败,并且不停的向注册中心请求提供方信息,抛出异常找不到对应的提供方。可以

    2024年02月08日
    浏览(47)
  • JavaEE 面试常见问题

    Mybatis 是一种典型的半自动的 ORM 框架,所谓的半自动,是因为还需要手动的写 SQL 语句,再由框架根据 SQL 及 传入数据来组装为要执行的 SQL 。其优点为: 1. 因为由程序员自己写 SQL ,相对来说学习门槛更低,更容易入门。 2. 更方便做 SQL 的性能优化及维护。 3. 对关系型数据

    2024年02月14日
    浏览(48)
  • JVM基础,面试常见问题

    目录 一.运行时数据区域 1.线程独享 (1)栈 (2)程序计数器 2.线程共享 (1)方法区 (2)堆 二.内存如何分配 1.指针碰撞法 2.空闲列表法 3.TLAB 三.对象在内存中的组成 1.对象头 (1)markword (2)指向类型的指针 (3)如果是数组-》数组长度 2.实例数据 3.对齐填充 四.如何访

    2024年01月23日
    浏览(50)
  • 单片机面试常见问题

    1、中断的概念?简述中断的过程 (1)中断:指CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU暂时中断当前正在运行的程序,转而执行为内部/外部事件或程序预先安排的事件的服务子程序,待中断服务子程序执行完毕后,CPU再返回到被

    2024年04月10日
    浏览(76)
  • 【数据结构面试常见问题】

    数据结构作为计算机的一门基础学科,它在面试中占有很大的比重,本科阶段,我们也学过数据结构与算法,内容比较多,也比较难,尤其是图的应用以及各类查找和排序算法,这些也都是核心内容。数据结构在实际的应用中也比较多,因此,整理一些常见的笔试、面试的数

    2024年03月22日
    浏览(45)
  • 项目经理岗面试常见问题

    一、注意事项   ·电面邀约确认(避免hr刷KPI): 请问贵司招聘的是什么岗位,是新建团队还是原有团队? 这边面试流程是怎样的,是 leader 直接面,还是?   ·面试前铺垫: 如果您对某部分感兴趣,请随时打断我。   ·面试中发挥: 尽量采用 STAR 原则回答,即 情境( Si

    2024年02月05日
    浏览(48)
  • 大数据常见面试问题汇总

    目录 第1章 核心技术 1.1 LinuxShell 1.1.1 Linux常用高级命令 1.1.2 Shell常用工具及写过的脚本 1.1.3 Shell中单引号和双引号区别 1.2 Hadoop 1.2.1 Hadoop常用端口号 1.2.2 HDFS读流程和写流程 1.2.3 HDFS小文件处理 1.2.4 HDFS的NameNode内存 1.2.5 Shuffle及优化 1.2.6 Yarn工作机制 1.2.7 Yarn调度器 1.2.8 HDFS块大

    2024年02月14日
    浏览(109)
  • docker常见面试问题详解

    在面试的时候,面试官常常会问一些问题: docker是什么,能做什么? docker和虚拟机的区别是什么呢? docker是用什么做隔离的? docke的网络类型?docker数据之间是如何通信的? docker的数据保存问题? 常用的docker命令? docker制作镜像相关? 下面,就让我来详细说明一些这些问

    2024年02月10日
    浏览(44)
  • List常见面试问题

    Java中的List是一种存放有序的、可以重复的数据的集合,它允许重复元素的存在。List中的元素都有对应的一个序列号(索引)记录着元素的位置,因此可以通过这个序列号来访问元素。 ‍ Java中的List有三种实现方式:ArrayList、LinkedList和Vector。其中,ArrayList是基于数组实现的,

    2024年02月09日
    浏览(38)
  • kubernetes常见面试问题详解

    在面试的时候,面试官常常会问一些问题: k8s是什么?有什么用? k8s由哪些组件组成? pod的启动流程? k8s里有哪些控制器? k8s的调度器里有哪些调度算法? pod和pod之间的通信过程? 外面用户访问pod数据流程? 你常用哪些命令? 容器的类型? 3种探针? pod的升级? HPA、V

    2024年02月10日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包