前言:String类是我们很常见的一种创建文本的类,但它也有许多有趣的地方,或者是可以深入了解一下的地方,所以我们本篇博客将带你深入String类。
上一篇博客中我们了解了字符串的一些习性,常量池等的东西,然后这一篇我们继续讲解到字符串中的奥秘。
每文一图:
深入String类:- 一.字符,字节与字符串
- 1.字符和字符串
- ①字符数组转字符串
- ②部分字符数组转字符串
- ③指定位置获取字符
- ④字符串转为字符数组
- ⑤代码使用例子
- 2.字节与字符串
- ①字节数组转字符串
- ②部分字节数组转字符串
- ③字符串转字节数组及编码转换
- 3.字符和字节
一.字符,字节与字符串
我们先来对比和字符串相关的两个东西,字符和字节。
1.字符和字符串字符串内部包含一个字符数组,String 可以和 char[] 相互转换
对于字符和字符串,我们有一下几种方法转换:
| NO | 方法名称 | 类型 | 描述 |
|---|---|---|---|
| 1 | public String(char value[]) | 构造 | 将字符数组中的所有内容变为字符串 |
| 2 | public String(char value[],int offset,int count) | 构造 | 将部分字符数组中的内容变为字符串 |
| 3 | public char charAt(int index) | 普通 | 取出指定索引位置的字符,索引从0开始 |
| 4 | public char[] toCharArray() | 普通 | 将字符串变为字符数组返回 |
我们挨个介绍:
①字符数组转字符串第一个是我们的public String(char value[]),是一个将字符数组中的所有内容变为字符串的方法,那么具体用法我们直接看代码:
public static void main(String[] args) {
char [] arr ={'a','b','c'};
String string = new String(arr);
System.out.println(string);
//打印abc
}
实际上这里就是可以把字符数组作为新建字符串对象的内容,把字符数组中的一个一个字符转变成字符串,转变只需要在new字符串的时候,把字符数组的数组名放进去就可以了。
②部分字符数组转字符串
如果我不想把所有字符都转换为字符串,而是希望把字符数组中的一部分字符转变为字符串,我们就可以用这个方法:
public static void main(String[] args) {
char [] arr ={'a','b','c','d','e','f'};
String string = new String(arr,1,3);
System.out.println(string);
//打印bcd
}
这里就是上面创建字符串时放数组名的升级版,也就是多了两个传参,这里的话,第一个还是想要转变的字符数组,然后第二个参数是从哪一个偏移量开始,比如这里就是从偏移量为1处开始,第三个就是取多少个位,这里取了三个,所以打印的是bcd。
这就是以部分字符数组转为字符串。
③指定位置获取字符
既然有字符数组转变为字符串,那我们字符串也有可以转化为字符的方法,这里我们就有一个可以获取指定位置的方法,我们来直接看一下用法:
public static void main3(String[] args) {
String str = "hello";//字符串
char ch = str.charAt(2);//获取下标为2的字符
System.out.println(ch);
//打印l
}
在这里,我们就可以得到下标为2的字符,所以这个方法也就是很简单的一种格式,字符串.charAt(下标)得到这个字符,将其存到ch里,就相当于得到这个字符了。
④字符串转为字符数组
上面只是拿到了其中的一个字符,那么要将字符串转化为字符数组,其实也是有方法的,下面就是这个方法:
public static void main(String[] args) {
String str = "hello";//字符串
char [] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
System.out.print(chars[i]+" ");
}
//打印h e l l o
}
上面的这个代码,就是将字符串转化为字符数组的一个方法,同样的是引用字符串,然后用上一个方法叫toCharArray,转换为字符数组存储到了chars中。
⑤代码使用例子
输入一个字符串,判断这个字符串是否全部由数字组成。
public static boolean isallnum(String s){
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(c < '0' || c > '9'){
return false;
}
}
return true;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
System.out.println(isallnum(str));
//123456 true
//123a456 false
}
当然这里也可以用一个包装类中方法,在Character中有一个isDigit方法,是确定指定的字符是否为数字的一个方法。
这就是字符和字符串的相互转换。
2.字节与字符串
写完字符和字符串,其实我们还有字节,这里我们继续说一下字节和字符串的相互转换。
| NO | 方法名称 | 类型 | 描述 |
|---|---|---|---|
| 1 | public String(byte bytes[]) | 构造 | 将字节数组变为字符串 |
| 2 | public String(byte bytes[],int offset,int length) | 构造 | 将部分字节数组中的内容变为字符串 |
| 3 | public byte[] getBytes | 普通 | 将字符串以字符数组形式返回 |
| 4 | public byte[] getBytes(String charsetName)throws UnsupportedEncodingException | 普通 | 编码转换处理 |
同样的,我们来进行挨个介绍:
①字节数组转字符串字符数组和字节数组就相差在类型上,所以对于数组转字符串,其实是差不多的,也和上面的字符数组转差不多。
public static void main(String[] args) {
byte[] bytes = {'h', 'e', 'l', 'l', 'o'};
String str = new String(bytes);
//打印hello
}
②部分字节数组转字符串
其实对于部分字节数组转字符串也差不多,是比较相似的。
public static void main(String[] args) {
byte[] bytes = {'h', 'e', 'l', 'l', 'o'};
String string = new String(arr,1,3);
System.out.println(string);
//打印ell
}
而这个代码我们在IDEA中看到是这样子的,三个参数也有标明上什么,第二个是起始位置,第三个是长度:
这里顺便提一下,当我们把起始位置和长度中间的逗号删去,也就是把1,3变成13,相当于就只有两个参数,会出现这样的一慕:
我们看见String上会被划了一道,其实我们不需要理解这个代码是什么意思,只需要知道,被划痕了一道的方法,表示是过时了的方法,不能再使用了。
③字符串转字节数组及编码转换
这里也是一样的,我们有一个方法可以将字符串转为字节数组:
public static void main(String[] args) {
String str = "abcd";
byte [] bytes = str.getBytes();//getBytes方法
System.out.println(Arrays.toString(bytes));
//打印[97, 98, 99, 100]
}
这里我们使用的是getBytes方法,可以将字符串转换为字符数组。
在这里,还有一个值得注意的点,这里的转换中,会用到编码,比如我们可以选择一些编码方式:
public static void main9(String[] args) throws UnsupportedEncodingException {
String str = "abcd";
byte [] bytes = str.getBytes("utf-8");//utf-8的编码
System.out.println(Arrays.toString(bytes));
//打印[97, 98, 99, 100]
}
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "abcd";
byte [] bytes = str.getBytes("GBK");//GBK编码
System.out.println(Arrays.toString(bytes));
//打印[97, 98, 99, 100]
}
虽然说上面两种编码下,字符串str输出的内容还是一模一样的,但是这仅限于英文,当字符串内容换为中文的时候,就会不一样了:
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "你好";
byte [] bytes = str.getBytes("GBK");//GBK编码下
System.out.println(Arrays.toString(bytes));
//打印[-60, -29, -70, -61]
}
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "你好";
byte [] bytes = str.getBytes("utf-8");//utf-8的编码下
System.out.println(Arrays.toString(bytes));
//打印[-28, -67, -96, -27, -91, -67]
}
所以两者是不一样的!!!
3.字符和字节
那么何时使用 byte[], 何时使用 char[] 呢?
byte[] 是把 String 按照一个字节一个字节的方式处理,这种适合在网络传输, 数据存储这样的场景下使用,更适合针对二进制数据来操作。
而 char[] 是把 String 按照一个字符一个字符的方式处理,更适合针对文本数据来操作,尤其是包含中文的时候。
这就是本篇深入String类2的全部内容啦,接下来我们还有深入String类3,里面会讲解到关于字符串的对比查找,以及关于字符串的方法。欢迎关注。一起学习,共同努力!也可以期待这个系列接下来的博客噢。
链接:都在这里! Java SE 带你从零到一系列
还有一件事:



