String类
两个String类需要知道的知识点:
- 字符串的操作不会改变原本的字符串,都是产生一个新的字符串返回。
- 任意数据类型与字符串拼接都是字符串。包括与空字符串拼接。
特点:
- 字符串不变:字符串的值在创建后不能被更改。
- 因为String对象是不可变的,所以它们可以被共享。
- 直接赋值的字符串,去常量池找,如果没有就在常量池中创建一个。
- 第二次直接赋值的字符串,在常量池中可以找到,直接拿过来使用,存储在常量池中可以多次使用,节省空间。
- new String ( ) ,new是存储在堆中,new一次申请一块空间,new两次申请两块空间,这两块空间时相互独立的。
代码说明:
public class Demo {
public static void main(String[] args) {
String s1 = "abc";
s1 += "d";
System.out.println(s1);// "abcd"
// 内存中有"abc","abcd"两个对象,s1从指向"abc",改变指向,指向了"abcd"。
String s2 = "abc";
String s3 = "abc";
// 内存中只有一个"abc"对象被创建,同时被s2和s3共享。
}
}
String的构造方法:
String()
- 创建一个空的字符串。
String(String original)
- 创建一个新的字符串,内容和参数时一样的。
String(char[] value)
- 将字符数组中的内容组成一个字符串。
String(byte[] bytes)
- 通过字节数组组成字符串。
- 使用字节去ASCII码表中找到对应的字符,将数组拼成字符串。
String(byte[] bytes, int offset, int length)
- 通过字节数组一部分来构造新的字符串对象。
- int offset: 从哪个索引开始。
- int length : 长度
- 若超出了字符串,会报错。
直接赋值字符串。
示例代码:
public class Demo {
public static void main(String[] args) {
// 1.String() 创建一个空的字符串对象
String str1 = new String();
System.out.println("str1:" + str1);
// 2.String(String original) 根据字符串来创建一个字符串对象
String str2 = new String("abc");
System.out.println("str2:" + str2);
// 3.String(char[] value) 通过字符数组来创建字符串对象
char[] chs = {'A', 'B', 'C', 'D', 'E'};
String str5 = new String(chs);
System.out.println("str5:" + str5);
// 4.String(byte[] bytes) 通过字节数组来构造新的字符串对象
byte[] bytes = {97, 98, 99, 100, 101}; // a, b, c, d, e
String str3 = new String(bytes);
System.out.println("str3:" + str3);
// 5.String(byte[] bytes, int offset, int length) 通过字节数组一部分来构造新的字符串对象
String str4 = new String(bytes, 1, 2);
System.out.println("str4:" + str4);
//6.直接赋值字符串。
String str6 = "abcde";
System.out.println("str6:" + str6);
}
}
String的判断功能:
public boolean equals (Object anObject)
- 比较字符串的内容是否相等。
- 常用于用户的帐号密码匹配,要一模一样。
public boolean equalsIgnoreCase (String anotherString)
- 比较字符串的内容是否相等,忽略大小写。
- 常用于验证码的判断(忽略大小写都可以)
boolean startsWith(String prefix)
- 测试此字符串是否以指定的前缀开头。
- 并不一定是一个字符,也可以是多个字符。
boolean endWith (String suffix)
- 测试此字符串是否以指定的后缀结尾。
- 并不一定是一个字符,也可以是多个字符。
示例代码:
public class Demo03 {
public static void main(String[] args) {
String str1 = "hello";
String str2 = new String("hello");
String str3 = "Hello";
// 1.boolean equals(Object anObject) 比较字符串的内容是否相等
// 常用于用户的账号密码匹配,要一模一样
System.out.println("equals: " + str1.equals(str2)); // equals: true
System.out.println("equals: " + str1.equals(str3)); // equals: false
// 2.boolean equalsIgnoreCase(String anotherString) 比较字符串的内容是否相等,忽略大小写
// 常用于验证码的判断(大小写都可以)
System.out.println("equalsIgnoreCase: " + str1.equalsIgnoreCase(str3)); // equalsIgnoreCase: true
// 3.boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开头。
System.out.println("startsWith: " + str1.startsWith("h")); // true
System.out.println("startsWith: " + str1.startsWith("he")); // true
System.out.println("startsWith: " + str1.startsWith("e")); // false
// 4.boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结尾。
System.out.println("endsWith: " + str1.endsWith("o")); // true
System.out.println("endsWith: " + str1.endsWith("lo")); // true
System.out.println("endsWith: " + str1.endsWith("l")); // false
}
}
String的获取功能:
int length()
- 返回此字符串的长度。
String concat(String str)
- 将指定的字符串连接到该字符串的末尾。
- 字符串的操作不会改变原本的字符串,都是产生一个新的字符串返回。
char charAt(int index)
- 返回指定索引处的 char值。
int indexOf(String str)
- 返回指定子字符串第一次出现的字符串内的索引。
- -1表示没有找到。
String substring(int beginIndex)
- 返回一个字符串,该字符串是此字符串的子字符串。
- 从哪个位置开始,到结束 一刀两段
String substring(int beginIndex, int endIndex)
- 返回一个字符串,该字符串是此字符串的子字符串。
- 两刀三段取中间,包含开头,不包含结尾。
String trim()
- 处理字符串前后多余的空格。(中间的空格不能去掉)
示例代码:
public class Demo04 {
public static void main(String[] args) {
String str1 = new String("HelloWorld中国");
System.out.println("长度 = " + str1.length()); // 长度 = 12
String str2 = str1 + "你好";
System.out.println("str2 = " + str2); // str2 = HelloWorld中国你好
// String concat(String str) 将指定的字符串连接到该字符串的末尾。
// 字符串的操作不会改变原本的字符串,都是产生一个新的字符串返回
String str3 = str1.concat("你好2"); // "HelloWorld中国你好2"
System.out.println("str3 = " + str3); // str3 = HelloWorld中国你好2
// 3.char charAt(int index) 返回指定索引处的 char值。
// 01234 56
String str4 = "HelloWo";
System.out.println("char = " + str4.charAt(0)); // H
// 4.int indexOf(String str) 返回指定子字符串第一次出现的字符串内的索引。
System.out.println("indexOf = " + str4.indexOf("e")); // 1
System.out.println("indexOf = " + str4.indexOf("llo")); // 2 第一给字母的索引
System.out.println("indexOf = " + str4.indexOf("ak")); // -1表示没有找到
String str5 = "HelloWo";
// 5.String substring(int beginIndex) 返回一个字符串,该字符串是此字符串的子字符串。
// int beginIndex: 从哪个位置开始,到结束 一刀两段
String sub1 = str5.substring(1);
System.out.println("str5 = " + str5); // str5 = HelloWo
System.out.println("sub1 = " + sub1); // sub1 = elloWo
// 6.String substring(int beginIndex, int endIndex) 返回一个字符串,该字符串是此字符串的子字符串。
// 两到三段取中间,包含开头不包含结尾
String sub2 = str5.substring(1,4);
System.out.println("sub2 = " + sub2); // sub2 = ell
}
}
String的转换功能:
char[] toCharArray()
- 将此字符串转换为新的字符数组。
byte[] getBytes()
- 将字符串转成字节数组、
String toLowerCase()
- 将此 String所有字符转换为小写。
String toUpperCase()
- 将此 String所有字符转换为大写。
String replace(CharSequence target, CharSequence replacement)
- 将字符串中target内容替换为replacement。
- 全部都改变,不是只修改第一个。
示例代码:
public class Demo05 {
public static void main(String[] args) {
String str1 = "HelloWorld";
// 1.char[] toCharArray() 将此字符串转换为新的字符数组。
char[] chs = str1.toCharArray();
// 2.byte[] getBytes() 将字符串转成字节数组
byte[] bytes = str1.getBytes();
// 3.String toLowerCase() 将此 String所有字符转换为小写。
String str2 = str1.toLowerCase(); // 将str1字符串中的内容全部转成小写
System.out.println("toLowerCase = " + str2); // toLowerCase = helloworld
// 4.String toUpperCase() 将此 String所有字符转换为大写。
String str3 = str1.toUpperCase();
System.out.println("toUpperCase = " + str3); // toUpperCase = HELLOWORLD
// 5.String replace(CharSequence target, CharSequence replacement) 将字符串中target内容替换为replacement
String str5 = "我爱你"; // 你 --换成-> 中国
String str6 = str5.replace("你", "中国");
System.out.println("replace = " + str6); // replace = 我爱中国
}
}
String分割功能:
String[] split(String regex)
- 根据指定的内容将字符串分割成多个内容
注意:
切割的时候,如果用"."来切割,则必须要换成"\\.",因为"."是正则表达式的通配符,会匹配任何字符,会把此字符切碎,返回的数组为null。
StringBuilder类
StringBuilder类概述:
本质就是一个字符串,是可变的字符串。
- String:不可变的字符串。
StringBuilder的作用:
解决字符串拼接耗性能的问题。
StringBuilder类构造方法:
StringBuilder()
- 创建可变字符串,默认数组长度是16。
StringBuilder(String str)
- 将不可变字符串转换为可变字符串,默认数组长度是16。
对扩容问题的解释:
- 一开始创建容量为16的数组,添加元素的时候,如果数组以满,则会自动扩容。每一次扩容都是当前容量的一倍。
StringBuilder类常用方法:
StringBuilder append(数据类型 变量名)
- 拼接内容。
String toString()
- 将可变字符串转换为不可变字符串。
StringBuilder deleteCharAt(int index)]
- 删除指定索引,返回字符串。
StringBuilder reverse()
- 反转数组。
使用场景:
如果需要执行大量的字符串拼接操作,则强烈推荐使用StringBuilder。
链式编程
当方法返回值是一个对象时,可以继续调用对象的方法。
包装类
概述:
一个可以将基本数据类型封装成对象的类则称为包装类。
包装类常见操作:
- 将字符串转换为对应的基本数据类型。
- 将基本数据类型转换为字符串类型。
Integer包装类概述
构造方法: (已淘汰,了解即可)
Integer(int value)
- 将一个整数value转换成整型包装类对象。
Integer(String s)
- 将一个字符串数值转换成整型包装类对象。
成员方法:
int intValue()
- 将包装类对象转换为基本数据类型整型。
static Integer valueOf(int num)
- 将基本数据整型转换为包装类对象
static int parseInt(String str)
- 把字符串转换为int值。
static String toString(int i)
- 将整数i转换成字符串
静态成员变量:
- Integer.MAX_VALUE:整数最大值
- Integer.MIN_VALUE:整数最小值
自动装箱与自动拆箱
自动装箱和自动拆箱概述:
JDK1.5的新特性。
自动装箱:
Java编译器自动将基本数据类型转换为对应的包装类类型的过程。
自动拆箱:
Java编译器自动将包装类类型转换为对应的基本数据类型的过程。
小结:
只要两边数据类型不一致,一边是基本数据类型,一边包装类类型,则就会发送自动装箱或自动拆箱。