企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 1. String,StringBuffer,StringBuilder,以及对String不变性的理解 - String、StringBuffer、StringBuilder - 都是 final 类,都不允许被继承 - String 长度是不可变的,StringBuffer、StringBuilder 长度是可变的 - StringBuffer 是线程安全的,StringBuilder 不是线程安全的,但它们两个中的所有方法都是相同的,StringBuffer 在 StringBuilder 的方法之上添加了 synchronized 修饰,保证线程安全 - StringBuilder 比 StringBuffer 拥有更好的性能 - 如果一个 String 类型的字符串,在编译时就可以确定是一个字符串常量,则编译完成之后,字符串会自动拼接成一个常量。此时 String 的速度比 StringBuffer 和 StringBuilder 的性能好的多 - String 不变性的理解 - String 类是被 final 进行修饰的,不能被继承 - 在用 + 号链接字符串的时候会创建新的字符串 - String s = new String("Hello world"); 可能创建两个对象也可能创建一个对象。如果静态区中有 “Hello world” 字符串常量对象的话,则仅仅在堆中创建一个对象。如果静态区中没有 “Hello world” 对象,则堆上和静态区中都需要创建对象。 - 在 Java 中, 通过使用 "+" 符号来串联字符串的时候,,实际上底层会转成通过 StringBuilder 实例的 append() 方法来实现。 ## 2. String有重写Object的hashcode和toString吗?如果重写equals不重写hashcode会出现什么问题? - String 有重写 Object 的 hashcode 和 toString吗? - String 重写了 Object 类的 hashcode 和 toString 方法。 - 当 equals 方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相对等的两个对象必须有相同的 hashCode - object1.euqal(object2) 时为 true, object1.hashCode() == object2.hashCode() 为 true - object1.hashCode() == object2.hashCode() 为 false 时,object1.euqal(object2) 必定为 false - object1.hashCode() == object2.hashCode() 为 true时,但 object1.euqal(object2) 不一定定为 true - 重写 equals 不重写 hashcode 会出现什么问题 - 在存储散列集合时(如 Set 类),如果原对象.equals(新对象),但没有对 hashCode 重写,即两个对象拥有不同的 hashCode,则在集合中将会存储两个值相同的对象,从而导致混淆。因此在重写 equals 方法时,必须重写 hashCode 方法。 ## 3. 如果你定义一个类,包括学号,姓名,分数,如何把这个对象作为key?要重写equals和hashcode吗 - 需要重写 equals 方法和 hashcode,必须保证对象的属性改变时,其 hashcode 不能改变。 ## 4. 字面量 在编程语言中,字面量(literal)指的是在源代码中直接表示的一个固定的值。 八进制是用在整数字面量之前添加 “0” 来表示的。 十六进制用在整数字面量之前添加 “0x” 或者 “0X” 来表示的 Java 7 中新增了二进制:用在整数字面量之前添加 “0b” 或者 “0B” 来表示的。 **在数值字面量中使用下划线** 在 Java7 中,数值字面量,不管是整数还是浮点数都允许在数字之间插入任意多个下划线。并且不会对数值产生影响,目的是方便阅读,规则只能在数字之间使用。 ```java public class BinaryIntegralLiteral { public static void main(String[] args) { System.out.println(0b010101); System.out.println(0B010101); System.out.println(0x15A); System.out.println(0X15A); System.out.println(077); System.out.println(5_000); /** * 输出结果 * 21 * 21 * 346 * 346 * 63 * 5000 */ } } ```