String类的内存解析
String str1 = "AA"
String str2 = "AA"
String str3 = new String("AA")
System.out.println(str1 == str2) //true
System.out.println(str1.equals(str2)) //true
System.out.println(str1 == str3) //false
System.out.println(str1.equals(str3)) //true
str1、str2这种直接赋值方式是变量名(地址)存在于栈空间当中,但是它的值是在方法区的字符串常量池当中
str3这种属于创建了对象,str3这个变量名(地址)存在于栈空间,对象是在堆空间当中,这个对象存储值的地方也是在字符串常量池当中
总结:
栈空间当中有存放变量名(地址)
堆空间当中存放对象
方法区当中存放字符串值(常量)
Person p1 = new Person("AA",12);
Person p2 = new Person("AA",12);
这个创建的原理是:
p1和p2变量都在栈空间创建,它们的对象都在堆空间中创建,由于age是int类型,所以直接在对象内部赋值,而name是String类型,这是引用数据类型,所以是在字符串常量池中取值,而这个“AA"的地址是0x1111,所以name存储的就是0x1111
包装类
八大基本数据类型对于八大包装类,需要掌握String、包装类、基本数据类型之间的转化
import org.junit.Test;
public class TestWrapper {
// 基本数据类型与包装类之间的转换
@Test
public void test1() {
// 基本数据类型转包装类
int i = 10;
System.out.println(i);
boolean b = false;
Integer i1 = new Integer(i);
System.out.println(i1.toString());
Float f = new Float(12.3F);
System.out.println(f);
Boolean b1 = new Boolean(true);
System.out.println(b1);
// 包装类转基本数据类型
int i2 = i1.intValue();
System.out.println(i2);
float f1 = f.floatValue();
System.out.println(f1);
// JDK5.0以后,自动装箱和拆箱
int i4 = 12;
Integer i3 = i4;//自动装箱
Boolean bb = false;
int i5 = i3;//自动拆箱
}
}
总结:
1、基本类型转包装类,只需要调用构造器就行
2、对于Boolean来讲,当形参是"true"返回true,除此之外都返回false
3、包装类的默认值都为null
4、包装类转基本类型,调用包装类xxx的xxxValue()方法
// 基本数据类型、包装类与String之间的转换
@Test
public void test2() {
// 基本数据类型、包装类转String
int i1 = 10;
String str1 = i1 + "";//"10"
String str1 = String.valueOf(i1);
Integer i2 = i1;
String str2 = String.valueOf(i2);
String str3 = String.valueOf(true);
System.out.println(str3);
// String转基本数据类型、包装类
int i3 = Integer.parseInt(str2);
System.out.println(i3);
boolean b1 = Boolean.parseBoolean(str3);
System.out.println(b1);
}
总结:
1、基本数据类型、包装类转字符串:调用String类的重载的valueOf(Xxx x)方法
2、字符串转基本数据类型、包装类:调用包装类的parseXxx(String str)方法