String必知必会

String必知必会

String类型

一、相关概率
二、String字面量和new String()的区别
三、字符串常量拼接
四、字符串常量+字符串变量、字符串变量之间的拼接
五、String常用的方法

一、相关概率
  • String声明为final,不可被继承
  • String实现了Serializable接口 表示字符串是支持序列化。
  • String实现了Comparable接口 表示String可以进行比较大小
  • String内部定义了final char[] value用于存储字符串数据
  • String代表不可变的字符序列。简称:不可变性(由于String对象的内容(对象内存地址所存的内容)是不能改变的,但String引用(变量)是可以改变的,可以让其指向另外一个字符串。(不能修改字符串的内容,但可以修改字符串的引用))
二、String字面量
String str1="abc";
String str2="abc";

赋值的过程是:

1.首先在编译期,JVM会去常量池来查找是否存在abc如果有则str1直接引用,如果没有则在字符串常量池创建abc

2.str2="abc" 同上原理 先去方法区中的字符串常量池中找是否有abc如果有则str2直接引用,如果没有则在字符串常量池创建abc

总结:字符串常量池中不会存放相同内容的字符串

二、new String()
String str = new String("abc")

赋值的过程是:

1.先去在编译期,JVM会去常量池来查找是否存在abc如果不存在就创建,存在的话直接引用地址

2.然后在运行时期,通过new String()在堆空间开辟了一块str的空间,然后直接引用字符串常量池abc的地址

三、字符串常量拼接
String str3 = "Hello"+" word";
String str4 = "Hello word";
System.out.println(str3 == str4); //true

上面是字符串常量拼接的例子:在编译时,JVM编译器对字符串做了优化,str3就被优化成“Hello word”str3str4指向字符串常量池同一个字符串常量,所以==比较为true

其实还有一种拼接方式可以使字符串与变量的拼接也去和常量池中的字符串比较:

String str1 = "Helloworld!";
final String str2 = "Hello"; 
String str3=str2+"world!";
System.out.println(str1 == str3); //true

上面是给str2变量加上了final修饰符,就是把变量变成了常量,所以==比较为true

四、字符串常量+字符串变量、字符串变量之间的拼接
String str5 = "Hello";
String str6 = " word";
String str7 = "Hello word";
String str8 = str5+" word";
System.out.println(str7 == str8);  //false

String通过+号来拼接字符串的时候,如果有字符串变量参与,实际上底层会转成通过StringBuilder的append( )方法来实现,大致过程如下:

StringBuilder sb = new StringBuilder();
sb.append(str5);
sb.append(" word");
str8 = sb.toString();

StringBuilder的 toString( )方法底层new了一个String对象,所以str8在堆内存中重新开辟了新空间,而str7指向常量池,所以str7 == str8为false。变量字符串拼接和常量字符串拼接结果是不一样的。因为变量字符串拼接是先开辟空间,然后再拼接

小知识点(加分点):

String str1="Hello";
String str2="World!";
String str3="HelloWorld!"
String str8 = (str1+str2).intern();
System.out.println(str8 == str3);  //true

如果拼接的结果调用intern(),返回值就在常量池中

五、String常用的方法
String方法介绍
int length()返回字符串长度:return value.length
char charAt(int index)返回某索引处的字符: return value[index]
boolean isEmpty()判断是否为空字符串: return value.length == 0;
String toLowerCase()使用默认语言环境,将String中所有字符转换成小写
String toUpperCase()使用默认语言环境,将String中所有字符转换成大写
String trim()返回字符串的副本,忽略字符串前后的空格
boolean equals(Object obj)比较字符串的内容是否相同
boolean equalsIgnoreCase(Object obj)与equals相同,但忽略大小写
String concat(String str)将指定字符串连接到此字符串结尾。等价于用“+”
int compareTo(String anotherString)比较两个字符串的大小
String subString(int beginIndex)返回一个新的字符串,他是从此字符串的beginIndex开始截取的
String subString(int beginIndex,int endIndex)返回一个新的字符串,他是从此字符串的beginIndex到endIndex截取的 //begin是包含的 end是不包含的 例如:String必知必会 取出Str 要这么取str.substring(0,3)
int indexOf(String str)返回指定子字符串第一次出现的字符串内的索引
int lastIndexOf(String str)返回指定字符的最后一次出现的字符串中的索引
String replace(char oldChar, char newChar)用于替换字符串oldChar要被替换的字符串 newChar替换的字符串 也有使用正则替换的方法如replaceAll() replaceFirst()
String[] split(String regex)`用于指定字符切割,返回切割后的数据用数组接收
String valueOf(int i)用于把int型数据转换成字符串 所有类型都可使用此方法转换数据
boolean endsWith(String suffix)测试此字符串是否是指定的后缀结束
boolean startsWith(String suffix)测试此字符串是否是指定的前缀开始
boolean startsWith(String suffix,int toffset)测试此字符串是否是指定索引开始的子字符串的前缀开始
boolean contains(CharSequence s)用于判断此字符串是否包含指定的数据
char[] toCharArray()用于把字符串转换成char类型数组 ,如果char[] 数组,想转字符串可以使用new String(char[] c)
byte[] getByte()使用平台的默认字符集将此 String编码为字节序列,将结果存储到新的字节数组中。也可以在构造器内改其他编码,例如str.getBytes("gbk"); 也可以使用new String(bytes,"gbk");对字节进行解码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值