目录
1.string是特殊的引用类型
2.String两种赋值方式
3.String 类是不可改变的
4.string创建对象问题
5.string和其他类型转换
1.string是特殊的引用类型
虽然string类型是引用数据类型但它是特殊的引用类型,string类型作为实参传入到方法中时,形参改变不会影响实参。
2.String两种赋值方式
String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上:
赋值方式一:String s = “aaa”;
在String池中分配空间,如果String池有aaa,直接将地址返回。如果Striing池中没有aaa,开辟空间存储aaa,将新地址返回
赋值方式二:String s = new String("aaa");
查看String池当中是否有aaa,如果有不用开辟新的空间,如果没有开辟String池空间存储aaa。在堆空间开辟一块空间,在空间里存储String池空间地址。
3.String 类是不可改变的
String 类是不可改变的解析,例如:
String s = "Google";
System.out.println("s = " + s);
s = "Runoob";
System.out.println("s = " + s);
输出结果为:
Google Runoob
从结果上看是改变了,但为什么说 String 对象是不可变的呢?
原因在于实例中的 s 只是一个 String 对象的引用,并不是对象本身,当执行 s = "Runoob"; 创建了一个新的对象 "Runoob",而原来的 "Google" 还存在于内存中。
字符串实际上就是一个 char 数组,并且内部就是封装了一个 char 数组。并且这里 char 数组是被 final 修饰的:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
并且 String 中的所有的方法,都是对于 char 数组的改变,只要是对它的改变,方法内部都是返回一个新的 String 实例。
4.string创建对象问题
以下代码共创建了几个对象?
String s= "abd";
String s1=new String("hello");
String s2=new String("hello");
String s3=s1;
String s4=s2;
[答案] 4个对象。
1)Striing池中有一个对象abd (1个对象)
2)String池开辟一个hello对象。在堆内存中开辟了一个对象(2个对象)
3)String池中有hello对象不需要在String池中开辟,需要在堆内存中开辟一个对象(1个对象)
4)只是在栈空间创建变量s3和s1指向同一个堆地址
5)在栈空间创建变量s4和s2指向同一个堆地址
5.string和其他类型转换
String转换基本数据类型,包装类之间的转换,调用包装类的静态方法 :包装类.parseXxx(str)
public void test(){
String st1 = "1";
int i = Integer.parseInt(st1);
}
基本数据类型,包装类转换String :调用 String重载的.valueOf(xxx)
或者自动类型转换直接+字符串
public void test(){
int st1 = 123;
String st2 = String.valueOf(st1);
String st3 = st1+"";
}
String 转换
字符数组char [ ]
调用String 的: .tocharArray()
public void test(){
String st1 = "adc123";
char[] chars = st1.toCharArray();
for (char c : chars) {
System.out.print(c+",");
}
}
字符数组转换String 要调用String的构造器
public void test(){
char[] c = {'h','e','l','l','o'};
String s = new String(c);
System.out.println(s);
}
编码:String --> byte[]:调用String的getBytes()
解码:byte[] --> String:调用String的构造器
String st1 = "abc ";
byte[] bytes = st1.getBytes();
//string转字节数组
byte[] gbks = st1.getBytes("gbk");
//字节数组转String
String s = new String(bytes);
System.out.println(s);