文章目录
Java 数组
数组的基本概念
为什么使用数组
public class study {
public static void main(String[] args) {
int score1 = 70;
int score2 = 80;
int score3 = 85;
int score4 = 60;
int score5 = 90;
System.out.println(score1);
System.out.println(score2);
System.out.println(score3);
System.out.println(score4);
System.out.println(score5);
}
}
所有成绩的**类型**都是相同的,如果采用这种方式来赋值的话十分的繁琐,那样的话是不是Java能不能存储一组相同类型的数据呢?
什么是数组
数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。
-
数组中存放的元素其类型相同
-
数组的空间是连在一起的
-
每个空间有自己的编号,其实位置的编号为0,即数组的下标。
数组的使命
数组是用来存储一组相同类型的数据的。
数组的创建以及初始化
数组的创建
T[] 数组名 = new T[N];
T:表示数组中存放元素的类型
T[]:表示数组的类型
N:表示数组的长度
数组的初始化
数组的初始化主要分为动态初始化以及静态初始化。
1.动态初始化:在创建数组时,直接指定数组中元素的个数
int[] array = new int[10];
2.静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定
T[] 数组名称 = {data1, data2, data3, ..., datan};
数组主要可以分为以下三种形式
int[] array = {1,2,3,4,5,6};
int[] array2 = new int[]{1,2,3,4,5,6};
int[] array3 = new int[10];
【注意事项】
静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
静态初始化时, {}中数据类型必须与[]前数据类型一致。
静态初始化可以简写,省去后面的new T[]。
可以分为俩部分来简写
T[] array1;
array1 = new T[10];
T[] array2;
array2 = new T[]{10, 20, 30};
/* 如果省略new T[] 必须一行写完 不能换行
int[] array5;
array5 = {1,2,3,4};
则显示错误
*/
如果没有对数组进行初始化,数组中元素有其默认值
如果数组中存储元素类型为基类类型,默认值为基类类型对应的默认值。如图
boolean[] array = new boolean[10];//false
char[] array2 = new char[10];//'\u0000'
如果数组中存储元素类型为引用类型,默认值为null
数组的使用
数组的元素访问
数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素
int[]array = new int[]{10, 20, 30, 40, 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);
System.out.println(array.length);//数组名.length就可以自动求出长度
下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常
数组的遍历
int[]array = new int[]{10, 20, 30, 40, 50};
for(int i = 0; i < 5; i++){
System.out.println(array[i]);
}
使用array.length
int[]array = new int[]{10, 20, 30, 40, 50};
for(int i = 0; i < array.length; i++){
System.out.println(array[i]);
}
使用 for-each 遍历数组
int[] array = {1, 2, 3};
for (int x : array) {
System.out.println(x);
}
用方法以字符串的形式输出
import java.util.Arrays;
public class study {
public static void main(String[] args) {
int []array={50,30,47,99,63,54,44};
Arrays.sort(array);//排序
String ret = Arrays.toString(array);//
System.out.println(ret);
}
}
数组是引用类型
初始JVM 的内存分布
内存是一段连续的存储空间,主要用来存储程序运行时数据的。比如
-
程序运行时代码需要加载到内存
-
程序运行产生的中间数据要存放在内存
-
程序中的常量也要保存
-
有些数据可能需要长时间存储,而有些数据当方法运行结束后就要被销毁。
-
如果对内存中存储的数据不加区分的随意存储,那对内存管理起来将会非常麻烦
基本类型变量与引用类型变量的区别
基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值
int a = 10;
int b = 20;
而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址
int[] arr = new int[]{1,2,3};
a、b是内置类型的变量,因此其空间中保存的就是给该变量初始化的值。array是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址。
array这个引用指向了一个对象
引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象。
引用举例
public class study{
public static void main(String[] args) {
int[] array1 = {1, 2, 3, 4};
array1[0] = 99;
int[] array2 = array1;
array2[0] = 100;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
}
array1[0] = 99;
array1这个引用所指向的对象的0下标改为100
int[] array2 = array1;
后array2这个引用指向了array1这个引用指向的对象 也可以理解为array2获得了array1所指向的对象的地址,array1把地址赋值给了array2,使array2拥有了指向array1所指向的对象的能力
int[] array2 = array1;
代表array2这个引用指向的是array1这个引用所指向的对象 即俩个引用指向一个对象
array2[0] = 100;
(表示把这个对象的0下标改为100)
所以输出结果俩者都相同。
再看一道题
public class study{
public static void main(String[] args) {
int[] array1 = {1,2,3,4};
int[] array2 = {11,22,33,44};
array1 = array2;
array1[0] = 1888;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
}
在
int[] array1 = {1,2,3,4}; int[] array2 = {11,22,33,44};
时候是
array1 = array2;
时
代表array2这个引用把其所指向的对象的地址赋值给了array1则array1这个引用所指向的对象也将发生变化
array1和array2这俩个引用指向的对象变得一样了
认识null
null 在 Java 中表示 “空引用” , 也就是一个不指向对象的引用
int[] arr = null; System.out.println(arr[0]); // 执行结果 Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:6)
null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操
作. 一旦尝试读写, 就会抛出 NullPointerException.
注意: Java 中并没有约定 null 和 0 号地址的内存有任何关联.(与c语言不一样 有区别)
数组的应用
保存数据
public static void main(String[] args) {
int[] array = {1, 2, 3};
for(int i = 0; i < array.length; i++){ System.out.println(array[i]);
}
}
作为函数的参数
public class study{
public static void func1(int[] array) {
array=new int[]{13,14,15,16};
}
public static void func2(int[] array) {
array[0] = 999;
}
public static void main(String[] args) {
int[] array1 = {1,2,3,4};
func1(array1);
//func2(array1);//实参
System.out.println(Arrays.toString(array1));
}
}
求func1没被注解和func2没被注解时候的值
func1时
int[] array1 = {1,2,3,4}; func1(array1);
public static void func1(int[] array)
array1指向0x98的对象 我们把array1的值给到了形参array,即array和array1所指向的是同一个对象。
但当
array=new int[]{13,14,15,16};
可是创建了一个新的对象0x111
那个对象把地址给了array即
因此array影响不了array1
结果为
在func2时
int[] array1 = {1,2,3,4}; func2(array1);//实参 ;
public static void func2(int[] array)
按照上面的思路array和array1指向的是相同的对象
array[0] = 999;
而func2中是直接修改对象。
作为函数的返回值
public class study{
public static int[] tmp(int[] arr){
for(int i=0;i<arr.length;i++){
arr[i]=arr[i]*2;
}
return arr;
}
public static void main(String[] args) {
int arr[]={1,2,3,4,5,6};
String ret =Arrays.toString(tmp(arr));
System.out.println(ret);
}
}
二维数组
二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组
二维数组创建
int[][] array={{1,2,3},{4,5,6}};
数组创建和一维数组时差不多
数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };
在我们对二维数组的第一印象应该是这样
然而二维数组是特殊的一维数组。与C语言中的二维数组有一定的差别
Java中的二维数组应该是这样
即arry[0]拿着一个数组,arry[1]拿着一个数组
public class study{
public static void main(String[] args) {
int[][] array={{1,2,3},{4,5,6}};
System.out.println(Arrays.toString(array[0]));
System.out.println(Arrays.toString(array[1]));
}
}
注意
public class test9 {
public static void main(String[] args) {
int[][] array=new int[][];
int[][] array1=new int[2][3];
int[][] array2=new int[][3];//报错
}
}
注意Java二维数组和C语言中的二维数组不一样,有列时必得有行不然会报错
我顺便写一下不规则二维数组
不规则二维数组
public class test9 {
public static void main(String[] args) {
int[][] array = new int[2][];
array[0]=new int[]{1,2,3,4,5,6,7,8};
array[1]=new int[]{999,555,888,777,444,444,777};
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + "");
}
System.out.println();
}
}
}
二维数组遍历
public class test9 {
public static void main(String[] args) {
int[][] array = {{1, 2, 3}, {4, 5, 6}};
for (int i = 0; i < array.length; i++) {//array。length表示二维数组有几个一维数组
for (int j = 0; j < array[i].length; j++) {//每个一位数组的长度
System.out.print(array[i][j] + "");
}
System.out.println();
}
}
}
public class test9 {
public static void main(String[] args) {
int[][] array = {{1, 2, 3}, {4, 5, 6}};
System.out.println(Arrays.deepToString(array));
}
}
public class test9 {
public static void main(String[] args) {
int[][] array = {{1, 2, 3}, {4, 5, 6}};
for (int[] ret : array) {
for (int x : ret) {
System.out.print(x + "");
}
System.out.println();
}
}
}
总结
最近突然心血来潮想好好学习了,我想好好学习了。如果有不足之处请多多指教,另外图片不能直接上传每一个图片都是一个一个拷贝过来的🥲可能会有一点瑕疵,如果发现问题我会即时修改,后期会偶尔更新的。虽然我是一个小菜鸟,但我会越来越努力的。😊😊