目录
一维数组详解
1.数组的三种创建方式:
2.数组的使用
(1).获取数组的长度:
(2).遍历数组:
(3).关于数组的库里面的方法:
3.数组是引用类型(重点)
一维数组详解
1.数组的三种创建方式:
public class Main{
public static void main(String[] args){
int[] arr1 = {1,2,3,4,5};//方法一
int[] arr2 = new int[5];//方法二
int[] arr3 = new int[]{1,2,3,4,5};//方法三
}
}
注意:不能这么写:int[] arr = new int[5] = {1,2,3,4,5};
使用方法二,要特别注意不同类型的默认值,如下图:
类型 | 默认值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0f |
double | 0.0 |
char | \u0000 |
boolean | false |
要注意的是,如果数组里面存的是引用类型(相当于二维数组),默认值为null,二维数组的内容我将会在下一篇文章讨论
2.数组的使用
数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的元素
数组的下标是从0开始的,注意不要越界访问
(1).获取数组的长度:
方法1:利用array.length,至于这个是什么,学到后面的类和对象就自然知道了,这里只要知道怎么用就可以了
public class Main{
public static void main(String[] args){
int[] arr = {1,2,3,4,5};
System.out.print(arr.length);
}
}
方法2:循环遍历(这里用的是foreach循环,请参考下文)
public class Main{
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
//计数器
int count = 0;
//foreach语句:用来遍历数组,下文会讲到
for (int x: arr){
count++;
}
System.out.print(count);
}
}
(2).遍历数组:
方法1:for循环
public class Main{
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
for (int i = 0;i < arr.length;i++){
System.out.print(arr[i]);
}
}
}
方法2:foreach循环
public class Main{
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
for(int x :arr){
System.out.print(x);
}
}
}
注意:foreach循环的意思是,创建一个变量x,按顺序去接受数组arr中的值
(3).关于数组的库里面的方法:
//这里只是简单的介绍用法,因为内容太多,这些内容的详解我会另写一篇文章。
a.将数组转换为字符串输出:Arrays.toString(数组名字)
b.数组拷贝:Array.copyOf(arr,length) :arr是要拷贝的数组,length是要拷贝的数组的长度
c.查找数组中的某个元素:Arrays.binarySearch(数组名,key)
key值是你要查找的值,这个方法的返回值是key的下标
(4).如何实现数组扩容:使用方法copyOf()
3.数组是引用类型(重点)
引用类型通俗的理解就是变量存储的是对象所在的地址
例如数组,它的数组名存储的是数组的地址
要更深入的理解引用类型,则必须清楚JVM的内存划分,如图:
这里重点要用到栈和堆
接下来就重点解释一下数组在内存中到底是怎么样存储的
如上图所示,计算机在栈中开辟了一块内存存储main的栈帧,main的栈帧里面存储了array引用变量,计算机又在堆中开辟了一块连续的空间存储数组array的数据,array变量存储的是堆中数据的地址,堆中的数据就叫做array指向的对象,这就是数组在内存中的存储方式
下面,我们看一段代码,加深一下对数组的理解:
此时的输出的结果是什么呢,是1 2 3 4 5吗,看下图
public class Main {
public static void main(String[] args) {
int[] array1 = {1,2,3,4,5};
int[] array2 = {6,7,8,9,10};
array2 = array1;
array2[0] = 0;
for (int x:array1){
System.out.print(x + " ");
}
}
}
奇怪,结果是0 2 3 4 5,为什么呢?
因为array2 = array1;这条语句是把array赋值给array2,所以就会造成变量array1和array2指向了同一哥对象,所以改变array[0],和改变array[0]是一样的,看下图-->
大家可能还有一个疑问,我把array2的值改成了array1,那我原来指向的数组{6,7,8,9,10}去哪了
,其实,在java当中,数组在堆中开辟的内存,一旦没有引用变量去指向它,会立马自动释放,
而在c语言当中,还要程序员自己去手动释放,所以java真的是一门非常安全的语言。
注意:那如果我要让一个引用类型的变量什么都不指向,怎么做呢,array = null;就可以了