上一章节传送门 --> jdk8源码分析笔记1 --> Object.classjava
挑选了String.class大部分代码,进行@Test测试。app
话很少说,code演示源码分析
import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.stream.IntStream; import org.junit.Test; public class TestString { @Test public void testConstructor() { String strA = new String(); System.out.println(strA);// } @Test public void testConstructorByCharArr() { char[] charArr = {'a', 'b', 'c'}; String strA = new String(charArr); System.out.println("strA =" + strA);//strA =abc } @Test public void testConstructorByIndex() { char[] charArr = {'a', 'b', 'c', 'd', 'e'}; String strA = new String(charArr, 1, 2); System.out.println("strA = " + strA);//strA = bc } /** * 从insArr里面,第offset位置开始拿,拿取的长度是3个,并转换成char,组合成字符串String */ @Test public void testConstructorByIntArr() { int[] insArr = {65, 66, 67, 68, 69, 70, 71};//A,B,C,D,E,F,G String strA = new String(insArr, 2, 3); System.out.println(strA);//CDE } /** * 从 bytesArr 里面,第offset位置开始拿,拿取的长度是3个,并转换成char,组合成字符串String Charset charset */ @Test public void testConstructorByBytes() { byte[] bytesArr = {65, 66, 67, 68, 69, 70, 71}; String strA = new String(bytesArr, 0, 3, StandardCharsets.UTF_8); System.out.println(strA);//ABC String strB = new String(bytesArr, StandardCharsets.UTF_8); System.out.println(strB);//ABCDEFG String strC = new String(bytesArr, 0, 3);//Charset.defaultCharset().name();读取系统的编码环境 System.out.println(strC);//ABCD } @Test public void testConstructorByStringBuff() { StringBuffer sbuf = new StringBuffer(); sbuf.append(1).append('a').append("AA"); String strA = new String(sbuf); System.out.println(strA);//1aAA } @Test public void testConstructorByStringBuild() { StringBuilder sbud = new StringBuilder(); sbud.append(1).append('a').append("AA"); String strA = new String(sbud); System.out.println(strA);//1aAA } @Test public void testStringLength() { String strA = ""; String strB = " "; String strC = null; System.out.println(strA.length());//0 System.out.println(strB.length());//3 System.out.println(strC.length());//throw NullPointerException } @Test public void testStringIsEmpty() { String strA = ""; String strB = null; String strC = " "; System.out.println(strA.isEmpty());//true System.out.println(strC.isEmpty());//false System.out.println(strB.isEmpty());//throw NullPointerException } @Test public void testCharAt() { String strA = "我爱个人祖国"; IntStream.range(0, strA.length()).forEach(ints -> System.out.print(strA.charAt(ints)));//我爱个人祖国 } /** * 获取字符串下标 index 的 codePoint */ @Test public void testCodePointAt() { String strA = "ABCDEFG"; int codePoint = strA.codePointAt(0); System.out.println(codePoint);//65 } /** * 返回index下标的前一位字符的 codePoint */ @Test public void testCodePointBefore() { String strA = "ABCDEFG"; int codePoint = strA .codePointBefore(strA.length());//index>0 or throw StringIndexOutOfBoundsException System.out.println(codePoint);//65 } /** * 增补字符,即代码点为 U+10000~U+10FFFF 的字符,这是 Unicode 5.0 中新增的代码点字符。 在 Java 中一个 Unicode 字符是使用 UTF-16 编码的 char 进行表示的, * 也就是一个 char 只能表示 U+0000~U+FFFF 的 Unicode 基本字符(BMP)。 所以在 Java 中须要表示 U+10000~U+10FFFF 的字符须要使用 一对代理字符进行表示, * 高代理字符的范围为 U+D800~U+DBFF,低代理字符的范围为 U+DC00~U+DFFF。 好比表示 U+10400 的字符须要两个 char(U+D801, U+DC00)才能表示, * 这时的代码点长度为 1,而代码单元长度为 2 转自 https://blog.csdn.net/weixin_40841731/article/details/83617660 没弄明白 * codePointCount的使用场景 */ @Test public void testCodePointCount() { char[] chs = Character.toChars(0x10400); System.out.println(chs.length); System.out.printf("U+10400 高代理字符: %04x%n", (int) chs[0]); System.out.printf("U+10400 低代理字符: %04x%n", (int) chs[1]); String str = new String(chs); System.out.println("代码单元长度: " + str.length()); System.out.println("代码点数量: " + str.codePointCount(0, str.length())); } @Test public void testOffsetByCodePoints() { char[] chs = Character.toChars(0x10400); String strA = new String(chs); System.out.println("\"" + strA + "\".length()==" + strA.length());//"𐐀".length()==2 int iA = strA.offsetByCodePoints(0, 1); System.out.println(iA);//2 System.out.println("-------分割线-------"); String strB = "ab"; System.out.println("\"" + strB + "\".length()==" + strB.length());//"ab".length()==2 int iB = strB.offsetByCodePoints(0, 1); System.out.println(iB);//1 } /** * charsArr的长度是不可变的 容许范围内截取的strA长度+dstBegin,不能超过 charsArr的长度,不然抛异常 */ @Test public void testGetChars() { String strA = "我爱个人祖国"; char[] charsArr = new char[5]; strA.getChars(0, 5, charsArr, 0); System.out.println(String.valueOf(charsArr)); } @Test public void testGetBytes() { String strA = "ABCDEF"; byte[] bytes1 = strA.getBytes(); for (byte b : bytes1) { System.out.println(b); } System.out.println("---------分割线---------"); byte[] bytes2 = strA.getBytes(StandardCharsets.UTF_8); for (byte b : bytes2) { System.out.println(b); } } @Test public void testCopyOfStr() { char[] charsArr = {'A', 'B', 'C'}; String str = new String(charsArr); String strCopy = String.copyValueOf(charsArr); System.out.println(str == strCopy);//false 深拷贝 System.out.println(str.equals(strCopy));//true } @Test public void testEndWithAndStartWith() { String strA = "ahbcahg"; System.out.println(strA.endsWith("hg"));//true System.out.println(strA.startsWith("ah"));//true } @Test public void testIndexOf() { String strA = "ahbcahg"; System.out.println(strA.indexOf("a"));//0 System.out.println(strA.lastIndexOf("ah"));//4 } @Test public void testJoinAndSplit() { ArrayList<String> strList = new ArrayList<>(); IntStream.range(0, 3).forEach(ints -> strList.add(ints + "str")); String joinStr = String.join(",", strList); System.out.println(joinStr);//0str,1str,2str System.out.println(joinStr.replace("str", ""));//0,1,2 System.out.println(joinStr.replaceAll("str", ""));//0,1,2 Arrays.asList(joinStr.split(",")).forEach(System.out::print);//0str1str2str } @Test public void testFormat() { String format = String.format("%d%s喜欢%s没有%s", 1, "我", "代码", "BUG"); System.out.println(format);//1我喜欢代码没有BUG } @Test public void testValueOf() { String strA = ""; String strB = " "; String strC = null; System.out.println(strA);// System.out.println(strB);// System.out.println(strC);//源码作了非空处理 } @Test public void testIntern() { String str1 = "aaa"; String str2 = "bbb"; String str3 = "aaabbb"; String str4 = str1 + str2; String str5 = "aaa" + "bbb"; System.out.println(str3 == str4); // false System.out.println(str3 == str4.intern()); // true System.out.println(str3 == str5);// true } }
已是最新章节了,will be continue...测试