第四章 Java 字符串
一、字符串
字符(char
)类型是Java的基本数据类型之一,用来存储单个字符。在开发过程中,往往多个字符一起才能表达一个有意义的数据。Java提供了字符串(String
)类型,用来处理一连串的字符。字符串便是由若干字符组成的序列。
1.1、字符串的声明和初始化
语法格式:
String 变量名 = “初始值”
或者
String 变量名 = new string(“初始值”);
例子:
String str1 = "Hello world";
String str2 = new String("Hello World");
1.2、字符串的连接
使用的是“+
”运算符可以将字符串连接在一起,也可以将字符串与基本数据类相互连接在一起。
例:
Public class Text {
Public static void main(String[] args){
String str1 = “Hello”;
String str2 = “Java”;
String str3 = “Hello Java”;
String str4 = “Hello” + “Java”;
String str5 = str1 + str2;
Int num = 520;
String str6 = num + str2;
System.out.println(“str1 = ”+str1);
String.out.println(“str2 = ”+str2);
System.out.println(“str3 = ”+str3);
System.out.println(“str4 = ”+str4);
System.out.println(“str5 = ”+str5);
System.out.println(“str6 = ”+str6);
}
}
注意
:使用“+”运算符连接的字符串中间是没有空格的。
1.3、字符串的比较
例:
Public class Text{
Public static void main(String[] args){
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println("(str1 == str2) = " + (str1 == str2));
System.out.println("(str1 == str3) = " + (str1 == str3));
System.out.println("str1.equals(str3) = " + str1.equals(str3));
}
}
解释:
- 用“
==
”操作符比较的是变量中存储的内容(数据或内存地址编号)。由于字符串是引用数据类型,如果str1 ==
str2的结果为true,意味着str1和str2两个变量中存储着同样的内存地址编号,即引用了同一块内存。 - String类型提供的equals()方法,是比较字符串的字面值是否相同.
- “str1 == str2”的值为true,因为str1和str2的内存地址编号相同,但是str3是又申请了一个新的内存地址,所以”str1 ==
str3”的值为false.
1.4、字符串的存储
字符串是引用数据类型
,因此字符串存储在堆中(堆中的字符串池)。为了节省内存,执行每个字符串时都会先在字符串池中查找是否存在所定义的字符串,如果存在直接应用,如果不存在则会重新分配内存存储该字符串。
1:String str1 = "Hello";
2:String str2 = "Hello";
3:String str3 = new String("Hello");
执行程序1时会在字符串池中查找“Hello”是否存在,如果不存在则分配内存将字符串“Hello”进行存储;执行程序2时依然会在字符串池中查找“Hello”是否存在,由于“Hello”存在,则引用str1的内存地址编号,存储在栈当中;当执行程序3时,虽然在字符串池中存在字符串“Hello”,但由于又在字符串池中申请了一块新的内存,产生新的一个内存地编号,然后将新的编号存储在栈中。
二、字符串常用的API
2.1、API
API
(Application Programming Interface),即应用程序编程接口。
A
(Application),即应用,按不同的场合,可以是一个提供特定功能的软件、一个提供某些数据的网络服务、一个作为程序组件的类库、甚至是一个硬件设备等等。P
(Programming),即编程。I
(Interface),即接口,是不同系统或实体交接并通过它彼此作用的部分。
注意
:API就是在编程过程中其他实体或系统与我们的程序进行信息交换的部分。
2.2、常用API
序号 | 方法名称 | 返回类型 | 作用 |
---|---|---|---|
1 | equals(Object anObject) | boolean | 将此字符串与指定的对象比较 |
2 | equalsIgnoreCase(String anotherString) | boolean | 忽略大小写比较两个字符串的字面值是否相等 |
3 | length() | int | 获取字符串的长度 |
4 | charAt(int index) | char | 获取指定索引处的char值 |
5 | indexOf(String str) | int | 获取指定子字符/字符串在原字符串中第一次出现处的索引(如果字符串中不包含该字符,则返回值为-1.) |
6 | lastIndexOf(String str) | int | 获取指定子字符/字符串在原字符串中最右边出现处的索引 |
7 | startsWith(String prefix) | boolean | 测试原字符串是否以指定的前缀开始 |
8 | endsWith(String suffix) | boolean | 测试原字符串是否以指定的后缀结束 |
9 | toLowerCase() | String | 获取原字符串对应的小写字符串 |
10 | toUpperCase() | String | 获取原字符串对应的大写字符串 |
11 | toCharArray() | String[] | 使用 str.toCharArray() 将字符串转换为数组 |
12 | substring(int beginIndex) | String | 截取原字符串,从参数beginIndex为下标的位置开始截取) |
13 | substring(int beginIndex, int endIndex) | String | 截取原字符串,从参数beginIndex为下标的位置开始截取到参数endIndex为下标的位置.str.substring(num1,num2) |
14 | trim() | String | 去掉原字符串首尾的空格 |
15 | split(String regex) | String[] | 将原字符串按照传入参数regex分割为字符串数组(注意:regex这个参数一般使用的是正则表达式) |
16 | replace(String regex, String replacement) | String | 将原字符串中指定的内容替换成另外的内容 |
2.3、控制符
控制符是控制输出结果的格式。
序号 | 格式符 | 说明 |
---|---|---|
1 | %s | 字符串类型 |
2 | %c | 字符类型 |
3 | %b | 布尔类型 |
4 | %md | 整数类型(十进制) |
5 | %x | 整数类型(十六进制) |
6 | %o | 整数类型(八进制) |
7 | %m.nf |
浮点类型 |
8 | %t | 制表符 |
9 | \n | 换行符 |
注意:
m是输出结果所占的列数,n是浮点型的小数点后的位数;
三、字符串与基本数据类型的转换
3.1、基本数据类型转换为String型
基本类型的数据转换成字符串类型有通常有两种方法:
- 通过字符串连接(使用“
+
”符号)将基本类型转换为string型; - 通过string类型提供的
vlalueof
(基本类型数据 变量名)方法将基本数据类型转换为字符串类型。
例1:
Pubic class Text{
Public static void mian(String[] args){
//通过字符串连接将基本类型转换为String型。
Int num = 2020;
Boolean bool = true;
String str1 ="" + num;
String str2 = "" + bool;
}
}
例2:
Public class Text {
Public static void main(String[] args){
//通过string类型提供的vlalueof(基本数据类型 变量名)方法将基本数据类型转换为字符串类型。
Int num = 2020;
Boolean bool = true;
String str1 = string.vlalueOf(num);
String str2 = string.vlalueOf(bool);
}
}
3.2、String型转换为基本数据类型
将字符串类型转换为基本类型,需要使用基本类 型的包装类。Java为每一种基本类型都提供了对应的包装类,包装类提供了一些常用的操作,其中就包括将字符串类型转换成基本类型。基本类型的包装类及其转换方法如下表:
基本类型 | 包装类 | 方法名称 | 作用 |
---|---|---|---|
byte | Byte | parseByte(String s) | 将字符串转换为byte类型 |
short | Short | parseShort(String s) | 将字符串转换为short类型 |
int |
Integer |
parseInt(String s) | 将字符串转换为int类型 |
long | Long | parseLong(String s) | 将字符串转换为long类型 |
float | Float | parseFloat(String s) | 将字符串转换为float类型 |
double | Double | parseDouble(String s) | 将字符串转换为double类型 |
boolean | Boolean | parseBoolean(String s) | 将字符串转换为boolean类型 |
解释;
字符串与char类型的转换可以通过字符串的charAt(int index )
方法来实现。
注意:
1、Integer与int的区别
- Integer是int的包装类,int则是java的一种基本数据类型
- Integer变量必须实例化后才能使用,而int变量不需要
- Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 。
- Integer的默认值是null,int的默认值是0
int 是基本数据类型
Integer是其包装类,注意是一个类。
2、为什么要提供包装类呢???
一是为了在各种类型间转化,通过各种方法的调用。否则 你无法直接通过变量转化。
比如,现在int要转为String
int a=0;
String result=Integer.toString(a);
在java中包装类,比较多的用途是用在于各种数据类型的转化中。
我写几个demo
//通过包装类来实现转化的
int num=Integer.valueOf("12");
int num2=Integer.parseInt("12");
double num3=Double.valueOf("12.2");
double num4=Double.parseDouble("12.2");
//其他的类似。通过基本数据类型的包装来的valueOf和parseXX来实现String转为XX
String a=String.valueOf("1234");//这里括号中几乎可以是任何类型
String b=String.valueOf(true);
String c=new Integer(12).toString();//通过包装类的toString()也可以
String d=new Double(2.3).toString();
再举例下。比如我现在要用泛型
List<Integer> nums;
这里<>
需要类。如果你用int。它会报错的
例1:
Public class Text {
Public static void main(String[] args){
String str1 = “2020”;
String str2 = “3.14”;
String str3 = “true”;
Int num = integer.parseInt(str1);
Double doub = double.parseDouble(str2);
Boolean bool = boolean.parseBoolean(str3);
}
}
例2:
Public class Text {
Public static void main(String[] args){
String str = “2020年新春快乐。”;
Char char =str.charAt(4);
}
}