java中String类型深度解析

[color=red] java虚拟机中有两种内存区域:堆内存、占内存。
栈内存主要保存以下内容:基本数据类型和对象的引用。
堆内存存储对象,栈内存的速度要快于堆内存。
总结成一句话就是:引用在栈而对象在堆[/color]

String类的本质是字符数组char[],其次String类是final的,是不可被继承的,String是特殊的封装类型,使用String时可以直接赋值,也可以用new来创建对象,但是这二者的实现机制是不同的。还有一个String池的概念,Java运行时维护一个String池,池中的String对象不可重复,没有创建,有则作罢。String池不属于堆和栈,而是属于常量池。
所以:通知直接赋值例如:String str1 = "chenchaoyang" 就是先在string池中寻找chenchaoyang,有则返回,没有则创建。而通过new创建就是重新在堆区创建了一个新的对象

== 比较的是引用对象的内存地址(堆内存对象的地址)
当调用 intern 方法时,如果string常量池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定), 则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
String的直接赋值,先检查池中是否有生成的对象,如果有就直接指向
String 是字符串常量。是不可改变对象。如果使用str+ = “hello”的形式,其实是先通过new StringBuffer()对象,然后再进行字符串的append,然后在使用new String()的方式转化为String对象。因此效率比较的慢,而且是新开辟的对象。
hashCode()方法是返回字符串内容的哈希码,既然内容相同,哈希码必然相同,那他们就相等了,这个容易理解。所以不管是string常量池中的还是堆中的只要内容相同hashCode都是相同的。

实例:
   	   public void testString(){
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s4 = s3.intern();
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s1 == (s3));
System.out.println(s1 == s2);
System.out.println(s1 == s4);
System.out.println(s2 == s4);
System.out.println(s1.hashCode() == s3.hashCode());
}

输出:
true
true
false
true
true
true
true

String的equals源码:
  public boolean equals(Object anObject)
{
//如果是同一个对象
if (this == anObject)
{
return true;
}
//如果传递进来的参数是String类的实例
if (anObject instanceof String)
{
String anotherString = (String)anObject;
int n = count;//字符串长度
if (n == anotherString.count) //如果长度相等就进行比较
{
char v1[] = value;//取每一个位置的字符
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) //对于每一位置逐一比较
{
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}


HashCode方法源码:
   private final char value[];//定义一个字符数组value,用于存储字符串里面的字符  
private final int offset;//定义offset变量表示字符串第一个字符的下标索引
private final int count;//定义count变量表示字符串中字符的个数
private int hash; // Default to 0,默认值为0
public int hashCode() {
int h = hash;
if (h == 0 && count > 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值