一,数组的定义
- 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
- 数组的元素可以是任何数据类型,包括基本类型和引用类型。
- C和C++中的数组都可以分配在栈上面,而JAVA中的数组是只能分配在堆上面的,因为JAVA中的数组是引用类型。
数组的特点:
1. 只能存储同一种数据类型的数据。
2. 一旦初始化,长度固定。
3. 数组中的元素与元素之间的内存地址是连续的。
注意: Object类型的数组可以存储任意类型的数据。
数组定义的几种形式
(1)int[] arr = new int[5]; 5为数组的长度
(2)int[] arr = new int[]{3,5,1,7};
(3)int[] arr = {3,5,1,7};后面直接跟元素。
注释:数组的定义分为两步,第一部分声明即左半部分,int[ ] arr
第二部分使用new,new的作用在内存堆中创建一个容器实体,即真是存在的数组,然后将这个数组的引用赋值给数组变量arr。
二,数组数据的存储
当数组元素为引用型的数据时,这时数组中的所有元素都要实例化,即需要new对象。
案例分析一:
案例分析二:
java 中各个维度的数组模型
三,二维数组
例:
疑问: 为什么a.length = 3, a[0].length = 4?
四,数组的使用
1,数组循环foreach 循环
JDK 1.5 引进了一种新的循环类型,被称为 foreach 循环或者加强型循环,它能在不使用下标的情况下遍历数组。
double[] myList = {1.9, 2.9, 3.4, 3.5}; // 打印所有数组元素
for (double element: myList) {
System.out.println(element); }
二维数组加强for循环
-
int[][] arr = {{65,6},{12,1,45,23},{0,-45,1}};//静态创建
-
for (int[] is : arr) {
-
for (int i : is) {
-
System.out.print(i + ",");
-
}
2,数组元素的反转
- 直接数组元素对换
String[] strings = { "ramer", "jelly", "bean", "cake" };
System.out.println("\t" + Arrays.toString(strings));
for (int start = 0, end = strings.length - 1; start < end; start++, end--) {
String temp = strings[end];
strings[end] = strings[start];
strings[start] = temp;
}
System.out.println("\t" + Arrays.toString(strings));
}
- 使用Collections和Arrays工具类(利用collections中的reverse方法,只适用于引用I型shuju)
String[] strings = { "ramer", "jelly", "bean", "cake" };
System.out.println("\t" + Arrays.toString(strings));
// 这种方式仅针对引用类型,对于基本类型如:
// char[] cs = {'a','b','c','g','d'};
// 应该定义或转换成对应的引用类型:
// Character[] cs = {'a','b','c','g','d'};
Collections.reverse(Arrays.asList(strings));
System.out.println("\t" + Arrays.toString(strings));
}
总结:: 使用Collections和Arrays工具类反转数组元素更简单,但是在原数组上操作时速度更快,并且占用最少的内存.
3,空数组和数组长度为0的数组的区别。
int[ ] arr1=null; //arr1是一个数组类型的空引用,不指向任何对象;
int[ ] arr2=new int[0];//声明并创建一数组对象(因为new对象了),但长度是0;
例如:
两者如果在一句代码中,则要先判断是否为空,否则可能会出现空指针异常。
eg:if (array == null || 0 == array.length) {...} // 这种写法正确,因为执行到 “0 == array.length”则说明数组不为空,不会产生空指针异常。
if (0 == array.length || array == null) {...} // 这种写法可能会产生空指针异常。
所以对于一个新定义的数组或者方法返回的数组,都要先判断是否为空,再判断长度是否为0,注意顺序。
五,Arrays工具类
1,数组打印toString方法,二维数组打印使用deeptoString
[jva] view plain copy
- int[] intArray = { 1, 2, 3, 4, 5 };
- String intArrayString = Arrays.toString(intArray); // 直接打印,则会打印出引用对象的Hash值 // [I@7150bd4d
- System.out.println(intArray);
- System.out.println(intArrayString);// [1, 2, 3, 4, 5]
2,equals方法 使用Arrays.equals来比较1维数组是否相等。 (二维数组判断相等使用deepEquals)
System.out.println(Arrays.equals(names1, names2));
out.println(Arrays.equals(names1, names2));
3,sort排序方法(这里实现的是升序排序)
4,fill为数组赋值,将数组的所有元素都赋值为指定的值
int[] array1 = new int[8];
Arrays.fill(array1, 1);
//[1, 1, 1, 1, 1, 1, 1, 1]
System.out.printl
Arrays.fill(array1, 1);
//[1, 1, 1, 1, 1, 1, 1, 1]
System.out.printl
5,binarySearch(二分查找数组中是否存在这个元素。)存在输出下标。不存在输出-1.
- char[] arr={'a','b','c','d','e'};
- int i = Arrays.binarySearch(arr, 'd');
- System.out.println(i);//结果是:3
下面的方法是数组与集合之间的相互转化
6,alist方法,可以返回一个固定大小的List,(转成List之后。可以使用List的所有方法)
List<String> stringList = Arrays.asList("Welcome", "To", "Java","World!");
<String> stringList = Arrays.asList("Welcome", "To", "Java","World!");
7,数组与ArrayList之间的相互转换(互转之后可以互相使用对方的方法)
- String[] stringArray = { "a", "b", "c", "d", "e" };
- ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray)); //将数组转化成了Arraylist
- String[] stringArr = new String[arrayList.size()]; //这里没有数据,只转化成了数组,需要循环填入数据。
- arrayList.toArray(stringArr);
- for (String s : stringArr)
- System.out.println(s);
8,将数组转化成set(可以使用set的所有方法)
- Set<String> set = new HashSet<String>(Arrays.asList(stringArray));
- //[d, e, b, c, a]
- System.out.println(set);