笔试的时候碰到这样一个题:
String s = new String("abc"); 问创建了几个String对象??(由这个问题,我想对字符串归纳一下)
(一)字符串存储地址有两种:
1. 常量池(不属于堆,也不属于栈),由java虚拟机进行管理,所有由(" ")括起来的字符串序列都存放在这里
因为String是final的,所以一旦创建,就不会改变,所以相同序列的字符串在常量池中只存放一份,没有则创建,有 的话则直接使用
例如:String s1 = "abc";//常量池中没有,则创建字符串“abc”;
String s2 = "abc";//已有这个字符串,则让s2的引用直接指向之前的“abc”;
s1 == s2为 true,因为s1,s2引用指向同一对象
2. 堆,存放的是new 出来的对象,里边内容为字符串序列。每调用一次new就会创建一个新对象
例如: String s1 = new String("abc");
String s2 = new String("abc");
s1 == s2 为false,因为s1 ,s2指向不同的对象。
(二)关于两个字符串相加后的结果
String s = "ab"+"bc";//此时存放在常量池中,因为后边两个都是常量 ,所以编译时就可以确定
String s = "ab"+s1;//s为String型变量,此时s1的存储地方不确定,所以结果存放在堆中
例如:String s1 =“cd”; String s2 = "ab"; String s = s1+s2;//s所指对象存放在堆中,s1,s2不确定。
(三)开始问题的答案:
1个或2个: 所有由(" ")括起来的字符串序列都存放在常量池中,所以当常量池中没“abc”时就创建一个对象,有则不创建,然后再在堆中创建一个对象,值为“abc”。
(四)字符串的hashcode()
String str1 = "abc"; String str2 = new String("abc");
str1.hashCode() == str2.hashCode()值为true。
关于hashcode:hashcode其实是经过hash算法生成的1个key,好的hash算法能保证不同的对象尽量生成不同的hash 值,key重叠的概率越小,代表hash算法越好,如果key不小心一致了,则会以类似链表的形式追加到这个key对应 的对象的后面。而相同的对象一定要生成相同的key。
(五)关于字符串交换函数
public class Test8 {
public static void main(String[] args)
{
String s1 = "s1";
String s2 = "s2";
swap(s1,s2);
System.out.println("s1:"+s1+" s2:"+s2);
}
public static void swap(String s1,String s2)
{
String temp = s1;
s1 = s2;
s2 = temp;
}
}
显示结果为s1 :s1 s2:s2
显然,交换函数没有起到交换作用 :