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

很简单的问题,关于String的

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

    本文导语:  public class TestB { public static void main(String[] args) { String s1 = new String("1"); String s2 = new String("1"); String s3 = "1"; String s4 = "1"; System.out.println(s1); System.out.println(s2); System.out.println(s1 == s2); System.out.p...

public class TestB
{
public static void main(String[] args)
{
String s1 = new String("1");
String s2 = new String("1");
String s3 = "1";
String s4 = "1";

System.out.println(s1);
System.out.println(s2);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));

System.out.println(s3);
System.out.println(s4);
System.out.println(s3 == s4);
System.out.println(s3.equals(s4));

s3 = "1";
System.out.println(s3 == s4);

s3 = new String("1");
System.out.println(s3 == s4);
}
};


谁可以解释一下为什么是这个执行结果。

在 s3 = "1"; 的时间,没有使用new运算符分配空间,s3是否重新分配了内存空间,s3到底分配到什么地方去了?

为什么
在 String = "String"的时间,==比较的结果永远为true.

|
但 jvm 会优化代码
把程序里相同的 常量 ( "1" )
合并成一个对象

正规 并 安全的方法 还是 .equals()

|
obj==obj比较的是对象的引用
obj.equals(obj)比较的是值(注意,这里的obj是系统的class,不是用户自己定义的class)
所以当
String s3 = "1";String s4 = "1";的时候
s3和s4都是指向同一个对象"1"的引用,所以无论是引用还是引用所代表的值,都是相等的

|
String s1 = new String("1);String s2 = new String("1);
这样声明的时候,在内存里产生了2个不同的对象(虽然值是一样的)。s1和s2的reference是不同的,尽管他们的值是相同的(用equals方法返回true)。也就是说这时有2个不同的实例。

而String s1 = "1", s2 = "1";
由于"1"是literal string,在分配内存空间的时候,声明s2的时候会找内存空间中是否已经存在,存在了就指向同一个地方,也就使得这种声明的变量(如果值一样的话)作比较的时候始终返回true。

|
weimenren(愚人碼頭):
对于Integer类型不知道你是不是同样的理解,类似上面:
Integer s1 = new Integer("1");
Integer s2 = new Integer("1");
这时如果比较s1==s2 结果肯定是false;
但是如果使用:s1.intValue()==s2.intValue();结果同样也一定是true;
因为Integer(整数类)转变成了int(整数类型),当然我的理解没有考虑内存分配方面.

|
我自己有一个个人的理解,不过不好说!
反正用==时,System.out.println(s1.intern()==s2.intern());
绝对是正确的结果!

|
对于String类来说 String s="1";和String s=new String("1");都创建了新对象,==比较的是序列号

|
String 对象一旦产生就不能改变
任何(加减)操作都会有一个新的对象

|
== 运算应用于对象时比较的 是引用本身 不是指向的对象
如果两个引用指向的是同一个对象 结果就是 true

|
标识 对象的 序列号?

|
String s1=new String("1");
创建了一个字符串类的实例S1,
String s1="1"
创建的是一个字符串类型变量!
==比较对象,似乎是不行的!
这是个人理解!

    
 
 

您可能感兴趣的文章:

  • 问一个简单问题,String和String Buffer有什么区别?
  • 问个低级的问题:我从库里取汉字时候,代码如下:String ls=ob.test(i);String dbstr1= new String(ls.getBytes("ISO-8859-1"),"GBK");
  • 问一个很蠢的问题:如:void main(String[] args);为什么一定要带上(如String[] args)参数
  • 汉字的问题:我用纯java把汉字从库里取出来显示,代码如下:String dbstr1= new String(ls.getBytes("ISO8859_1"),"gb2312"),可一部分字
  • int to string 值转换问题
  • 菜鸟问题-如何将char[]转化为string??
  • 关于String 比较的一个问题
  • 刚学linux,请教个string问题
  • 关于string类的一个问题
  • 有关java中String类的方法的一个问题,急用!!!
  • String.getBytes()问题
  • String类型数据与Date类型转换的问题?
  • 弱弱地问,string的处理问题
  • 关于String类的简单问题
  • 关于String类的trim()方法的问题
  • 关于String的问题,谢谢!
  • 怎样把type为int的数据强制转化成String型???(很菜的问题,大家见笑了:-))
  • 菜问题:如何进行数据类型的转化,比如int转化为string
  • string问题一个???????????????????????????
  • 问大家一个简单问题:int怎么转成String?有什么好方法?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • 简单问题简单问题简单问题简单问题
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • 小问题,急问题,重大问题!!!
  • sharepoint 2010中item.Update()和item.SystemUpdate 修改数据版本问题解决
  • 弱弱的一问,linux下的中文问题及网络问题,分不是问题
  • 八个问题帮你快速了解Docker
  • 请教两个小问题:一个cgywin下使用vi的问题,另一个socket的问题
  • 错误:将'const x'作为'x'的'this'实参时丢弃了类型限定问题解决
  • 网页的编码问题!或者java的编码问题,由此引出一条解决中文问题的思路
  • nginx Windows版相关问题及使用说明
  • 死锁的问题 多级锁定问题 循环锁定问题
  • vs2010下禁用vmware的方法以及解决vmware插件导致vs2010变慢的问题
  • [问题]双系统出现的问题!求问题的原因和解决办法!
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • 初学者问题。一个是编译hello world的问题,一个是配置ssh的问题
  • c/c++服务器程序内存泄露问题分析及解决
  • C程序问题:哪个高手帮我解释下下面的问题,主要是a[0]和&[0] 的区别 和编译器的问题??
  • ​部署 Docker 前必须问自己的四个问题
  • swing的问题还是jbuiler的问题??
  • spring的事务类型及spring和hibernate可能导致的问题分析
  • 菜鸟第一次安装红帽子7.2的一箩筐问题。每个问题会开个帖子,各放100分!请有安装经验的老鸟们帮忙解决。第二个问题:什么是LILO?怎么样


  • 站内导航:


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

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

    浙ICP备11055608号-3