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年以前的年份的天干地支和生肖不会求。
点赞
评论留言