数组(数组与泛型待补充,深浅拷贝待补充)

来源:互联网 发布:40本网络禁书阅读 编辑:程序博客网 时间:2024/06/16 21:14

一.数组基础
1.数组的定义: 数组是相同数组是相同类型数据的有序集合

2.数组的创建:
int[] a = new int[3];double[] b = new double[2];Car[] cars = new Car[10];

3.数组有一个length属性,例如a.length,返回数组中的元素个数

4.数组的特点:
(1) 数组是对象(其直接父类是Object类),是引用类型.数组元素相当于对象的成员变量(详情见内存图)
这里有一个例子:

public class ArrayTest {    public static void main(String[] args) {        int[] a1 = {1,2,3,4,5};        int[] a2;        a2 = a1;        for(int i = 0; i < a2.length; i++){            a2[i] = a2[i] + 1;        }        for(int i = 0;i < a1.length; i++){            System.out.println("a1["+ i +"] = "+a1[i]);        }    }}

输出结果:
a1[0] = 2
a1[1] = 3
a1[2] = 4
a1[3] = 5
a1[4] = 6
结果分析:
这里把a1数组的引用赋值给了a2,所以a2数组指向的就是a1数组,因此修改a2数组中元素的值,a1数组的值也改变了,因为两个数组实际上是一个数组
(2)数组的长度是确定的,数组一旦被创建它的大小就不可以改变了
(3)数组中的元素可以是任何数据类型,包括基本类型和引用类型
(4)某一数组中,所有元素必须是相同的类型,不允许出现混合类型
(5)数组的角标是从0开始的
(6)数组对象一旦被创建, 如果没有明确的初始化数组元素,每一个元素都会先被默认初始化(其实分配空间和赋值是一起进行的,也就是完成数组的初始化)

5.数组的基本语法
(1)数组的声明有两种方法:

  • Int[] a;(我们习惯的用法)
  • Int a[];

(2)创建数组对象(为数组对象分配连续的空间)

  • A = new int[4];
  • B = new int[3];

(3) 三种初始化(对数组元素的初始化)
①默认初始化(数组分配空间后,每个元素也被按照成员变量的规则被隐式初始化):
数组元素相当于对象的成员变量,默认值跟成员变量规则一样.数字0,布尔false,char是(char)0也就是\u0000,引用是null
②动态初始化(数组声明与为数组分配空间和赋值的操作分开进行);
int[] a;
a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
③静态初始化(在声明数组的同时就为数组元素分配空间并赋值)(有两种方式):
方式一:int c[] = {1,2,3,4};//长度为4,索引范围[0,3]
方式二:int c[] = new int[]{1,2,3,4};//大括号中有多少元素长度就是多少
Car[] cars = {new Car(“奔驰”), new Car(“电驴”), new Car(“三轮”)}

6.数组的遍历方法
(1)传统方式:

int[] numbers = new int[]{10, 20, 30, 40, 50};for (int i = 0; i < numbers.length; i++) {    System.out.println("element at index " + i + ": " + numbers[i]);}

(2)foreach语句(增强for循环不需要检查数组索引,如果你想逐个地访问所有的元素这是一种很好的方法,但是因为你不能访问索引,也就不能修改数组元素。):

for(int i: numbers){    System.out.println(i);}

二.多维数组(这里用二维数组举例)
1.二维数组的创建:二维数组可以看成一维数组为元素的数组
例如:

int [][] a = {{1,2},{2,4,5,6},{1,2,2}};

2.多维数组的特点
(1)java中的多维数组不必须是规则矩阵形式
(2)java中多维数组的声明和初始化应按照从高维到低维的顺序进行,
例如:

int[][] a = new int[3][];a[0] = new int[2];a[1] = new int[4];a[2] = new int[3];//! int t1[][] = new int[][4]   //这样是不允许的

(3)二维数组的长度:

int[][] a = new int[3][4];a.length = 3;a[0].length = 4;

三.数组的内存分析
1.元素为基本数据类型的数组,以下面数组为例

public static void main(String[] args){    int[] a = new int[3];    a[0] = 11;    a[1] = 22;    a[2] = 33;}

(1)声明数组,在栈中开辟一块空间来存储变量
步骤1
(2)创建数组,在堆中开辟一块连续空间,并把所有元素默认初始化
步骤2
(3)把堆中数组的地址赋值给变量名
步骤3
(4)根据需求修改数组元素的值
步骤4

2.元素为引用类型的数组,以下面数组为例

public void static main(String[] args){    Car[] cars = new Car[3];    cars[0] = new car("奔驰");    cars[1] = new car("电驴");    cars[2] = new car("三轮");}

(1)声明数组,在栈中开辟一块空间来存储变量
步骤1
(2)创建数组,在堆中开辟一块连续空间,并把所有元素默认初始化,因为元素是引用类型,所以初始化为null
步骤2
(3)把堆中数组的地址赋值给变量名
步骤3
(4)创建一个car对象,然后把car对象的地址传递给数组中的元素,其他元素同理,得到最终的数组
步骤4

3.二维数组内存分析,代码如下:

int[][] a = {    {1,2},    {3,4,5,6},    {7,8,9}};

(1)在栈中开辟一块空间存储变量,然后在堆中开辟一块连续空间创建一维数组,该一维数组的元素默认初始化为null,把一维数组地址赋给栈中变量
步骤1
(2)依次创建子数组,并把子数组的地址赋给前面创建的数组元素
步骤2


四.java.util.Arrays包下数组相关方法

返回值 方法名 解释 static < T > List< T > asList(T… a) 把数组转换为一个List返回 static int(两种返回值) binarySearch(很多重载方法) 使用二分法来搜索指定的数组,看数组中是否有指定值 static boolean[] (多种返回值) copyOf(很多重载方法) 复制指定的数组,截取或用默认值填充让新数组有指定长度 static boolean[] (多种返回值) copyOfRange(很多重载方法) 将指定数组的指定范围复制到一个新数组 static boolean deepEquals(Object[] a1,Object[] a2) 如果两个指定数组彼此是深层相等的,则返回true static int deepHashCode(Object[] a) 基于指定数组的“深层内容”返回哈希码 static String deepToString(Object[] a) 返回指定数组“深层内容”的字符串表示形式 static boolean equals(很多重载方法) 如果两个指定的某类型数组彼此相等,则返回true static void fill(很多重载方法) 用一个值填充数组的所有元素(如果该值是引用类型,填充的是地址,改变一个就会改变所有元素的值,因为所有元素指向的是用一个对象) static int hashCode(很多重载方法) 基于指定数组的内容返回哈希码 static void (两种返回值) sort(很多重载方法) 对指定的数组按照升序进行排序 static String toString(很多重载方法) 返回指定数组内容的字符串表示形式

五.java.langSystem类提供的数组拷贝方法
java.lang.System类提供了数组拷贝方法: System.arrayCopy把当前数组的元素拷贝到目标数组中。你可以拷贝整个或子数组,具体看你的需求。(要注意arraycopy是浅拷贝,关于深浅拷贝后序博文会详细说明)
例如:

public static void main(String args[]) {        int[] source = new int[]{10, 20, 30, 40, 50};        int[] target = new int[5];        System.out.println("Before copying");        for(int i: target){            System.out.println(i);        }        System.arraycopy(source, 0, target, 0, 3);        System.out.println("after copying");        for(int i: target){            System.out.println(i);        }}

输出结果:
Before copying
0
0
0
0
0
after copying
10
20
30
0
0


六.数组与泛型(<>中p440–p450)(目前还无法理解,等看了泛型之后补上)

0 0