Java:String与编码

1、String

创建字符串

  1. String s = "xxx" ;

  2. String s = new String ("xxx");

  3. 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中从srcBeginsrcEndchar复制到目标char[] dst中,从dstdstBegin处开始
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中的Stringchar是以Unicode编码的。

 

3、总结

  1. Java中的字符串类型是String,它本身也是一个class,但是Java编译器对String有特殊处理,可以直接用"xxx"来表示;实际上String在JVM中是通过char[ ]数组表示的;
  2. Java字符串是不可变的,这是因为String在JVM内部表示char [ ]时,通过private final char[ ]实现的,此外JVM中没有任何修改char[ ]方法实现的;
  3. 字符串的各种方法,判断字符串内容通常用equals(str2)
  4. 格式化字符串的方法:formatted、format
  5. 字符编码:ASCII——每个字符1B;Unicode——每个字符2B;UTF-8——1~4B的边长编码。Java中,char、String类型实际上是2B Unicode编码。字符串的编码转化,同str.getBytes(编码类型)实现的,不过编码转化后,就不再是char类型,而是byte[ ];反之,如果要把byte[ ]转化为String,可以在new String ( )时通过参数指定编码格式。
posted @   ShineLe  阅读(1920)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示