String类是java.long包默认引入的,为了解决字符串序列的相关问题。String类被final关键字修饰,他不能被继承。
1.常量对象
String中字符串是常量,生成后就自动加载到方法区(常量池/元空间)里面去,一但定义就不可以修改。如果对字符串进行修改,则会重新开辟新的空间。System.identityHashCode()可以返回对象的内存地址。
package Package4.String类.String常用方法;
public class A {
public static void main(String[] args){
/*string中字符串是常量,定义了就不可变,
在它上面做修改相当于在方法区(常量池)里面创建一个新value
*/
String s1="你好";
System.out.println(System.identityHashCode(s1));
s1="hello";
System.out.println(System.identityHashCode(s1));
}
}
2.String对象
String对象的字符序列,每次new一个对象,就会在内存里开辟一个新的空间。即使字符序列相同,内存地址也不同。
package Package4.String类.String常用方法;
public class A {
public static void main(String[] args){
/*string中字符串是常量,定义了就不可变,
在它上面做修改相当于在方法区(常量池)里面创建一个新value
*/
String s1=new String("你好");
System.out.println(System.identityHashCode(s1));
String s2=new String("你好");
System.out.println(System.identityHashCode(s2));
}
}
3.并置运算+
并置运算运算如果有String对象,那么就会在内存里重新开辟内存空间,他们的内存地址不同
package Package4.String类.String常用方法;
public class A {
public static void main(String[] args){
String s1="你";
String s2="好";
String s3="你"+"好";
String s4=s1+"好";
String s5="你好"+s2;
String s6=s1+s2;
System.out.println(s3 == s4);
System.out.println(s3 == s5);
System.out.println(s3 == s6);
System.out.println(s4 == s6);
}
}
4.关于这方面的题
当str被new创建时,“good”就不会发生改变,后面给str赋值的时候会重新开辟新的内存空间,而且这是形参,不能做到值传递。所以没有产生变化。而数组是基本数据类型,他是可以被改变的。
package Package4.String类.String常用方法.compareTo_;
public class StringTest {
String str=new String("good");
char[] ch={'t','e','s','t'};
public void charge(String str,char ch[]){
str="test ok";
ch[0]='b';
}
public static void main(String[] args){
StringTest ex=new StringTest();
ex.charge(ex.str,ex.ch);
System.out.println(ex.str);
System.out.println(ex.ch);
}
}