Java中String的使用

1 篇文章 0 订阅
1 篇文章 0 订阅

String特性

String的声明:final修饰、实现了Comparable接口
在这里插入图片描述
String 的不可变性: String对象的字符内容是存储在一个字符数组value[]中的 (jdk9前使用char[]) final修饰 表示value的引用是不能改变的

在这里插入图片描述
因此多个String的实例得以指向字符串常量池的同一个字符串,这个字符串不可能会被改变。可以拿现成的字符串使用,而节省空间

   jdk7及之后,字符串常量池与静态变量(静态域)都放在了堆中储存。
   在Java中,引用本身是存储在栈内存中的,而对象则是存储在堆内存中的。

String的两种定义方式

==① 字面量的定义方式 String s = “hello” ==
先从常量池查看是否有"hello"数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址

string s1 = "hello";
String s2 = "hello";
System.out.println("s1==s2")//true

在这里插入图片描述

② new 的方式:String s = new String(“hello”);
既然出现了new,先在堆中创建空间,里面维护了value数组,指向了常量池中的hello,如果常量池没有hello,重新创建,如果有,直接通过value指向。最后s指向的是堆中空间的地址

Person p1 = new Person();
p1.name =Tom";

Person p2 = new Person();
p2.name =Tom";

System.out.println(p1.name.equals( p2.name)); //
System.out.println(p1.name == p2.name); //
System.out.println(p1.name == "Tom"); //

在这里插入图片描述

面试题:String str4 = new String(“abc”) 创建多少个对象?
1、在常量池中查找是否有“abc”对象。
1)有则返回对应的引用实例;
2)没有则创建对应的实例对象。
2、在堆中 new 一个 String("abc") 对象。
3、将对象地址赋值给str4,创建一个引用。

所以,常量池中没有“abc”字面量则创建两个对象,否则创建一个对象,以及创建一个引用。(关系到常量池是否已经存在那个字面量)

String的连接操作:+

  • 常量 + 常量 (还只在常量池)(编译期间就可以确定结果)
  • 变量 + 常量 、变量+变量 (创建一个[[StringBuilder]]的实例,通过append()添加字符串,最后调用toString()返回一个字符串。(toString()内部new 一个String的实例))
  • concat(String otherString)
  • 拼接后调用intern方法:返回值在常量池中
    • String s4 = s1.intern();
    • 说明:堆空间的s1对象在调用intern()之后,会将常量池中k可能存在的"ab"字符串赋值给s4。

String的常用API

构造器

  • public String() :初始化新创建的 String对象,以使其表示空字符序列。
  • String(String original): 初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
  • public String(char[] value) :通过当前参数中的字符数组来构造新的String。
  • public String(char[] value,int offset, int count) :通过字符数组的一部分来构造新的String。
  • public String(byte[] bytes) :通过使用平台的默认字符集解码当前参数中的字节数组来构造新的String。
  • public String(byte[] bytes,String charsetName) :通过使用指定的字符集解码当前参数中的字节数组来构造新的String。

常用方法

(1)boolean isEmpty():字符串是否为空
(2)int length():返回字符串的长度
(3)String concat(xx):拼接
(4)boolean equals(Object obj):比较字符串是否相等,区分大小写
(5)boolean equalsIgnoreCase(Object obj):比较字符串是否相等,不区分大小写
(6)int compareTo(String other):比较字符串大小,区分大小写,按照Unicode编码值比较大小
(7)int compareToIgnoreCase(String other):比较字符串大小,不区分大小写
(8)String toLowerCase():将字符串中大写字母转为小写
(9)String toUpperCase():将字符串中小写字母转为大写
(10)String trim():去掉字符串前后空白符
(11)public String intern():结果在常量池中共享

查找

(11)boolean contains(CharSequence s):是否包含xx
(12)int indexOf(String str):从前往后找当前字符串中xx,即如果有返回第一次出现的下标,要是没有返回-1
(13)int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
(14)int lastIndexOf(String str):从后往前找当前字符串中xx,即如果有返回最后一次出现的下标,要是没有返回-1
(15)int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。

字符串截取

(16)String substring(int beginIndex) :返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
(17)String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。

和字符/字符数组相关

(18)char charAt(index):返回[index]位置的字符
(19)char[] toCharArray(): 将此字符串转换为一个新的字符数组返回
(20)static String valueOf(char[] data) :返回指定数组中表示该字符序列的 String
(21)static String valueOf(char[] data, int offset, int count) : 返回指定数组中表示该字符序列的 String
(22)static String copyValueOf(char[] data): 返回指定数组中表示该字符序列的 String
(23)static String copyValueOf(char[] data, int offset, int count):返回指定数组中表示该字符序列的 String

开头与结尾

(24)boolean startsWith(String str):测试此字符串是否以指定的前缀开始
(25)boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
(26)boolean endsWith(String str):测试此字符串是否以指定的后缀结束

替换

(27)String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 不支持正则。 (28)String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。 (29)String replaceAll(String regex, String replacement):使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
(30)String replaceFirst(String regex, String replacement):使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。

String与其他结构间的转换

编码和解码

  • 编码:字符、字符串 --> 字节、字节数组。对应着编码集

  • 解码:字节、字节数组 --> 字符、字符串。对应着解码集

  • 规则:解码集必须使用当初编码时使用的编码集。只要不一致,就可能出现乱码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值