String 类

2024-10-09 15:29:46 浏览数 (3)

一. 认识 String 类:

在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类

二. String 类的基本用法:

1.字符串构造: 我们构造字符串可以使用常量串构造, 直接newString对象: 使用字符数组进行构造

代码语言:javascript复制
public static void main(String[] args) {
        // 使用常量串构造
        String s1 = "haha";

        // 直接newString对象
        String s2 = new String("hehe");

        // 使用字符数组进行构造
        char[] array = {'h', 'o'};
        String s3 = new String(array);
    }

注意:String是引用类型,内部并不存储字符串本身

他的存储是通过value来维护:如图:

三. String对象的比较:

1. 对于基本类型变量,==比较两个变量中存储的值是否相同

代码语言:javascript复制
// 对于基本类型变量,==比较两个变量中存储的值是否相同
System.out.println(a == b); // false
System.out.println(a == c); // true

2.对于内置类型,==比较的是变量中的值;对于引用类型==比较的是引用中的地址。

代码语言:javascript复制
// 对于引用类型变量,==比较两个引用变量引用的是否为同一个对象
String s1 = new String("hello");
String s2 = new String("hello");
String s3 = new String("world");
String s4 = s1;
System.out.println(s1 == s2); // false
System.out.println(s2 == s3); // false
System.out.println(s1 == s4);

3.String类重写了父类Object中equals方法,Object中equals默认按照==比较,String重写equals方法后,(简单来说,equals比较的是,对象里的内容)

代码语言:javascript复制
public static void main(String[] args) {
        String s1 = new String("bte");
        String s2 = new String("btE");

        String s3 = s1;
        System.out.println(s2 == s1);//false
        System.out.println(s3 == s1);//ture,这里是引用比较
        System.out.println(s1.equals(s3));//true
}

四.字符串的不可变性

1.String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改

其原因. 是String类在设计时就是不可改变的,String类实现描述中已经说明了

2.以下是jdk8中的String类的实现 :

3. 纠正 网上有些人说:字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。这种说法是 错误 的,不是因为String类自身,或者其内部value被final修饰而不能被修改。

4.final 修饰类表明该类不想被继承, final 修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的 内容 可以修改

如图:

5.但是由于维护数组的value(就是引用,也可以理解为地址),被private修饰:所以,数组的引用不能被修改:

总结:

1. String类被final修饰,表明该类不能被继承

2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。

五. 认识 StringBuffer 和 StringBuilder(略讲):

(一)者运行速度: 这段代码可以看出,字符串拼接还是 StringBuffer 和 StringBuilder 比较快,虽然他们,运行时会调用很多方法,但是他们,不会开辟新的字符串对象,所以速度很快。

代码语言:javascript复制
  public static void main(String[] args) {
        long start = System.currentTimeMillis();
        String s = "";
        for(int i = 0; i < 10000;   i){
            s  = i;
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);

        start = System.currentTimeMillis();
        StringBuffer sbf = new StringBuffer("");
        for(int i = 0; i < 10000;   i){
            sbf.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);
        start = System.currentTimeMillis();

        StringBuilder sbd = new StringBuilder();
        for(int i = 0; i < 10000;   i){
            sbd.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);
    }

如图:

方法 说明:

StringBuff append(String str)

在尾部追加,相当于String的 =,可以追加:boolean、char、char[]、

double、float、int、long、Object、String、StringBuff的变量

char charAt(int index)

获取index位置的字符

int length()

获取字符串的长度

int capacity()

获取底层保存字符串空间总的大小

void ensureCapacity(int

mininmumCapacity)

扩容

void setCharAt(int index,

char ch)

将index位置的字符设置为ch

int indexOf(String str)

返回str第一次出现的位置

int indexOf(String str, int fromIndex)

从fromIndex位置开始查找str第一次出现的位置

int lastIndexOf(String str)

返回最后一次出现str的位置

int lastIndexOf(String str, int fromIndex)

从fromIndex位置开始找str最后一次出现的位置

StringBuff insert(int offset, String str)

在offset位置插入:八种基类类型 & String类型 & Object类型数据

StringBuffer deleteCharAt(int index)

删除index位置字符

StringBuffer delete(int start, int end)

删除[start, end)区间内的字符

StringBuffer replace(int start, int end, String str)

将[start, end)位置的字符替换为str

String substring(int start)

从start开始一直到末尾的字符以String的方式返回

String substring(int start,int end)

将[start, end)范围内的字符以String的方式返回

StringBuffer reverse()

反转字符串

String toString()

将所有字符按照String的方式返回

(二).StringBuilder(二者方法都很多,这里示范一个)

1. 由于 String 的不可更改特性,为了方便字符串的修改, Java 中又提供 StringBuilder和StringBuffer 类。这两个类大部分功能是相同的,这里介绍 StringBuilder 常用的一些方法,其它需要用到了大家可参阅 StringBuilder在线文档: Java Platform SE 8

2. StringBuilder 的 append方法:

在尾部追加,相当于 String 的 = ,可以追加: boolean 、 char 、 char[] 、

double 、 float 、 int 、 long 、 Object 、 String 、 StringBuff 的变量:

代码语言:javascript复制
public static void main(String[] args) {

        String s1 = "这样";
        s1  = "拼接";

        //1.即尾插-->字符、字符串、整形数字,相当于上面的拼接
        StringBuilder stringBuilder = new StringBuilder("haha");
        System.out.println(stringBuilder.append(1));


        //要接受,就用toString转化为String类型
        String ret = stringBuilder.toString();
        System.out.println(ret);
    }

注意:String变为StringBuilder: 利用StringBuilder的构造方法或append()方法,StringBuilder变为String用toString方法。

(二).StringBuffer 和 StringBuilder区别 :

1.StringBuffer 和 StringBuilder append方法源码如下:StringBuffer被synchronized修饰,所以,在多线程情况下,可以保证线程安全(相当于他有一个锁,在做事时候不会被别人打扰),StringBuilder 则在单线程情况下,可以保证线程安全

0 人点赞