public class MainClass {
public static void main(String[] args) {
//声明并开辟了一个3个长度的数组
int date[] = new int[3];
date[0] = 10;
date[1] = 20;
date[2] = 30;
for (int i = 0; i < date.length; i ++) {
System.out.println(date[i]);
}
}
}
public class MainClass {
public static void main(String[] args) {
int date[] = null; //声明数组
date = new int[3]; //开辟空间
date[0] = 10;
date[1] = 20;
date[2] = 30;
for (int i = 0; i < date.length; i ++) {
System.out.println(date[i]);
}
}
}
下面还是以内存关系来描述以上的关系。
既然数组属于引用数据类型,那么数组一定可以发生引用传递。
范例: 数组的引用传递
public class MainClass {
public static void main(String[] args) {
int date[] = new int[3];
date[0] = 10;
date[1] = 20;
date[2] = 30;
int temp[] = date;
temp[0] = 99;
for (int i = 0; i < date.length; i ++) {
System.out.println(date[i]);
}
}
}
public class MainClass {
public static void main(String[] args) {
int date[] = new int [] {1, 2, 3, 4, 5};
for (int i = 0; i < date.length; i ++) {
System.out.println(date[i]);
}
}
}
public class MainClass {
public static void main(String[] args) {
int date[] = new int[]{1, 2, 3};
change(date); //int temp[] = date;
for (int i = 0; i < date.length; i ++) {
System.out.println(date[i]);
}
}
//此方法定义在主类中,由主方法直接调用
public static void change(int temp[]) {
for (int i = 0; i < temp.length; i ++) {
temp[i] *= 2; //将数组的内容乘2
}
}
}
public class MainClass {
public static void main(String[] args) {
int date[] = new int[]{1, 2, 3};
int temp[] = date;
for (int i = 0; i < temp.length; i ++) {
temp[i] *= 2; //将数组的内容乘2
}
for (int i = 0; i < date.length; i ++) {
System.out.println(date[i]);
}
}
}
public class MainClass {
public static void main(String[] args) {
int date[] = new int[] { 2, 1, 9, 0, 5, 3, 7, 6, 8 };
sort(date);//实现排序
print(date);
}
// 这个方法专门负责排序
public static void sort(int arr[]) {
// 外层控制排序的次数
for (int i = 0; i < arr.length; i++) {
// 内层控制每次的排序控制
for (int j = 0; j < arr.length - 1; j++) {
if (arr[j] > arr[j + 1]) {
int t = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = t;
}
}
}
}
// 专门定义一个输出的方法
public static void print(int temp[]) {
for (int i = 0; i < temp.length; i++) {
System.out.print(temp[i] + "、");
}
System.out.println();
}
}
**面试题:**请编写一个数组排序操作
答案如上。
范例: 实现数组的转置
如果要想实现转置的操作,有两个思路:
定义一个新的数组,而后将原始数组按照倒序的方式插入到新的数组之中,随后改变原始数组引用。
public class MainClass {
public static void main(String[] args) {
int date[] = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
//首先定义一个新的数组,长度与原始数组一致
int temp[] = new int[date.length];
int foot = date.length - 1; //控制date数组的索引
//对于新的数组按照索引由小到大的顺序循环
for (int i = 0; i < temp.length; i ++) {
temp[i] = date[foot];
foot --;
}
//此时temp的内容就是date转置后的结果
//让date指向temp,而date的原始数据就成为垃圾了
date = temp;
print(date);
}
// 专门定义一个输出的方法
public static void print(int temp[]) {
for (int i = 0; i < temp.length; i++) {
System.out.print(temp[i] + "、");
}
System.out.println();
}
}
虽然以上的代码实现了转置的操作,但是遗憾的是,代码里面会产生垃圾。
利用算法,在一个数组上完成转置操作:
原始数组: 1、2、3、4、5、6、7、8,转置次数:数组长度 ÷ 2
第一次转置:8、2、3、4、5、6、7、1
第二次转置:8、7、3、4、5、6、2、1
第三次转置:8、7、6、4、5、3、2、1
第四次转置:8、7、6、5、4、3、2、1
但是以上给出的数组长度是一个偶数,如果是一个奇数呢?
原始数组: 1、2、3、4、5、6、7,转置次数:数组长度 ÷ 2
第一次转置:7、2、3、4、5、6、1
第二次转置:7、6、3、4、5、2、1
第三次转置:7、6、5、4、3、2、1
也就是说不管是奇数个数还是偶数个数的数组,转置的次数计算方式完全一样。
public class MainClass {
public static void main(String[] args) {
int date[] = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
reverse(date); //实现转置
print(date);
}
//此方法实现数组的转置操作
public static void reverse(int arr[]) {
int len = arr.length / 2; //转置的次数
int head = 0; //头部索引
int tail = arr.length - 1; //尾部索引
for (int i = 0; i < len; i ++){
int t = arr[head];
arr[head] = arr[tail];
arr[tail] = t;
head ++;
tail --;
}
}
// 专门定义一个输出的方法
public static void print(int temp[]) {
for (int i = 0; i < temp.length; i++) {
System.out.print(temp[i] + "、");
}
System.out.println();
}
}
以上实现的是一个一维数组的转置,那么如果是二维数组呢?
**前提:**是一个行与列完全相同的数组;
1 2 3
4 5 6
7 8 9
第一次转置:
1 4 3
2 5 6
7 8 9
第二次转置:
1 4 7
2 5 6
3 8 9
第三次转置:
1 4 7
2 5 8
3 6 9
public class MainClass {
public static void main(String[] args) {
int date[][] = new int[][] {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
reverse(date); // 实现转置
print(date);
}
// 此方法实现数组的转置操作
public static void reverse(int arr[][]) {
for (int i = 0; i < arr.length; i ++) {
for (int j = i; j < arr[i].length; j ++) {
if (i != j) {
int t = arr[i][j];
arr[i][j] = arr[j][i];
arr[j][i] = t;
}
}
}
}
// 专门定义一个输出的方法
public static void print(int temp[][]) {
for (int i = 0; i < temp.length; i++) {
for (int j = 0; j < temp[i].length; j ++) {
System.out.print(temp[i][j] + "、");
}
System.out.println();
}
System.out.println();
}
}
以上给出的是一个等行列的数组,但如果行和列不一样呢?
1 2 3
4 5 6
开辟一个新的数组,数组的行数是原数组的列数,列数是原数组的行数。
需要改变原始数组的引用,会产生垃圾。
以上实现了方法接收数组的操作情况,同样方法也可以返回数组。
范例: 方法返回数组
public class MainClass {
public static void main(String[] args) {
int data[] = init(); //接受数组
print(data);
}
public static int[] init() {
return new int[] { 1, 2, 3 };
}
// 专门定义一个输出的方法
public static void print(int temp[]) {
for (int i = 0; i < temp.length; i++) {
System.out.print(temp[i] + "、");
}
System.out.println();
}
}
静态初始化:类名称 对象数组名称[] = new 类名称[]{实例化对象, 实例化对象, ...};
范例: 对象数组的动态初始化
class Book {
private String title;
private double price;
public Book(String t, double p) {
title = t;
price = p;
}
//setter、getter、无参构造略
public String getInfo() {
return "书名:" + title + ",价格:" + price;
}
}
public class MainClass {
public static void main(String[] args) {
//开辟了一个3个长度的对象数组
Book books[] = new Book[3];
//对象数组中的每个数据都需要分别实例化
books[0] = new Book("Java基础入门", 89.8);
books[1] = new Book("操作系统", 51.5);
books[2] = new Book("数据结构", 100.2);
for (int i = 0; i < books.length; i ++) {
System.out.println(books[i].getInfo());
}
}
}
对象数组实际上就是将多个对象交给数组统一管理。
范例: 使用静态初始化
class Book {
private String title;
private double price;
public Book(String t, double p) {
title = t;
price = p;
}
//setter、getter、无参构造略
public String getInfo() {
return "书名:" + title + ",价格:" + price;
}
}
public class MainClass {
public static void main(String[] args) {
//开辟了一个3个长度的对象数组
Book books[] = new Book[]{
new Book("Java基础入门", 89.8),
new Book("操作系统", 51.5),
new Book("数据结构", 100.2)
};
for (int i = 0; i < books.length; i ++) {
System.out.println(books[i].getInfo());
}
}
}