面试

  • String为什么不可变?
    • 双引号里边的字符串对象不可变,不是引用不可变
    • 我看过源代码,String类中有一个byte 数组,这个byte数组采用final修饰,因为数组一旦创建不可变,并且被final修饰的引用一旦指向某个引用后,不可再指向其他引用,所以String不可变!
  • StringBuilder/StringBuffer为什么是可变的呢?
    • StringBuilder/StringBuffer内部是byte数组,这个数组没有被final修饰,StringBuilder/StringBuffer初始化的容量是16,当存满之后会扩容,底层调用了数组拷贝的方法,Systemctl.arraycopy()…这样扩容的,所以StringBuilder/StringBuffer适用于字符串的频繁拼接

      为什么要使用8种包装类?

      ```java package com.packclass;

/**

  • 8种基本类型又对应准备了8种包装类型,8种包装类型属于引用数据类型,父类是object。
  • 为什么提供 8种包装类的意义?
  • 函数有时候参数需要传递对象时,8种基本类型不够用。 */ public class Demo01 { public static void main(String[] args) {
    1. Demo02 demo02 = new Demo02(100);
    2. doSomething(demo02);
    } public static void doSomething(Object object){
    1. System.out.println(object.toString());//100
    }

}

// Demo02 package com.packclass;

public class Demo02 { int value;

  1. public Demo02(int value) {
  2. this.value = value;
  3. }
  4. public Demo02() {
  5. }
  6. @Override
  7. public String toString() {
  8. return String.valueOf(this.value);
  9. }

}

  1. <a name="MHgi1"></a>
  2. ### 认识拆箱和装箱
  3. ```java
  4. package com.packclass;
  5. /*
  6. 8 种基本类型对应的包装类型
  7. 基本数据类型 包装类型
  8. byte java.lang.Byte(父类Number)
  9. short java.lang.Short(父类Number)
  10. int java.lang.Integer(父类Number)
  11. long java.lang.Long(父类Number)
  12. float java.lang.Float(父类Number)
  13. double java.lang.Double(父类Number)
  14. boolean java.lang.Boolean(父类Object)
  15. char java.lang.character(父类Object)
  16. Number是一个抽象类,无法实例化
  17. Number中有一些拆箱方法
  18. */
  19. public class Demo03 {
  20. public static void main(String[] args) {
  21. // 基本数据类型转化为引用数据类型
  22. Integer integer = new Integer(10);
  23. // 引用数据类型转化为基本数据类型
  24. float i = integer.floatValue();
  25. System.out.println(i);
  26. }
  27. }

自动拆箱、自动装箱

  1. package com.packclass;
  2. public class Demo06 {
  3. public static void main(String[] args) {
  4. // 自动装箱
  5. Integer x = 900;
  6. // 自动拆箱
  7. int y = x;
  8. System.out.println(y);
  9. // + 两边要求是基本数据类型,x 是包装类不是基本数据类型,这里会进行自动拆箱,将 x 转换为基本数据类型
  10. System.out.println(x + 1);
  11. // 分析一下程序是为什么?
  12. /*
  13. java 中为了提高执行效率,将-128 - 127之间所有的包装对象提前创建好,
  14. 放到了一个方法区的整数型常量池当中,目的是这个区间的数据不需要再new了,
  15. 直接从整数型常量池取出来
  16. == 比较的是两个对象的内存地址是否相同
  17. 类加载的时候会加载整数型常量池 256个对象
  18. */
  19. Integer a = 128;
  20. Integer b = 128;
  21. System.out.println(a == b);// false
  22. Integer m = 127;
  23. Integer n = 127;
  24. System.out.println(m == n);// true
  25. }
  26. }

构造方法

  1. package com.packclass;
  2. /*
  3. 关于Integer的两个构造方法
  4. Integer(int)
  5. Integer(string)
  6. */
  7. public class Demo04 {
  8. public static void main(String[] args) {
  9. Integer i = new Integer(100);
  10. System.out.println(i);// 100
  11. Integer y = new Integer("123");// 123
  12. System.out.println(y);
  13. }
  14. }