jdk1.8 String类中方法介绍

1. String()
创建一个空字符串
String b = new String();
String a = "";
System.out.println(b.equals( a ));//true

2. String(String original)
构建一个指定字符串的字符串对象

3. String(char value[])
使用字符数组来创建一个字符串对象
String str = new String(new char[]{'a','1','!'});
System.out.println(str);//a1!

4. String(char value[], int offset, int count)
从offset位置开始获取count个字符组成的字符串。注意offset索引是从0开始的
char[] ch = {'a','1','!','b','c','d'};
String str = new String(ch,1,3);
System.out.println(str);//a1!

5. String(int[] codePoints, int offset, int count) 
从offset位置开始获取count个ascii码表对应的图形所组成的字符串。注意offset索引是从0开始的


6. String(byte ascii[], int hibyte, int offset, int count) 
用字节数组ascii从offset位置开始的count个字符创建一个字符串对象,hibyte通常为0
byte[]型在java中是8位的,转换成String就转换成了16位,高8位要填,就是这个hibyte了。不过这个构造器已经被废弃了。在API中可以看到@Deprecated

7. String(byte ascii[], int hibyte) 
用字节数组ascii创建一个字符串对象,hibyte通常为0

8. private static void checkBounds(byte[] bytes, int offset, int length)
用来判断offset,length参数是否越界 

9. public String(byte bytes[], int offset, int length, String charsetName)
利用指定的charsetName编码,该编码可以使UTF-8,GBK等,将字节数组从offset位置开始的count个字符的字符串对象

10. String(byte bytes[], int offset, int length, Charset charset)
通过使用指定的 charset 解码指定的 byte 子数组,构造一个新的 String。


11. String(byte bytes[], String charsetName)
通过使用指定的字符集解码指定的 byte 子数组,构造一个新的 String。


12. String(byte bytes[], Charset charset)
通过使用指定的 charset 解码指定的 byte 子数组,构造一个新的 String。

13. String(byte bytes[], int offset, int length)
通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。

14. String(byte bytes[])
将字节数组转换成字符串对象

15. String(StringBuffer buffer)
将stringbuffer对象转换成string对象
Arrays.copyOf(buffer.getValue(), buffer.length()),线程安全,被同步代码块修饰

16. String(StringBuilder builder)
同15,线程不安全

17. String(char[] value, boolean share)
一个特殊的保护类型的构造方法
String除了提供了很多公有的供程序员使用的构造方法以外,还提供了一个保护类型的构造方法(Java 7),我们看一下他是怎么样的:

String(char[] value, boolean share) {
    // assert share : "unshared not supported";
    this.value = value;
}
从代码中我们可以看出,该方法和 String(char[] value)有两点区别,第一个,该方法多了一个参数: boolean share,其实这个参数在方法体中根本没被使用,也给了注释,目前不支持使用false,只使用true。那么可以断定,加入这个share的只是为了区分于String(char[] value)方法,不加这个参数就没办法定义这个函数,只有参数不能才能进行重载。那么,第二个区别就是具体的方法实现不同。我们前面提到过,String(char[] value)方法在创建String的时候会用到 会用到Arrays的copyOf方法将value中的内容逐一复制到String当中,而这个String(char[] value, boolean share)方法则是直接将value的引用赋值给String的value。那么也就是说,这个方法构造出来的String和参数传过来的char[] value共享同一个数组。 那么,为什么Java会提供这样一个方法呢? 首先,我们分析一下使用该构造函数的好处:

首先,性能好,这个很简单,一个是直接给数组赋值(相当于直接将String的value的指针指向char[]数组),一个是逐一拷贝。当然是直接赋值快了。
其次,共享内部数组节约内存

但是,该方法之所以设置为protected,是因为一旦该方法设置为公有,在外面可以访问的话,那就破坏了字符串的不可变性。例如如下YY情形:

char[] arr = new char[] {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
String s = new String(0, arr.length, arr); // "hello world"
arr[0] = 'a'; // replace the first character with 'a'
System.out.println(s); // aello world
如果构造方法没有对arr进行拷贝,那么其他人就可以在字符串外部修改该数组,由于它们引用的是同一个数组,因此对arr的修改就相当于修改了字符串。

所以,从安全性角度考虑,他也是安全的。对于调用他的方法来说,由于无论是原字符串还是新字符串,其value数组本身都是String对象的私有属性,从外部是无法访问的,因此对两个字符串来说都很安全。

在Java 7 之有很多String里面的方法都使用这种“性能好的、节约内存的、安全”的构造函数。比如:substring、replace、concat、valueOf等方法(实际上他们使用的是public String(char[], int, int)方法,原理和本方法相同,已经被本方法取代)。

但是在Java 7中,substring已经不再使用这种“优秀”的方法了,为什么呢? 虽然这种方法有很多优点,但是他有一个致命的缺点,对于sun公司的程序员来说是一个零容忍的bug,那就是他很有可能造成内存泄露。 看一个例子,假设一个方法从某个地方(文件、数据库或网络)取得了一个很长的字符串,然后对其进行解析并提取其中的一小段内容,这种情况经常发生在网页抓取或进行日志分析的时候。下面是示例代码。

String aLongString = "...a very long string..."; 
String aPart = data.substring(20, 40);
return aPart;
在这里aLongString只是临时的,真正有用的是aPart,其长度只有20个字符,但是它的内部数组却是从aLongString那里共享的,因此虽然aLongString本身可以被回收,但它的内部数组却不能(如下图)。这就导致了内存泄漏。如果一个程序中这种情况经常发生有可能会导致严重的后果,如内存溢出,或性能下降。

新的实现虽然损失了性能,而且浪费了一些存储空间,但却保证了字符串的内部数组可以和字符串对象一起被回收,从而防止发生内存泄漏,因此新的substring比原来的更健壮。

额、、、扯了好远,虽然substring方法已经为了其鲁棒性放弃使用这种share数组的方法,但是这种share数组的方法还是有一些其他方法在使用的,这是为什么呢?首先呢,这种方式构造对应有很多好处,其次呢,其他的方法不会将数组长度变短,也就不会有前面说的那种内存泄露的情况(内存泄露是指不用的内存没有办法被释放,比如说concat方法和replace方法,他们不会导致元数组中有大量空间不被使用,因为他们一个是拼接字符串,一个是替换字符串内容,不会将字符数组的长度变得很短!)。

18. int length() 
获取字符串长度

19. boolean isEmpty() 
判断字符串是否为空

20. char charAt(int index) 
获取指定位置的字符,索引从0开始

21. int codePointAt(int index)
获取指定索引位置字符的ascii码
byte[] bytes = new byte[]{65,66,67,68};
String str = new String(bytes);
System.out.println(str.codePointAt(1));//66

22. int codePointBefore(int index) 
获取指定索引位置前一个字符的ascii码

23. int codePointCount(int beginIndex, int endIndex) 
获取指定索引区间字符个数

24. int offsetByCodePoints(int index, int codePointOffset) 
获取指定开始位置的指定索引位置的实际索引位置

25. void getChars(char dst[], int dstBegin) 
私有方法

26. void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)
将指定索引范围的字符复制到dst字符数组中,dstbegin表示复制到的开始位置

27. void getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin)  
将指定索引范围的字节复制到dst字节数组中,dstbegin表示复制到的开始位置

28. byte[] getBytes(String charsetName)
获取指定编码的字节数组

29. byte[] getBytes() 
获取系统平台默认编码的字节数组 

30. boolean equals(Object anObject)
判断两个对象

31. boolean contentEquals(StringBuffer sb)
字符串内容比较

32. boolean nonSyncContentEquals(AbstractStringBuilder sb)
字符串内容比较

33. boolean contentEquals(CharSequence cs)

34. boolean equalsIgnoreCase(String anotherString)
忽略大小写比较

35. int compareTo(String anotherString)
比较两个对象的ascii表内容,返回ascii码差

36. public static final Comparator<String> CASE_INSENSITIVE_ORDER  = new CaseInsensitiveComparator();
37. private static class CaseInsensitiveComparator implements Comparator<String>, java.io.Serializable 

38. int compareToIgnoreCase(String str) 
忽略大小写比较两个对象的ascii表内容,返回ascii码差

39. boolean regionMatches(int toffset, String other, int ooffset, int len)
表示从当前字符串的toffset位置开始,取一个长度为len的子串;然后从另一个字符串other的ooffset位置开始也取一个长度为len的子串,然后比较这两个子串是否相同,如果这两个子串相同则返回true,否则返回false。

40. boolean regionMatches(boolean ignoreCase, int toffset,String other, int ooffset, int len) 
同上,ignoreCase为true时表示忽略大小写比较

41. boolean startsWith(String prefix, int toffset)
从toffset位置开始判断该字符串是否已prefix开头

42. boolean startsWith(String prefix)
从索引0位置判断字符串是否已prefix开头

43. boolean endsWith(String suffix)
判断字符串是否已suffix结束

44. int hashCode()
获取字符串的hashcode码

45. int indexOf(int ch)
获取字符串第一次出现ascii码的索引位置

46. int indexOf(int ch, int fromIndex)
从fromIndex指定位置开始,获取字符串第一次出现ascii码的索引位置

47. int indexOfSupplementary(int ch, int fromIndex)
该方法私有,返回指定的代码点表示的字符在当前字符串中第一次出现的索引位置 

48. int lastIndexOf(int ch)
获取字符串最后一次出现ascii码的索引位置

49. int lastIndexOf(int ch, int fromIndex)
从fromIndex指定位置开始,获取字符串最后一次出现ascii码的索引位置

50. int lastIndexOfSupplementary(int ch, int fromIndex)
该方法私有,...

51. int indexOf(String str)
获取指定字符串出现的位置

52. int indexOf(String str, int fromIndex)
从指定位置开始,获取指定字符串出现的位置

53. int indexOf(char[] source, int sourceOffset, int sourceCount, String target, int fromIndex) 
返回指定目标字符数组的[targetOffset,targetOffset + targetCount]区间内字符序列,在源字符数组的[sourceOffset,sourceOffset + sourceCount]区间内字符序列中,第一次出现的索引位置 

54. int indexOf(char[] source, int sourceOffset, int sourceCount, char[] target, int targetOffset, int targetCount, int fromIndex)

55. int lastIndexOf(String str)
返回指定字符串在当前字符串对象中的最后一次出现的索引位置 

56. int lastIndexOf(String str, int fromIndex)
返回指定字符串在当前字符串对象中的最后一次出现的索引位置,在当前字符串上从指定的fromIndex索引位置开始搜索 

57. int lastIndexOf(char[] source, int sourceOffset, int sourceCount,String target, int fromIndex)
返回指定目标字符数组的[targetOffset,targetOffset + targetCount]区间内字符序列 ,在源字符数组的[sourceOffset,sourceOffset + sourceCount]区间内字符序列中 ,最后一次出现的索引位置 

58. int lastIndexOf(char[] source, int sourceOffset, int sourceCount,char[] target, int targetOffset, int targetCount, int fromIndex)

59. String substring(int beginIndex)
获取重beginIndesx位置开始的剩余全部字符串

60. String substring(int beginIndex, int endIndex)
获取指定范围的字符串

61. CharSequence subSequence(int beginIndex, int endIndex)
截取[beginIndex,endIndex)之间的字符串,最终生成CharSequence对象 , 与substring(int beginIndex, int endIndex)方法类似,区别就是返回值类型不同 

62. String concat(String str)
将str连接到当前字符串的末尾,等于+

63. String replace(char oldChar, char newChar)
替换当前字符串对象中所有出现的oldChar字符为newChar字符,最终 
返回一个新的字符串对象 
若当前字符串对象中不包含oldChar字符,那么直接return this,否则, 
会生成一个新的字符串对象并返回 

64. boolean matches(String regex)
检测当前字符串是否符合给定的正则表达式 

65. boolean contains(CharSequence s)
当且仅当当前字符串包含指定的字符序列才会返回true 

66. String replaceFirst(String regex, String replacement) 
根据给定的正则表达式替换当前字符串匹配到的第一个子字符串为参数replacement表示的字符串 
注意:replacement参数中若包含反斜杠\和美元符号$可能会与直接将其当做纯文本替换字符串 
返回的结果不一致.如果你需要抑制特殊字符的潜在含义,那么你可能会需要使用 
java.util.regex.Matcher类的quoteReplacement方法来实现当前方法的功能。默认情况下, 
当前方法是采用java.util.regex.Matcher类的replaceFirst方法实现的. 

67. String replaceAll(String regex, String replacement)
根据给定的正则表达式替换当前字符串匹配到的所有子字符串为参数replacement表示的字符串 
注意:replacement参数中若包含反斜杠\和美元符号$可能会与直接将其当做纯文本替换字符串 
返回的结果不一致.如果你需要抑制特殊字符的潜在含义,那么你可能会需要使用 
java.util.regex.Matcher类的quoteReplacement方法来实现当前方法的功能。默认情况下, 
当前方法是采用java.util.regex.Matcher类的replaceAll方法实现的. 

68. String replace(CharSequence target, CharSequence replacement)
将当前字符串中第一次出现的target字符序列替换为replacement字符序列 
注意:若target或replacement参数中包含了正则表达式中的特殊字符,会一律 
按照纯文本字符去理解,不会被理解为它在正则表达式中表达的含义, 
即当前方法不支持正则表达式. 

69. String[] split(String regex, int limit)
按照regex进行字符分割,limit表示分割成几部分

70. String[] split(String regex)
按照regex进行字符分割

71. static String join(CharSequence delimiter, CharSequence... elements)
在指定elements之间插入delimiter来形成一个新的字符串

72. static String join(CharSequence delimiter,Iterable<? extends CharSequence> elements)
同上

73. String toLowerCase(Locale locale)
使用给定Local的大小写形式的转换规则将当前字符串对象的字符序列中包含的每个字符转换成小写形式 
由于大小写映射并不总是以1:1的形式进行字符映射,因此可能会导致转换后的字符串长度与原字符串的长度不一致. 

74. String toLowerCase()
将字符串转换成小写

75. String toUpperCase(Locale locale)
同73

76. String toUpperCase()
将字符串转换成大写

77. String trim()
去掉字符串两端的空白

78. String toString()
返回字符串本本身

79. char[] toCharArray()
将字符串转换成字符数组

80. static String format(String format, Object... args)
使用指定的字符串格式和参数返回一个格式化后的字符串 

81. static String format(Locale l, String format, Object... args)
使用指定的字符串格式和参数在指定的语言环境下返回一个格式化后的字符串 

82. static String valueOf(Object obj)
将指定的obj对象转换成String对象 

83. static String valueOf(char data[])
将指定的字符数组对象转换成String对象 

84. static String valueOf(char data[], int offset, int count) 
将指定的字符数组的[offset,offset + count]区间内的字符序列转换成一个字符串对象 

85. static String copyValueOf(char data[], int offset, int count)
将指定的字符数组的[offset,offset + count]区间内的字符序列转换成一个字符串对象 
同valueOf(char data[], int offset, int count)方法实现细节一模一样,仅仅只是方法名称不同 

86. static String copyValueOf(char data[])
将指定的字符数组转换成一个字符串对象 
同valueOf(char data[])方法的具体实现细节一模一样,仅仅只是方法名称不同 

87. tatic String valueOf(boolean b)
 将boolean变量值转换成一个字符串对象 

88. static String valueOf(char c)
 将字符变量值转换成一个字符串对象 

89. static String valueOf(int i)
 将整形变量值转换成一个字符串对象 
90. static String valueOf(long l)
将长整形变量值转换成一个字符串对象 

91. static String valueOf(float f)
将float变量值转换成一个字符串对象 

92. static String valueOf(double d)
将double变量值转换成一个字符串对象 

93. native String intern()
返回字符串对象的规范化表示形式 
字符串常量池初始化默认是空的,它由String类私下管理维护 
当intern方法被执行,如果字符串常量池已经包含了与当前字符串对象equals的字符串, 
那么直接从字符串常量池里返回该字符串对象即可,否则会将该字符串对象添加到常量池中 
并返回. 
因此对于任意的两个字符串s和t, 
当且仅当s.equals(t) == true, 
s.intern() == t.intern()才会返回true. 
所有的字符串字面量以及基于String的常量表达式都会被字符串常量池集中管理和返回. 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值