恒生电子面经准备
文章目录
- 1.jdk,jre,jvm的区别是什么?
- 2.java中finally的重要性?使用的场景有哪些?有没有总结性的说法?什么类型的东西放到finally?
- 3.final的作用
- 4.==和equals的区别?
- 5.为什么重写equals方法要同时重写hashcode方法?
- 6.怎么把String类型转换成数字类型
- 7.Java里面的显示转换和隐式转换,简述一下
- 8.java中的顶级父类
- 9.Java的所有基本数据类型,有几种?
- 10.平时有做单元测试吗?用的什么工具类,测试类怎么写的?@Test注解是什么工具类提供的?
- 11.String底层是什么数据类型
- 12.String类型为什么不可变
- 13.String,StringBuilder,StringBuffer区别?为什么StringBuffer线程安全
- 14.Java怎么打印对象,怎么打印属性值
- 15.Java里面如何遍历list
- 16.重载和重写的区别?
- 17.线程池有哪些参数?有哪些拒绝策略?除了抛出异常还有什么策略?
- 18.JVM有做过分析吗?有没有在线处理过异常?
- 19.java集合的使用,简述一下
- 20.SpringBoot了解多少
- 21.JAVA锁了解吗?了解AQS吗?
- 22.synchronized底层怎么实现的?分布式锁了解吗?
- 23.那锁住的对象怎么和monitor锁监视器关联上的呢?
- 24.知道synchronized锁升级的过程吗?
- 25.java内存结构、类加载过程,编译原理了解吗?
- 26.JAVA反射了解吗?举几个java反射的应用案例
- 27.java中字节流和字符流的区别是啥?
1.jdk,jre,jvm的区别是什么?
jdk包含jre,jre包含jvm。jdk包含了编译器调试器等开发工具
jre是java运行时环境,可以运行已经编译好的程序
jvm是虚拟机负责把字节码编译成机器指令执行
2.java中finally的重要性?使用的场景有哪些?有没有总结性的说法?什么类型的东西放到finally?
finally保证关键的代码一定会被执行,无论try块是否抛出异常,或者执行了return
常见的使用场景是资源释放,比如关闭文件流,关闭数据库连接,锁释放等等。可以总结为:带有收尾性的都应该放在finally中
3.final的作用
是修饰符,用来保证不可变性,修饰的类不可继承,修饰的方法不可重写,修饰的变量只能赋值一次
4.==和equals的区别?
==比较的是内存地址指向是否相同。equals比较的是两个对象的具体值是否相同
5.为什么重写equals方法要同时重写hashcode方法?
hashcode方法用于定位元素存放的数组下标,可能冲突,所有需要equals判断元素值是否重复,重复就丢弃,只重写equals不重写hashcode可能出现元素重复
6.怎么把String类型转换成数字类型
Integer.parseInt()
7.Java里面的显示转换和隐式转换,简述一下
隐式转换式小范围提升为大范围,如int转换为double。显示转换时大范围转化为小范围(type)实现,可能出现精度丢失
8.java中的顶级父类
Object方法‘
9.Java的所有基本数据类型,有几种?
八种,byte.short,int long float double char boolean
10.平时有做单元测试吗?用的什么工具类,测试类怎么写的?@Test注解是什么工具类提供的?
junit做单元测试,@Test注解是junit注解提供的,用来标记测试方法
11.String底层是什么数据类型
jdk8底层采用的是char类型数组,jdk9采用的是byte数组
12.String类型为什么不可变
final保证类不被继承,修饰char数组保证引用不发生改变,该类没有对外提供get和set方法,保证不被修改
13.String,StringBuilder,StringBuffer区别?为什么StringBuffer线程安全
String:不可变,安全,效率低
StringBuilder:可变,单线程高效,线程不安全
StringBuffer:可变,多线程安全,采用synchronized修饰
14.Java怎么打印对象,怎么打印属性值
类重写了toString方法,new构造对象,点出来属性值
15.Java里面如何遍历list
传统for循环,增强for循环,迭代器,lambda表达式
16.重载和重写的区别?
方法 重载(Overload) 是指同一个类中方法名相同,但参数列表不同,可以是参数类型或数量不同,它属于 编译时期多态。而方法 重写(Override) 是指子类继承父类时,方法名和参数列表相同,通过修改方法实现来改变行为,它属于 运行时期多态。简单记忆:重载同名不同参,重写子类改父类。
17.线程池有哪些参数?有哪些拒绝策略?除了抛出异常还有什么策略?
public ThreadPoolExecutor(
int corePoolSize, // 核心线程数
int maximumPoolSize, // 最大线程数
long keepAliveTime, // 救急线程存活时间
TimeUnit unit, // 存活时间单位
BlockingQueue workQueue, // 阻塞队列
ThreadFactory threadFactory, // 线程工厂
RejectedExecutionHandler handler // 拒绝策略
)
线程池的拒绝策略有四种:抛出异常,丢弃新来的任务,丢失最早的任务,交给主线程执行
18.JVM有做过分析吗?有没有在线处理过异常?
线上CPU飙高,top命令查看哪个进程,ps查看进程对应线程信息,使用jstack查看进程的哪些线程出现了问题,最终定位问题
19.java集合的使用,简述一下
在java中,常用的集合主要有三类,List,Set,Map.List主要是有序可重复,适合按照顺序存储数据。set存放不重复无序数据,适合用来去重。Map存放键值对数据
20.SpringBoot了解多少
快速搭建web应用和微服务项目,核心在于他的自动配置,开箱即用,减少了很多手动配置
21.JAVA锁了解吗?了解AQS吗?
主要有悲观锁和乐观锁。悲观锁有synchronized和reentrantlock,乐观锁使用版本号法,其中reentrantlock底层是基于AQS实现的,AQS用一个state记录锁状态(0表示无锁,1表示有锁),没有获取锁成功用FIFO队列管理等待线程
22.synchronized底层怎么实现的?分布式锁了解吗?
sychronized锁会让锁住的对象关联一个锁监视器,当一个线程获取到锁的时候,其他线程会进入到阻塞队列中,如果调用了wait方法会进入到等待队列中。
分布式锁可以采用redis实现,比如比较常用的redission分布式锁
23.那锁住的对象怎么和monitor锁监视器关联上的呢?
首先要分析这个对象的内存结构,分为对象头,实例数据,填充(hotspot虚拟机规定),对象头包括markword和klassword。这里主要通过markword实现关联,markwork重量级锁有一个monitor指针可以实现关联
24.知道synchronized锁升级的过程吗?
偏向锁:单线程反复加锁解锁
轻量级锁:多个线程竞争不激烈
重量级锁:多线程竞争激烈
原因:阻塞/唤醒涉及到操作系统用户态和内核态的切换,开销很大。这里的开销指的是上下文的切换,保存程序计数器,寄存器,堆栈指针等等
25.java内存结构、类加载过程,编译原理了解吗?
JVM内存结构分为线程私有和线程共享两部分
线程私有:虚拟机栈(存放方法调用的栈帧),本地方法栈(给native方法服务),程序计数器(记录当前线程执行到的字节码行号)
线程共享:堆,存放对象的示例数据,是垃圾回收的主要区域
方法区(jdk8叫元空间):存放类的结构信息,方法,静态变量等
运行时常量池:存放字面量和符号引用
2.类加载过程:
类的加载由类加载器完成,遵循双亲委派模型。
2.1加载:读取.class文件,生成Class对象
2.2验证:确保字节码合法,安全
2.3准备:为静态变量分配内存并赋初值
2.4解析:把常量池的符号引用解析为直接引用
2.5初始化:执行类的clinit方法,真的赋值和静态代码块
3.编译原理:
首先是源代码通过javac编译成字节码。接着字节码交给解释器翻译为机器指令,还有JIT编译为本地机器码,提高运行效率
26.JAVA反射了解吗?举几个java反射的应用案例
反射指的是运行时动态获取类的信息并操作类成员。比如说Spring底层通过反射创建对象,JSON序列化和反序列化,jdbc通过反射加载驱动,AOP通过动态代理加反射实现
27.java中字节流和字符流的区别是啥?
字节流按字节处理,适合二进制文件,比如图片,字符流按字符处理,适合文本文件。字节流基类是 InputStream/OutputStream,字符流基类是 Reader/Writer。”