1, 数组的定义、特点:
定义: 所谓数组,就是相同数据类型的元素按一定顺序排列的 集合 ,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为 下标 。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在 程序设计 中,为了处理方便, 把具有相同类型的若干 变量 按有序的形式组织起来的一种形式。这些按序排列的同类数据 元素 的集合称为数组。
type[] arrayName;
type arrayName[];
注:推荐使用type[] arrayname;这种定义格式,因为这种方式不仅具有更好的语义,也具有更好的可读性,
对于type[] arrayName;很容易理解这是定义一个变量,其中变量的类型是type[]。
特点:
1)在Java中,无论使用数组或集合,都有边界检查。如果越界操作就会得到一个RuntimeException异常。
2)数组只能保存特定类型。数组可以保存原生数据类型,集合则不能。集合不以具体的类型来处理对象,它们将所有对象都按Object类型处理,集合中存放的是对象的引用而不是对象本身。
3)集合类只能保存对象的引用。而数组既可以创建为直接保存原生数据类型,也可以保存对象的引用。在集合中可以使用包装类(Wrapper Class),如Integer、Double等来实现保存原生数据类型值。
例码:int a = 10;
Integer integer = new Integer(a);
int b = integer.intValue();
System.out.println(a = b);
4)对象数组和原生数据类型数组在使用上几乎是相同的;唯一的区别是对象数组保存的是引用,原生数据类型数组保存原生数据类型的值。
2, 数组的初始化:
Java语言中数组必须先初始化,然后才可以使用,所谓初始化,就是为数组的元素分配内存空间,并为每个数组元素赋初始值。
2.1静态初始化:初始时由程序员显式地指定每个元素的初始值,由系统决定数组的长度
格式:arrayName=newtype[];//创建
arrayName=newtype[]{element1,element2,element3…};
简化:arrayName={element1,element2,element3…};
2.2动态初始化:初始化时程序员只指定数组的长度,由系统为数组元素分配初始值
格式:arrayName=newtype[length];
3,数组在内存中的表现形式:
数组引用变量只是一个引用,这个引用可以指向任何有效的内存,只有该引用指向有效内存后,才可以通过该数组变量来访问数组,实际的数组元素被存储在堆(heap)内存中,数组引用变量是一个引用,被存储在栈(Stack)内存中,数组在内存中的存储示意图如下:
转存失败重新上传取消
注:栈内存和堆内存
当一个方法执行时,每个方法都会建立自己的一个内存栈,在这个方法内定义的变量将会逐个放入到这块栈内存里,随着方法的执行结束,这个方法的内存栈也会自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的,当我们在程序中创建一个对象时,这个对象将会保存到运行时数据区中,以便反复利用(因为对象的创建成本较大),这个运行时数据区就是堆内存。堆内存中的对象不会随着方法的结束而销毁,即使方法结束后,这个对象还可以被另外一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁。只有当一个对象没有任何一个引用变量引用它时,系统的垃圾回收机制会在合适的时候回收它。
4, 多维数组
4.1Java中并没有真正的多维数组,只有数组的数组,Java中多维数组不一定是规则矩阵形式
Java语言里的数组类型是引用类型,因此,数组变量其实是一个引用,这个引用指向真实的数组内存,数组元素的类型也可以是引用,如果数组元素的引用再次指向真实的数组内存,这种情形看上去很像多维数组。
4.2定义一个多维数组
int[][] xx;
xx=new int[3][];
xx[0]=new int[3];
xx[1]=new int[2];
4.3多维数组在内存中的表现形式,如图
转存失败重新上传取消
5, 关于数组常见算法的代码剖析:
5.1拆分查找:
class HalfSearch
{
/*
在一个有序的数组中查找一个元素的位置;
例如:有数组{0,2,4,6,8,10,12}查找10的位置index=5
*/
public static void main(String[] args)
{
int[] arr=new int[]{0,2,4,6,8,10,12};
int index=getIndex(arr,12);
System.out.println("index="+index);
}
//一般性做法,效率较低的算法
/*
public static int getIndex(int[] arr,int key)
{
for(int i=0;i<arr.length;i++)
{
if(arr[i]==key)
return i;
}
return -1;
}
*/
//折半查找法
/*
public static int getIndex(int[] arr,int key)
{
int min=0;
int max=arr.length-1;
int mid=(min+max)/2;
while(arr[mid]!=key)
{
if(key>arr[mid])
min=mid+1;
else
max=mid-1;
if(min>max) //判断查找不到的情况,返回-1
return -1;
mid=(min+max)/2; //折半
}
return mid;
}
*/
//折半查找法的第二种方式:效率稍高
public static int getIndex(int[] arr,int key)
{
int min=0;
int max=arr.length-1;
int mid;
while(min<=max)
{
mid=(min+max)/2;
if(key>arr[mid])
min=mid+1;
else if(key<arr[mid])
max=mid-1;
else
return mid;
}
return -1;
}
}
5.2选择排序:
class SelectSort{
public static void main(String[] args)
{
int[] arr=new int[]{2,1,5,3,6,4,8,9,7};
System.out.println("原数组:");
Print(arr);
System.out.println();
System.out.println("排序后:");
SelectSort(arr);
}
//选择排序,对一个数组进行升序排列
//打印原数组
public static void Print(int[] arr)
{
System.out.print("[ ");
for(int i=0;i<arr.length;i++)
{
if(i!=arr.length-1)
System.out.print(arr[i]+", ");
else
System.out.print(arr[i]+"]");
}
}
//选择排序
public static void SelectSort(int[] arr)
{
for(int i=0;i<arr.length-1;i++)
{
for(int j=i+1;j<arr.length;j++)
{
if(arr[i]>arr[j])
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
Print(arr);
}
}
5.3冒泡排序:
class BubbleSort
{
public static void main(String[] args)
{
int[] arr=new int[]{2,1,5,3,6,4,8,9,7};
System.out.println("原数组:");
Print(arr);
System.out.println();
System.out.println("排序后:");
BubbleSort(arr);
}
//打印原数组
public static void Print(int[] arr)
{
System.out.print("[ ");
for(int i=0;i<arr.length;i++)
{
if(i!=arr.length-1)
System.out.print(arr[i]+", ");
else
System.out.print(arr[i]+"]");
}
}
//冒泡排序
public static void BubbleSort(int[] arr)
{
for(int i=0;i<arr.length;i++) //for(int i=arr.length-1;i>0;i--)
{
for(int j=0;j<arr.length-i-1;j++) //for(int j=0;j<x;j++)
{
if(arr[j]>arr[j+1])
{
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
Print(arr);
}
}
6.操作数组的工具类<Arrays>
Java.util包中封装了很多关于java数组的工具方法,这些方法都是静态的。
binarySearch;;(type[] a, type key) : 使用二分搜索法来搜索指定的 type 型数组,以获得指定的值。
binarySearchtype[] a, int fromIndex,int toIndex, type key) : 使用二分搜索法来搜索指定的 type 型数组的范围,以获得指定的值。
copyOfRange(type[] original, int from,int to)de> : 将指定数组的指定范围复制到一个新数组。
equals(type[] a, type[] a2) :如果两个指定的 char 型数组彼此相等,则返回true。
fill(type[] a, type val) :将指定的 byte 值分配给指定 type 节型数组的每个元素。
fill(type[] a, int fromIndex,int toIndex, type val) :将指定的 type 值分配给指定 type 型数组指定范围中的每个元素。
sort(type[] a) :对指定的 type 型数组按数字升序进行排序。
sort(type[] a, int fromIndex,int toIndex) :对指定type 型数组的指定范围按数字升序进行排序。
toString(type[] a):返回指定数组内容的字符串表示形式。
详情参见JDK 1.6API文档,有更好的解释。
总结:关于数组这一节的知识并不多,主要要学会数组的定义,理解好数组在内存中的表现形式,这对日后开发有很好的帮助。除此之外,还要掌握以上常见的排序算法,尤其是冒泡排序,虽然在开发中不常见,但是在面试时出现的概率很大。
此外,通过查阅API文档,发现了操作数组工具类Arrays有很多方法,在这里做了一些常见方法的总结,这些方法都是静态的,相当实用,例如sort方法,最好牢记下来,以便开发时直接拿来用,不必翻阅API文档。
定义: 所谓数组,就是相同数据类型的元素按一定顺序排列的 集合 ,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为 下标 。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在 程序设计 中,为了处理方便, 把具有相同类型的若干 变量 按有序的形式组织起来的一种形式。这些按序排列的同类数据 元素 的集合称为数组。
type[] arrayName;
type arrayName[];
注:推荐使用type[] arrayname;这种定义格式,因为这种方式不仅具有更好的语义,也具有更好的可读性,
对于type[] arrayName;很容易理解这是定义一个变量,其中变量的类型是type[]。
特点:
1)在Java中,无论使用数组或集合,都有边界检查。如果越界操作就会得到一个RuntimeException异常。
2)数组只能保存特定类型。数组可以保存原生数据类型,集合则不能。集合不以具体的类型来处理对象,它们将所有对象都按Object类型处理,集合中存放的是对象的引用而不是对象本身。