2-Java核心类总结-String

2-Java核心类总结-String

目录

3-Java核心类总结-String

String

1)java中字符串的不变性

2)字符串的创建

3)字符串长度(及限制)

4)连接字符串

5)格式化字符串

6)方法

参考汇总


 

String

字符串广泛应用 在 Java 编程中,在 Java 中 字符串属于对象 ,Java 提供了 String 类来创建和操作字符串。String类表示字符串, Java程序中的所有字符串文字(例如“abc" )都实现为此类的实例。

1)java中字符串的不变性

​ java中字符串是不变的,它们的值在创建后 无法更改 。 字符串缓冲区(StringBuffer类)支持可变字符串。 因为String对象是不可变的,所以可以共享它们。

不变性原理:不可变即不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。

首先创建一个String对象s,然后让s的值为“ABCabc”, 然后又让s的值为“123456”。 s只是一个String对象的引用,并不是对象本身。对象在内存中是一块内存区,成员变量越多,这块内存区占的空间越大。引用只是一个4字节的数据,里面存放了它所指向的对象的地址,通过这个地址可以访问对象。也就是说,s只是一个引用,它指向了一个具体的对象,当s=“123456”; 这句代码执行过之后,又创建了一个新的对象“123456”, 而引用s重新指向了这个新的对象,原来的对象“ABCabc”还在内存中存在,并没有改变。

要理解String的不可变性,首先看一下String类中都有哪些成员变量。 在JDK1.6中,String类有value,offset和count这三个变量,且都是private的,并且没有提供setValue, setOffset和setCount等公共方法来修改这些值,所以在String类的外部无法修改String,也就是说 一旦初始化就不能修改 , 并且在String类的外部不能访问这三个成员。此外,value,offset和count这三个变量都是final的, 也就是说在String类内部,一旦这三个值初始化了, 也不能被改变。所以可以认为String对象是不可变的了。

2)字符串的创建

​ 直接赋值:如 String s = "abc";

​ 使用关键字和构造方法来创建对象:如 String s = new String("abc")

 

​ 附:String类的构造方法有以下

 

3)字符串长度(及限制)

使用 length() 方法,如:String s = new String("abc"); System.out.println( s.length() ); //打印结果为3

String的长度限制:

根据public String(char value[], int offset, int count)的定义,count是int类型的, char value[] 中最多可以保存 Integer.MAX_VALUE 个,即2147483647字符(jdk1.8.0_73);但String s = ""; 中,最多可以有65534个字符。如果超过这个个数,就会在 编译期 报错。

长度限制原理:当我们使用字符串字面量直接定义String的时候,是会把字符串在常量池中存储一份的。那么上面提到的65534其实是 常量池的限制 。常量池中的每一种数据项也有自己的类型。Java中的 UTF-8 编码的 Unicode 字符串,在常量池中以CONSTANT_Utf8 类型表示。CONSTANT_Utf8_info 是一个CONSTANT_Utf8类型的常量池数据项,它存储的是一个常量字符串。常量池中的所有字面量几乎都是通过CONSTANT_Utf8_info描述的。而CONSTANT_Utf8_info中有 "u2 length" ,表明了该类型存储数据的长度。u2是无符号的16位整数,因此理论上允许的最大长度是2^16=65536。而 java class 文件是使用一种变体UTF-8格式来存放字符的,null 值使用两个字节来表示,因此只剩下 65536- 2 = 65534个字节。

上面提到的这种String长度的限制是编译期的限制,也就是使用 String s= ""; 这种 字面值方式定义 的时候才会有的限制。String在运行期也有长度限制的,就是我们前文提到的那个Integer.MAX_VALUE ,这个值约等于4G,在 运行期 ,如果String的长度超过这个范围,就可能会抛出异常。(在jdk 1.9之前)int 是一个 32 位变量类型,取正数部分来算的话,他们最长可以有有近 4G 的容量。

4)连接字符串

String 类提供了连接两个字符串的方法

(1)public String concat(String str):

将指定的字符串连接到此字符串的末尾。如果参数字符串的长度为0 ,则返回使用concat方法的 String对象;否则,返回一个是由此 String 对象表示的字符序列 和 由参数字符串表示的字符序列的串联的 String 对象。也可以对字符串常量使用 concat() 方法,如:"cares".concat("s") //返回 "caress"。

如:

(2)使用'+'操作符

更常用的是使用'+'操作符来连接字符串。如:"Hello," + " runoob" + "!" ;//返回 "Hello, runoob!"。

5)格式化字符串

输出格式化数字可以使用 printf() 和 format() 方法。String 类使用静态方法 format() 返回一个String 对象而不是 PrintStream 对象, 能用来创建可复用的格式化字符串,而不仅仅是用于一次打印输出。

如:

System.out.printf("浮点型变量的值为 " +"%f, 整型变量的值为 " + " %d, 字符串变量的值为 " + "is %s", floatVar, intVar, stringVar);

也可以写成:

String fs; fs = String.format("浮点型变量的值为 " +"%f, 整型变量的值为 " + " %d, 字符串变量的值为 " + " %s", floatVar, intVar, stringVar);

附:String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。与C语言的sprintf()方法有类似之处。format()方法有两种重载形式:

(1)format(String format, Object... args)

该方法使用指定的字符串格式和参数生成格式化的新字符串。新字符串始终使用本地语言环境。

语法: String.format(format,args...) 。format:字符串格式;args...:字符串格式中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。参数的数目是可变的,可以为0。

(2)format(Locale locale, String format, Object... args)

该方法使用指定的语言环境、字符串格式和参数生成一个格式化的新字符串。新字符串始终使用指定的语言环境。

语法:String.format(locale,format,args...) 。locale:指定的语言环境;format:字符串格式;args...:字符串格式中由格式说明符引用的参数。

(3)常用的日期格式化转换符

 

示例:

 

(4)时间格式化转换符

 

(5)常见的日期和时间组合的格式

 

(6)常规类型格式化

 

使用转换符,还可以配合转换符标识来控制输出的格式

 

6)方法

(1)部分方法

方法(返回值 方法名(参数列表))作用备注
char charAt(int index)返回指定索引处的char值, 指数范围为0至length() - 1。 序列的第一个char值位于索引0 
int compareTo(String anotherString)按字典顺序比较两个字符串中每个字符的Unicode值。如果结果此String对象排在参数字符串之前,(小于参数)为负整数;反之(大于参数)为正整数;如果(等于参数)字符串相等,结果为零。在某个索引处具有不同的字符,返回该位置字符差值(Unicode码差值);索引位置字符都一样,返回字符串长度的差值。
int compareToIgnoreCase(String str)同上,忽略大小写差异在每个字符上先调用了Character的toUpperCase()再调用了Character.toLowerCase()消除了大小写差异。
boolean contains(CharSequence s)当且仅当此字符串包含指定的char值序列时,才返回true 
boolean contentEquals(CharSequence cs)//参数还可是(StringBuffer sb)将此字符串与指定的CharSequence(StringBuffer)比较。 当且仅当此String表示与指定序列相同的char值序列时,结果为true 
boolean equals(Object anObject)将此字符串与指定的对象进行比较。当且仅当参数不是null,且表示与此String对象相同的字符序列时,结果为true 
boolean equalsIgnoreCase(String anotherString)同上,忽略大小写 
byte[] getBytes()//参数可为:空、(String charsetName)参数对应:使用(平台默认的/指定的)字符集将此String编码为字节序列,并将结果存储到新的字节数组中 
byte[] getBytes(Charset charset)使用给定的charset将此String编码为字节序列,将结果存储到新的字节数组中 
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)将此字符串中的字符复制到目标字符数组中 
int hashCode()返回此字符串的哈希码 
int indexOf(参数列表)返回指定字符(字符串)第一次在字符串中出现的索引参数可为:1.(int ch)//指定字符;2.(int ch,int fromIndex)//从指定索引开始搜索指定字符;3.(String str)//指定字符串;4.(String str,int fromIndex)//同2
int lastIndexOf(参数列表)返回指定字符(字符串)在此字符串中最后一次出现处的索引参数可为:1.(int ch)//指定字符;2.(int ch,int fromIndex)//从指定索引反向搜索指定字符;3.(String str)//指定字符串;4.(String str,int fromIndex)//同2
String intern()返回字符串对象的规范化表示形式。如果字符串池已包含等于String对象的字符串,则返回池中的字符串。 否则,将此String对象添加到池中,并返回对此String对象的引用对于任何两个字符串s和t,有s.intern() == t.intern()是true,当且仅当s.equals(t)为true;即与字符串具有相同内容的字符串,但保证来自唯一字符串池
boolean isBlank()如果字符串为空或仅包含 white space代码点,则返回 true,否则false 
boolean isEmpty()判断字符串是否为空,为空返回true,否则返回false 
boolean matches(String regex)告知此字符串是否匹配给定的正则表达式 
boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)测试两个字符串区域是否相等。toffset为调用者的起始偏移量,ooffset为参数other的起始偏移量,len为要比较的字符数第一个参数为true时忽略大小写;也可以没有第一个参数,但不忽略大小写

(2)替换

 

(3)拆分

 

(4)指定前缀后缀

 

 

(5)子序列(subxxxxx)

 

(6)将字符串转化(toxxxxx)

 

(7)去空格

 

 

(8)将参数转化为字符串(valueOf)

 

参考汇总

参考链接:

​ Java的String类:https://www.runoob.com/java/java-string.html

Java String的不可变性:https://blog.csdn.net/zhangjg_blog/article/details/18319521?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

Java String常用构造方法:https://blog.csdn.net/weixin_43441790/article/details/100353368

Java String长度限制:https://blog.csdn.net/qq_36761831/article/details/99943600

Java String创建格式化字符串:https://www.cnblogs.com/mrxy/p/8041836.html

 

参考:Java 11 API

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值