Java常见面试题(持续更新)
文章目录
- transient 关键字作用
- final 关键字作用
- 封装的作用
- HashMap,HashTable,ConcurrentHashMap
- HashMap不是线程安全的示例
- HashMap常见面试题
- String intern函数
- StringBuffer 与StringBuilder 的区别
3。设计模式
4。垃圾回收
5。抽象类与接口的区别
6.什么情况下会触发类的初始化
7.谈谈你对解析与分派的认识
8 如何⾃定义⼀个类加载器?你使⽤过哪些或者你在什么场景下需要⼀个⾃定义的类加载器吗?
9.关于集合中一些常考的重点知识点总结
1.Java里面有哪几种基础数据类型,2.Char为何是两个字节,3.Object有哪些方法,4.final修饰变量,函数,类的作用,5.ArrayList的父类有哪些,6.为什么覆盖equal的时候必须覆盖hashcode,7.反射应用场景,优缺点,8.自定义线程池的参数以及意义,9.当线程池不断接受新任务,活跃线程数怎么变化,10.线程池的四种拒绝策略,11.同步与异步,阻塞与非阻塞,12.BIO,NIO,AIO的区别,13.加入要处理100个连接,用BIO和NIO分别需要多少个线程,13.synchronized的原理,偏向锁,轻量级锁,重量级锁,sleep和wait的区别,线程状态有哪些,线程之间通信,14.ReentrantLock的原理,和synchronized的区别,15.AtomicInteger的原理,16.volatile能不能保证线程安全,17.线程安全的单例模式,18.HashMap,HashTable,ConcurrentHashMap的区别,19.jdk1.8对HashMap做了哪些改动,20.JVM内存模型,GC算法,CMS有几次stop the world,21.新生代gc几次存活之后才能进去老年代,22.频繁GC的可能原因,23.线上OOM,日志十几个G,怎么快速定位,24.事务的原理,事务的特性,事务的传播行为,事务的隔离级别,25.分布式事务,二阶段提交,三阶段提交,tcc能不能保证100%一致性,26.CAP,BASE理论,最终一致性的概念,27.A和B用户在不同的节点,用最终一致性设计转账功能,28.判断集群保证了CAP里面的哪些要素,MySql主备集群,MySql范围分区集群,HBase,Redis-Cluster,Redis哨兵集群,Zookeeper集群,Kafka集群,29.一致性哈希节点分布不均匀怎么办,30.MySql分库分表策论:范围分库,取模,一致性哈希的优缺点,31.MyCat和Sharding-JDBC的区别,优缺点,32.索引原理,索引失效的原因,ABC联合索引实际建了几个索引,MYASIAM和INNODB的区别,33.什么情况下锁行,什么情况下锁表,MySql乐观锁,排它锁,间隙锁,34.Select for update分别在主键,唯一索引,分索引列
transient 关键字作用
final 关键字作用
封装的作用
·隐藏实现细节,提供公共的访问方式
·提高安全性,防止数据被乱改
HashMap,HashTable,ConcurrentHashMap
1.HashMap是支持null键和null值的,而HashTable在遇到null时,会抛出NullPointerException异常。
2.哈希值的处理和映射方式不同。
Hashtable
做法如下:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
HashMap
做法如下:
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}
if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null);
HashTable默认的初始大小为11,之后每次扩充为原来的2n+1。HashMap默认的初始化大小为16,之后每次扩充为原来的2倍。
3.HashMap不是线程安全的,Hashtable是线程安全的。
Hashtable的做法是:公开的方法比如get都使用了synchronized描述符。而遍历视图比如keySet都使用了Collections.synchronizedXXX进行了同步包装。
Hashtable 本身比较低效,因为它的实现基本就是将 put、get、size 等各种方法加上“synchronized”。
╔═══════════════╦═══════════════════╦═══════════════════╦═════════════════════╗
║ Property ║ HashMap ║ Hashtable ║ ConcurrentHashMap ║
╠═══════════════╬═══════════════════╬═══════════════════╩═════════════════════╣
║ Null ║ allowed ║ not allowed ║
║ values/keys ║ ║ ║
╠═══════════════╬═══════════════════╬═════════════════════════════════════════╣
║Is thread-safe ║ no ║ yes ║
╠═══════════════╬═══════════════════╬═══════════════════╦═════════════════════╣
║ Lock ║ not ║ locks the whole ║ locks the portion ║
║ mechanism ║ applicable ║ map ║ ║
╠═══════════════╬═══════════════════╩═══════════════════╬═════════════════════╣
║ Iterator ║ fail-fast ║ weakly consistent ║
╚═══════════════╩═══════════════════════════════════════╩═════════════════════╝
参考:
- java - What’s the difference between ConcurrentHashMap and Collections.synchronizedMap(Map)? - Stack Overflow
HashMap不是线程安全的示例
- HashMap线程安全问题
多线程的同时put可能导致元素的丢失
HashMap常见面试题
HashMap的底层数据结构?
HashMap的存取原理?
Java7和Java8的区别?
为啥会线程不安全?
有什么线程安全的类代替么?
默认初始化大小是多少?为啥是这么多?为啥大小都是2的幂?
HashMap的扩容方式?负载因子是多少?为什是这么多?
HashMap的主要参数都有哪些?
HashMap是怎么处理hash碰撞的?
hash的计算规则?
String intern函数
intern函数的意义:如果常量池中存在当前字符串, 就会直接返回当前字符串. 如果常量池中没有此字符串, 会将此字符串放入常量池中后, 再返回。
根据注释:s.intern() == t.intern()
的结果为true
当且仅当s.equals(t)
的结果为true
。
有几个注意事项:
1.所有的字符串常量的字符串都在字符串常量池中。
2.intern
函数的意义是如果你new String
,那么对象会被放在堆中,并且是新的对象。如果你知道会相同的字符串会用到多次,那么可以使用intern
函数,使其进入字符串常量池,减少空间的开销。
3.字符串常量池在java 7后就存在堆中。在JDK 7中,不再将永久字符串分配给Java堆的永久代,而是分配给Java堆的主要部分(称为年轻代和旧代) 。此更改将导致更多数据驻留在主Java堆中,而永久生成中的数据更少,因此可能需要调整堆大小。
4.字符串如何加入字符串常量池,在Java 7 以后,new
的对象加入的都是引用。
public static void main(String[] args) {String str2 = new String("str") + new String("01");str2.intern();String str1 = "str01";System.out.println(str2 == str1); //trueString s4 = new String("1");s4.intern();String s5 = "1";System.out.println(s4 == s5); //falseString s = new StringBuilder("aa").append("bb").toString();String s2 = new StringBuilder("cc").toString();System.out.println(s.intern() == s); //trueSystem.out.println(s2.intern() == s2); //false}
参考:
- What is Java String interning? - Stack Overflow
- Java String intern function result problem - Stack Overflow
- 深入理解String.intern - 后端 - 掘金
- 深入解析String#intern - 美团技术博客
StringBuffer 与StringBuilder 的区别
StringBuffer 是线程安全的, StringBuilder 不是.
java - Difference between StringBuilder and StringBuffer
StringBuffer 的线程安全是靠在每个函数前加上synchronized
关键字实现。
StringBuilder 是 Java 1.5 中新增的,在能力上和 StringBuffer 没有本质区别,但是它去掉了线程安全的部分,有效减小了开销,是绝大部分情况下进行字符串拼接的首选。
2.HashMap是线程不安全的、用HashMap来做缓存的话可能导致内存泄露
5。抽象类中可以有已经实现了的方法,也可以有被abstract修饰的方法(抽象方法),因为存在抽象方法,所以该类必须是抽象类。但是接口要求只能包含抽象方法。实现 抽象类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现。抽象方法可以有public、protected和default这些修饰符 。接口方法默认修饰符是public。你不可以使用其它修饰符。
6.(1)、遇到 new, getstatic, putstatic, invokestatic 这4条字节码指令。
(2)、使用 java.lang.reflect 包的方法对类进行反射调用。
(3)、初始化一个类的时候,如果发现其父类还没有进行过初始化,则先初始化其父类(注意:
如果是接口的话,则不要求初始化父类)。
(4)、当虚拟机启动时,用户需要指定一个要执行的主类(包含 main()方法的那个类),虚拟机会先初始化这个主类。
(5)、当使用JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandle 实例最后的解析结果 REF_getstatic, REF_putstatic, REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则先触发其初始化。
外加几种不会初始化的例子:
(1)、同类子类引用父类的静态字段,不会导致子类初始化。至于是否会触发子类的加载和验证,则取决于虚拟机的具体实现。
(2)、通过数组定义来引用类,也不会触发类的初始化。例如下面这个语句:
1Animal[] a = new Animao[10];
并不会触发 Animal 类的初始化。
(3)、引用一个类的常量也不会触发初始化。
7.1.方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期间是不可变的,即“编译时可知,运行不可以变”,这类目标的方法的调用称之为解析。
Java 语言中符合“编译器可知,运行期不可变”这个要求的方法,主要包括静态方法和私有方法两大类。
2.解析调用一定是个静态的过程,在编译期就完全确定,在类加载的解析阶段就将涉及的符号引用全部转变为可以确定的直接引用,不会延迟到运行期再去完成。而分派(Dispatch)调用则可能是静态的也可能是动态的。于是分派方式就有静态分派和动态分派。
8 可以把自己自定义的类加载器继承 ClassLoader,然后重写 findClass() 方法,把自己的类加载逻辑写到 findClass() 方法中去。
使用类加载器的场景:
加载特定路径的 class 文件
热部署加载 class 文件
从网络中加载一个加密的 class 文件
9.参考文章:关于集合中一些常考的重点知识点总结
参考文章:
- Java面试题及其解答(一)
Java常见面试题(持续更新)相关推荐
- 【面试题】Java常见面试题集锦
Java常见面试题集锦 面试题模块 这份面试题,包含的内容了十九了模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC. ...
- JAVA常见面试题及解答
JAVA常见面试题及解答(精华) 1)transient和volatile是java关键字吗?(瞬联) 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: class ...
- Java常见面试题 Java面试必看 (一)
本篇博客是本人收集网上Java相关的资料整理所得,仅供参考. 一.Java基础 1.JDK 和 JRE区别 JDK(Java Development Kit)是针对Java开发员的产品,是整个Java ...
- 300+ Java常见面试题总结【JavaPub版】
点赞再看,养成习惯 答案解析见文末 我是JavaPub,专注于面试.副业,技术人的成长记录. 这份[Java常见面试题总结]我想准备很久了,前面做面试官,后来自己也面了很多一线二线互联网公司,希望通过 ...
- Java常见面试题 Java面试必看 (二)
Java常见面试题 Java面试必看 (一) 十一.Spring Boot/Spring Cloud 104.什么是 spring boot? Spring Boot 是由 Pivotal 团队提供的 ...
- java常见面试题及答案 11-20(JVM)
11.JVM内存分哪几个区,每个区的作用是什么? java虚拟机主要分为以下一个区: 方法区: 1. 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法 ...
- Java常见面试题,2021年及答案汇总
Java常见面试题,2021年及答案汇总 其实,博主还整理了,更多大厂面试题,直接下载吧 下载链接:高清172份,累计 7701 页大厂面试题 PDF 1.什么是ThreadPoolExecutor? ...
- Java常见面试题及答案汇总
面临金三银四黄金跳槽季,不光是很多在职人员跃跃欲试,也有很多大学生积极地加入到应聘行列.作为技术出身的我们,找工作的一大前提就是技术是否能过关.而对于Java程序员来说,至少是两关的面试,这首个关卡就 ...
- 2018常见的java面试题_2018新版Java常见面试题
千锋西安Java编程培训班的老师总结了2018新版Java常见面试题,一起来看! 1.1.java基础 ●面向对象的特征:继承.封装.多态 继承[构造器.protected关键字.向上转型Java实现 ...
- 总结Java常见面试题和答案
转载自 总结Java常见面试题和答案 int和Integer有什么区别? 答:int是java的原始数据类型,Integer是java为int提供的封装类,java为每个原始数据类型都提供了封装 ...
最新文章
- mysql-5.7.21-winx64_MySql-5.7.17 -winx64的安装配置
- 图像识别工程师 VS The application has requested the Runtime to terminate it in an unusual way.
- svn修改提交路径_使用SVN钩子强制提交日志和限制提交文件类型
- 《从0到1学习Flink》—— Flink 写入数据到 ElasticSearch
- JavaFX 2.0和Scala,像牛奶和饼干
- Android中简单的日期格式化
- 前端后端接口那些事吐槽
- springsecurity中session失效后怎样处理_结合Spring Security进行web应用会话安全管理
- wifi情况下使用fiddler_钢筋网片在什么情况下使用?
- 常见linux服务器系统异常问题
- Linux经常使用到的操作
- 人行横道——步行管理(交通运行管理)
- redis---sds(简单动态字符串)详解
- 实例讲解统计学基础知识(5):假设检验
- 大屏幕显示屏 html,在大屏幕上显示墙的三种解决方案
- java unbox_Java中Auto Box/Unbox容易踩到的“坑”,Integer
- iPhone6今发售被指已变味 加价倒手成黄牛圈钱工具
- 关于显式类型转换以及隐式类型转换
- Java基础 项目实例五 简易聊天系统
- ubuntu多屏协同,在电脑上操作手机
热门文章
- Excel VBA两两个体距离矩阵转化为数据库格式
- tomcat源码_从源码角度讲Tomcat在SpringBoot 中是如何启动的?
- thymeleaf加载不了js引用_web前端教程之js中的模块化一
- 在线作图丨数据降维方法⑥——消除趋势对应分析(Detrended correspondence analysis, DCA)
- 面对万亿级测序市场,纳米孔测序技术何去何从?
- Annual Review of Microbiology : 珊瑚微生物组:关乎珊瑚生态系统的健康与恢复
- 你想要的宏基因组-微生物组知识全在这(190101)
- android studio ndk 书籍,NDK 在AndroidStudio3.2.1版本集成方法(ndk-build方式)
- R语言使用DALEX包的model_profile函数对caret包生成的多个算法模型的离散变量进行分析、使用偏依赖图(Partial Dependence Plots)解释某个离散特征和目标y的关系
- R语言ggplot2可视化:为可视化图像添加多行标题(multi line title)并将多行标题居中对齐(center align)