数组
1. 数组与其他容器之间的区别有三个:
效率:数组是一种效率最高的存储 和 随机访问对象的方式;
类型:数组会对放入其中的对象进行类型检查(编译阶段),其他容器,都是在运行阶段进行类型检查;
保存基本类型的能力:数组可以保存基本类型,其他容器不行;
2. 数组缺点:数组在创建的时候,大小就被固定了,并且生命周期也是不可改变的。
ps:java中,数组和容器,都有边界检查;
3. 对象数组和基本类型数组唯一的区别是:对象数组保存的是引用,基本类型数组保存的是值;
4. 数组的初始化:
数组声明/初始化方式有三种:
(1)String[] strArray = new String[5];
(2)String[] strArray = {"a", "b", "c"};
(3)String[] strArray = new String[] {"a", "b", "c"};
编程思想上说,当不确定数组元素个数时,可以用第三种初始化方式,不理解,与第二种什么区别
测试:ps - 结果与预想的不一样
public static void main(String[] args) {
testBaseType();
testString();
testObject();
}
private static void testBaseType() {
int[] a = {1, 2, 3};
int[] b;
b = a;
for (int i = 0; i < b.length; i++) {
b[i]++;
}
for (int i = 0; i < a.length; i++) {
System.out.println("a" + i + " :" + a[i]);
System.out.println("b" + i + " :" + b[i]);
}
System.out.println("----------------------------");
}
private static void testString() {
String[] strArray1 = {"a", "b", "c"};
String[] strArray2;
strArray2 = strArray1;
for (int i = 0; i < strArray2.length; i++) {
strArray2[i] = "d";
}
for (int i = 0; i < strArray1.length; i++) {
System.out.println("strArray1" + i + " :" + strArray1[i]);
System.out.println("strArray2" + i + " :" + strArray2[i]);
}
System.out.println("----------------------------");
}
private static void testObject() {
Integer[] a = {1, 2, 3};
Integer[] b;
b = a;
for (int i = 0; i < b.length; i++) {
b[i]++;
}
for (int i = 0; i < a.length; i++) {
System.out.println("a" + i + " :" + a[i]);
System.out.println("b" + i + " :" + b[i]);
}
}
// 结果:
a0 :2
b0 :2
a1 :3
b1 :3
a2 :4
b2 :4
----------------------------
strArray10 :d
strArray20 :d
strArray11 :d
strArray21 :d
strArray12 :d
strArray22 :d
----------------------------
a0 :2
b0 :2
a1 :3
b1 :3
a2 :4
b2 :4
5、数组初始化默认值:
对象:默认null
基本类型:默认0
布尔型:默认false
字符型:默认(char)O
6. java.util类库中,有Arrays类,提供了一系列实用的static方法:
equals():比较两个数组是否相等;
fill():以某个值填充数组;
sort():对数组进行排序;
binarySearch():在已经排序的数组中查找元素;
asList():接收任意的数组为参数;
// TODO 待测试
7. 复制数组:java标准类库提供有static方法 - System.arraycopy(),比for循环复制要快很多;
测试:ps:结果还是跟预期的不符啊,编程思想说,对象数组复制,只复制引用,我以为a1和b1的内容应该是一样的
public static void main(String[] args) {
testArrayCopy();
}
private static void testArrayCopy() {
int[] a = {1, 2, 3};
int[] b = new int[3];
Integer[] a1 = {1, 2, 3};
Integer[] b1 = new Integer[3];
String[] strArray1 = {"a", "b", "c"};
String[] strArray2 = new String[3];
System.arraycopy(a, 0, b, 0, 3);
System.arraycopy(a1, 0, b1, 0, 3);
System.arraycopy(strArray1, 0, strArray2, 0, 3);
for (int i = 0; i < b.length; i++) {
b[i]++;
b1[i]++;
strArray2[i] = "d";
}
for (int i = 0; i < b.length; i++) {
System.out.println("a " + i + " :" + a[i]);
System.out.println("b " + i + " :" + b[i]);
System.out.println("a1 " + i + " :" + a1[i]);
System.out.println("b1 " + i + " :" + b1[i]);
System.out.println("strArray1 " + i + " :" + strArray1[i]);
System.out.println("strArray2 " + i + " :" + strArray2[i]);
}
}
// 测试结果
a 0 :1
b 0 :2
a1 0 :1
b1 0 :2
strArray1 0 :a
strArray2 0 :d
a 1 :2
b 1 :3
a1 1 :2
b1 1 :3
strArray1 1 :b
strArray2 1 :d
a 2 :3
b 2 :4
a1 2 :3
b1 2 :4
strArray1 2 :c
strArray2 2 :d