前言
数组与字符串
一、数组
1. 作用
- 方便一次定义多个变量的工具
2. 定义及初始化
- 定义整形变量
- 语法:int 变量名;
int a;
定义一个整形变量 a;
- 定义整形数组
- 类比定义整形变量
- 语法: int[] 变量名;
int[] a;
定义一个整形数组类型的变量 a;
- 数组初始化
- 初始化长度为常量:
a = new int[10];
- 初始化数组长度为 10,值全为 0;
- 初始化长度为变量:
int[] a = new int[n];
int[] b;
b 也是一个数组,没有初始化则为空(NULL),长度为 0,不能直接用(类比 Java 中变量没有初始化值是不能使用)。String[] strs = new String[10];
初始化数组长度为 10 的字符串数组,值为 NULL- 1)默认初始化:
int[] a= new int[10];
初始化后值都为 0 - 2)直接初始化每个值:
int[] a = {0, 1, 2};
定义一个长度为 3 的数组,里面包含 3 个元素分别为 0, 1, 2
- 初始化长度为常量:
- 赋值
- Java 中的数组可以进行重新赋值(Java 中的数组可以理解为一个普通变量)
int[] a = {1, 2, 3}; a = new int[10];
初始定义长度为 3 的数组,可以重新赋值
3. 访问
- 取值:
[]
,a[0], a[1] … - 赋值:a[0] = 5;
- 遍历:支持范围遍历;
4. 多维数组
-
理解:理解为数组的数组,即数组里的每一个元素为一个数组
-
定义
- 类比一维数组定义
int[] a = new int[10]
定义一个一维数组,数组中的每个元素为整数
- 二维数组定义
int[][] a = new int[3][4];
定义一个二维数组,有 3 个元素(a 数组长度为 3),每个元素是长度为 4 的一维数组
- 类比一维数组定义
-
初始化:二维数组中每一元素的长度可以不一致,最后位置加不加
,
都可
int[][] a = { {0,1,2,3}, {4,5,6}, {8,9,10,11} };
-
访问:a[][]
-
范围遍历
int[][] q = new int q[n][n]; for (int[] row : q) for (int val : row)
5. 常用 API
length
:返回数组长度int[][] a = { {0, 1, 2, 3}, {4, 5, 6}, {8, 9, 10, 11} } System.out.println(a.length) // 3 for (int i = 0; i < 3; i ++) System.out.println(a[i].length); // 4 3 4
Arrays.sort()
:将数组从小到大进行排序import java.util.Arrays; int n = sc.nextInt(); int[] a = new int[n]; for (int i = 0; i < n; i ++) a[i] = sc.nextInt(); Arrays.sort(a);
Arrays.fill(int[] a, int val)
:填充数组(将数组所有元素初始化为 val),只能初始化一维数组int[] a = new int[10]; Arrays.fill(a, -1); System.out.println(Arrays.toString(a)); // 数组元素全部初始化为-1
Arrays.toString()
:将数组转化为字符串
二、字符串
1. 字符
- 字符与整数之间通过 ASCII 码联系
- 字符与整数之间相互转化
// 字符转化成整数 char c = 'a'; System.out.println((int)a); // 97 // 整数转化成字符 int a = 66; System.out.println((char)a); // B
- 字符进行运算
- 字符作运算时会自动转换为对应 ASCII 的整数
int a = 'B' - 'A';
// 1 char c = 'A' + 2
; // 67,存储时为 67 对应的二进制数
System.out.println(c)
; // C,char 类型只有在输出的时候显示为字符
- 字符作运算时会自动转换为对应 ASCII 的整数
2. String 类
-
空字符串:是一个长度为
0
的字符串对象;String empty = "";
-
null 字符串表示不存在字符串对象,是一个 null 引用;
-
字符串输出
System.out.println(str); System.out.printf("%s", str);
-
初始化
- 定义并赋值:
String a = "Hello";
- 定义并赋值另一个字符串:
String x = a;
// x 和 a 指向同一个变量 - 初始化时作运算:
String c = a + "yjx";
// +表示拼接
- 定义并赋值:
-
字符串与基本数据类型作运算
- 会先将基本类型转换为字符串,然后再作运算
String d = "My age is" + 18;
-> String d = “My age is” + “18”;
- 会先将基本类型转换为字符串,然后再作运算
-
字符串与对应基本数据类型转化
- 字符串转化为对应的基本数据类型
String mone = "123.45"; double money = Double.parseDouble(money);
- 基本类型转化为对应的字符串
// 方式1 int money = 123; String money = "" + money; // 用空字符串加变量的方式 // 方式2 Integer money = 123; // 定义成一个对象 String money_str = money.toString(); // 调用对象中的API toString
-
只读变量
- Java 中的 String 是不可修改的,若修改,修改后为一个新的变量
String a = "Hello "; a += "World";` // a为一个全新的变量
-
常用 API
-
所有 API 都 不会改变原来字符串的值,改变的是新串的值
-
charAt(idx)
:访问字符串,只能通过 API 进行访问,区别于 C++ 以数组的形式进行访问charAt(idx):访问 idx 位置的字符
String str = "Hello World"; for (int i = 0; i < str.length(); i ++) System.out.println(str.charAt(i));
-
split()
:分割字符串,分割结果为一个字符串数组String str = "Hello World"; String[] strs = str.split(" "); // 以空格进行分割
-
indexOf()
:查找字符或者字符串,第一次出现的下标,如果没有出现返回 -1 -
substring(beginIndex, endIndex)
:返回子串,区间范围为左闭右开;- [1, 3) :1,2
- [1] :1, 2, … 结束,直接到末尾
-
toCharArray()
:将字符串转换成字符数组,用于遍历字符串,String 本身不支持范围遍历,字符数组支持范围遍历String str = "Hello World" char[] cs = str.toCharArray(); for (char c : cs) System.out.print(c);
-
-
StringBuilder、StringBuffer
-
String 定义的对象是不可变的,进行单个字符插入操作,每插入一个字符都会重新构造一个新的字符串,都会将原字符串复制一遍,n2 级别的计算量,速度较慢,所以引入 StringBuilder 和 StringBuffer
-
StringBuilder:不支持多线程,速度较快;StringBuffer:支持多线程,速度较慢;
StringBuilder sb = new StringBuilder("Hello"); // 定义时进行初始化 sb.append("World"); // 在后面拼接一个字符 // String 不支持修改某个元素值,StringBuilder 支持修改某个元素值 for (int i = 0; i < sb.length(); i ++) { sb.setCharAt(i, (char)(sb.charAt(i) + 1)); // 取出第 i 个字符 + 1 -> 整数,再转化为char类型;将第 i 个字符替换为它的下一个字符 } sb.reverse(); // 翻转字符串,StringBuilder 是可以修改的,reverse() 会改变原来的值
-