Java中的String类详解(一)

String:用于保存字符串,即一组字符序列。

String类分别实现了Serializable、Comparable、CharSequence和Object接口

        1.实现了Serializable接口,表明String可以串行化(在网络上进行传输)

        2.实现了Comparable接口,表明String创建的对象实例可以相互比较

        3.实现了CharSequence接口,即字符序列接口

字符串中的字符都采用的是Unicode字符编码,一个字符(无论是汉字还是字母)都占用两个字节

JVM中为减少字符串对象的重复创建,维护了一块特殊的内存空间,即字符串常量池。

Java中创建字符串对象存在两种形式:

        1.利用字面量形式:String str = "abc";

                使用字面量形式创建字符串时,JVM会在字符串常量池中进行检查,是否存在相同内容的字符串对象的引用。如果存在,则将该引用返回。如果不存在,则创建字符串对象,并将引用放在字符串常量池中,返回常量池中的引用。

                所以,使用字面值创建对象时,str直接指向字符串常量池中的某块空间(引用)

        2.利用new对象实例:String str = new String();

                使用new对象实例的方式创建字符串时,不管字符串常量池中是否有相同内容的对象引用,都会在堆上创建String对象的引用。引用中维护了value属性,其指向String字符串对象。

// String中重写了equals方法,比较的是两个字符串内容是否相等
// ==,运算符,比较判断的是两个字符串地址是否相等

String str1 = "kxg";
String str2 = new String("kxg");
System.out.println(str1.equals(str2)); // true
System.out.println(str1 == str2); // false

String a = "abc";
String b = "abc";
System.out.println(a.equals(b)); // true
System.out.println(a == b); // true

String类通过final修饰,代表不可变的字符序列。即:字符串是不可变的。

        字符串常量池形成的条件就是String不可变。当多个变量共享一个字符串对象时,如果String对象可变,则一个引用操作改变了字符串变量的值,其他的变量也会受到影响。

所以改变变量的值,需要改变其所指向的引用,而不是改变字符串的值。



String s1 = "hello" + "kxg";
// 编译器会对该语句进行优化:String s1 = "hellokxg";所以仅仅创建了一个对象

String s2 = "hello"; // 创建字符串对象"hello"
String s3 = "kxg"; // 创建字符串对象"kxg"
String s4 = s2 + s3; 
    // StringBuilder str = new StringBuilder();  str.append("hello");  str.append("kxg");
    // s4=str.toString();

// s1指向的是常量池中的引用;而s4指向的是堆上的引用

System.out.println(s1.equals(s4)); // true
System.out.println(s1 == s4); // false

// 当两个字符串常量相加时,池中相加,结果指向的是常量池中的地址
// 当存在字符串变量相加时,堆上通过StringBuilder的append相加,结果指向堆上的地址

String类中的常用方法:

        (1)equals方法:判断两个字符串的内容是否相等,区分大小写

        (2)equalsIgnoreCase方法:判断两个字符串内容是否相等,忽略大小写

        (3)length方法:获取字符串的长度(字符的个数)

        (4)indexOf方法:获取某个字符在字符串中第一次出现时的索引位置

        (5)lastIndexOf方法:获取某个字符在字符串中最后一次出现的索引位置

                        indexOf方法、lastIndexOf方法不仅仅可以是单个字符,也可以是某部分子串

        (6)subString方法:截取某部分子串

                        subString(int index):从索引为index的位置开始截取

                        subString(int start, int end):从start位置开始截取,截取到(end-1)的位置

        (7)toUpperCase方法:将字符串中全部字符转为大写

        (8)toLowerCase方法:将字符串中全部字符转为小写

        (9)concat方法:拼接字符串

        (10)replace方法:替换字符串中的字符

                        replace(XXX, YYY):将字符串中所有的XXX替换成YYY

        (11)split方法:对字符串进行分割

        (12)toCharArray方法:字符串转为字符数组

        (13)compareTo方法:比较两个字符串的大小

                        两个字符串挨个字符比较。前者大,返回正数;后者大,返回负数;相等,返回0

        (14)format方法:格式化字符串

                        %s、%d、%f、%c都是占位符,分别表示字符串、整数、小数、字符来替换

                        %.2f表示小数仅仅保留两位(四舍五入)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值