Java基础8
Java基础8
DouDouLee 发表于2年前
Java基础8
  • 发表于 2年前
  • 阅读 16
  • 收藏 0
  • 点赞 2
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: 字符串的创建与存储机制、==/equals/hashCode、String/StringBuffer/StringBuilder/StringTokenizer

1、字符串的创建与存储机制

字符串的声明与初始化有两种情况:

1)在JVM中存在着一个字符串池,保存着很多String对象,且可以被共享使用,s1与s2引用的是同一个常量池中的对象。String采用的是享元设计模式(使用共享技术实现相同或相似的对象的重用,即实现实现相同或相似的对象的代码共享,极大减少了系统中对象的个数),当创建一个字符串常量时,会首先在常量池中查找是否已经有相同的字符串被定义,依据String类的equals(Obj o)返回值,若已经定义,直接获取对其的引用,此时不需要再去创建新的对象;若没有定义,则首先创建这个对象,然后把它加到字符串池中,再将它的引用返回。

String s1 = "abc"; //在常量区里放一个“abc”字符串
String s2 = "abc";//s2 引用常量区里的字符串,不会创建新的对象

2)

String s3 = new String("abc");//在堆中创建新的对象
String s4 = new String("abc"); //在堆中又创建新的对象

他们在内存中地址是不同的,用new时总是会产生新的对象。

Q:new String("abc");创建了几个对象?

A:一个或两个。若常量池中有字符串“abc”则创建一个;没有则创建两个对象。

2、==/equals/hashCode()

==运算符用来比较两个变量的值是否相等。即比较变量对应的内存中所存储的数值是否相同。如String s = new String();,变量s占用一块存储空间,而new String()则存储在另外一块存储空间里,此时变量s所对应内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象的类型的变量,若比较这两个变量是否指向同一个对象,即要看这两个变量所对应内存中的数值(地址)是否相等,这时候可以用==比较。但要比较对象的内容是否相同==就无法实现了。

equals()方法是Object类提供的方法之一。Object类中定义的equals(obj)方法是直接用==比较的两个对象,所以在没覆盖equals方法情况下equals(obj)与==一样,比较的是引用。相比==,equals方法可以被覆盖。

hashCode()方法是从Object类中继承过来的,,返回内存中的地址转换成的一个int值,若没有重写,任何对象的hashCode方法返回值都是不同的。

package Four;

//s1.hashCode、s2.hashCode与s1.equals(s2)的关系:
//返回的hashCode()不同equals一定不同,equals相同则hashCode()同,其他情况都不确定

public class Equals {
 public static void main(String[] args){
  String s1 = "Hello";
  String s2 = "Hello";
  /*int java.lang.String.hashCode()
Returns a hash code for this string.
*/
  
  String s11 =new String( "Hello");
  String s22 =new String( "Hello");
  System.out.println(s1 .hashCode() == s2.hashCode());
  System.out.println(s1 == s2);
  System.out.println(s11 .hashCode() == s22.hashCode());
  System.out.println(s11 == s22);
 }
}/*
true
true
true
false*/

3、String/StringBuffer/StringBuilder/StringTokenizer

1)String是不可变类,即String对象一旦被创建,其值不能被改变;StringBuffer属于可变类。

2)实例化String时,可以利用构造函数String s = new String("abc");或赋值语句String s = "abc";StringBuffer只能用构造函数StringBuffer s = new StringBuffer("abc");

3)StringBuffer效率较高

String s = "abc";
s+="123";

等价于:

StringBuffer s1 = new StringBuffer(s);
s.append("123");
s = s1.toString();

由上看出,String的使用比StringBuffer多了一些操作,同时生成了一些临时对象,从而导致程序的执行效率降低。

StringBuilder与StringBuffer类似,都是字符串缓冲区,但StringBuilder不是线程安全的,若只在单线程使用StringBuilder效率较高。

在执行效率方面StringBuilder>StringBuffer>String.

StringTokenizer是用来分割字符串的工具类。

import java.util.StringTokenizer;
public class StringTokenizerTest {
 public static void main(String[] args){
  StringTokenizer st = new StringTokenizer("Hey you");
  while(st.hasMoreTokens())
   System.out.println(st.nextToken());
 }
}/*
Hey
you
*/
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 6
博文 91
码字总数 45242
×
DouDouLee
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: