有趣有坑的面试题

93 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情

权限修饰符

class Target{
punlic String name="hello"
}

问:哪个类可以直接修改name属性?

从题目可以看到,name是public修饰,是不是所有类都能访问?不是的

怎么访问name属性?需要target类,但是target类不是public修饰,而是没写,表示default。

所有target类只有当前包test才能访问

所有结果是:在test下任意包可以直接访问修改

开发中最常用的是 private public

权限修饰符的名称当前类同一个包下面其他类不同包下面子类不同包下面的其他类
public可以可以可以可以
protected可以可以可以不可以的
不写(默认)可以可以不可以不可以
private可以不可以不可以不可以

在几进制下 123*234=28560是成立的?

考察进制底层逻辑:第一:尾数3*4=12,12怎么变成0?需要进位:可能是12进制,满12进位,可能是六进制,两个六(12)进位

假如:6进制:结果不可能有八(6以上的值)所有结果应该是12进制

如何在不产生更多变量情况下,交换两个元素值?

public static void main(String[] args){
    int a=10;
    int b=20;
    //交换ab
   // 可以有变量:
    // int c=a;a=b;b=c;
    //没有变量,但是可能越界
    a=a+b;//30  a=30;b-20   和存入ab不变
    b=a-b;//30-20  a=30,b=20原来a存入b
    a=a-b;//    a=10b=20            原来b存入a
    // 最好位运算
    a = a ^ b;//00001010 ^ 00010100=00011110
    b = a ^ b;//00011110 ^ 00010100=00001010
    a = a ^ b;//00011110 ^ 00001010=00010100

    System.out.println(a);
    System.out.println(b);
 
}

除0

public class Test{
    public static void main(String[] arge){
         System.out.println(5.0/0.0);
         System.out.println(5.0/0);
         System.out.println(5/0.0);
         System.out.println(5/0);
    }
}

当两个数都是整数时候,0不能作为除数:所有前三个正常输出,第四个运行时异常

前三输出:Infinity(无穷)

异常:运行时异常,编译异常(程序员可以处理)

错误:一般是内存问题,只能重启查找问题一般无法处理

字符串问题

public class Test{
    public static void main(String[] r){
        String a="zzt";
        String b="zzt";
        String c=a+b;
        String d="zzt"+"zzt";
        System.out.println(c==d);//false
        System.out.println(c.equals(d));//true
           
    }
}

a+b 底层是StringBuilder拼接,先放a在b,然后tostring 两个引用值相加,在栈里面

zzt+zzt 是明文,直接拼接在一起 两个字面量相加,结果在常量池

直接赋值字符串 创建的字符串对象,只会在常量池中 创建对象的时候,JVM会先去常量池中通过equals(key)方法,判断是否有相同的对象

如果有,则直接返回该对象在常量池中的引用; 如果没有,则会在常量池中创建一个新对象,再返回引用

new String(“abc”) 它保证字符串常量池和堆中都有这个对象,没有就创建,最后返回堆内存中的对象引用。