0%

Java基础(常用类之String类)

一、String简介

String类:代表字符串。Java程序中的所有字符串字面值(如“ABC”)都作为此类的实例实现。

它是一个final类,不可被继承,是一个常量,值在创建之后不能更改,即代表不可变的字符序列

二、创建字符串对象两种方式的区别

1、直接赋值方式创建对象

1
2
3
String str1 = "abc";	//字面量的定义方式
String str2 = "abc";
System.out.println(str1==str2); //true

直接赋值方式创建对象是声明在方法区的字符串常量池 中。字符串常量池中不会存储相同内容的字符串的,所以此时str1==str2的结果为true。这种方式只开辟一块堆内存空间,并且会自动入池,不会产生垃圾。

2、通过构造方法创建字符串对象

1
2
3
String str1 = new String("hello");//实例化的方式
String str2 = new String("hello");
System.out.println(str1==str2); //false

此时的str1和str2保存的地址是数据在堆空间中开辟空间以后对应的地址值。 这种方式会开辟两块堆内存空间,其中一块堆内存会变成垃圾被系统回收,而且不能够自动入池,需要通过public String intern();方法进行手工入池。

面试题:String s = new String(“abc”);方式创建对象,在内存中创建了几个对象?
两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:”abc”

3、两种方式拼接字符串的对比

1
2
3
4
5
6
7
8
9
10
String s1 = "javaABC";
String s2 = "java";
String s3 = s2 + "ABC";
String str = s3.intern();
System.out.println(s1 == s3); //false
System.out.println(s1 == str); //true

final String s4 = "java"; //s4为常量
String s5 = s4 + "ABC";
System.out.println(s1 == s5); //true

结论
1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
2.只要其中有一个是变量,结果就在堆中。
3.如果拼接的结果调用intern()方法,返回值就在常量池中

三、String的常用方法

1、String的转换功能

1、常用方法

1
2
3
  char[] toCharArray()	//把字符串转换为字符数组
  String toLowerCase() //把字符串转换为小写字符串
  String toUpperCase() //把字符串转换为大写字符串

2、代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class TestString {
public static void main(String[] args) {
// 创建字符串对象
String s = "abcde";
// char[] toCharArray():把字符串转换为字符数组
char[] chs = s.toCharArray();
for (int x = 0; x < chs.length; x++) {
System.out.println(chs[x]);
}
System.out.println("-----------");
// String toLowerCase():把字符串转换为小写字符串
System.out.println("HelloWorld".toLowerCase());
// String toUpperCase():把字符串转换为大写字符串
System.out.println("HelloWorld".toUpperCase());
}
}
//结果
/*
a
b
c
d
e
-----------
helloworld
HELLOWORLD
*/

注意:

字符串的遍历有两种方式:一是ength()加上charAt();二是把字符串转换为字符数组,然后遍历数组。

2、String类的获取功能

1、常用方法

1
2
3
4
5
int length()	//获取字符串的长度,其实也就是字符个数
char charAt(int index) //获取指定索引处的字符
int indexOf(String str) //获取str在字符串对象中第一次出现的索引
String substring(int start) //从start开始截取字符串
String substring(int start,int end) //从start开始,到end结束截取字符串。包括start,不包括end

2、代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class TestString {
public static void main(String[] args) {
// 创建字符串对象
String s = "helloworld";
// int length():获取字符串的长度,其实也就是字符个数
System.out.println(s.length());
System.out.println("--------");

// char charAt(int index):获取指定索引处的字符
System.out.println(s.charAt(0));
System.out.println(s.charAt(1));
System.out.println("--------");

// int indexOf(String str):获取str在字符串对象中第一次出现的索引
System.out.println(s.indexOf("l"));
System.out.println(s.indexOf("owo"));
System.out.println(s.indexOf("ak"));
System.out.println("--------");

// String substring(int start):从start开始截取字符串
System.out.println(s.substring(0));
System.out.println(s.substring(5));
System.out.println("--------");

// String substring(int start,int end):从start开始,到end结束截取字符串
System.out.println(s.substring(0, s.length()));
System.out.println(s.substring(3, 8));
}
}
//结果
/*
10
--------
h
e
--------
2
4
-1
--------
helloworld
world
--------
helloworld
lowor
*/

3、String的判断功能

1、常用方法

1
2
3
4
  boolean equals(Object obj):比较字符串的内容是否相同
  boolean equalsIgnoreCase(String str): 比较字符串的内容是否相同,忽略大小写
  boolean startsWith(String str): 判断字符串对象是否以指定的str开头
  boolean endsWith(String str): 判断字符串对象是否以指定的str结尾

2、代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class TestString {
public static void main(String[] args) {
// 创建字符串对象
String s1 = "hello";
String s2 = "hello";
String s3 = "Hello";

// boolean equals(Object obj):比较字符串的内容是否相同
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println("-----------");

// boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
System.out.println(s1.equalsIgnoreCase(s2));
System.out.println(s1.equalsIgnoreCase(s3));
System.out.println("-----------");

// boolean startsWith(String str):判断字符串对象是否以指定的str开头
System.out.println(s1.startsWith("he"));
System.out.println(s1.startsWith("ll"));
}
}

//结果
/*
true
false
-----------
true
true
-----------
true
false
*/

四、String类与其他结构之间的转换

1、 String 与 char[]之间的转换

String –> char[]: 调用String的toCharArray()
char[] –> String: 调用String的构造器

1
2
3
4
5
6
7
8
9
10
11
12
public void test2(){
String str1 = "abc123";

char[] charArray = str1.toCharArray();
for (int i = 0; i < charArray.length; i++) {
System.out.println(charArray[i]);
}

char[] arr = new char[]{'h','e','l','l','o'};
String str2 = new String(arr);
System.out.println(str2);
}

2、String 与基本数据类型、包装类之间的转换

String –> 基本数据类型、包装类:调用包装类的静态方法:parseXxx(str)
基本数据类型、包装类 –> String: 调用String重载的valueOf(xxx)

1
2
3
4
5
6
7
8
9
10
11
 public void test1(){
String str1 = "123";
// int num = (int)str1; //错误的
int num = Integer.parseInt(str1);

String str2 = String.valueOf(num);//"123"
String str3 = num + "";

System.out.println(str1 == str3);
}
}

3、 String 与 byte[]之间的转换

编码:String –> byte[]: 调用String的getBytes()
解码:byte[] –> String: 调用String的构造器

说明:解码时,要求解码使用的字符集必须与编码时使用的字符集一致,否则会出现乱码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void test3() throws UnsupportedEncodingException {
String str1 = "abc123中国";
byte[] bytes = str1.getBytes();//使用默认的字符集,进行编码。
System.out.println(Arrays.toString(bytes));

byte[] gbks = str1.getBytes("gbk");//使用gbk字符集进行编码。
System.out.println(Arrays.toString(gbks));

System.out.println("******************");

String str2 = new String(bytes);//使用默认的字符集,进行解码。
System.out.println(str2);

String str3 = new String(gbks);
System.out.println(str3);//出现乱码。原因:编码集和解码集不一致!
String str4 = new String(gbks, "gbk");
System.out.println(str4);//没有出现乱码。原因:编码集和解码集一致!
}
-------------本文结束感谢您的阅读-------------