当前位置:  技术问答>java相关

基础的概念问题

    来源: 互联网  发布时间:2017-04-28

    本文导语:  我写了这样一个测试程序 public class Test {   public static void main(String args[]) {            String s = new String("Hello");   String s1 = new String("Hello");   String m = "hello";   String m1 = "hello";   if(s==s1){  ...

我写了这样一个测试程序
public class Test {
  public static void main(String args[]) {
           String s = new String("Hello");
  String s1 = new String("Hello");
  String m = "hello";
  String m1 = "hello";
  if(s==s1){
   System.out.println("OK");
  }
  else{
   System.out.println("Bad");
  }
  if(m==m1){
   System.out.println("mOK");
  }
  else{
   System.out.println("mBad");
  }

}
(s==s1)打印出来的是bad,但是(m==m1)是mok,请大侠解释一下

|
以前知道,现在记不太清楚了,好像是jvm给向String m = "hello";
这样创建的String建立了一个缓冲池(暂且这么叫),也就是你创建的m,ml都指向缓冲池里面的对象,所以==成立。
而象String s = new String("Hello");这样建立的实例是分配不同的地址的,所以==不成立。
建议你发在认证区,那里的人可能更清楚。

|
String s = new String("Hello");
String s1 = new String("Hello");
new String("Hello");被看成是不同的對象

String m = "hello";
String m1 = "hello";
在String m = "hello";時,會在heap里為"hello"分配一個空間,
當String m1 = "hello";時,系統會先去收索heap里有沒有"hello",如果有的話就把"hello"的地址福給m1
因為'=='在倆邊都是對象時,是判斷兩邊對象的引用是否一樣



|
在定义m时,系统为m分配一个地址空间并存为hello,定义m1时由于并没有要求新空间,所以利用的还是原来的空间,说白了就是m和m1是一个"hello",而s和s1为两个不同的地址空间,所以会出现这种情况。就象两个人知道一个抽屉里有一把钥匙,和两个人知道两个抽屉里分别有一把两个一样的钥匙一样,虽然一样但还是两把钥匙。

|
字符串的比较不能用==

程序运行的时候有一个字符串缓冲池,其中保存着所有的字符串对象
对字符串进行的操作也都是从这个缓冲池中取出的。
在调用==操作的时候只是在缓冲池中寻找两个对象进行比较,
此时有可能调用字符串并不存在缓冲池中。而调用equals()方法的
时候,会先生成一个调用的字符串在缓冲池中,这样
缓冲池中就有了这两个字符串对象,就可以进行比较了

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。














站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3