Java:String与编码
1、String
创建字符串
-
String s = "xxx" ;
-
String s = new String ("xxx");
-
String s = new String( new char [] {'x','x','x'} );
对于第三种的解释:字符串在String内部是通过一个char[ ] 数组表示的(和C++类似),只是由于String太常用了,所以Java提供了“xxx”这种字符串字面量表示方法。
特点
Java字符串是不可变的,这种不可变性是通过内部的private final char[ ]字段,以及没有任何修改char[ ]的方法实现的(即Java中不能对char[] 进行修改);
不可变意味着:一旦创建了String,就无法修改其值。所以在调用String的修改方法时,并不是对该String本身进行修改,而是复制一个副本,对该副本修改并返回,所以需要额外的String来承接。
对象方法:用法str.xxx(...)
需要注意的是,由于String的不可变性,所以所有这些方法都不会改变原String,只能返回改变后的新String
返回值类型 |
方法 |
说明 |
boolean | == | 比较两个字符串变量是否指向同一个地址 |
char | charAt( index ) | 返回指定索引处的单个char |
int | compareTo(String str) | 比较两个字符串 |
int | compareToIgnoreCase(String str) | 比较两个字符串,不考虑大小写 |
String | concat(String str2) | 把指定字符串连接到该字符串结尾 |
boolean | contains(String str2) | 判断str中是否包含子串str2 |
String | copyValueOf(char [] data) | 返回指定的char[]代表的String |
String | copyValueOf(char [] data , int offset , int count) | 返回从offset开始,总共count个字符的data中一部分char组成的String |
boolean | endsWith(String suffix) | str是否以suffix结尾 |
boolean | equals(str2) | 比较两个字符串内容是否相同 |
boolean | equalsIgnoreCase(str2) | 忽略大小写比较内容 |
String | formatted()、format() | 格式化字符串 |
byte[] | getBytes() | 使用默认编码,将该String编码为byte序列 |
byte[] | getBytes(String charset) | 用charset指定的编码方式,将该String编码为byte序列 |
void | getChars(int srcBegin , int srcEnd , char[] dst , int dstBegin) | 将字符串str中从srcBegin到srcEnd的char复制到目标char[] dst中,从dst的dstBegin处开始 |
int | hashCode() | 返回该字符串的Hash码 |
int | indexOf(String str2 , int fromIndex=0) | 第一次出现指定子串的索引,参数fromIndex指定从何处开始 |
String | intern() | 返回字符串对象的规格化表示形式 |
boolean | isBlank() | 是否为"" |
boolean | isEmpty() | 是否为null |
int | lastIndexOf(String str2 , int fromIndex=-1) | 最后一次出现指定字串的索引,参数fromIndex指定从何处反向开始 |
int | length() | 字符串长度 |
boolean | matches(String regex) | 该字符串是否匹配指定的正则表达式 |
boolean | regionMatches(...) | 两个字符串的指定部分区域是否相等 |
String | replace(char oldChar , char newChar) | 用newChar替换该String中的所有oldChar |
String | replace(String str2 , String str3) | 用子串str3替换该String中的所有str2 |
String | replaceAll(String regex , String replacement) | 用replacement替换该字符串中所有匹配正则表达式regex的子串 |
String | replaceFirst(String regex,String replacement) | 用replacement替换该字符串中第一个匹配正则表达式regex的子串 |
String[ ] | split(String regex , int limit=0) |
用正则表达式regex指定的分隔符分割字符串,返回分割后各部分String组成的String[] 参数limit指明分割次数,默认0为无限制 |
boolean | startsWith(String prefix , int toffset=0) | str是否以在toffset处以prefix开始 |
String | substring(int start,int end=-1) | 截取指定位置间的子串 |
String | trim() | 移除首尾空白字符 |
strip() | 移除首尾空白字符,包括中文的空格字符 | |
stripLeading() | 移除首部空白字符 | |
stripTrailing() | 移除尾部空白字符 | |
char[ ] | toCharArray() | 将String转为char[ ] |
String | toLowerCase() | 把String中的字符小写 |
String | toUpperCase() | 把String中的字符大写 |
String | valueOf( x ) | 把各类型的x字符串化 |
静态方法:用法String.xxx(...)
方法返回值 |
方法 |
说明 |
String |
copyValueOf(char[ ] data) copyValueOf(char[ ] data , int offset , int count) |
等同于valueOf( char [ ] ),把char[ ]转化为String |
String | format(String format , Object... args) | 将参数1format格式化,其中的格式化字符例如%d、%s等填充为一系列的参数args |
String | join(CharSequence delimiter , String [] str) | 用连接符delimiter将一个String []中的各String连接起来 |
String | valueOf( xxx ) | 将xxx转化为String |
部分方法的补充说明
1、格式化字符串:formatted、format
package pack1; public class Main{ public static void main(String [] args){ String s= "Hi %s,your score is %d!"; System.out.println(s.formatted("Alice",80)); System.out.println(String.format("Hi %s,your score is %.2f!","Bob",59.5)); } }
formatted()
str.formatted(格式化列表)
format()
String.format(str,格式化列表)
其中有几个占位符,后边的格式化列表中就有几个参数,且参数类型要和占位符一致。
常用占位符
s | 字符串 |
d | 整数 |
x | 十六进制整数 |
f | 浮点数 |
占位符可以带格式,比如%.2f是两位小数,如果不确定用啥占位符,那就始终用%s,因为%s可以显示任何类型数据。
③各类型与String的相互转化
各类型转字符串:String.valueOf(xxx)
要把任意基本类型或者引用类型转换为String,可以使用静态方法String.valueOf()。这是一个重载方法,编译器会根据参数自动选择合适的方法:
String.valueOf(123); // "123" String.valueOf(45.67); // "45.67" String.valueOf(true); // "true" String.valueOf(new Object()); // 类似java.lang.Object@636be97c
字符串转各类型
转换类型 | 方法 | 补充 |
int | Integer.parseInt(str,进制) | |
boolean | Boolean.parseBoolean(str) | |
Integer | Integer.getInteger(str) | 不是转化str,而是将str对应的系统变量转化为Integer |
char[] | str.toCharArray() | 如果从char[]到String,直接用new String (carray)构造String即可 |
2、字符编码
主流编码
ASCII编码:每个字符1B
Unicode编码:每个字符2或更多字节,包含了全世界所有语言
UTF-8编码:变长编码,用来把Unicode编码变为1~4B的变长编码
编码转化
Java中,char类型实际上是2B Unicode编码,如果要把字符串转换为其他编码,可以用str.getBytes(编码类型)这种方法。
byte[] b1 = "Hello".getBytes(); // 按系统默认编码转换,不推荐 byte[] b2 = "Hello".getBytes("UTF-8"); // 按UTF-8编码转换 byte[] b2 = "Hello".getBytes("GBK"); // 按GBK编码转换 byte[] b3 = "Hello".getBytes(StandardCharsets.UTF_8); // 按UTF-8编码转换
需要注意的是,以上代码转换编码后,就不再是char类型,而是byte[ ]
如果要把某种已知编码的byte[ ]转化为String,可以在new String()时通过参数指定原编码格式:
byte[] b = ... String s1 = new String (b,"GBK");//按GBK转化 String s2 = new String (b,StandardCharsets.UTF_8);//UTF-8
始终牢记:Java中的String和char是以Unicode编码的。
3、总结
- Java中的字符串类型是String,它本身也是一个class,但是Java编译器对String有特殊处理,可以直接用"xxx"来表示;实际上String在JVM中是通过char[ ]数组表示的;
- Java字符串是不可变的,这是因为String在JVM内部表示char [ ]时,通过private final char[ ]实现的,此外JVM中没有任何修改char[ ]方法实现的;
- 字符串的各种方法,判断字符串内容通常用equals(str2)
- 格式化字符串的方法:formatted、format
- 字符编码:ASCII——每个字符1B;Unicode——每个字符2B;UTF-8——1~4B的边长编码。Java中,char、String类型实际上是2B Unicode编码。字符串的编码转化,同str.getBytes(编码类型)实现的,不过编码转化后,就不再是char类型,而是byte[ ];反之,如果要把byte[ ]转化为String,可以在new String ( )时通过参数指定编码格式。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性