JAVA String类笔记(自用)

String 类

String类 : 代表字符串 。JAVA程序中的所有字符串字面值(如"abc")都作为此类的实例实现

String是一个final 类 代表不可变的字符序列

字符串是常量 ,用双引号引起来表示.它们的值在创建之后不能更改

String 对象的字符内容是存储在一个字符数组value[]中。

String : 字符串 使用一对“” 引起表示

1String 声明为final 不可被继承

2 String 实现了Serializable 接口 表示字符串是支持序列化的

3 实现了Comparable接口 表示String可以表示大小

4 .String 内部定义了 final char[] value 用于存储字符串数据

String 不可变性 体现: 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
党对现有的字符串进行连接操作时,也需要重新制定内存区域赋值 不能使用原有的value赋值
当调用String 的replace()方法 修改指定字符串时,也需要重新制定内存区域赋值 不能使用原有的value赋值。

5,通过字面量的方式 (区别于new直接赋值 例如 String s =“abc”)给一个字符串赋值,此时字符串值声明在字符串常量池
字符串常量池中是不会存储相同内容的字符串。

String的实例化方式

方式一: 通过字面量的方式

方式二: 通过new +构造器的方式

//通过字面量定义的方式 此时的s1和s2的数据javaEE声明在方法区的字符串常量池中
String s1=  "javeEE";
String s2 = "javeEE";
//通过new 加构造器的方式 此时 s3 和s4 保存的地址值是数据在堆空间开辟空间以后对应的地址值
String s3 = new String("javaEE");
String s4 = new String("javaEE");
System.out.println(s1==s2);//true
System.out.println(s1==s3);//false
System.out.println(s1==s4);//false
//(从堆空间指向共同的常量池 是两个对象所以地址不同)
System.out.println(s3==s4);//false

思考:String s = new String (“abc”) 方式创建对象 在内存中创建了几个对象?

两个: 一个堆空间的new 结构 另一个是char[]对应的 常量池中的数据“abc”

String  s1 ="a";
String  s2 ="b";
String  s3 ="ab";
String  s4 =s1+s2;
String  s5 ="a"+S2;
String  s6= "a"+"b";
System.out.println(s3==s6);//true
System.out.println(s3==s4);//false
System.out.println(s3==s5);//false

结论
常量与常量的拼接结果在常量池,切常量池不会存在相同内容的常量
只要其中有一个是变量 结果就在堆中
如果拼接的结果调用intern()方法 返回值就在常量池中

String 常用方法

类型方法作用
intlength()返回字符串的长度
charcharAt(int index)返回索引处的字符
booleanisEmpty()判断是否是空字符串
StringtoLowerCase()将String中的所有字符转换为小写
StringtoUppreCase()将String中所有字符转换成大写
Stringtrim()返回字符串的副本,忽略前导空白和尾部空白
Stringconcat(String str)将指定字符串连接到此字符串的结尾 等价于用+
intconparaTo(String anotherString)比较两个字符串大小
Stringsubstring(int beginIndex)返回一个新的字符串 ,它是此字符串的从index开始截取到最后一个子字符串
Stringsubstring(int beginIndex,int endIndex)返回一个新的字符串 ,它是此字符串的从index开始截取到endIndex(不包含)一个子字符串
booleanendsWith(String suffix)测试此字符串是否以指定的后缀结束
booleanstatrtWith(String preflx)判断此字符串是否以指定的前缀开始
booleanstatrtWith(String preflx,int toffset)测试此字符串从指定索引开始子字符串是否以指定的前缀开始
booleancontains( CharSequence s)当且仅当此字符串包含指定的char值序列时 返回 true
intindexOf(String srt)返回指定子字符串在此字符串中第一次出现的索引
intindexOf(String srt,int fromIndex)返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
intlastIndexOf(String str)返回指定字符串在此字符串中最右边出现处的索引 (从后往前找 但是返回索引还是从前面数)
intlastIndexOf(String str,int fromIndex)返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
Stringreplace(char oldChar,char newChar)返回一个新的字符串 ,它是通过newChar 替换此字符串中出现的所有oldChar得到的

String 和 其他结构的转换

String与基本数据类型的转换调用包装类的静态方法 parseXXX(str)

基本数据类型 转换成String ---- String,valueof()

String 与 字符数组之间转换 (char[])
String → 字符数组 String.toCharArray();
字符数组→String 调用String的构造器 new String( char[])

String 与byte[]之间的转换

编码 String → byte[] 调用String的 getBytes()方法 使用默认的字符集 进行转换

解码 调用String的构造器 new String(byte[]) 解码时要求解码使用的字符集必须与编码时使用的一致 ,否则会出现乱码

StringBuffer 和StringBuilder

String 和 StringBuffer 和StringBuilder 的异同

String : 不可变字符序列 底层使用char[]数组存储

StringBuffer 可变字符序列 线程安全的 效率偏低 底层使用char[]数组存储

StringBuilder 可变字符序列 JDK5.0新增的 线程不安全 效率高 底层使用char[]数组存储

StringBuffer sb =new StringBuffer(); char[] c =new char[16] ;底层创建了一个长度是16的char型数组
若盛不下了 则会进行自动扩容 默认扩容为原来容量的2倍+2 同时将原有数组中的元素复制到新的数组中

append();添加
sb.append("a")     c[0]='a';
sb.append("b")      c[1]='b';

如果 StringBuffer sb =new StringBuffer(“abc”); 相当于实在你str的长度的基础上再加16

建议使用StringBuffer( int capacity) 或StringBuild(int capacity) 指定容量 避免扩容

StringBuffer类的常用方法

方法作用
append()用于字符串拼接
delete(int start,int end)删除指定位置的内容
replace(int start, int end, String str)把【start,end) 位置替换为str
reverse()把当前字符序列逆转
insert(int offset,xxx)在指定位置插入xxx
indexof(String srt)跟String的一样
substring(int beginIndex,int endIndex)同上
length()同上
charAt(int n )指定位置的字符
setCharAt( int n ,char ch)修改指定位置的字符

总结 :
增 append
删 delete
改 setCharAt /replace
查 charAt
长度 length

效率 StringBuilder > StringBuffer >String

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值