package cn.ekgc.javasenior.day20210624;
import java.util.Arrays;
public class StringDemo01 {
public static void main(String[] args) {
/*
* 1、在 Java 中,代表“字”这个概念的是 char 类型。
* 2、char 的本质就是一个 16 位的无符号整数。
* 3、计算机字符的发展:
* (1)对于计算机本身来说,并不存在字、数字等概念,只有 0 和 1 两个状态。
* (2)为了能够产生字符,那么人为的将二进制的值和字符相对应进行编码。
* (3)于是,美国使用了一个字节进行该方案的编码,使用一个字节的正数部分,
* 也就是 0 ~ 127 进行字符的编码,该方案就形成了 ASCII。
* 以后所有的字符编码方案都继承于 ASCII 编码方案,所有的方案 0 ~ 127 都是 ASCII 的编码。
* 在 ASCII 编码方案中:A - 65。
* 4、对于 Java 的 char 类型来说,一次只能够存储一个字符。
*/
// 如果需要存储多个字符,那么就必须使用多个 char 变量
char chr1 = '李';
char chr2 = '静';
char chr3 = '平';
// 由于 char 类型只能够存储一个字,那么为了能够存储多个字,可以使用 char[]
char[] chrs = {'李', '静', '平'};
// 但是数组在进行操作时,会带来极大的不便利性,最大的问题就是长度不可变的问题。
// 因此,为了解决使用 char[] 的不便利性,于是就诞生了 String——字符串。
// 就可以使用 String 来存储多个字符。
/*
* 对于字符串来说,一次性可以存储多个字符,而且操作将比 char[] 方便的多。
* 但是,对于 String 类型来说,其结构特征如下:
* 1、String 类使用关键字 final 来进行修饰。
* (1)表示任何子类都无法继承于 String。
* (2)一旦创建一个 String 类型的对象,那么这个对象将不再发生任何变化。
* 2、String 本质上就是使用了一个 char[] 存储对应字符。
* private final char value[]
* 而且这个 char[] 使用了关键字 final 进行修饰,那么表名这个 char[] 一旦被赋值,将不再发生变化。
*/
/*
* 要想创建一个 String 类型的对象,有以下两种方式:
* 1、创建 String 类型的对象和基本数据类型一样,可以直接进行赋值
* 原因在于,String 类型属于经常会被使用到的,因此在设置之初,就尽量的将其使用方式靠近基本数据类型的使用。
* 如果采取基本数据类型的形式创建一个 String 对象,那么需要特别注意的是:
* 该对象不是直接存储在堆内存中,而 Java 会首先去方法区的字符串常量池中查找是否已经存在了该字符串对象,
* 如果找到了,那么就将这个字符串的地址值赋予变量,如果没有,才在字符串常量池中创建该字符串,
* 并将这个字符串的内存地址交给变量。a
*/
String str1 = "Hello World";
String str2 = "Hello World";
System.out.println("比较 str1 和 str2 的内存地址是否相同:" + (str1 == str2));
/*
* 2、由于 String 本身就是一个引用数据类型,那么也可以使用 new 关键字来创建其对象
* 对于关键字 new 来说,其作用就是直接在堆内存中开辟空间,创建对象,
* 因此使用 new 关键字创建的 String 对象则直接存储在堆内存,
* 而且只要通过 new 创建对象,那么就直接在堆内存中开辟空间,而不会去查找原来是否已经存在。
*/
String str3 = new String("Hello World");
String str4 = new String("Hello World");
System.out.println("比较 str3 和 str4 的内存地址是否相同:" + (str3 == str4));
System.out.println("比较 str1 和 str3 的内存地址是否相同:" + (str1 == str3));
/*
* 由于 String 的本质就是一个 char[],那么也可以通过 String 的构造方法,
* 将一个 char[] 变为 String 对象。
*/
String str5 = new String(chrs);
System.out.println(str5);
// 由于 char 的本质就是一个字符编码,也就是一个字节,那么也可以通过一个 byte[] 得到一个 String 对象
byte[] bytes = {65, 66, 67, 68, 69};
String str6 = new String(bytes);
System.out.println("通过 byte[] 获得一个 String 对象:" + str6);
// 要想将一个 String 对象变为一个 char 数组,则通过 String 的 toCharArray()
char[] chrs2 = str1.toCharArray();
System.out.println(Arrays.toString(chrs2));
// 要想将一个 String 对象变为一个 byte[],则通过 getBytes()
byte[] bytes2 = str1.getBytes();
System.out.println(Arrays.toString(bytes2));
// 将一个 char 强转为 int
System.out.println((int) 'A');
System.out.println((char) 82);
}
}
package cn.ekgc.javasenior.day20210624;
public class StringDemo02 {
public static void main(String[] args) {
// 创建 String 类型的对象
String str1 = "Hello World";
// 要想获得 String 的长度,那么通过 length() 获得
// String 的长度,就是其内部 char[] 的长度
System.out.println("str1 的长度是:" + str1.length());
// 要想判断两个 String 的内容是否相等,需要通过调用 equals() 来实现
String str2 = "hello world";
System.out.println("str1 和 str2 的内容是否相等:" + str1.equals(str2));
// 如果要忽略大小写的判断内容是否相等,那么通过 equalsIgnoreCase()
System.out.println("str1 和 str2 忽略大小写是否相等:" + str1.equalsIgnoreCase(str2));
// 要想将 String 内容统一变为大写,则通过 toUpperCase() 实现
System.out.println("将 str1 的内容都变为大写:" + str1.toUpperCase());
// 通过 toLowerCase() 将 String 的内容都变为小写
System.out.println("将 str1 的内容都变为小写:" + str1.toLowerCase());
// 要想判断 String 中是否有某个特定的字符,通过 contains 实现
System.out.println("判断 String 中是否包含字符 o:" + str1.contains("o"));
// 要想获得某个字符在 String 中的下标,那么通过 indexOf() 获得
// indexOf() 在查找时,是从前往后进行查找的
System.out.println("获得 str1 中 o 的下标:" + str1.indexOf("o"));
// 如果需要从后往前进行查找,那么通过 lastIndexOf()
System.out.println("获得 str1 中 o 的下标:" + str1.lastIndexOf("o"));
// 要想获得某个下标所对应的字符,通过 charAt()
System.out.println("获得 str1 中下标为 6 的字符:" + str1.charAt(6));
// 在 String 中,如果需要连接两个字符串,那么通过 + 或者是 concat() 实现
/*
* 无论是通过 + 连接字符串,还是通过 concat() 连接,
* 本质上都是重新又创建了一个 String,这个 String 是前两个字符串的拼接
*/
str1 = str1 + " 李静平";
String str4 = str1.concat(" 李静平");
System.out.println("通过 + 连接字符串:" + str1);
System.out.println("通过 concat() 连接字符串:" + str4);
// 如果直接使用两个字符串连接时,Java 在编译阶段,就已经将这两个字符串合为一个进行整体编译。
String str5 = "Hello" + " World"; // 编译时,就已经形成 String str5 = "Hello World";
// 如果需要截取 String 字符串的一段,那么通过 subString() 实现
System.out.println("截取 str1 从下标 3 开始到结束的字符串:" + str1.substring(3));
// 如果截取的不是到整个字符串结束,那么需要给定开始和结束的下标
System.out.println("截取 str1 从下标 3 开始,到下标 7 的字符串:" + str1.substring(3, 7));
String str6 = " 李静平 Hello World ";
System.out.println("获得 str6 的长度:" + str6.length());
// 对于有些系统来说,空格属于非法字符,需要去掉,那么通过 trim()
// trim() 能够去掉字符串的前后空格
str6 = str6.trim();
System.out.println("使用 trim() 去掉 str6 的前后空格:" + str6);
System.out.println("去掉前后空格后的 str6 的长度:" + str6.length());
}
}