zoukankan      html  css  js  c++  java
  • java笔记04: String的理解与运用

    一,“==”与equals()

    运行以下代码,如何解释其输出结果?

     1 public class StringPool {
     2     
     3     public static void main(String args[])
     4     {
     5         
     6         String s0="Hello";
     7         
     8         String s1="Hello";
     9         
    10         String s2="He"+"llo";
    11         
    12         System.out.println(s0==s1);//true
    13         
    14         System.out.println(s0==s2);//true
    15         
    16         System.out.println(new String("Hello")==new String("Hello"));//false
    17         
    18     }
    19 
    20 }

    首先s0==s1

    在Java执行时会维护一个String堆,对于一些可以共享的字符串对象,会先在堆中查找是否存在相同的String内容(字符相同),如果有就直接返回,不创建新对象。

     s0中的值是引用的s1的值,自己并没有创建对象,所以比较后的结果是true。

    同理,s2中的值也是引用S1的值,所以比较的结果也是true

    new String("Hello")==new String("Hello")

    同时在堆中new了两个对象,这两个对象的内容都是Hello

    但就好比a篮子和b篮子都装了一个苹果,a篮子装了苹果后和b篮子装了苹果后能判相等吗?

    当然不行,假设苹果都是一样的,那苹果当然能和苹果相等,但是篮子却是不一样的

    在Java中,内容相同的字串常量(“Hello”)只保存一份以节约内存,所以s0,s1,s2实际上引用的是同一个对象。

    编译器在编译s2一句时,会去掉“+”号,直接把两个字串连接起来得一个字串(“Hello”)。这种优化工作由Java编译器自动完成。

    当直接使用new关键字创建字符串对象时,虽然值一致(都是“Hello”),但仍然是两个独立的对象。

    Java中“==”的使用

    1基本数据类型:比较的是内容;

    2引用数据类型:比较的是对象地址;

    再看以下代码

     1 public static void main(String args[])
     2  {
     3      String s1="a";
     4      String s2=s1;
     5      System.out.println(s1==s2);//true
     6      s1+="b";
     7      System.out.println(s1==s2);//false
     8      System.out.println(s1=="ab");//false
     9      System.out.println(s1.equals("ab"));//true
    10  }

    分析:

    给字串变量赋值意味着:两个变量(s1,s2)现在引用同一个字符串对象“a”!

    String对象的内容是只读的,使用“+”修改s1变量的值,实际上是得到了一个新的字符串对象,其内容为“ab”,它与原先s1所引用的对象”a”无关,所以,s1==s2返回false;

    代码中的“ab”字符串是一个常量,它所引用的字符串与s1所引用的“ab”对象无关。

    String.equals()方法可以比较两个字符串的内容。

    二,String,equals()方法

    java中的String.equals()方法的实现代码:

    equals()法是根类Object中的方法。源代码如下:

     1 public boolean equals(Object obj)
     2 {
     3     return (this == obj);
     4 }
     5 
     6 
     7 //可见默认的equals方法,直接调用==,比较对象地址。
     8 //
     9 //不同的子类,可以重写此方法,进行两个对象的equals的判断。
    10 //String类源码中重写的equals()方法的实现代码如下:
    11 
    12 
    13 public boolean equals(Object anObject)
    14 { 
    15     if(this==anObject) return true;
    16 
    17     if(anObject instanceof String) 
    18     {
    19         String anotherString=(String)anObject;
    20 
    21         int n=value.length;
    22 
    23         if(n==anotherString.value.length)
    24                 //若两个字符串长度一样,则一个个进行字符比较
    25         {
    26             char v1[]=value;//字符串转化成的对应数组
    27             char v2[]=anotherString.value;
    28                     //字符串转化成的对应数组
    29     
    30             int i=0;
    31 
    32             while(n--!=0)
    33             { 
    34                 if(v1[i]!=v2[i]) return false; 
    35             //若比较过程中出现不等,则俩字符串不等,返回false
    36                 i++;
    37             }
    38 
    39             return true;
    40                     //直至比较完两个字符串长度,跳出while循环
    41                  //    此时说明俩字符串相等,返回true
    42 
    43         }
    44     }
    45 
    46 
    47     return false;
    48 //两个字符串长度不一样,俩字符串不等,
    49 //不必一个个比较内容,直接返回false
    50 }                                              

    注:instanceof是Java、php的一个二元操作符(运算符),和==,>,<是

    同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。它的作用
    是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用来
    判断继承中的子类的实例是否为父类的实现。

    从上面的代码可以得知:
    (1) String类中的equals首先比较地址,如果是同一个对象的引用,可知对象相等,返回true。
    (2)如果不是同有一个对象,equals方法则继续挨个比较两个字符串对象内的字符,只有完全
    相等才返回true,否则返回false。

    三,整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明罚款

    Length():获取字串长度

    charAt():获取指定位置的字符

    getChars():获取从指定位置起的子串复制到字符数组中

    replace():子串替换

    toUpperCase()、 toLowerCase():大小写转换

    trim():去除头尾空格

    toCharArray():将字符串对象转换为字符数组

    四,

    String类的方法可以连续调用:

    String str="abc";

    String result=str.trim().toUpperCase().concat("defg");

    请阅读JDK中String类上述方法的源码,模仿其编程方式,编写一个MyCounter类,它的方法也支持上述的“级联”调用特性,其调用示例为:

    MyCounter counter1=new MyCounter(1);

    MyCounter counter2=counter1.increase(100).decrease(2).increase(3);

     1 public class MyCounter {
     2   int i;
     3   MyCounter(int n){
     4     i=n;
     5   }
     6   public MyCounter increase(int n) {
     7     this.i=this.i+n;
     8     return this;
     9   }
    10   public MyCounter decrease(int n) {
    11     this.i=this.i-n;
    12     return this;
    13   }
    14 
    15   public static void main(String[] args) {
    16 
    17     MyCounter counter1=new MyCounter(1);
    18     MyCounter counter2=counter1.increase(100).decrease(2).increase(3);
    19     System.out.println("counter2.i="+counter2.i);
    20 
    21   }
    22 
    23 }
  • 相关阅读:
    word2010怎么把白色方框变成黑色方框?
    Ubuntu 14.04 安装 Sublime Text 3
    安装xmlspy之后,链接及邮箱等都用这个软件打开,怎样取消?
    SRAM、DRAM、SDRAM、DDR、DDR2、DDR3
    ROM和RAM区别
    shell脚本分析一
    重要网址
    vi/vim
    dump_stack使用
    BIOS、BootLoader、uboot对比
  • 原文地址:https://www.cnblogs.com/sdysyhj/p/7744407.html
Copyright © 2011-2022 走看看