JAVA面经整理(2024.6)(三)

1.字节流和字符流的区别?

1.数据单位: 字节流操作的是单个字节,而字符流操作的是单个字符。

2.编码方式: 字节流以字节为单位进行读写,不涉及字符编码转换。而字符流会对数据进行编码和解码,可以用来处理不同字符集的数据。

3.应用场景: 字节流常用于处理图像、音频、视频等二进制数据。而字符流常用于处理文本数据,如读写文本文件、网页内容等。

4.包装类: Java中提供了InputStream、OutputStream、Reader、Writer等抽象基类,这些类可以被具体的字节流或字符流类所实现。此外,Java还提供了缓冲流、转换流等包装类,用于增强流的性能和处理能力。

2.jvm构成,介绍一下各部分。

线程私有:

程序计数器、栈。

程序计数器:

用来存储字节码文件运行到哪了。

栈:

局部变量表:以槽的形式存放函数入参、本身、局部变量。

操作数栈:用于计算用的栈,计算过程类似于波兰表达式。

帧数据:用于存放异常表、方法出口地址、动态连接。

线程共有:

堆、本地方法栈、方法区。

堆:

存放生成的对象和Class对象、JDK8及其以后的字符串常量池。

本地方法栈:

调用本地方法用的栈。

方法区:

这是一个逻辑概念。因为方法区包含instanceKlass(直接内存的元空间),运行时常量池(JDK7之前在堆的永久代、JDK7及以后在直接内存的元空间)、静态变量(JDK6及之前的版本在堆的永久代中、JDK7及之后在堆的Class中)、字符串常量池(JDK7之前在堆的永久代中、JDK7在直接内存的元空间、JDK8及以后在堆中)

3.toString()默认打印什么?

打印getClass().getName() + "@" + Integer.toHexString(hashCode());

4.讲下synchronized

Synchronized是java中的一个关键字,是一种锁,往往加在方法、类Class和代码块上,是一种非公平锁,不需要显式加锁与解锁。

synchronized锁涉及到一个锁升级的过程。

首先需要知道JAVA对象(非数组)在堆中的结构为object header、具体数据和对齐填充。

object header又分为两个部分,mark word、Klass pointer。

假设虚拟机为64位,markword就是64位,记录了hashcode、age等等。最后三位代表锁的状态。

现在假设是无锁状态后三位为001,第一个线程需要获得这个锁,那么无锁升级成偏向锁,最后三位变为101,markword记录一下thread的ID。

此时假设偏向锁期间有线程来争抢该锁,首先考虑:

偏向锁ID是否为该线程ID,如果是,代表为重入锁,可以加锁。

如果不是该线程ID,代表是其他的线程来争抢锁,先会尝试CAS替换偏向锁ID,成功的话就偏向这个线程。否则开始进行偏向锁撤销操作,等待一个全局安全点,暂停持有该偏向锁的线程,判断该线程是否存活,此时分两种情况:

如果是处于未存活或者处于存活状态但是同步代码块已经执行完成这两种情况的话,判断有无开启重偏向,如果开启,CAS操作将偏向锁ID修改为第二个线程的ID,否则偏向锁升级成轻量级锁,最后两位改成00。

如果是处于存活状态但是同步代码块尚未执行完成直接升级成轻量级锁,最后两位改成00。

最后唤醒暂停的线程。

在轻量级锁的情况下,假设又有线程来争抢锁,会进行自旋操作,假设自旋过程中抢到了锁就很好,否则升级成重量级锁,最后两位改成10。

5.多态是什么?

多态指的是父类引用指向子类的对象。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值