• 干货 | 每日十道Java基础面试题


    每日坚持学习,即便不多,积少成多便可。

    1、String是否可变?真的是不可变的吗?

    一般可以回答是不可变的,因为每个字符串都有自己的内存地址。

    String不可变,但是引用可变。

    1. String str = "Hello";
    2. str = str + " World";
    3. System.out.println("str=" + str);

    结果打印:Hello World

    解析:Hello字符串并没有变,只是str的引用地址从Hello 变成了 Hello World 而已。在第二行的时候,计算机给“Hello Word”开辟了个内容地址,并把str的地址引用指向了它。

    所以说它可变,其实是指引用可变。

    2、通过反射其实是可以修改所谓的"不可变"对象

    1. // 创建字符串"Hello World", 并赋给引用s
    2. String s = "Hello World";
    3. System.out.println("s = " + s);// Hello World
    4. // 获取String类中的value字段
    5. Field valueFieldOfString = String.class.getDeclaredField("value");
    6. // 改变value属性的访问权限
    7. valueFieldOfString.setAccessible(true);
    8. // 获取s对象上的value属性的值
    9. char[] value = (char[]) valueFieldOfString.get(s);
    10. // 改变value所引用的数组中的第5个字符
    11. value[5] = '_';
    12. System.out.println("s = " + s); // Hello_World
    结果:
    s = Hello World s = Hello_World
    解析:
    用反射可以访问私有成员, 然后反射出 String 对象中的 value 属性, 进而改变通过获得的 value
    用改变数组的结构。但是一般我们不会这么做,这里只是简单提一下有这个东西。

    3、在使用 HashMap 的时候,用 String key 有什么好处?

    HashMap 内部实现是通过 key hashcode 来确定 value 的存储位置,因为字符串是不可变的,
    所以当创建字符串时,它的 hashcode 被缓存下来,不需要再次计算,所以相比于其他对象更
    快。

    4、JDK 中常用的包有哪些?

    java.lang :这个是系统的基础类;
    java.io :这里面是所有输入输出有关的类,比如文件操作等;
    java.nio :为了完善 io 包中的功能,提高 io 包中性能而写的一个新包;
    java.net :这里面是与网络有关的类;
    java.util :这个是系统辅助类,特别是集合类;
    java.sql :这个是数据库操作的类。
    5、 如何将字符串反转?
    使用 StringBuilder 或者 stringBuffffer reverse() 方法。

    6、数组有没有 length()方法?String 有没有 length()方法?

    数组没有 length() 方法 ,有 length 的属性。 String length() 方法。 JavaScript 中,获得字符串的
    长度是通过 length 属性得到的,这一点容易和 Java 混淆

    7、Integer a= 127 Integer b = 127相等吗?

    对于对象引用类型: == 比较的是对象的内存地址。
    对于基本数据类型: == 比较的是值。
    如果整型字面量的值在 - 128 127 之间,那么自动装箱时不会 new 新的 Integer 对象,而是直接引用常量池中的Integer对象,超过范围 a1==b1 的结果是 false
    1. public static void main(String[] args) {
    2. Integer a = new Integer(3);
    3. Integer b = 3; // 将3自动装箱成Integer类型
    4. int c = 3;
    5. System.out.println(a == b); // false 两个引用没有引用同一对象
    6. System.out.println(a == c); // true a自动拆箱成int类型再和c比较
    7. System.out.println(b == c); // true Integer a1 = 128; Integer b1 = 128;
    8. System.out.println(a1 == b1); // false Integer a2 = 127; Integer b2 = 127;
    9. System.out.println(a2 == b2); // true
    10. }

    8、String str = new String("hello")创建了几个对象?

    两个!new算一个,"hello"算一个

    9、Java会存在内存泄漏吗?什么时候?

    会、当有两个整数,第一个为足够大的整数、第二个为足够大的负数时,第一个减去第二个,结果会溢位,导致错误。

    10、是否可以继承String类?

    不可以,因为String类是用final声明的

  • 相关阅读:
    免费的ssh工具
    最直观的就是通过 performance 与 lighthouse 来评判
    【设计模式】【创建型5-2】【工厂方法模式】
    39 _ 回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想
    Vue常见问题
    GB28181学习(十六)——基于jrtplib实现tcp被动和主动收流
    CPU的功能和基本结构
    基于PCIe的NVMe协议在FPGA中实现方法
    CentOS 7防火墙配置
    SSM整合(四)
  • 原文地址:https://blog.csdn.net/weixin_40796213/article/details/126087158