一维数组
- 数组,是相同类型数据的有序集合。3个关键词,“相同类型的数据”+“有顺序的”+“集合”。实际上,系统一旦发现是数组集合,就会将集合中数据,存储在连续的内存位置上。
- 通过下标访问数组中的元素,下标从0开始。
- 数组是集合,存储的元素,可以是基础数据类型,也可以对象类型,或者是数组类型(也就是多维数组)。
// 定义基础数据类型数组
int[] numArr; // int类型的数组
char charArr[]; // char类型的数组
// 定义对象类型的数组
Date dateArr[]; // Date类型的数组
Count CountArr[]; // Count类型的数组
- 数组需要先声明/定义再使用。就如对象一样,声明后要new进行实例化。而数组定义时,也不会创建数组对象本身,并为其分配内存。要经过初始化后,才能使用数组,包括访问数组的元素等。
- 但值得注意的是,Java不支持静态的数组定义,也就是声明数组时指定数组长度。如
int numArr[5];
- 数组的创建或者说初始化,分为“静态初始化”和“动态初始化”两种。
- 静态初始化,就是在定义数组的同时,对数组的元素进行赋值。
- 而动态初始化,则是先通过new运算符,创建指定数据类型的数组,并指定数组的长度,后续通过下标来给数组元素赋值。
// 数组的静态初始化
int[] numArr = {0, 1, 2, 3, 4, 5}
char charArr[] = {'C', 'h', 'i', 'n', 'a'}
// 数组的动态初始化 Liang
String names[];
names = new String[5];
names[0] = 'L';
names[1] = 'i';
names[2] = 'a';
names[3] = 'n';
names[4] = 'g';
// 对象类型的动态初始化
Date age[] = new Dat[2];
age[0] = new Date('1949');
age[1] = new Date('2022');
- 通过下标,访问数组内的元素,下标也称为索引,都是从0开始,可以是整数的常量或者表达式。
- 数组对象的length属性表示数组内元素的个数,我们可以通过length属性进行数组的边界检查。
- 实际上,我们使用new创建数组时,会指定数组的长度,这时系统会自动赋值给length属性。而一旦数组创建,大小就固定了。
多维数组
- 如果数组中元素也是数组,就是二维数组。同理,数组中再存数组,层层套娃,就是多维数组。
int[][] pointArr; // 定义二维的int数组
char strArr[][][]; // 定义三维的char数组
Date dateRangeArr[][][][]; // 定义四维的Date数组
- 与一维数组一样,多维数组的初始化也分为“静态初始化”和“动态初始化”
- 静态初始化时,不必指定数组每一维的大小,系统会根据初始化给的初始值,自动计算数组每一维的大小
- 动态初始化时,有两种分配内存的方式:直接分配与按维度分配
- 直接分配就是声明数组时,给出各个维度数组的大小;
- 按维分配就是从最高维度起,分别为每个维度分配内存;
// 静态初始化
int intArr[][] = {{1, 2}, {1, 3, 5}, {2, 4, 6}};
// 动态初始化-直接分配
int a[][] = new int[2][3];
// 动态初始-按维分配
int twoDim[][] = new int[4][]; // 先只分配第一维的数组大小
twoDim[0] = new int[5];
twoDim[1] = new int[5];
twoDim[2] = new int[5];
twoDim[3] = new int[5];
- 多维数组也有length属性,也通过下标来访问数组内的元素。
- 值得注意的是,不管一维还是多维数组,都是定长的。一旦创建后,数组的大小就不能再变化。如果需要改变数组,可以通过
System.arraycopy()
方法,将数组重新赋值给一个新的数组。 - 同时,
java.util.Arrays
类,提供了一系列数组的静态方法:equals(type[], type[])
:判断两个数组的值是否相同;sort(type[])
:将数组按升序进行排序(如果数组内元素是对象,此方法将调用元素内对象的compareTo方法来比较);fill(type[], type value)
:将value值填充到数组的每个元素;binarySearch(type[], type value)
:采用二分查找法在数组中查找value值;
字符串类型
String与StringBuffer
- Java中的字符串是由数个字符组成的序列,同时也是一个对象。Java的标准包
java.lang
封装了String和StringBuffer类,分别处理不变字符串和可变字符串。 - 顾名思义,不变字符串是字符串一旦创建,内容就不能改变,即便调用String类的查找、比较、连接等操作,也不能插入新字符串,或者改变原来字符串本身。
- Java字符串分为“常量”和“变量”,常量用双引号括起来,创建过程是隐式的,比如打印日志
System.out.println("This is String")
;而变量则要先声明后初始化;
String s1;
StringBuffer sb1;
s1 = new String();
sb1 = new StringBuffer();
// 由字符串数组,创建字符串
char chars = {'a', 'b', 'c'};
String s2 = new String(chars);
// 用字符串常量初始化
String s3 = "Hello World";
// StringBuffer需要new来创建
StringBuffer strb3 = new StringBuffer(s3);
字符串操作与判断
- 前面已经提到,String类的字符串是不可变的字符串。操作String字符串后,并不改变字符串本身,而是生成另一个实例。
- StringBuffer类字符串处理可变字符串,不创建新字符串对象,而是直接操作字符串本身。
String和StringBuffer共有方法
length()
:返回字符串长度(字符个数);charAt(int index)
:返回字符串中指定索引位置index的字符;subString(int beginIndex)
:从beginIndex位置开始截取字符串,直到末尾;
String类独有的方法
replace(char oldChar, char newChar)
:将当前字符串中所有的oldChar,替换成newChar;toLowerCase()
:将当前字符串中所有字符转换成小写形式;toUpperCase()
:将当前字符串中所有字符转换成大写形式;concat(String str)
:将str字符串,拼接到当前字符串末尾;starsWith(String prefix)
:测试prefix是否为当前字符串的前缀;trim()
:剔除字符串前后的空白;valueOf(type value)
:将任意数据类型的参数value,转换成字符串;
StringBuffer类独有的方法
append(String str)
:将参数str添加到当前字符串的最后;replace(int start, ind end, String str)
:将当前字符串中start到end的位置,替换成参数str;capacity()
:返回当前字符串的容量;strbuferr_length = str_num + capacity
注意:系统为String类对象分配内存时,是按字符的实际个数等量分配的;而StringBuffer类分配内存时,除去字符所占的空间外,会再另外加入16个字符大小的缓冲区。
Vector(向量)类
- Java引入Vector(向量)类,可看作是一个可变数组。这个数组的大小根据需要来改变,增加或删除元素,Vector会相应的变大或变小。除此之外,Vector可以存储不同类型的元素,但不能是基础数据类型。
Vector vList = new Vector();
vList.add(0, new String("开国大典"));
vList.add(1, new Date(1949));
vList.add(2, new String("举办北京奥运会"));
vList.add(3, new Date(2008));