java基础知识-数组

java基础知识-数组

数组介绍

数组是一种数据结构,用来存储同一类型值的集合。 通过一一个整型下标可以访问数组中的每一个值。例如,如果a是一个整型数组,a[i]就是 数组中下标为i的整数。
数组在内存中占据了一块连续的内存空间。

数组的初始化方式

数组在初始化过程中,有两种初始化方式:静态和动态初始化,两者的区别在于由系统指定长度还是由程序员指定长度,然后系统根据指定的长度在堆内存中寻找一块大小符合的连续内存块分配给数组,并根据数组类型初始化每个数组元素的值,初始化完之后,数组长度不可改变

静态初始化

初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组的长度

int[] array = { 1, 2, 3, 4 };
int[] array1 = new int[] { 1, 2, 3, 4 };
 
System.out.println(array[2]);
System.out.println(array1[2]);

动态初始化

初始化时程序员只指定数组的长度,由系统为每个数组元素分配初始化

int[] array = new int[3];
// 两种方式都可以
// int array[] = new int[3];
array[0] = 1;
array[1] = 2;
array[2] = 3;
 
System.out.println(array[0]);

动态初始化,系统如何为每一个数组元素,分配初始值?

1.基本类型初始化

  • 整型(byte,short,int和long)初始化为0
  • 浮点型(float,double)初始化为0.0
  • 字符型(char)初始化为'\u0000'(Unicode字符,相当于一个空格)
  • 布尔型(boolean)初始化为false

2.引用类型初始化

引用类型初始化:引用类型(类,接口,和数组)初始化为null

数组遍历方式

1.通过下标遍历数组

int [] arr={1,2,3,4,5,6,7,8,9,10};
for(int i=0;i<arr.length;i++){
    System.out.println(arr[i]);
}

2.通过for-each循环去遍历

int[] ns = { 1, 4, 9, 16, 25 };
for (int n : ns) {
    System.out.println(n);
}

数组的打印

int[] ns = { 1, 1, 2, 3, 5, 8 };
System.out.println(Arrays.toString(ns));

数组的排序

1.从小到大

Arrays.sort(ns);

2.自定义实现比较-从大到小

Integer []arr= {1,2,3,4,5,6,7,8};
		Comparator<Integer> mycmp=new Comparator<Integer>() {
			
			@Override
			public int compare(Integer o1, Integer o2) {
				if(o1<o2) {
					return 1;
				}else if(o1>o2) {
					return -1;
				}else {
					return 0;
				}
			}
		};
		Arrays.sort(arr,mycmp);
		System.out.println(Arrays.toString(arr));

求数组的长度

int len=arr.length;

多维数组

1.二维数组

int[][] arr= {
			{1,2,3},
			{4,5,6},
			{7,8,9},
			{10,11,12}
		};
		
		for(int i=0;i<arr.length;i++) {
			for(int j=0;j<arr[0].length;j++) {
				System.out.printf("%d ",arr[i][j]);
			}
			System.out.println();
		}

2.锯齿数组

int[][] arr=new int[3][];
		arr[0]=new int[3];
		arr[1]=new int[4];
		arr[2]=new int[5];
		for (int i = 0; i < arr.length; i++)
		{
			for (int j = 0; j < arr[i].length; j++)
			{
				System.out.printf("%d ",arr[i][j]);
			}
			System.out.println();
		}
0 0 0 
0 0 0 0 
0 0 0 0 0

数组的复制

int[] a= {1,2,3,4,5,6};
	  int[] b=Arrays.copyOfRange(a, 0, a.length);
	  a[1]=10;
	  System.out.println("a:"+Arrays.toString(a));
	  System.out.println("b:"+Arrays.toString(b));
a:[1, 10, 3, 4, 5, 6]
b:[1, 2, 3, 4, 5, 6]

Arrays类

Arrays.equals(Object[] array1, Object[] array2)

  • 判断两个数组是否相等
    • 数组元素为基本数据类型时,依次比较值
    • 数组元素为引用数据类型时,依次调用元素的 equals() 方法进行比较

Arrays.toString(Object[] array)

  • 返回数组元素的字符串形式

Arrays.binarySearch(Object[] array, int fromIndex, int toIndex, Object obj)

  • 使用二分法查找数组内指定范围内的指定元素的索引值

Arrays.copyOf(T[] original, int newLength)

  • 拷贝数组,其内部调用了 System.arraycopy() 方法,从下标 0 开始,如果超过原数组长度,则会用 null 进行填充

Arrays.copyOfRange(T[] original, int from, int to)

  • 拷贝数组,指定起始位置和结束位置,如果超过原数组长度,则会用 null 进行填充

数组与内存

  • 数组对象(指针)存储在栈中
  • 数组元素存储在堆中

如下图所示:只有当 JVM 执行 new String[] 时,才会在堆中开辟相应的内存区域。数组对象 array 可以视为一个指针,指向这块内存的存储地址。

参考:
1.java核心技术卷1
2.https://www.liaoxuefeng.com/wiki/1252599548343744/1259544232593792
3.https://juejin.im/post/5c88e75fe51d4520a700b9f3
4.https://blog.csdn.net/goodbye_youth/article/details/81003817

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值