String str1 = “abc“与String Str2 = new String(“abcd“)"/>
String str1 = “abc“与String Str2 = new String(“abcd“)
- 用第一种创建字符串时,会在java编译期间,先在常量池中查找是否存在abc,若不存在就会新建abc放到常量池中反之就直接指向即可,然后变量str1会指向常量池中abc;
- 用第二种创建字符串时,在编译期间会先在堆中new一个对象,然后在常量池中查找是否存在abcd,若不存在就会新建并放到常量池中,str2的值就是指向这个对象。
equals与==
- String类重写了equals方法,可以通过源码可以看出,重写的equals方法先使用“==”判断比较的两个对象是否是否相同,相同就返回true,否者就再比较两个字符串的值否相等,相等就返回true否者返回false。
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;}
- == 在比较数值时就是直接比较两个数值是否相等;在比较对象时比较两个变量指向的是否是同一个对象地址。
字符串的的hashCode方法,字符串的hashCode值就是每个字符的ascll码加前一个字符的hash*31的和。
public int hashCode() {int h = hash;if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;}
Object的hashCode是使用原生的方法
public native int hashCode();
自己的总结,仅仅提供参考,有错误请给我纠正,谢谢。
更多推荐
String str1 = “abc“与String Str2 = new String(“abcd“)
发布评论