(一)数组声明
数组是引用类型。数组必须先声明,再使用。
dataType[] arrayRefVar;// 首选的方法
或dataType arrayRefVar[];// 效果相同,但不是首选方法
分析好数据的内存分配,数组变量名是引用类型在栈中存储;数组对象是在堆内存存储。
注意:
针对数组提供了length属性来获取数组的长度
针对字符串提供了length()方法来获取字符串的长度
针对泛型集合类提供了size()方法来获取元素的个数
(二)数组初始化
1、动态初始化
数组定义与为数组元素分配空间和赋值的操作分开进行。
例如:int[ ] a; a = new int[3]; a[0] = 1; a[1] = 2; a[2] = 3;
2、静态初始化
在定义数组的同时就为数组元素分配空间并赋值。
int a[ ] = {1 , 2, 3};
(三)二维数组
二维数组的本质就是多个一维数组的组合。多维的与之类似。
下面哪个语句正确地声明一个整型的二维数组? 多选
A int a[][] = new int[][];
B int a[10][10] = new int[][];
C int a[][] = new int[10][10];
D int [][]a = new int[10][10];
E int []a[] = new int[10][10];
答案是CDE
a[]是一维数组,又定义 int[] 一维数组,所以合起来就是二维数组
int[] a[] 与int[][] a 等效
二维数组
int[] a[] 与int[][] a 等效
1、动态初始化
- String s[][] ;
- s = new String[3][] ;
- s[0] = new String[2] ;
- s[1] = new String[3] ;
- s[2] = new String[2] ;
2、静态初始化
int a[][] = {{1,2},{3,4,5,6},{7,8,9}} ;
(四)数组与算法
需要结合算法,对数据进行排序和搜索。
同时根据内存的分析,如何提高效率。
选择排序:把第一个数与他后面的数进行比较,如果顺序则继续与后面比较,如果逆序则两数交换位置,继续将第一个数与交换位置后的数进行比较,这样就完成了第一轮排序。同理将第二位与其后的数比较,直到数组有序为止。
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[j]<arr[i]){
int
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
冒泡排序:将第一个数与相邻的数进行比较,如果顺序则继续第二个数与后面相邻的书进行比较;如果逆序则交换位置,继续和后面相邻的数进行比较,完成第一趟冒泡排序。同理,直到数组有序。
private
static
void
冒泡排序(
int
[] arr) {
for
(
int
j = 0; j < arr.length-1; j++) {
for
(
int
i=0;i<arr.length-1-j;i++){
if
(arr[i]>arr[i+1]){
int
temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
}
}
(五)操作数组(Arrays类)(默认是升序)
java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。
- 给数组赋值:通过 fill 方法。
- 对数组排序:通过 sort 方法,默认是升序。
- 比较数组:通过 equals 方法比较数组中元素值是否相等。
- 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。:binarySearch(数组,要搜索的数据);
注意:Arrays类中的sort()使用的是“经过调优的快速排序法”;
调用binarySearch()方法进行搜索时,需要先对数据进行排序,调用sort()方法排序。
搜索方法的简介:
binarySearch(int[] a, int fromIndex, int toIndex, int key)
使用二分搜索法来搜索指定的 int 型数组的范围,以获得指定的值。
binarySearch(int[] a, int key)
使用二分搜索法来搜索指定的 int 型数组,以获得指定的值。
排序方法的简介:
sort(int[] a)
对指定的 int 型数组按数字升序进行排序。
sort(int[] a, int fromIndex, int toIndex)
对指定 int 型数组的指定范围按数字升序进行排序。
sort(T[] a, Comparator<? super T> c)
根据指定比较器产生的顺序对指定对象数组进行排序。
1.对基本数据类型的数组的排序
说明:(1)Arrays类中的sort()使用的是“经过调优的快速排序法”;
(2)比如int[],double[],char[]等基数据类型的数组,Arrays类之只是提供了默认的升序排列,没有提供相应的降序排列方法。
(3)要对基础类型的数组进行降序排序,需要将这些数组转化为对应的封装类数组,如Integer[],Double[],Character[]等,对这些类数组进行排序。(其实还不如先进行升序排序,自己在转为将序)。
2.对复合数据类型的数据的排序
函数原型: (1)public static<T> void sort(T[] a,Comparator c) 根据指定比较器产生的顺序对指定对象数组进行排序。
(2)public static<T> void sort(T[] a,int fromIndex,int toIndex,Comparator c) 根据指定比较器产生的顺序对指定对象数组的指定范围进行排序。
结合Arrays详解
一、Comparable接口
Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
public class Person implements Comparable<Person>
{
String name;
int age;
public Person(String name, int age)
{
super();
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
@Override
public int compareTo(Person p)
{
return this.age-p.getAge();
}
public static void main(String[] args)
{
Person[] people=new Person[]{new Person("xujian", 20),new Person("xiewei", 10)};
System.out.println("排序前");
for (Person person : people)
{
System.out.print(person.getName()+":"+person.getAge());
}
Arrays.sort(people);
System.out.println("\n排序后");
for (Person person : people)
{
System.out.print(person.getName()+":"+person.getAge());
}
}
}
二、Comparator简介
public class PersonCompartor implements Comparator<Person>
{
@Override
public int compare(Person o1, Person o2)
{
return o1.getAge()-o2.getAge();
}
}
调用方法:
Arrays.sort(people,new PersonCompartor());