一维数组
数组中存储元素的类型是统一的,每一个元素在内存中所占的空间大小是相同的,知道数组的首元素的内存地址,要查找的元素只知道下标就可以快速的计算出偏移量,通过首元素内存地址加上偏移量快速计算出要查找元素的内存地址,通过内存地址快速定位该元素,所以数组查找元素的效率较高随机的对数组进行增删元素,当增加的元素的时候,为了保证数组中元素在空间存储上是有序的,所以被添加元素位置后面的所有元素都要向后移动删除元素也是,后面所有的元素要向前移动。所以数组的增删元素的效率很低
静态数组
- 创建静态数组语法:
// 声名一个int类型的数组
int[] a1 = {100,200,300,400};
// 声名一个boolean类型的数组
boolean[] a2 = {true,false,true};
// 声名一个String类型的数组
String[] a3 = {"qqq","www","eee","rrr"};
// 声名一个byte类型的数组
byte[] a4 = {1,2,3,4,5};
// 声名一个char类型的数组
char[] a5 = {'a','b','c','d'};
// 声名一个object类型的数组
Object o1 = new Object();
Object o2 = new Object();
Object o3 = new Object();
Object o4 = new Object();
Object[] a6 = {o1,o2,o3,o4};
- 遍历数组及数组的length的用法:
int[] in = {5,4,3,2,1};
// 数组length的用法
System.out.println("数组中第一个元素为:" + in[in.length-5]);
System.out.println("数组中最后一个元素为:" + in[in.length-1]);
// 数组的修改:
in[1] = 6;
System.out.println("````````````````````");
// 遍历数组:
for(int i=0;i<in.length;i++) {
System.out.println("数组的元素依次为:" + in[i]);
}
动态数组
- 动态初始化一维数组,会先在堆内存中分配这个数组,并且数组中每一个元素都采用默认值。
数据类型 | 数据类型 | 数据类型 | 数据类型 | 默认值 |
---|---|---|---|---|
byte | short | int | long | 0 |
float | double | 0.0 | ||
boolean | false | |||
引用类型 | null |
创建动态数组语法:
// 动态声明一个int类型的数组,最多可以存储i个元素 int[] a1 = new int[i]; // 赋值 例如上面声名i个则最多可以创建i个元素 a1[0] = 1; a1[1] = 2; a1[2] = 3; a1[3] = 4; // 遍历 for (int i = 0; i < a1.length; i++) { System.out.println(a1[i]); }
创建对象动态数组:
// 创建对象动态数组 Object[] a2 = new Object[4]; for (int i = 0; i < a2.length; i++) { // a2[i].toString(); // Exception in thread "main" java.lang.NullPointerException // 空指针异常 Object o = a2[i]; System.out.println(o); /** * 使用a2[i].toString();与System.out.println(o);抛出异常的区别: * 1.使用a2[i].toString();抛出空指针异常 * 2.System.out.println(o);直接抛出null是因为println()底层代码中有一个 * return (obj == null) ? "null" : obj.eoString(); * 所以使用第二种方法不会抛出Error */
什么时候使用动态初始化,什么时候使用静态初始化?
- 无论是动态初始化还是静态初始化,最终的内存分布都是一样的。
- 如果在创建数组的时候,知道数组中应该存储什么数据,这个时候当然采用静态初始化方式,如果在创建数组的时候,无法预测到数组中存储什么数据,只是先开辟空间,则使用动态初始化方式。
数组的拷贝
语法:
System.arraycopy(数据源,源数组的开始下标,目标数组,目标数组的开始下标,拷贝长度); // 数据源是指拷贝的数据源,目标数组是指的是拷贝的指定数组
示例:
int[] src = {1,2,3,4,5,6,7}; int[] dest = {10,11,12,13,14}; // System.arraycopy(数据源,源数组的开始下标,目标数组,目标数组的开始下标,拷贝长度); // 数据源是指拷贝的数据源,目标数组是指的是拷贝的指定数组 System.arraycopy(src,2,dest,2,2); for (int i = 0; i < dest.length; i++) { System.out.println(dest[i]); }