JAVA基本数据类型
JAVA基本数据类型: byte,short,int,long为整型;float,double为浮点型;char为字符型;boolean 为布尔类型
基本类型间的转换
存储范围小的类型到存储范围大的类型: 自动转换
byte → short(char) → int → long → float → double
从存储范围大的类型到存储范围小的类型(使用强转,可能会损失精度)
double → float → long → int → short(char) → byte
String
八大基本本数据类型存在栈(stack),String的对象实例存在堆(heap),除此之外还要明白一个概念,常量池。
String s1 = "abc"; // String 直接创建
String s2 = "abc"; // String 直接创建
String s3 = s1; // 相同引用
String s4 = new String("abc"); // String 对象创建
String s5 = new String("abc"); // String 对象创建
以上代码的执行过程是这样的:
String s1= “abc”, 首先看常量池中有没有“abc”这个字符串,显然没有,那么在常量池中创建一个“abc”字符串, s1 指向这个字符串。
String s2 = “abc”, 在常量池中找到了字符串“abc”,那么 s2直接指向这个串。
如果遇到new,那么就不在常量池中找了,直接在堆中创建实例。
验证结果
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1 == s4);
System.out.println(s4 == s5);
如果仅仅是想判断字符串值相等,那么就使用equals。
String 特性
String类 是final修饰的,不可以被继承。
String类的底层是基于char数组的。
String类被设计成不可变(immutable)类,所以它的所有对象都是不可变对象,线程安全,不会有并发问题。
public static void main(String[] args) {
String str = "a"+"b"+"c";
System.out.println(str);
}
这段代码会产生几个String对象呢,使用javap查看其字节码,可以看出只有一个
String str = "a";
String str2 = "b";
String str3 = "c";
str = str+str2+str3;
System.out.println(str);`
这段代码查看源代码,可以看出生成了4个String对象,先是创建了str,str2,str3 ,然后用StringBuilder将他们append起来,返回新的一个String对象
StringBuffer 和StringBuilder
由于String的不可变性,对其任意的修改都会产生一个新的对象,如果需要频繁变更,那就要使用StringBuffer和StringBuilder
StringBuffer 线程安全,但效率慢
StringBuilder 线程不安全,但效率快