java 类字符串成员_java常用类与包装类--常用类字符串String类、StringBuffer类、Stringbuilder类...

1.String类

1.1String类的概念和储存结构:

(1)字符串是一个比较特殊的对象,可以使用new,也可以不使用new来创建字符串对象

String s1 = new String("abc"); 堆

String str= "abc"; 常量池

String str2= "abc";

两者的区别:一个在堆中,一个在常量池中

常量池:方法区的一部分,字符串在常量池里面保存一份

(2)字符串是不可变量,一旦初始化就不可以被改变

String s1 = "abc";(直接使用用字符串字面量)

s1 = s1 + "123";//s1变量指向变了(指向了"abc123"),并不是字符串变了。

e8685084d88e380a149d2ebaa15ebef0.png

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

面试题:以下语句创建了几个对象?

String str1= new String("abc");

一个或者两个:

如果之前常量池里有"abc"了,就在堆中创建一个对象;

如果常量池里没有"abc"对象,则先在常量池中把"abc"创建出来,然后再到堆空间中创建对象.

面试题

(3)"abc" vs new String("abc");

String s3 = "abc";

String s4 = "abc"; VS String str1 = new String("abc");

使用new关键字创建的对象都是在堆内存中开辟了新空间,所以地址不可能相同。

不使用new创建的字符串引用的是常量池中的字符串对象,所以地址是相同的

28f0d52eba25d4692d502908ecb15fea.png

4c08d10b782ac4ee43d6e9a65a75083b.png

(4)new String(chs)

b8302acf72229234dc4035901d6d66c8.png

1.2String类的常用构造方法

String(char[] ch)

String(char[] ch,int offset,int count)

String(byte[] bys,int off,int len)

//使用默认的解码,将字节数组解码成String

先在堆中,后在常量池

其构造方法创建的字符串,先在堆中创建出来,

并在常量池保存一个副本(如果常量池中没有的话)

310dc0eabd91db1a6b34f2bac100b09e.png

String(String original)

//用一个原始字符串构建一个新字符串

使用构造方法创建的对象都是在堆中

如果直接使用字符串常量创建对象: new String(String original)

先在常量池中创建对象,然后在堆中创建对象;

补充:char的ASCII

16788a264ef48d0a90499e071c9baeeb.png

int length()--获取字符串中字符的个数

char charAt(int index);

char[] toCharArray();//使用此方法改写统计案例

int indexOf(String str); 有报位置无-1

boolean startsWith(String str);

boolean endsWith(String str);

String[] split(String reg);//统计单词

String substring(int beginIndex);

String substring(int beginIndex,int endIndex);(左闭右开)

1.3 equal方法与==

6b445ce7c5f3bc2709aab7fc33c82268.png

6da05e1c765164a5a94f1f7001b209fc.png

1.4 String 的构造方法

1.4.1成员变量

2200358fab87247f3d4b579a58fd7fb3.png

1.4.2构造方法

789ca905358aeec07702e86b1c979b3b.png

55fbf5b8cefe7931792b0b2c2a0c4e44.png

cb6062e95ad7179f6f891714ee3ae82d.png

e7c78a027c984752e7dfab65edc2abc1.png

12b4b55481020f7191373123b5fc8afa.png

75bb80c8033857e59c0dcd4b8f28ca0b.png

5bdce63f0664814779bb7b6f7ddd7ac7.png

1.5字符串拼接原理

d8cc431d35a769658709cf298d3935e4.png

2.StringBuffer类

类似于String的字符缓冲区,是一个容器。其内部维护了一个字符数组,用于存储字符。StringBuffer可以对字符串内容进行增删

很多方法与String相同。

2.1对成员变量源码研究

cd9f68be7833a5b69242565132c0775d.png

ffa3d6bedafea7a1b32e59dab82d85e5.png

2.2StringBuffer的构造方法

006c90a3c6c4f0dca25b789b08a6011e.png

2.3StringBuffer类特有方法--添加

StringBuffer append(int x)--在末尾追加

StringBuffer insert(int off,插入内容)---指定位置

若:StringBuffer sb = new StringBuffer();

则以下语句等价:

cb4ce8c88b784fee0a0a8833d4c72c1e.png

c38f2532454bc5df225f2b52ccaf5ac1.png

dc7110b88ded3df2c165643480741629.png

0392aa0c7fd14967386266f682bf7726.png

2.3.1append解析

append方法后面可以跟任意数据类型,一下是对append(String str)

89cca298fda229ebbe9507fdf7e014d9.png

2.4StringBuffer类特有方法--删减

StringBuffer delete(int start, int end)

注意位置区间的处理:包前不包后:[start,end)

85bb1c7478646c8964ae0dc984126dcb.png

2.5toString方法

2f778058b3a0e35a8e3eae3414a0f8b0.png

f3ab30b78b76a505b5caad432cb44248.png

313e8fdc7d75d46fc2ed50ca2914f536.png

补充:对比oject类

bc873c02d32591999ead746d924d900a.png

5139aab05736976ef9b440559c5af76c.png

2.5StringBuffer类特有方法--反转功能

StringBuffer reverse()

d4dd7287606290ec59ebb88a08f5c9ca.png

2.6StringBuffer类特有方法--替换功能

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

替换功能:[start,end)

8dcc7e127c8cfa679f5726070615487a.png

3.StringBuilder类

3.1StringBuilder vs StringBuilder

JDK1.5出现了:StringBuilder

区别是从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。

与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。

StringBuilder是同步的,效率稍低

StringBuilder是非同步的,因此速度更快

51046abc6df3addccfa7bf91ed13d8b9.png

3.2练习

练习1:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

将字符串中每个单词反转,例如:

welcome to China

emoclew ot anihC

思路:

考虑使用StringBuffer类的reverse方法

关键是如何将每个单词转换成StingBuffer对象?public classStringBuilderDemo2 {public static voidmain(String[] args) {

String src= new String("welcome to China");//切分成字符串数组

String[] words = src.split(" ");//用来装反转之后的字符串

StringBuilder res = newStringBuilder();//遍历数组,封装成StringBuilder对象

for(int i = 0;i

StringBuilder sb= newStringBuilder(words[i]);

res.append(sb.reverse()).append(" ");

}

System.out.println(res.toString().trim());

}

}

练习

练习2:

ea922ea775a31a02803f56764fc58c5d.png

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public classStringBufferDemo{public static voidmain(String[] args){

StringBuffer s1= new StringBuffer("A");

StringBuffer s2= new StringBuffer("B");

test(s1,s2);

System.out.println(s1+","+s2);//考察 AB,B

}public static voidtest(StringBuffer x,StringBuffer y){

x.append(y);

y=x;

System.out.println("test:"+x+","+ y);//AB,AB

}

}

练习

5f9c63807689afe6c26d47def3809a98.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值