Java基础之数组

一、数组概述
1.定义:数组是存储同一种数据类型多个元素的集合,可以看成是一个容器。
2.数组既可以存储基本数据类型,也可以存储引用数据类型。
注意:
	1) 基本数据类型包括byte、short、int、long、float、double、boolean、char;
	  引用数据类型包括数组、类、接口、枚举。
	  其中基本数据类型分类:
		整数类型:byte、short、int、long,默认初始值均为0
			- byte:字节型,占1个字节,即8位。取值范围为-2^7~2^7-1,即-128~127
			- short:短整型,占2个字节,即16位。取值范围为-2^15~2^15-1,即-32768~32767
			- int:整型,占4个字节,即32位。取值范围位-2^31~2^31-1,即-2147483648~2147483647
			- long:长整型,占8个字节,即64位。取值范围为-2^63~2^63-1,即−9223372036854775808~9223372036854775807
		浮点类型:float、double,默认初始值为0.0
			- float:单精度,占4个字节,默认值为0.0F.举例为Float f = 23.13f;
			- double:双精度,占8个字节,默认值为0.0D. 举例为Double d = 12.345;
		布尔类型:boolean 布尔型,值为true 或 false,默认值为false
		字符类型:char 字符型,最小值为'\u0000',最小值为'\uffff',默认值为'\u0000'
	2) 基本数据类型优先级比较
		(byte、short、long) < int < long < float < double
		优先级较低的可自动转换为优先级较高的,优先级较高的转换成优先级低的需进行强制类型转换。另外byte、short、char三者之间不存在隐式转换,只能进行强制类型转换。
	3)基本数据类型与引用数据类型的值传递:
		- 基本数据类型的值传递不改变原值,因为方法调用完毕会弹栈,局部变量会随之消失
		- 引用数据类型的值传递改变原值,因为即使方法弹栈,但是new出来的数组对象还会存在堆内存,可以通过地址继续访问
	4)Java中到底是传值还是传址?
		- 说法1 既传值也传址,基本数据类型传递的是值,引用数据类型传递的是地址。
		- 说法2 Java中只有传值,因为地址值也是值√
3.数组定义格式

1)一维数组

  • 动态初始化:只指定初始长度,由系统给出初始值,初始值为0,格式为:

     数据类型[] 数组名 = new 数据类型[数组长度];
     如:int[] arr1 = new int[5];
    
  • 静态初始化:直接给出初始化值,系统判断长度,格式有二:

     数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3, ……};
     数据类型[] 数组名 = {元素, 元素2, 元素3, ……};		——>简写形式
     如:int[] arr3 = new int[]{11, 22, 33, 44, 55};		//静态初始化
     	int[] arr2 = {11, 22, 33, 44, 55};				//静态初始化简写形式
    
  • 其他格式(不常用)

     数据类型 数组名[] = new 数据类型[数组长度];
     数据类型 数组名[] = new 数据类型[]{元素1, 元素2, 元素3, ……};
     数据类型 数组名[] = {元素, 元素2, 元素3, ……};	
     如:int arr4[] = new int[5];
       	int arr5[] = {11, 22, 33, 44, 55};
        int arr6[] = new int[]{11, 22, 33, 44, 55};
    

    注意:数组的初始化不允许动静结合,即int[] arr = new int[5]{11, 22, 33, 44, 55};这种写法绝对错误

  • 直接打印数组为其地址值
    如:[I@19bb25a中[代表的数组、有几个就代表几维数组;I代表是int类型;@是固定符号;19bb25a代表十六进制的地址值。

2)二维数组

  • 动态初始化:

     数据类型[][] 数组名 = new 数据类型[m][n];
     如:int[][] arr = new int[3][2];这是一个二维数组,其中包括3个一维数组,每个一维数组中有2个元素。
    
  • 其他格式:

     数据类型 数组名[][] = new 数据类型[m][n];
     数据类型[] 数组名[] = new 数据类型[m][n];
    

    注意:int[] x,y[]; 这是定义了一个一维数组x和一个二维数组y

4.数组操作可能会出现的问题
  • 越界:ArrayIndexOutOfBoundsException数组索引越界异常
    原因:访问了数组中不存在的索引

  • 空指针:NullPointerException空指针异常
    原因:数组已经不再指向堆内存,而你还在用数组名去访问元素。即当数组引用赋值为null,再去调用数组中的元素就会出现空指针异常。

二、内存图

在这里插入图片描述

三、使用Arrays工具类操作数组常用方法
  1. public static String toString(int[] arr): 将int型数组转化为String,源码如下:
	public static String toString(int[] a) {
       if (a == null)
           return "null";
       int iMax = a.length - 1;
       if (iMax == -1)
           return "[]";

       StringBuilder b = new StringBuilder();		//因为是单线程,不需要考虑线程安全问题,所以可以使用StringBuilder效率高
       b.append('[');
       for (int i = 0; ; i++) {
           b.append(a[i]);
           if (i == iMax)
               return b.append(']').toString();
           b.append(", ");
       }
   }
  1. public static void sort(int[] arr): 将int型数组进行排序
  2. public static int binarySearch(int[] a, int key): 二分查找,前提条件a必须是一个有序数组,源码如下:
	private static int binarySearch0(int[] a, int fromIndex, int toIndex,int key) {
        int low = fromIndex;
        int high = toIndex - 1;

        while (low <= high) {
            int mid = (low + high) >>> 1;
            int midVal = a[mid];

            if (midVal < key)
                low = mid + 1;
            else if (midVal > key)
                high = mid - 1;
            else
                return mid; // key found
        }
        return -(low + 1);  // key not found.
    }

注意:Arrays工具类中所有的方法都是静态的,所以只能用类名.调用,即Arrays.方法
如有问题 请多多指教

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值