String类的理解

时间:2024-4-7    作者:老大夫    分类: JAVA


类的声明

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

final:不可被继承、
Serializable:可序列化的接口。---凡是实现序列化接口的类就可以通过网络、IO流进行传输。
Comparable:凡是实现此接口的类都可以比较大小。

内部声明属性

jdk8.0中
private final char value[];

实际上就是,不可更改的字符数组。

jdk9至今
private final byte[] value;

换成byte的好处就是,绝大多数情况都是在使用字母,这样就只需要1个byte空间而不是char需要2个byte空间。

字符串常量的存储位置

String s1="hello";

字符串常量池,但是字符串常量池中不允许存放两个相同的字符串。
不同版本的jdk常量池存放位置也不同。


String的不可变性

  1. 同样内容的字符串会指向同一地址,其中一个字符串变得不一样时会重新创建一个新的字符串常量。由栈空间指向字符串常量池。
  2. 当给原有字符串增加内容时,也是会重新生成一个新的字符串。
  3. 当对字符串执行replace方式时仍然要重新开辟空间生成一个新的字符串。

String实例化的两种方式

第一种直接赋值

String s1="hello";

第二种使用构造器创建对象形式

String s2=new String("goodbye");

对比地址是否一致

public class StringDemo {
    public static void main(String[] args) {
        String s1="hello";
        String s2="hello";
        String s3=new String("hello");
        String s4=new String("hello");
        System.out.println(s1==s2);//true
        System.out.println(s1==s3);//false
        System.out.println(s3==s4);//false
    }
}

只要引入了变量它就会生成新的字符串,所以地址会不同。

构造器创建对象形式实际上是创建了两个对象,第一次指向String类的value,再由value指向真正的字符串内容。

String的连接操作

  1. 常量+常量:仍然存储在字符串常量池,注:如果给变量加上final也会变为常量
  2. 常量+变量 或 变量+常量:创建一个新的对象,返回堆空间中的字符串地址
  3. 调用字符串intern():返回的是字符串常量池中字面量的地址
  4. (了解)concat():不管连接的参数是常量还是变量,调用此方法后都返回一个新new的对象。

常量拼接和直接写没有区别,有变量参与就会重新创建新的对象。

String的构造器

public String()//表示空字符序列创建String对象
public String(String original)//
public String(char value[])
public String(char value[], int offset, int count)
public String(int[] codePoints, int offset, int count)
public String(byte ascii[], int hibyte, int offset, int count)
public String(byte ascii[], int hibyte) 
public String(byte bytes[], int offset, int length, String charsetName)
public String(byte bytes[], int offset, int length, Charset charset)
public String(byte bytes[], String charsetName)
public String(byte bytes[], Charset charset)
public String(byte bytes[], int offset, int length)
public String(byte bytes[])
public String(StringBuffer buffer)
public String(StringBuilder builder)
public String(char[] value, boolean share)

在UTF-8中汉字占用3个字符,英文占用一个
在GBK(ANSI)中汉字占用2个字符,英文占用一个
UTF-8,GBK都向下兼容ascII码

编码与解码
编码:String---》字节、字节数组
解码:字节、字节数组----》String

String的方法

方法名 作用
isEmpty 判断字符串是否为空
length 返回字符串长度
concat 拼接
equals 判断是否相同内容
equalsIgnoreCase 判断内容是否相同不区分大小写
方法名 作用
toLowerCase 转换成小写
toUpperCase 转换成大写
trim 去掉字符串前后空白
intern 结果在常量池中共享
compareTo 比较字符串大小,按照Unicode大小比较
compareToIgnore 忽略大小写,比较Unicode大小
contains 是否包含
indexOf 第一次出现位置的下标,没有就返回-1
indexOf(String str,int fromIndex) 从指定索引向后找
lastIndexOf 最后一次出现的位置
lastIndexOf(String str,int fromIndex) 从后往前找最后一次出现的位置
subString(int index) 从指定索引取字符串到最后
subString(int index,int lastIndex) 从指定索引取字符串到指定第二个索引(不包括最后索引上的字符)(左闭右开原则)
方法名 作用
charAt 返回指定索引的字符
toCharArry 将字符串转换为一个字符数组返回
valueOf 将基本类型转换为字符串
方法名 作用
startWith 判断字符串是否以指定前缀开始
startWith(char c,int index) 判断字符串是否从指定索引以指定前缀开始
endWith 判断字符串是否以指定后缀为结尾
方法名 作用
方法名 作用
replace(char oldChar, char newChar) 用新字符代替旧字符
replace(CharSequence target, CharSequence replacement) 用新字符串代替旧字符串
replaceFirst(String regex, String replacement) 代替第一个符合正则表达式的字符串
replaceAll(String regex, String replacement) 用正则表达式来代替

版权所有:伸手党盘
文章标题:String类的理解
文章链接:https://ssdpan.cn/?post=372
本站文章来源于网络搜集和原创,仅供学习使用,未经授权请勿用于任何商业用途,如有侵权及时联系删除

推荐阅读:


扫描二维码,在手机上阅读