java中String类型的相关知识总结

Java 投稿 15700 0 评论

java中String类型的相关知识总结

一、常用方法:

1.构造方法:

    • 可指定offset和length

  • char数组

    • 可指定offset和count

    • 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 = (StringanObject;
            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. 如何实现不可变:

  • char数组final,不可变

  • 没有提供任何可以修改数组内容的方法

2. 不可变的好处:

  1. 不可变,线程绝对安全

  2. 作为参数不可变,更安全

  3. 字符串常量池的需要,可以共享而不用担心被谁改变

  4. hash值不可变,只要算一次,可以缓存hash

3. String和StringBuffer和StringBuilder的区别:

  • String不可变,线程安全

  • 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"创建了几个对象的问题

    在类加载的过程中,确实在运行时常量池中创建了一个"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

编程笔记 » java中String类型的相关知识总结

赞同 (69) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽