【中大厂面试题】小鹏 后端 最新面试题

目录

计算机基础

ARM有了解嘛?

二进制怎么转16机制?

byte类型的-1怎么表示?

Java

两个方法都被synchronized修饰,其中一个调用另一个可以成功嘛?synchronized修饰方法锁的那一部分?

静态内部类和匿名内部类有什么区别吗?

匿名内部内可以使用外部类的引用吗?静态的呢?

HashMap和HashTable区别?

讲一下ConcurrentHashMap?

JVM

类加载过程?

双亲委派机制为什么叫双亲?有什么好处?

class文件和字节码文件的区别?

弱引用和软引用的区别?

网络

计网分层结构说一下?

TCP为什么要三次握手?

算法

反转链表


计算机基础

ARM有了解嘛?

了解不过,大概知道是一个处理器,嵌入式领域用的多。

二进制怎么转16机制?

可以采用分组转换法。

分组转换法基于二进制和十六进制之间的位权关系。因为2^4=16,这意味着 4 位二进制数能够表示的状态数刚好与十六进制的一位所能表示的状态数相同。所以可以将二进制数按每 4 位一组进行划分,每一组都能唯一地对应一个十六进制数字。

下面我给出了二进制的数,我们将它转换为十六进制,例如:0101101,我们将这个数按4个一组来划分,变成 0010 1101(这里本来是010 1101前面不够4位我们就凑一个0),可以得到 0010 =2、 1101=D 所以转换成十六进制就是2D。

byte类型的-1怎么表示?

byte类型是有符号的 8 位整数,取值范围是-128127-1byte类型中的二进制表示是补码形式,正数的补码与原码相同,负数的补码是在反码的基础上加 1,这是因为计算机中采用补码来进行减法运算,可以将减法转换为加法,方便硬件实现,计算过程如下:

  • 先写出1的原码:00000001

  • 然后得到-1的原码:10000001

  • 接着求-1的反码:11111110

  • 最后求-1的补码:11111111

所以,在 Java 的byte类型中,-1用二进制补码表示为11111111。当进行运算或存储时,计算机使用这个补码来处理-1相关的操作。例如,在进行加法运算时,-1 + 1的计算过程如下:

  • - 1的补码是111111111的补码是00000001

  • 相加得到:11111111 + 00000001 = 100000000(9 位,超出byte范围)。

  • 由于byte类型是 8 位,会发生截断,得到00000000,也就是0,这符合数学运算结果。

Java

两个方法都被synchronized修饰,其中一个调用另一个可以成功嘛?synchronized修饰方法锁的那一部分?

如果两个方法都被synchronized修饰,一个方法内部调用另一个方法是可以成功的。这是因为synchronized方法默认是对当前对象(this)加锁。当一个线程进入了一个synchronized方法,它已经获得了该对象的锁,在这个方法内部调用另一个synchronized方法时,由于是同一个对象的锁,所以线程可以继续执行被调用的synchronized方法,不会出现锁竞争导致无法调用的情况。

例如下面的代码,method1调用method2时,因为它们都是同一个对象examplesynchronized方法,所以可以正常执行。

public class SynchronizedExample {
    public synchronized void method1() {
        System.out.println("Method 1 started");
        method2();
        System.out.println("Method 1 ended");
    }
    public synchronized void method2() {
        System.out.println("Method 2 is running");
    }
    public static void main(String[] args) {
        SynchronizedExample example = new SynchronizedExample();
        example.method1();
    }
}

synchronized 修饰方法锁的对象:

  • 对于非静态方法:当synchronized修饰一个非静态方法时,锁的是当前对象(this)。这意味着同一时刻,对于同一个对象实例,只有一个线程能够执行这个对象的synchronized非静态方法。不同的对象实例之间的synchronized非静态方法可以被不同的线程同时执行,因为它们的锁对象(this)是不同的。

  • 对于静态方法:当synchronized修饰一个静态方法时,锁的是这个类的Class对象。因为静态方法是属于类的,而不是属于某个具体的对象实例。所以同一时刻,对于一个类的所有实例,只有一个线程能够执行这个类的synchronized静态方法。例如,下面的例子,staticMethod1staticMethod2都是静态的synchronized方法,它们共享同一个类的Class对象作为锁。所以当thread1thread2同时启动时,其中一个方法会先获得类的Class对象锁,另一个方法需要等待锁释放后才能执行。

public class SynchronizedStaticExample {
    public static synchronized void staticMethod1() {
        System.out.println("Static Method 1 started");
    }
    public static synchronized void staticMethod2() {
        System.out.println("Static Method 2 started");
    }
    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            SynchronizedStaticExample.staticMethod1();
        });
        Thread thread2 = new Thread(() -> {
            SynchronizedStaticExample.staticMethod2();
        });
        thread1.start();
        thread2.start();
    }
}

静态内部类和匿名内部类有什么区别吗?

静态内部类是定义在另一个类内部的类,并且使用static关键字修饰。它就像是类的一个静态成员,不依赖于外部类的实例,就像下面的例子中,StaticInnerClass可以直接访问OuterClassouterStaticVar静态变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扫地僧009

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值