文章目录
1、Array通识
-
Java中,数组是一种引用数据类型,不属于基本数据类型,数组的父类是Object
-
数组实际是个容器,可以同时容纳多个元素
-
数组,即一组数据,是个数据集合
-
数组当中可以存储基本数据类型,也可以存储引用数据类型的数据
-
数组中如果存储的是Java对象的话,实际上存储的是引用(对象的内存地址)
-
数组一旦创建,Java中规定长度不可变
2、数组的分类
Java中,数组分为一维数组、二维数组、三维数组、多维数组……
Java中的数组对象都有length属性,用于获取数组中元素的个数
Java中的数组,要求数组中元素类型要统一,如int数组则只能存int类型的数据
3、一维数组的内存结构
- Java中,一维数组在内存中存储的时候,数组中元素的内存地址是连续的
- 所有数组都是以首元素的内存地址做为整个数组对象的内存地址
- 数组中每一个元素都是有下标的,从0开始,最后一个下标为length-1
数组这种数据结构的优缺点:
优点:
- 查询检索某个下标上的元素效率极高(首先每个元素的内存地址连续,其次元素类型相同即占用的空间大小一样,直白说就是偏移量一样,这样一个数学表达式就能算出某个下标上元素的内存地址),是效率最高的一个数据结构
缺点:
- 为了保证元素内存地址的连续,在数组上随机增删元素时效率较低,因为会导致后面的元素统一向前向后位移(最后一个元素无影响,然而时间复杂度按照最坏的情况算)
- 不能存储大量数据(不容易找到一块很大的连续的内存空间)
4、一维数组的定义与初始化
定义:
//定义
int[] array1;
boolean[] array2;
Object[] array3;
初始化:
静态初始化一维数组:
int[] array = {100,200,300};
动态初始化一维数组:
int[] array = new int[5]; //5表示元素个数是5,元素值默认是0
String[] names = new String[6]; //6个元素,默认值null
5、一维数组中元素的访问
//测试数组
int[] a = {1,2,3,4,5};
(1)查
通过数组名[下标]
System.out.println("元素个数:"+ a.length); //数组对象的length属性
System.out.println(a[0]); //首位元素
System.out.println(a[a.length-1]); //末尾元素
(2)改
数组名[下标] = values;
a[0] = 111;
a[a.length-1] = 9527;
(3)遍历
//正序遍历
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
//倒叙遍历
for(int i=a.length-1;i>=0;i--){
System.out.println(a[i]);
}
//下标越界
System.out.println(a[100]);
下标越界异常:ArrayIndexOutBoundException
6、动态初始化一维数组
关于静态和动态初始化数组,静态即创建数组时,已确定个元素的值,如
Object[] objects = {new Object(),new Object(),new Object(),new Object()};
动态初始化即后期再a[0]=xx;a[1]=xx;如:
int[] a = new int[4];
举例:
public static void printArray(String[] args){
for(int i=0;i<args.length;i++){
System.out.println(args[i]);
}
}
public static void main(String[] args) {
//等价于String[] a = new String[3];
//再printArray(a);
printArray(new String[3]);
//直接传递静态数组是错误写法
printArray({"1", "2", "3"});
//这样是允许的
printArray(new String[]{"1", "2", "3"});
//或者改成这样也行
String[] a = {"1", "2", "3"};
printArray(a);
}
部分截图:
7、main方法的传参是String数组
到此,main方法中的传参也就明晰了,即一个String数组String[] args,数组名args
public static void mian (String[] args){
System.out.println("JVM传的String数组的长度是:" + args.length);
}
args做为一个引用,我们引用.length属性没有空指针异常,说明args不是null。即String[] args = {};
或者说String[] args = new String[0]; ,就是说数组对象创建了,但里面没有数据。
🍁那么String[] args数组何时会有值?
String[] args数组是留给用户的,用户可以再控制台上输入参数,这些参数会被转化为String[] args
8、数组中存储引用数据类型
对于存引用数据类型的数组来说,实际上存的是Java对象的内存地址,数组中每个元素都是引用。
9、数组的扩容
Java中,数组长度一旦确定则不可变,当数组满了的时候,就需要扩容:
- 先新建一个大容量的数组,然后将小容量数组中的数据一个个拷贝到大数组中(扩容效率很低)
- 拷贝使用System类中的静态方法arrayCopy()
//源代码
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
四个传参为:
拷贝源数组、源数组的起点下标、目标数组(大数组)、目标的起点下标、拷贝长度
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/146105.html