String类

    xiaoxiao2025-03-19  20

    1 实例化方式

    直接赋值

    String str = "Hello World";//str是一个对象,那么“Hello World”应该保存在堆内存中

    构造法

    String str = new String("Hello World");

    实例化的区别:

    1.采用直接赋值

    String str1 = "Hello"; String str2 = "Hello"; System.out.println(str1 == str2);

    为什么现在没有开辟新的内存空间呢?

    在JVM底层实际上会自动维护一个对象池(字符串对象池),如果采用了直接赋值的模式进行String类的对象实例化操作,那么该实例化对象(字符串内容)会自动保存在这个对象池之中,如果下次继续使用直接赋值的模式声明String类对象,此时对象池中如若有指定内容,则直接进行引用;如若没有,则开辟新的字符串而后将其保存在对象池中以供下次使用。

    2.采用构造方法

    String str = new String("Hello");

    通过分析可知,如果使用String构造方法就会开辟两块堆内存空间,并且其中一块内存将成为垃圾空间。

    例:字符串共享问题

    String str1 = new String("Hello"); String str2 = "Hello"; System.out.println(str1==str2);

    该字符串常量并没有保存在对象池之中。

    String类中提供有方法入池操作public String intern();

    String类中两种对象实例化的区别

    1.直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。

    2.构造方法:会开辟两块堆内存空间,其中一块成为垃圾空间,不会自动保存在对象池中,可以通过intern()方法入池。

    2 字符串相等比较

    String str1 = "Hello"; String str2 = new String("Hello"); System.out.println(str1==str2);//false

    上述代码中两个字符串内容相同,而使用==得到的结果不同,这是为什么呢?我们可以看一下内存图分析:

    == 本身是进行数值比较的,如果用于对象比较,那么所比较的应该是两个对象所保存的内存地址数值比较,而并没有比较对象的内容。

    那么要比较内容怎么办呢?则必须采用String类的equals方法。

    String str1 = "Hello"; String str2 = new String("Hello"); System.out.println(str1.equals(str2));

    String类 == 与 equals的区别

    1.“==”:进行数值比较,比较的是两个字符串对象的内存地址数值

    2.“equals()”:进行字符串内容比较

    3 String类的匿名对象

    在Java中,本身也没有提供字符串常量的概念,所有使用""定义的内容的本质上都是String类的匿名对象。

    String str1 = "Hello"; String str2 = new String("Hello"); System.out.println(str1.equals(str2)); System.out.println("Hello".equals(str2));

    "String str1 = "Hello"",本质上是将一个匿名的String类对象设置有名字,而且匿名对象一定保存在堆内存中。

    4 字符串变更

    字符串一旦定义,不可改变。

    String str1 = "Hello"; str1 += "World"; System.out.println(str);

    以上变更是字符串的引用一直在改变,字符串上没有发生任何变化,会形成大量的垃圾空间。

    5 字符与字符串

    No方法名称类型,描述1public String(char value[])构造将字符数组中的内容变成字符串2public char charAt(int index)普通取得指定索引位置的字符3public char[] tocharArray()普通将字符串变成字符数组返回

    6 字符串查找

    No方法名称描述1public boolean contains(CharSequence s)判断一个子字符串是否存在2public int indexOf(String str)从头开始查找子字符串的位置,返回位置开始索引3public int indexOf(String str,int fromIndex)从指定位置开始查找子字符串的位置4public int lastIndexOf(String str)从后向前查找子字符串位置5public int lastIndexOf(String str,int fromIndex)从指定位置由后向前查找6public boolean startsWith(String prefix)判断是否以指定字符串开始7public boolean startsWith(String prefix,int toffset)从指定位置开始判断是否以指定字符串开始8public boolean endWith(String suffix)判断是否以指定字符串结尾

    7 字符串拆分

    public String[] split(String regex);将字符串全部拆分

    8 字符串截取

    public String substriing(int beginIndex);从指定索引截取到结尾

    public String substring(int beginIndex,int endIndex);截取部分内容

    索引从0开始。

    9 其他操作方法

    No方法名称描述1public String trim()去掉字符串的左右空格,保留中间空格2public String toUpperCase()字符串转大写3public String toLowerCase()字符串转小写4public native String intern()字符串入池操作5public String concat(String str)字符串连接6public int lengrh()取得字符串长度7public boolean isEmpty()判断是否为空字符串,但不是null,而是长度为0

    10 StringBuffer类

    String类中使用"+"进行字符串连接,而在StringBuffer类中更改为append()方法

    public synchronized StringBuffer append(各种数据类型 a);

    public class Test{ public static void main(String[] args) { StringBuffer sb = new StringBuffer(); sb.append("Hello").append("World"); display(sb); System.out.println(sb); } public static void display(StringBuffer temp){ temp.append("\n").append("www.sust.com.cn"); } }

    String和StringBuffer相互转换

    String--->StringBuffer:利用StringBuffer的构造方法或append()方法

    StringBuffer--->String:调用toString()方法

    StringBuffer特有的方法

    字符串反转:public synchronized StringBuffer reverse()删除指定范围的数据:public synchronized StringBuffer delete(int start,int end)插入数据:public synchronized StringBuffer insert(int offset,各种数据类型 a)

    String、StringBuffer、StringBuilder的区别

    1.String的内容不可修改,StringBuffer与StringBuilder的内容可以修改

    2.StringBuffer采用同步处理,属于线程安全操作,而StringBuilder采用异步处理,属于线程不安全操作

     

     

     

     

     

     

    最新回复(0)