二、JAVA基础-数组

一、定义

数组是一个固定长度的,包含相同类型数据的容器。数组元素可以是对象,也可以是基本类型。

数组在JAVA中是效率最高的存储和随机访问引用序列的方式,通过下标即可访问指定的元素。

 

二、声明与初始化

声明:

dataType[] arrayRefVar;

dataType arrayRefVar[];

 

常用上面一种声明方式,语法上更有意义。

初始化:

数组的初始化主要有三种方式:

1.默认初始化:使用new关键字,只指定数组的长度,数组元素的值会根据元素的类型自动设置初始值,如int[] 数组元素初始值为0,boolean[]数组元素初始值为false,包装类型如Integer[]数组元素的初始值为null

eg. int[] arrInt = new int[5];  声明一个长度为5的int数组,所有元素的值都是0

2.静态初始化:指定数组中每个元素的值,数组长度会自动计算获得

eg. int[] arrInt = {1,3,5,7,9}; 创建一个长度为5,元素分别是1,3,5,7,9的数组

3.动态初始化:指定数组的长度,并为数组元素赋值,未赋值的元素则自动设置初始值。

eg. 创建一个长度为3的float数组,并给前2个元素赋值,第三个元素则为默认值0.0

 

三、访问数组

上面我们说了数组可以通过下标来访问,下标从0开始,如arrFloat[0]即arrFloat数组第一个元素。

for-each可以让我们在不使用元素索引值的情况下遍历整个数组

eg.

 

四、一位数组、多维数组

1.一位数组最大长度 Integer.MAX_VALUE

2.多维数组最大维度数 255

3.非矩形数组,数组元素长度可以不同

 

五、数组的类表示
int[]: [I
byte[]: [B
long[]: [J
float[]: [F
double[]: [D
boolean[]: [Z
char[]: [C
String[]: [Ljava.lang.String;
Object[]: [Ljava.lang.Object;
数组的类表示数组维数“[”和数组中元素类型结合而成

 

六、Arrays
单线程:
1.binarySearch:查找数组中为 key 的 下标 :binarySearch 二分法查找,数组必须有序,且存在此数组中,否则返回负数下标
2.copyOf:复制出新的数组,复制长度由 newLength 决定,长度可大于被复制数组的长度
 copyOfRange:复制指定下标范围内的值
3.sort:默认进行升序排序,可自定义排序
4.toString:数组toString
deepToString:二维数组toString
5.equals:比较一维数组内容是否相等
deepEquals:比较二维数组内容是否相等
6.fill:将一个数组全部置为 val ,或在下标范围内将数组置为 val
7.setAll:一个数组全部做表达式操作
8.stream:将数组转为流式,对array进行流式处理,可用一切流式处理的方法
多线程:
9.parallelPrefix:二元迭代,对原数组内容进行二元操作
10.parallelSetAll:一个数组全部做表达式操作
11.parallelSort:对数组进行升序排序或自定义排序
12.spliterator:返回一个Spliterator,进行Spliterator相关操作

 

七、ArrayList

ArrayList一个动态数组,其本质也是用数组实现的,它具有:随机访问速度快,插入和移除性能较差(数组的特点);支持null元素;有顺序;元素可以重复;线程不安全;
ArrayList实现了List接口以及list相关的所有方法,它允许所有元素的插入,包括null
ArrayList继承AbstractList并实现了List接口,RandomAccess接口,Cloneable接口,Serializable接口,因此它支持快速访问,可复制,可序列化。
 
ArrayList 默认初始化大小为0(不是10)
jdk1.8版本,默认构造方法,使用空数组初始化,容量大小默认为0
之前前的版本,ArrayList 默认初始化大小为10
 
向ArrayList添加新元素前,会调用ensureCapacityInternal(int)方法来保证内部数组空间足够。
ArrayList内部数组的扩容 1.5倍,C#是2倍
 
ArrayList内部数组的收缩: trimToSize()
 
indexOf(Object o) 遍历数组,返回元素首次出现的位置,会根据是否为null使用不同方式判断。
如果是元素为null,则直接比较地址,否则使用equals的方法比较
不存在就返回-1
 
clone() 返回副本,复制过程数组发生改变会抛出异常
浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。
深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。这个方式称为深拷贝

 

思考:

1.数组必须要初始化才能使用,这句话对不对?

eg.

{

int[] arr1 = {1,2,3};

int[] arr2;

/* arr2[0] = 1; */  /* 这里会报错,因为arr2尚未初始化 */

arr2 = arr1;

arr2[1] = 1; /* 这里就不会报错了,因为数组的初始化就是为数组分配内存空间,上面“arr2[0] = 1”那一行因为还没有为数组分配内存空间,所以报错。*/

                  /* 这里 arr2 = arr1; 已经将爱arr2指向了arr1已经分配好的内存空间,所以这里虽然没有给arr2进行初始化,arr2也是可以访问的*/

}

 

转载于:https://www.cnblogs.com/lizg-blogs/p/9450618.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值