20201223-张景安

总结:

String类的" "和new String("hello");的区别:

//注:有变量参与的字符串连接都会返回新的String实例
    String s = "hello"; //此处也创建了一个String的实例,"hello"存放在方法区的字符常量池中。

    String s1 = new String("hello");        //在堆中创建一个String的实例对象,用来存放"hello"字符字段
    String s = "hello" ; // 这里仍然对应着一个 String实例
    String x = "world" ;
        
    String t = "helloworld" ;
    System.out.println( System.identityHashCode( t ) );
        
    String r = "hello" + "world" ;   //会在编译时将两个字连接起来,运行时在字符常量池中查找这个字符串是否存在:是:将地址值赋给r。否:创建新的字符串。
    System.out.println( System.identityHashCode( r ) );
        
    System.out.println( t == r ); // true
/*
    输出结果为:
        2125039532
        2125039532
        true;
*/
    String m = s + x ; // String m = "hello" + x ; // String m = s + "world" ;
        System.out.println( t == m ); // false
        System.out.println( System.identityHashCode( m ) ); 
        System.out.println( t.equals( m ) );
// String m = "hello" + x ; 字符常量连接的是地址值;
//如果将x用final修饰的话,则返回结果为true

StringJoiner类

  • JDK1.8提供了StringJoiner来操作字符序列
  • 如果需要频繁拼接字符串建议使用StringJoiner来实现。
  • 开发文档:StringJoiner用于构造由分隔符分隔的字符序列,并且可选地从提供的前缀开始并以提供的后缀结尾。

注:StringJoiner、StringBuffer、StringBuilder的区别?

https://www.dazhuanlan.com/2019/12/16/5df7788694521/

StringBuffer是线程安全的,但是会额外增加开销,StringBuilder线程不安全的,有效减少开销。但是两者本质上没有区别。

StringJoiner joiner1 = new StringJoiner( CharSequence   ch );

StringJoiner joiner2 = new StringJoiner( delimiter , prefix , suffix ) ;
//构造一个 StringJoiner使用的供给拷贝在不带字符 prefix , delimiter和 suffix 。

实例:

package com.itlaobing.strings;

import java.util.StringJoiner;

/**
 * 1、JDK 1.8 提供了 StringJoiner 来 操作 字符序列
 * 2、如果需要频繁拼接字符串建议使用 StringJoiner 来实现
 */
public class StringTest5 {
    
    public static void main( String[] args ){
        
        final CharSequence delimiter = "," ;
        StringJoiner joiner1 = new StringJoiner( delimiter ) ;
        
        joiner1.add( "hello" );
        joiner1.add( "world" );
        joiner1.add( "hello" );
        
        String s = joiner1.toString();
        System.out.println( s );
        
        System.out.println( "- - - - - - - - - - - - - - - - - - - -" ); 
        
        CharSequence prefix = "【" ;
        CharSequence suffix = "】" ;
        
        StringJoiner joiner2 = new StringJoiner( delimiter , prefix , suffix ) ;
        
        joiner2.add( "大郎" );
        joiner2.add( "大浪" );
        joiner2.add( "打狼" );
        
        String x = joiner2.toString();
        System.out.println( x );
        
        System.out.println( "- - - - - - - - - - - - - - - - - - - -" ); 
        
        StringJoiner joiner = joiner1.merge( joiner2 );
        System.out.println( joiner == joiner1 ); // true
        System.out.println( joiner == joiner2 ); // false
        
        String t = joiner.toString();
        System.out.println( t );
        
    }

}

String的getChars方法

public void getChars(int srcBegin,
                     int srcEnd,
                     char[] dst,
                     int dstBegin)
/*将此字符串中的字符复制到目标字符数组中。
要复制的第一个字符是索引srcBegin ; 要复制的最后一个字符在索引srcEnd-1 (因此要复制的srcEnd-srcBegin总数为srcEnd-srcBegin )。 字符被复制到的子阵列dst开始于索引dstBegin和在索引结束:

     dstbegin + (srcEnd-srcBegin) - 1 
参数
srcBegin - 要复制的字符串中第一个字符的索引。
srcEnd - 要复制的字符串中最后一个字符后面的索引。
dst - 目标数组。
dstBegin - 目标数组中的起始偏移量。*/
    -----------------------------------------------
    // 第一个参数 begin 表示从字符串那个索引字符开始
    // 第二个参数 end 表示从字符串那个索引字符为止
    // 第三个参数 target 表示将 字符串 中 [ begin , end ) 之间的字符复制那个数组中
    // 第四个参数 start 表示在 目标数组的哪个位置开始从存放字符

实例:

package com.itlaobing.strings;

import java.util.Arrays;

public class StringTest6 {
    
    public static void main( String[] args ) {
        
        char[] buffer = new char[ 10 ];
        
        System.out.println( Arrays.toString( buffer ) );
        
        final String s = "今儿天气不错" ;
        
        // 第一个参数 begin 表示从字符串那个索引字符开始
        // 第二个参数 end 表示从字符串那个索引字符为止
        // 第三个参数 target 表示将 字符串 中 [ begin , end ) 之间的字符复制那个数组中
        // 第四个参数 start 表示在 目标数组的哪个位置开始从存放字符
        // s.getChars( begin , end , target , start );
        s.getChars( 2 , 5 , buffer , 3 );
        
        System.out.println( Arrays.toString( buffer ) );
        
        System.out.println( "- - - - - - - - - - - - - - - - - - - -" ); 
        
        char[] charArray = s.toCharArray();
        System.out.println( Arrays.toString( charArray ) );
        charArray[ 1 ] = '天' ;
        System.out.println( Arrays.toString( charArray ) );
        
        System.out.println( s );
        
    }

}

问题:

1984年以前的年份的天干地支和生肖不会求。

标签

评论


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