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

对JAVA基础掌握比较好的,没什么说的,进来看看吧!!!!!!!!!!

    来源: 互联网  发布时间:2015-04-11

    本文导语:  给出下面程序的输出:并请说明原因。 ------------------- class StringLiteral {    public static void main(String[] args) {       String java = "Java", va = "va";       System.out.println(java == "Java")...

给出下面程序的输出:并请说明原因。
-------------------
class StringLiteral {
   public static void main(String[] args) {
      String java = "Java", va = "va";
      System.out.println(java == "Java");
      System.out.println(Other.java == java);
      System.out.println(java == ("Ja"+"va"));
      System.out.println(java == ("Ja"+va));
   }
}
class Other { static String java = "Java"; }

|
为了说明问题,我对原来的程序进行了如下改动:
/** BEGIN */
class  StringLiteral  { 
      public  static  void  main(String[]  args)  { 
            String  java  =  "Java",  va  =  "va"; 
            String  java2  =  new String("Java");
            System.out.println("=== 1 ==="); 
            System.out.println(java  ==  "Java"); 
            System.out.println(Other.java  ==  java); 
            System.out.println(java  ==  ("Ja"+"va")); 
            System.out.println(java  ==  ("Ja"+va)); 
            System.out.println("=== 2 ==="); 
            System.out.println(java . equals ( "Java")); 
            System.out.println(Other.java . equals ( java)); 
            System.out.println(java . equals ( "Ja"+"va")); 
            System.out.println(java . equals ( "Ja"+va)); 
            System.out.println("=== 3 ==="); 
            System.out.println(java == new String( "Ja"+va)); 
            System.out.println(java .equals( new String( "Ja"+va))); 
            System.out.println("n=== 4 ==="); 
            System.out.println(java2  ==  "Java"); 
            System.out.println(Other.java  ==  java2); 
            System.out.println(java2  ==  ("Ja"+"va")); 
            System.out.println(java2  ==  ("Ja"+va)); 
            System.out.println("=== 5 ==="); 
            System.out.println(java2 . equals ( "Java")); 
            System.out.println(Other.java . equals ( java2)); 
            System.out.println(java2 . equals ( "Ja"+"va")); 
            System.out.println(java2 . equals ( "Ja"+va)); 
            System.out.println("=== 6 ==="); 
            System.out.println(java2 == new String( "Ja"+va)); 
            System.out.println(java2 .equals( new String( "Ja"+va))); 
      } 

class  Other  {  static  String  java  =  "Java";  } 
/** END */
输出结果是:
=== 1 ===
true
true
true
false
=== 2 ===
true
true
true
true
=== 3 ===
false
true

=== 4 ===
false
false
false
false
=== 5 ===
true
true
true
true
=== 6 ===
false
true

问题应该已经说明白了。
1、 "==" 比较的是内存地址,而不是值。
    而"equals"比较的是值,不是地址
2、 通过变量声明,没有 new 的String变量,是在编译时确定的,
    所有值相同的变量指向同一个地址(共用一个实例)。
3、 通过 new 生成的 String 值,是在运行期建立的,
    不与其他变量共享内存(建立的时候)。

|
我觉的,首先,String是一个Object来的,
所以用==来比较,是比较他们是否同一个对象,
因为java的编译优化的机制,所以
            String  java  =  "Java",  va  =  "va"; 
            System.out.println(java  ==  "Java"); 
            System.out.println(Other.java  ==  java); 
            System.out.println(java  ==  ("Ja"+"va")); 
            System.out.println(java  ==  ("Ja"+va)); 
前面三个都是在编译的时候就可以静态确定的,所以分配到了
同一个对象,所以比较结果是true
而第四个,由于"Ja"+va是要等到运行的时候才能确定,
所以会新分配了一个对象,所以是false

|
前三个为“true”就不用说了,最后一个为false是因为:
   在JAVA中,String有专门的strings池存放。当你建立一个String变量,编译时,如果编译器发现池中有相同的变量,它就直接引用该变量,否则创建新的(这一切都是在编译时完成的)。“==”操作比较的不仅是两个变量的值,而且还要比较它们的地址(在池中的位置是否相同),而"ja"+va这句话中由于va不是常量,不能在编译时完成此操作,所以该String不能放到String池中,自然地址不一样,java==("ja"+va)为false了 

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












  • 相关文章推荐
  • 我初学JAVA,大家愿意交朋友的进来看看!留QQ的给分啊!
  • 学过c的java程序员,请进来!
  • 关于用Jprint java打印的问题,请大家进来看看(路人甲、华仔哥)
  • 熟悉JAVA的请进来
  • 强烈要求:Java板块再进行分类!所有问题都并在一起,实在太乱了!同意的请进来签名!
  • 网络技术 iis7站长之家
  • 一道java的题目,应该不难,进来看一下
  • 学习JAVA时写了个读写Ini文件的类,赏脸的朋友请进来留个话吧……
  • 散分,庆祝一把升为4角,南京的java程序员进来拿
  • yacc80,dy_paradise,newry,sdyqingdao,cxhz_cn,xiaohaozi,honeychen进来,上次叫大家推荐java书的帖子出问题了,我到这里来给你们加分。     
  • Java和VB的问题??请进来帮帮我,也许是很简单的颜色问题呀?
  • 关于Thinking in java这本书中的问题!高手进来!
  • JAVA的日期的输入输出问题, 请进来看看
  • 手上有core in java2(卷2高级特性)一书的兄弟进来帮忙看看原书例子问题。
  • 有读过《JAVA程序设计教程》(第3版)的朋友,进来讨论!
  • 关于编码转换的问题,我觉得java大斑竹(尤其是笑着悲伤)应该做一个faq,大家进来支持一下。
  • 又一个关于JAVA的问题,还是基本性质的题目,爱好者们进来研究研究
  • java.util.Date类型向java.sql.Date类型转换之间的一个小问题,请大家进来看看
  • 真正理解JAVA的高手请进来挑战挑战!
  • dynku(随风来去.cn)进来本人学JAVA以来第二个程序,计算器,问题多多,希望各位细心指点。
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍


  • 站内导航:


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

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

    浙ICP备11055608号-3