20201224-张景安

总结:

字符串实例:

  1. 当遇到 "hello" 会首先查找 String常量池 中是否存在相应的 String实例
  2. 若 String常量池 【不存在】 相应的 String实例 ,则 构造新的实例并将该实例添加到 String常量池,最后返回该实例的地址
  3. 将返回的 String实例 的地址赋值给 s 变量 (此时就说 s 变量 指向了 String常量池 )

  4. 若字符常量池中存在相应的字符实例则直接返回String变量。

  5. 运算符:==比较的永远是值。

StringTestA

package com.itlaobing.analysis;

import java.util.Arrays;

public class StringTestA {

    public static void main(String[] args) {
        
        // 1、当遇到 "hello" 会首先查找 String常量池 中是否存在相应的 String实例
        // 2、若 String常量池 【不存在】 相应的 String实例 ,则 构造新的实例并将该实例添加到 String常量池,最后返回该实例的地址
        // 3、将返回的 String实例 的地址赋值给 s 变量 (此时就说 s 变量 指向了 String常量池 )
        String s = "hello" ;
        
        // 1、当遇到 "hello" 会首先查找 String常量池 中是否存在相应的 String实例
        // 2、若 String常量池 【存在】 相应的 String实例 ,则直接返回 String常量池 中该实例的地址
        // 3、将返回的 String实例 的地址赋值给 x 变量 (此时就说 x 变量 指向了 String常量池 )
        String x = "hello" ;
        
        // 运算符 == 永远比较 == 两侧的 值是否相等
        System.out.println( s == x );
        
        System.out.println( "- - - - - - - - - - - - - - - - - - - -" );
        
        // 字节序列
        byte[] bytes = { 104, 101, 108, 108, 111 };
        System.out.println( Arrays.toString( bytes ) );
        
        // 解码: 将 字节序列 转换为 字符序列
        String t = new String( bytes );
        System.out.println( t );
        System.out.println( t.hashCode() );

    }

}

String、StringBuffer、StringBuilder的区别

共同点:

  • 都是最终类,没有子类不可被继承。

不同点:

  • String创建的字符序列不可变,它继承自CharSequence接口。
  • StringBuffer、StringBuilder序列可变。
  • StringBuffer 类 直接继承了 AbstractStringBuilder ( 从 JDK 1.5 开始 )
  • StringBuffer 实例 中的 实例变量 是可变的。
  • StringBuffer线程是安全的,效率较低。StringBuilder线程不安全的,但是效率较高。

方法实例:

package com.itlaobing.buffer;

/**
 * 1、StringBuffer 类中定义的 实例方法 都会直接修改当前 StringBuffer实例
 * 2、StringBuffer实例 是可变的 ( 字符缓冲区 中的内容是可变的 )
 */
public class StringBufferTest2 {

    public static void main(String[] args) {
        
        String s = "hello" ;
        System.out.println( s );
        
        String x = s.toUpperCase();
        String t = s.concat( "world" );
        
        System.out.println( s );
        System.out.println( x );
        System.out.println( t );
        
        System.out.println( "- - - - - - - - - - - - - - - - - - - -" );
        
        StringBuffer buffer = new StringBuffer( "今天天气很好" );
        System.out.println( buffer );
        buffer.append( "特适合睡觉,所以我们准备成立一个周四睡觉总部" ); // 在末尾追加
        System.out.println( buffer );
        
        buffer.insert( 6 , ',' ); // 在指定索引处插入新内容
        System.out.println( buffer );
        
        String key = "睡觉" ;
        int start = buffer.indexOf( key ); // 查找指定内容首次出现的位置
        int end = start + key.length() ;
        buffer.delete(start, end); // 删除 [start,end)之间的内容
        
        System.out.println( buffer );
        
        buffer.insert( start ,  "sleep" ); // 在指定索引处插入新内容
        System.out.println( buffer );
        
        start = buffer.lastIndexOf( key ); // 查找指定内容最后出现的位置
        end = start + key.length();
        buffer.replace( start , end,  "sleep" ); // 使用指定内容替换 [start,end) 之间的内容
        System.out.println( buffer );
        
        buffer.reverse(); // 反转字符缓冲区
        
        System.out.println( buffer );
    
    }

}

  • StringBuffer 和 StringBuilder 都没有重写 Object的 equals 方法
  • 可以将 StringBuffer 和 StringBuilder 转换为 String实例后 通过 String类 提供的 contentEquals 来比较
  • String类提供了 contentEquals( CharSequence ) 和 contentEquals( StringBuffer ) 方法用来比较 字符序列 的内容是否相等
package com.itlaobing.buffer;

/**
 * 1、StringBuffer 和 StringBuilder 都没有重写 Object的 equals 方法
 * 2、可以将 StringBuffer 和 StringBuilder 转换为 String实例后 通过 String类 提供的 contentEquals 来比较
 * 3、String类提供了 contentEquals( CharSequence ) 和 contentEquals( StringBuffer ) 方法用来比较 字符序列 的内容是否相等
 */
public class StringBufferTest5 {

    public static void main(String[] args) {
        
        StringBuffer buffer1 = new StringBuffer( "今儿天不错" );
        System.out.println( buffer1 );
        
        StringBuffer buffer2 = new StringBuffer( "今儿天不错" );
        System.out.println( buffer2 );
        
        System.out.println( buffer1 == buffer2 ); // false
        System.out.println( buffer1.equals( buffer2 ) ); // false
        
        System.out.println( "- - - - - - - - - - - - - - - - - - - -" );
        
        String str1 = buffer1.toString();
        System.out.println( str1.equals( buffer2 ) ); // false
        System.out.println( str1.contentEquals( buffer2 ) ); // true
        
    }

}

标签

评论

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1