1、数组
1.1概念
- 数组是一种线性的数据结构,它包含一组相同类型的元素,并且每个元素都有一个唯一的索引值。这些元素在内存中按照顺序连续存储
- 数组是一种引用数据类型。在数组中,可以存储基本数据类型,也可以存储引用类型
- 引用类型:类、String、数组、接口、枚举、注解
- 方法中的变量,如果是基本数据类型,存储在栈内存中
- 如果是引用类型,内容存储在堆内存中,在栈内存中,有一个变量指向堆内存地址(引用)
1.2数组的声明和初始化
1.2.1声明数组
- 声明数组时,我们需要指定数组的类型和名称。
- 例如:
// 声明一个整型数组
int[] numbers;
//声明一个双精度浮点型数组
double[] scores;
1.2.2初始化数组
- 在声明数组之后,我们需要为数组分配内存空间并初始化它。这可以通过使用
new
关键字来完成。
静态初始化
在声明数组的同时直接初始化数组元素的值:
int[] numbers = {1, 2, 3, 4, 5}; // 静态初始化整型数组
动态初始化
先声明数组,然后分配内存空间并初始化数组元素的值:
int[] numbers = new int[5]; // 分配一个长度为5的整型数组
numbers[0] = 1; // 初始化第一个元素
numbers[1] = 2; // 初始化第二个元素
// ...以此类推
1.3.数组的索引
- 数组中的每个元素都有一个唯一的索引值,用于访问该元素。在Java中,数组的索引是从0开始的。例如,在一个长度为5的数组中,索引的有效范围是0到4。
1.4.数组的长度
- 数组的长度是指数组中元素的个数。
- 在Java中,可以使用length属性来获取数组的长度。例如:
int[] numbers = {1, 2, 3, 4, 5};
int length = numbers.length; // 获取数组长度,length的值为5
1.5 数组的遍历
- 遍历数组是指依次访问数组中的每个元素,并对它们执行某些操作。
- 在Java中可以使用循环结构(如for循环)来遍历数组。例如:
int[] numbers = {1, 2, 3, 4, 5};
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]); // 遍历并打印数组中的每个元素
}
1.6 数组的拷贝
- 在Java中,数组是引用类型,直接赋值一个数组变量会使其指向另一个数组对象,而不是创建一个新的数组对象。
- 要拷贝一个数组,可以使用System.arraycopy()方法或数组的clone()方法。
1.7 多维数组
- 除了上述的一维数组之外,Java还支持多维数组,如二维数组、三维数组等。
- 多维数组中的每个元素本身也是一个数组。
- 二维数组可以看作是一个表格或矩阵。
2、字符串
2.1定义
- 符串是由一系列字符(char)组成的不可变序列。
- 在Java中,字符串是对象,属于java.lang.String类。
- 不是基本数据类型,是一种引用类型
2.2特点
- 不可变性:字符串一旦创建,其内容就不能被修改。每次对字符串的修改操作(如拼接、替换等)都会生成一个新的字符串对象。
- 引用类型:字符串是引用类型,存储在堆内存中。
- 常量池:对于通过字面量创建的字符串,Java会尝试在字符串常量池中查找是否存在相同内容的字符串。如果存在,则直接引用该字符串,避免重复创建。
2.3使用方式
- 字面量方式:直接使用双引号包围文本创建字符串对象,如
"Hello, World!"
。 - 构造器方式:使用
String
类的构造器创建字符串对象,如new String("Hello, World!")
。但这种方式与字面量方式在内存分配上有所不同。
2.4常用方法
- 构造方法:用于创建字符串对象,如
String(char[] value)
、String(byte[] bytes)
等。 - 比较方法:
equals(Object anObject)
:比较两个字符串的内容是否相等。equalsIgnoreCase(String anotherString)
:忽略大小写比较两个字符串的内容是否相等。compareTo(String anotherString)
:按字典顺序比较两个字符串的大小。
- 转换方法:
toCharArray()
:将字符串转换为字符数组。toUpperCase()
、toLowerCase()
:将字符串转换为大写或小写形式。
- 查找和截取方法:
indexOf(int ch)
、indexOf(String str)
:查找字符或子串首次出现的索引位置。substring(int beginIndex)
、substring(int beginIndex, int endIndex)
:截取子串。
- 替换和拆分方法:
replace(char oldChar, char newChar)
、replace(CharSequence target, CharSequence replacement)
:替换字符串中的字符或子串。split(String regex)
:根据正则表达式拆分字符串。
- 其他方法:
length()
:返回字符串的长度。isEmpty()
:判断字符串是否为空(即长度为0)。trim()
:去除字符串首尾的空白字符。format(String format, Object... args)
:格式化字符串。
2.5内存分配
- 字面量方式:字符串字面量存储在字符串常量池中,当创建相同内容的字符串时,会指向常量池中的同一个对象。
- 构造器方式:使用
new
关键字创建的字符串对象在堆内存中分配空间,与常量池中的字符串内容相同但引用地址不同。
2.6特殊转义字符
- 换行符 (
\n
):- 描述:在字符串中表示换行。
- 示例:
"Hello\nWorld!"
将输出为两行,第一行是 "Hello",第二行是 "World!"。
- 回车符 (
\r
):- 描述:在字符串中表示回车(在某些系统中与换行符功能相似)。
- 注意:在不同的操作系统中,换行和回车的表现可能不同。例如,在Windows中,换行通常使用
\r\n
,而在Unix/Linux中,换行通常使用\n
。
- 制表符 (
\t
):- 描述:在字符串中表示水平制表符,通常用于对齐文本。
- 示例:
"Hello\tWorld!"
将在 "Hello" 和 "World!" 之间插入一个制表符。
- 双引号 (
\"
):- 描述:在字符串中表示双引号字符本身,因为双引号在字符串中通常用于界定字符串的开始和结束。
- 示例:
"He said, \"Hello!\""
将在输出中包含双引号。
- 单引号 (
\'
):- 描述:在字符串中表示单引号字符本身。
- 示例:
String s = 'It\'s a beautiful day!';
注意这里示例中的字符串实际上应该使用双引号来界定,但这里是为了演示单引号的转义。
- 反斜杠 (
\\
):- 描述:在字符串中表示反斜杠字符本身,因为反斜杠在字符串中通常用作转义字符的前缀。
- 示例:
"C:\\path\\to\\file"
用于表示Windows文件路径中的反斜杠。
- Unicode 转义字符 (
\uXXXX
或\UXXXXXXXX
):- 描述:用于表示 Unicode 字符。其中
XXXX
或XXXXXXXX
是 Unicode 字符的十六进制表示。 - 示例:
"\u00A9"
表示版权符号(©)。
- 描述:用于表示 Unicode 字符。其中