zoukankan      html  css  js  c++  java
  • 关于==和equals()方法&Java中string与char如何转换&String,StringBuffer

    1.对于基本数据类型,可以直接使用==和!=进行内容比较
    如:int x=30;
           int y=30;
            x==y;  //true
    基本数据类型

    简单类型(基本类型)

    boolean

    byte

    char

    short

    int

    long

    float

    double

    void

    二进制位数

    1

    8

    16

    16

    32

    64

    32

    64

    --

    封装器类

    Boolean

    Byte

    Character

    Short

    Integer

    Long

    Float

    Double

    Void

     
     
     
     
     
     
     
    2.对于不是基本数据类型的,则==和!=比较的就是对象的引用
    如:String s1="hello";
           String s2=new String("hello");
            s1==s2;//false
    错误原因就是String不是基本数据类型,所以==比较的是对象的引用,很显然,两个对象的引用时在栈的不同位置,也就是说,两个对象的引用在栈中是不同的地址
     
    String类中有一个equals()方法,可以进行内容的比较。
    如:s1.equals(s2);//true

    栗子:

      String s1="abc";

      String s2==s1;

      String s5="abc";

      String s3=new String("abc");

      String s4=new String("abc");

    问题来了:

      s1==s5;  //true,"abc"放到常量池(Constant Pool)中,对于两个值相同的常量,常量池只会创建一个

      s1==s2;  //true,比较的是同一个引用

      s1.equals(s2);  //equals()比较的是内容,显然s1,与s2的内容相同

      s3==s4;  //false,new出来的,就是放在了不同的堆内存中了,它们的引用s3,s4就会不同

      s3.equals(s4);  //true,s3与s4的内容相同

      s1.equals(s4);  //true,s1与s4的内容相同

      s1==s4;  //false,使用new关键字创建出来的,不管String Pool中是否已经有值相同的对象,都会创建一个新的String对象存储在堆内存中,然后把引用返回,赋值给s4

    3.Java中string与char如何转换?

      String s="hello";

      char c[]={'h','e','l','l','o'};

      char ch[]=s.toCharArray();  //string转换成char

      String s1=new String(c);  //char转换成string

    4.注意以下二者的区别

      String s="a"+"b";

      String s="a";

         s+="b";

      每次"+="操作都会构造新的String对象,所以后者开辟了两个内存段。为了效率,应该避免使用"+="来构造字符串

    栗子1:

      以下程序创建了几个对象?

      String A,B,C;

      A="a";

      B="b";

      A=A+B;

      StringBuffer D=new StringBuffer("abc");

      D=D.append("567");

      答案;5个

      其实String s3=new String("abc");是创建了两个对象,"abc"本身就是在pool中创建的一个对象,而在运行时,执行new String()时,将pool中的对象复制了一份放到heap中,并且把这个对象的引用交给s3持有。

      但是StringBuffer是可变类,特点就是改变对象本身而不是创建新的对象,所以StringBuffer D=new StringBuffer("abc");是创建了一个对象。

      D=D.append("567");创建了一个对象,因为"567"本身就是一个对象。

      A="a";//创建了一个对象

      B="b";//创建了一个对象

      A=A+B;//此处创建了一个对象,并由A来引用,那么原来A所指向的对象就成为垃圾对象,被回收。

    栗子2:

      请说出以下代码块存在的问题?

      String temp="";

      for(int i=0;i<9999;temp+="x")

      {

      }

      由于String类是支持非可变性的,所以当执行temp+="x"的时候,实际上是另外创建了一个对象,而tmp原来指向的那个对象就成了垃圾。

      这样一循环就会产生n个对象,从而造成内存浪费。

    那么问题来了:什么是支持非可变性类?

      这种类的特点就是状态固定,不存在任何修改对象的方法,在该对象生存周期内,它的值永远不变的。所以线程安全,不要做同步处理,可以将其共享给所有的用户,让所有的"客户端程序员"都可以直接使用此类而不需要做任何额外的工作。

      非可变类的缺点就是:对于每一个不同的值,都要去一个单独的对象。

     栗子3:

      下列 java 程序输出结果为_A_。

    int i=0;
    Integer j = new Integer(0);
    System.out.println(i==j);
    System.out.println(j.equals(i));

      A.true,true

      B.false,true

    解释: i==j ,这个是基本类型与 Integer 的比较, j 会自动拆箱成 int 类型,然后比较的是值。因此返回真。

  • 相关阅读:
    cef 依赖的文件 libcef
    ubuntu 添加新分区,并挂载/home
    x509 证书链验证
    chromium调试
    Chromium智能指针使用指南
    具有扩展主密钥时SSL/TLS的主密钥计算
    OpenSSL解惑2:如何强制选择协议的版本
    基于Gmssl的SM2加解密算法Demo
    漫谈TLS nonce
    VS2015动态库静态加载时指定动态库位置的方法
  • 原文地址:https://www.cnblogs.com/GumpYan/p/5527156.html
Copyright © 2011-2022 走看看