Java中数组的定义和使用教程(三)

 更新时间:2021年01月14日 17:31:14   作者:mrbacker  
这篇文章主要给大家介绍了关于Java中数组的定义和使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

数组排序

在很多的面试题上都会出现数组排序的操作形式。但是这个时候你千万别写上:java.util.Arrays.sort(数组)。而这种排序都是以升序为主。

基础的排序操作:

范例: 冒泡排序

public class ArrayDemo {
	public static void main(String args[]) {
		int data[] = new int[] {9, 3, 1, 5, 4, 2, 7, 8, 6, 0};
		sort(data);
		printArray(data);
	}

	public static void sort(int arr[]) { //实现数组排序
		for(int x = 0; x < arr.length - 1; x++) {
			for(int y = 0; y < arr.length - x - 1; y++) {
				if(arr[y] > arr[y+1]) {
					int temp = arr[y];
					arr[y] = arr[y+1];
					arr[y+1] = temp;
				}
			}
		}
	}
	//定义一个专门进行数组输出的方法
	public static void printArray(int temp[]) {
		for (int i = 0; i < temp.length; i++) {
			System.out.print(temp[i] + "、");
		}
		System.out.println();
	}
}

数组转置

所谓的转置最简单的理解就是首尾交换。而如果要想实现这样的交换有两种实现思路。

思路一:开辟一个新的等长的数组,而后将原始数组倒序保存进去;

public class ArrayDemo {
	public static void main(String args[]) {
		int data[] = new int[] {9, 3, 1, 5, 4, 2, 7, 8, 6, 0};
		data = reverse(data); //反转
		printArray(data);
	}
	public static int [] reverse(int arr[]) { 
		int temp[] = new int[arr.length];
		int foot = 0;
		for(int x = arr.length - 1; x >= 0; x--) {
			temp[foot++] = arr[x];
		}
		return temp;
	}
	//定义一个专门进行数组输出的方法
	public static void printArray(int temp[]) {
		for (int i = 0; i < temp.length; i++) {
			System.out.print(temp[i] + "、");
		}
		System.out.println();
	}
}

使用此类模式实现的最大问题在于开辟了两块相同的堆内存空间,所以造成空间浪费。

思路二:在一个数组上完成转换

public class ArrayDemo {
	public static void main(String args[]) {
		int data[] = new int[] {9, 3, 1, 5, 4, 2, 7, 8, 6, 0};
		reverse(data); //反转
		printArray(data);
	}

	public static void reverse(int arr[]) {
		int center = arr.length / 2; //转换次数
		int head = 0; //头部开始索引
		int tail = arr.length - 1; //尾部开始索引
		for(int x = 0; x < center; x++) {
			int temp = arr[head];
			arr[head] = arr[tail];
			arr[tail] = temp;
			head++;
			tail--;
		}
	}
	//定义一个专门进行数组输出的方法
	public static void printArray(int temp[]) {
		for (int i = 0; i < temp.length; i++) {
			System.out.print(temp[i] + "、");
		}
		System.out.println();
	}
}

这种转换只需要根据数组长度 ÷ 2即可。

如果要进行二维数组的原地转置,那么肯定有一个前提:行列要相等。

范例: 保证中间轴不变(x = y)

public class ArrayDemo {
	public static void main(String args[]) {
		int data[][] = new int[][] {{1, 2, 3}, {4, 5, 6},{7, 8, 9}};
		reverse(data); //反转
		printArray(data);
	}

	public static void reverse(int arr[][]) {
		for(int x = 0; x < arr.length; x++) {
			for(int y = x; y < arr[x].length; y++) {
				if(x != y) {
					int temp = arr[x][y];
					arr[x][y] = arr[y][x];
					arr[y][x] = temp;
				}
			}
		}
	}
	//定义一个专门进行数组输出的方法
	public static void printArray(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();
	}
}

二分查找法

如果现在要求在一个指定的数组之中查询一个数据的位置,那么现在可能想到的最简化的实现,整体数组遍历。

范例: 顺序查找

public class ArrayDemo {
	public static void main(String args[]) {
		int data[] = new int[] {1, 2, 3, 4, 5, 6, 7, 8};
		int search = 7;
		System.out.println(index(data, search));
	}
	public static int index(int arr[], int key) {
		for(int x = 0; x < arr.length; x++) {
			if(arr[x] == key)
				return x;
		}
		return -1;
	}
}

这个的时间复杂度是n,也就是说所有的数组中的数据都需要进行一次遍历,这样才能确认所需要查找的数据是否存在,那么现在如果想进行更快速地查找,最好的做法是进行二分查找(折半查找)。

范例: 实现二分查找(采用递归)

public class ArrayDemo {
	public static void main(String args[]) {
		int data[] = new int[] {1, 2, 3, 4, 5, 6, 7, 8};
		int search = 7;
		System.out.println(index(data, search));
	}
	public static int binarySearch(int arr[], int from, int to, int key) {
		if(from < to) {
			int mid = from / 2 + to / 2; //确定中间点
			if(arr[mid] = key) { //数据找到了
				return mid; // 取得当前索引
			}else if(key < arr[mid]) {
				return binarySearch(arr, from, mid - 1; key);
			}
			else(key > arr[mid]){
				return binarySearch(arr, mid + 1, to, key);
			}
		}
		return -1;
	}
}

但是这些都是属于数据结构课程的范围,是逻辑思维训练。

对象数组(核心)

在之前所定义的数组都属于基本数据类型数组,那么对象也可以将其定义为数组,这样的操作形式称为对象数组。对象数组往往是以引用数据类型为主的定义,例如:类、接口,而且对象数组也分为两种定义格式。

  • 对象数组动态初始化:类名称 对象数组名称[] = new 类名称[长度];
  • 对象数组静态初始化:类名称 对象数组名称[] = new 类名称[]{实例化对象,…};

范例: 对象数组的动态初始化

class Person {
	private String name;
	private int age;

	public Person(String n, int a) {
		name = n;
		age = a;
	}
	public String getInfo() {
		return "姓名:" + name + ",年龄:" + age;
	}
}
public class ArrayDemo {
	// 动态初始化之后对象数组中的每一个元素都是其对象数据类型的默认值
	public static void main(String args[]) {
		Person per[] = new Person[3]; //动态初始化
		per[0] = new Person("张三", 1);
		per[1] = new Person("王五", 2);
		per[2] = new Person("李四", 4);
		for(int x = 0; x < per.length; x++) {
			System.out.println(per[x].getInfo());
		}
	}
}

范例: 静态初始化

class Person {
	private String name;
	private int age;

	public Person(String n, int a) {
		name = n;
		age = a;
	}
	public String getInfo() {
		return "姓名:" + name + ",年龄:" + age;
	}
}
public class ArrayDemo {
	// 动态初始化之后对象数组中的每一个元素都是其对象数据类型的默认值
	public static void main(String args[]) {
		Person per[] = new Person[] {
		new Person("张三", 1), 
		new Person("王五", 2),
		new Person("李四", 4)
		}; //动态初始化
		for(int x = 0; x < per.length; x++) {
			System.out.println(per[x].getInfo());
		}
	}
}

每一个对象可以保存更多的的属性,所以对象数组保存的内容要比基本数据类型更多。那么应用的也就更多。所有的开发必定都存在有对象数组的概念。

总结

到此这篇关于Java中数组的定义和使用的文章就介绍到这了,更多相关Java数组的定义和使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在Map中实现key唯一不重复操作

    在Map中实现key唯一不重复操作

    这篇文章主要介绍了在Map中实现key唯一不重复操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java编程实现非对称加密的方法详解

    Java编程实现非对称加密的方法详解

    这篇文章主要介绍了Java编程实现非对称加密的方法,简单讲述了非对称加密的概念、原理,并结合实例形式分析了java实现DH加密解密、RSA加密解密、ElGamal加密等具体操作技巧,需要的朋友可以参考下
    2017-08-08
  • Spring 实现给Bean属性注入null值

    Spring 实现给Bean属性注入null值

    这篇文章主要介绍了Spring 实现给Bean属性注入null值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringBoot项目中使用@Scheduled读取动态参数

    SpringBoot项目中使用@Scheduled读取动态参数

    这篇文章主要介绍了SpringBoot项目中使用@Scheduled读取动态参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 深入Java对象的地址的使用分析

    深入Java对象的地址的使用分析

    本篇文章介绍了,Java对象的地址的使用分析。需要的朋友参考下
    2013-05-05
  • Java 调整格式日志输出

    Java 调整格式日志输出

    本文主要介绍Java 的日志输出格式,在开发java的时候会经常看日志进行调试或者查看错误,这里给大家介绍日志输出调整格式,以便大家看日志的时候更加方便,
    2016-07-07
  • Rxjava+Retrofit+MVP实现购物车功能

    Rxjava+Retrofit+MVP实现购物车功能

    这篇文章主要为大家详细介绍了Rxjava+Retrofit+MVP实现购物车功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Java源码解析CopyOnWriteArrayList的讲解

    Java源码解析CopyOnWriteArrayList的讲解

    今天小编就为大家分享一篇关于Java源码解析CopyOnWriteArrayList的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • java返回集合为null还是空集合及空集合的三种写法小结

    java返回集合为null还是空集合及空集合的三种写法小结

    这篇文章主要介绍了java返回集合为null还是空集合及空集合的三种写法小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 详解Spring中接口的bean是如何注入的

    详解Spring中接口的bean是如何注入的

    这篇文章主要介绍了详解Spring中接口的bean是如何注入的的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-06-06

最新评论