类型归属
String不属于8种基本数据类型,String是一个对象。
因为对象的默认值是null,所以String的默认值也是null; 但它又是一种特殊的对象,有其它对象没有的一些特性。
常量池
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。
它包括了关于类、方法、接口等中的常量,也包括字符串常量。
我声明了什么?
new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;
String s = "Hello world!";
只是声明了一个只能指向String对象的引用变量, 目前指向"Hello world!"这个String类型的对象
用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。
String是不可变的
看似的变动实际上是引用的变动(reference).一切都是对象,你操控的实际上是对象的引用,然后引用再和对象打交道,引用并不一定要对象。
对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。
String参数传值
String就相当于是char[]的包装类。包装类的特质之一就是在对其值进行操作时会体现出其对应的基本类型的性质。在参数传递时,包装类就是如此体现的.
String str=”kvill”;和 String str=new String (“kvill”);的区别
String str=”kvill” 是字符串常量放在常量池中
String str=new String (“kvill”);放在堆栈中.
对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。