java中String类型的相关知识总结
一、常用方法:
1.构造方法:
- byte数组
- 可指定offset和length
- 可指定charset
- char数组
- 字符序列
- String
- StringBuffer
- StrngBuilder
2. 实例方法:
charAt(int index) char
codePointAt(int index) int
getBytes() byte[]
getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin) void
toCharArray() char[]
length() int
codePointCount(int beginIndex,int endIndex) int
concat(String str) String
substring(int beginIndex,int endIndex) String
split(String regex) String[]
trim() String
toUpperCase()/toLowerCase String
replace(char oldChar,char newChar) String
replace(CharSequence target,CharSquence replacement) String
replaceAll(String regex,String replacement) String
replaceFirst(String regex,String replacement) String
contains(CharSequence s) boolean
endsWith(String suffix)/startsWith(String prefix) boolean
equals(Object anObject) boolean- public boolean equals(Object anObject) {
- if (this == anObject) {
- return true;
- }
- if (anObject instanceof String) {
- String anotherString = (String)anObject;
- int n = value.length;
- if (n == anotherString.value.length) {
- char v1[] = value;
- char v2[] = anotherString.value;
- int i = 0;
- while (n-- != 0) {
- if (v1[i] != v2[i])
- return false;
- i++;
- }
- return true;
- }
- }
- return false;
- }
复制代码 matches(String regex) boolean
indexOf(int ch/String str)/lastIndexOf()
3. 静态方法:
String.format(String format,Obect... args) String
String.valueOf(xxx) String
二、底层实现:
jdk1.8中String类型底层就是一个char数组:- public final class String
- implements java.io.Serializable, Comparable<String>, CharSequence {
- /** The value is used for character storage. */
- private final char value[];
- }
复制代码 三、不可变性:
String最为人所津津乐道的便是它的不可变性(immutable),这里就引出两个问题,String如何做到不可变的,以及不可变的好处
1. 如何实现不可变:
jdk1.8中String的字符存储在一个char数组里
- char数组final,不可变
- 没有提供任何可以修改数组内容的方法
2. 不可变的好处:
- 不可变,线程绝对安全
- 作为参数不可变,更安全
- 字符串常量池的需要,可以共享而不用担心被谁改变
- hash值不可变,只要算一次,可以缓存hash
3. String和StringBuffer和StringBuilder的区别:
- String不可变,线程安全
- StringBuffer可变,线程安全
- StringBuilder可变,线程不安全
四、缓存池:
1.字符串常量池(String pool)里存放着所有的字符串字面量
- String a="aaa";
- String b="aaa";
- //a,b引用到的String pool里的同一个对象
- a==b//true
复制代码 2. new 出来的String对象放在堆区
- String a=new String("aaa");
- String b=new String("aaa");
- a==b//false
- a=="aaa"//false
- //这里实际是先创建字面量"aaa",再去创建对象的
复制代码 new创建字符串时首先查看池中是否有相同值的字符串,如果有,则拷贝一份到堆中,然后返回堆中的地址;如果池中没有,则在堆中创建一份,然后返回堆中的地址(注意,此时不需要从堆中复制到池中,否则,将使得堆中的字符串永远是池中的子集,导致浪费池的空间)!
- 关于String str=new String("123")创建了几个对象的问题
很显然,new只调用了一次,也就是说只创建了一个对象。而这道题目让人混淆的地方就是这里,这段代码在运行期间确实只创建了一个对象,即在堆上创建了"abc"对象。而为什么大家都在说是2个对象呢,这里面要澄清一个概念,该段代码执行过程和类的加载过程是有区别的。在类加载的过程中,确实在运行时常量池中创建了一个"abc"对象,而在代码执行过程中确实只创建了一个String对象(堆上)。
- public String(String original) {
- this.value = original.value;
- this.hash = original.hash;
- }
复制代码 3. intern()方法
先判断字符串常量池里是否已经有了这个字符串,如果有就返回常量池中该字符串的引用,没有就在常量池中添加并返回常量池中的引用。- String a=new String("aaa");
- a=="aaa"//false
- a=a.intern()
- a=="aaa"//true
复制代码 五、参考资料
鄙人只是一名在读的软件工程专业的本科生,正在复习找工作,故而将复习时遇到的一些有意思的东西总结出来,既是加深理解,也是便于日后复习。
鄙人才疏学浅,若文中有谬误之处,还望诸位不吝斧正,以免误人子弟。若有同道中人想一同讨论学习,也可以联系我=>2938189276@qq.com。未经作者允许,请勿转载!
路漫漫其修远兮,吾将上下而求索。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |