【忘不了的Java基础】之String
-
String存放在内存的哪个区域中?
-
String创建几种方式的对比?
-
String的比较==,和equals()方法,有什么不同?
-
String为什么要设置成final类型?
-
String做形参的传递是怎么的?
-
String,与StringBuffer,StringBuilder?
1.String存放在内存的哪个区域中?
String str = "hello";
内容“hello”在常量池中,常量池在方法区中
str是指向内容“hello”的引用(地址),在栈中
String str1= new String( "hello");
new的对象在堆中,
str1是指向堆中String实例内容“hello”的引用(地址),在栈中
2.String创建几种方式的对比?
public static void main(String[] args) { String s1 = "a"; //第一种 String s3 = "a"; String s2 = new String("a"); //第二种 System.out.println("s1==s2 "+(s1==s2)); //false System.out.println("s1==s3 "+(s1==s3)); //true System.out.println("s1.equal(s2) "+s1.equals(s2)); //true System.out.println("s1.equal(s3) "+s1.equals(s3)); //true }
3.String的比较==,和equals()方法,有什么不同?
== 比较的是对象的引用
equals()比较String的内容value
//String源码 public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { //依次比较字符数组的内容 char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
4.String为什么要设置成final类型?
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];
首先String类是用final关键字修饰,这说明String不可继承。再看下面,String类的主力成员字段value是个char[ ]数组,而且是用final修饰的。final修饰的字段创建以后就不可改变。
当需要修改字符串的内容时,String类的方法都会返回一个新的String对象,同时,如果内容没有发生改变,String的方法只是返回指向原对象的引用而已。
好处:安全,
不可变性支持线程安全,
不可变性支持字符串常量池
参考:https://blog.csdn.net/u013905744/article/details/52414111
5.String做形参的传递是怎么的?
对于一个方法而言,参数是为该方法提供信息的,而不是想让该方法改变自己的。
示例:
public static void main(String[] args) { String q = "abc"; System.out.println(q); //abc String qq = upcase(q); System.out.println(qq); //ABC System.out.println(q); //abc } public static String upcase(String s){ return s.toUpperCase(); }
解读:
当把q传给upcase()方法时,实际传递的时引用的一个拷贝。其实,每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置上,从未动过。
6.String,与StringBuffer,StringBuilder?
String是final修饰的,不可变对象,每次修改都会重新生成一个新的String对象并返回新对象的引用。
StringBuffer 可变,线程安全,加了synchronized
StringBuilder 可变,线程不安全,
String str = "mango"; String s = "abc"+str+"def"+22;
//编译器自动引入了StringBuilder类
//编译器创建了一个StringBuilder对象,用以构造最终的String,并为每个字符串调用一次StringBuilder的append()方法,共三次,最后调用toString()生成结果。