面试
- String为什么不可变?
- 双引号里边的字符串对象不可变,不是引用不可变
- 我看过源代码,String类中有一个byte 数组,这个byte数组采用final修饰,因为数组一旦创建不可变,并且被final修饰的引用一旦指向某个引用后,不可再指向其他引用,所以String不可变!
- StringBuilder/StringBuffer为什么是可变的呢?
/**
- 8种基本类型又对应准备了8种包装类型,8种包装类型属于引用数据类型,父类是object。
- 为什么提供 8种包装类的意义?
- 函数有时候参数需要传递对象时,8种基本类型不够用。
*/
public class Demo01 {
public static void main(String[] args) {
} public static void doSomething(Object object){Demo02 demo02 = new Demo02(100);doSomething(demo02);
}System.out.println(object.toString());//100
}
// Demo02 package com.packclass;
public class Demo02 { int value;
public Demo02(int value) {this.value = value;}public Demo02() {}@Overridepublic String toString() {return String.valueOf(this.value);}
}
<a name="MHgi1"></a>### 认识拆箱和装箱```javapackage com.packclass;/*8 种基本类型对应的包装类型基本数据类型 包装类型byte java.lang.Byte(父类Number)short java.lang.Short(父类Number)int java.lang.Integer(父类Number)long java.lang.Long(父类Number)float java.lang.Float(父类Number)double java.lang.Double(父类Number)boolean java.lang.Boolean(父类Object)char java.lang.character(父类Object)Number是一个抽象类,无法实例化Number中有一些拆箱方法*/public class Demo03 {public static void main(String[] args) {// 基本数据类型转化为引用数据类型Integer integer = new Integer(10);// 引用数据类型转化为基本数据类型float i = integer.floatValue();System.out.println(i);}}
自动拆箱、自动装箱
package com.packclass;public class Demo06 {public static void main(String[] args) {// 自动装箱Integer x = 900;// 自动拆箱int y = x;System.out.println(y);// + 两边要求是基本数据类型,x 是包装类不是基本数据类型,这里会进行自动拆箱,将 x 转换为基本数据类型System.out.println(x + 1);// 分析一下程序是为什么?/*java 中为了提高执行效率,将-128 - 127之间所有的包装对象提前创建好,放到了一个方法区的整数型常量池当中,目的是这个区间的数据不需要再new了,直接从整数型常量池取出来== 比较的是两个对象的内存地址是否相同类加载的时候会加载整数型常量池 256个对象*/Integer a = 128;Integer b = 128;System.out.println(a == b);// falseInteger m = 127;Integer n = 127;System.out.println(m == n);// true}}
构造方法
package com.packclass;/*关于Integer的两个构造方法Integer(int)Integer(string)*/public class Demo04 {public static void main(String[] args) {Integer i = new Integer(100);System.out.println(i);// 100Integer y = new Integer("123");// 123System.out.println(y);}}
