数组(数组与泛型待补充,深浅拷贝待补充)
来源:互联网 发布: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)声明数组,在栈中开辟一块空间来存储变量
(2)创建数组,在堆中开辟一块连续空间,并把所有元素默认初始化
(3)把堆中数组的地址赋值给变量名
(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)声明数组,在栈中开辟一块空间来存储变量
(2)创建数组,在堆中开辟一块连续空间,并把所有元素默认初始化,因为元素是引用类型,所以初始化为null
(3)把堆中数组的地址赋值给变量名
(4)创建一个car对象,然后把car对象的地址传递给数组中的元素,其他元素同理,得到最终的数组
3.二维数组内存分析,代码如下:
int[][] a = { {1,2}, {3,4,5,6}, {7,8,9}};
(1)在栈中开辟一块空间存储变量,然后在堆中开辟一块连续空间创建一维数组,该一维数组的元素默认初始化为null,把一维数组地址赋给栈中变量
(2)依次创建子数组,并把子数组的地址赋给前面创建的数组元素
四.java.util.Arrays包下数组相关方法
五.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)(目前还无法理解,等看了泛型之后补上)
- 数组(数组与泛型待补充,深浅拷贝待补充)
- 数组补充
- 03 JAVA 数组补充 拷贝、序列化
- 数组的深浅拷贝
- IOS数组的深浅拷贝
- JS数组的深浅拷贝
- javascript 数组的深浅拷贝
- js 数组的深浅拷贝
- 待补充
- 待补充
- 待补充
- 数组总结之补充
- (总结)C++与java比较教程--7.2 C++中声明指针类型和指针数组(待补充)
- js 数组对象的深浅拷贝
- 对象和数组的深浅拷贝
- 实现数组和对象的深浅拷贝
- 【个人】JavaScript数组知识点补充
- 关于数组的补充问题
- ubuntu14.04中关于flash插件在firefox无法使用的解决方法
- C语言的项目开发模型(1)-字符串两头堵
- Java反射结合属性文件实现工厂模式
- Perfect Squares
- 第六天:二维数组和 面向对象的思想
- 数组(数组与泛型待补充,深浅拷贝待补充)
- 实现三级缓存加载图片
- [2016-8-19]成员变量、可变参数、Scanner
- 【转载】github入门到上传本地项目
- 读懂Spring依赖注入的每个细节
- PerconaXtraBackup --全备增备prepare restore
- 参数传递二维数组
- “排列与组合”笔记
- Oracle 11g必须开启的服务及服务详细介绍