面试
- 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() {
}
@Override
public String toString() {
return String.valueOf(this.value);
}
}
<a name="MHgi1"></a>
### 认识拆箱和装箱
```java
package 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);// false
Integer 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);// 100
Integer y = new Integer("123");// 123
System.out.println(y);
}
}