Java知识点详解——第七章:数组

数组

        数组是有序的元素序列,用于储存多个相同类型数据的集合。
        数组的创建方式有多种,但在创建时都应该指定长度(元素数量),引用类型。

方式一: String[ ] array = new String[5];
方式二: int[ ] array = new int[ ] {1,2,3,4,5};
方式三: int[ ] array = {1,2,3,4,5};

示例:

public class Demo{
	//数组没有创建时值为null
	int[] array;
	
	public void method(){
		//访问值为null的数组将出现nullPointerException
		System.out.println(array[0]);
	}

	public static void main(String[] args) {
		
		//创建数组的多种方式,数组在创建都应指定长度(元素数量)
		//数组是引用类型
		//数组创建后具备默认值
		//数组创建后,长度不不可变
		
		//创建方式1
		int[] array = new int[5];
		String array[] = new String[5];
		//对数组的元素进行赋值
		array[0] = 1;
		//访问数组中的元素,通过下标索引
		System.out.println(array[0]);
		
		//创建方式2  创建时直接赋值
		int[] array = new int[]{1,2,3,4,5,6};
		//访问时索引不能超过数组的长度
		System.out.println(array[7]);
		
		//创建方式3
		int[] array = {1,2,3,4,5,6};
		
		//获取数组的长度,使用length属性
		System.out.println(array.length);
		
		//遍历数组的元素
		for(int i = 0; i < array.length; i++){
			System.out.println(array[i]);
		}	
	}
}

注意事项

  1. [ ]可以放在数组名的后面;
  2. 创建数组必须分配数组的长度,创建后具备默认值,且长度不变;
  3. 访问数组中的元素,通过下标索引访问(访问时索引不能超过数组长度)。

数组的相关属性

属性作用示例
length获取数组中元素的数量(长度)System.outpprintln(array.length);
split分割String[ ] nameArray = s.split(",");
toCharArray( )将字符串转换为数组(char型)char[ ] array = str.toCharArray( );

对数组进行排序:
        数组中的排序是将元素按照一定规律依次比较的过程。

import java.util.Arrays;
import java.util.Date;

import com.chiang.Demo2;

public class Demo7 {
	//降序
	public static final int DESC =  2;
	//升序
	public static final int ASC = 1;
	
	
	/**冒泡排序    排序类型  1升序   2降序*/
	public void sort1(int[] array, int sortType){
		if(sortType == 1){
			//外层循环比较轮数
			for(int i = 1; i < array.length; i++){
				//里层循环比较每轮的次数  -i表示上一轮产生的最大/最小值不需要参与比较
				for(int j = 0; j < array.length-i; j++){
					//相邻两数的比较
					if(array[j] > array[j+1]){
						//两数交换
						int temp = array[j];
						array[j] = array[j+1];
						array[j+1] = temp;
					}
				}
			}	
		}
		else{
			//外层循环比较轮数
			for(int i = 1; i < array.length; i++){
				//里层循环比较每轮的次数  -i表示上一轮产生的最大/最小值不需要参与比较
				for(int j = 0; j < array.length-i; j++){
					//相邻两数的比较
					if(array[j] < array[j+1]){
						//两数交换
						int temp = array[j];
						array[j] = array[j+1];
						array[j+1] = temp;
					}
				}
			}
		}
	}
	
	
	/** 选择排序法 */
	public void sort2(int[] array){
		//外层循环控制比较轮数
		for(int i = 0; i < array.length-1; i++){
			//里层循环控制每一轮比较的次数
			for(int j = i+1; j < array.length; j++){
				if(array[i] > array[j]){
					int temp = array[i];
					array[i] = array[j];
					array[j] = temp;
				}
			}
		}
	}
	
	
	/**快速排序法(二分法)    left:左边的起始索引位置    right:右边的起始索引位置*/
	public void sort3(int[] array,int left, int right){
		//如果排序到最后一位数,右边的索引小于左边的索引时,排序结束
		if(left > right){
			return;
		}
		
		int i = left;
		int j = right;
		
		//基准值
		int middle = array[left];
		
		//i和j没有汇合时,则两端继续前进
		while(i != j){
			//先从右往左前进
			while(array[j] >= middle && j > i){
				j--;
			}
			//再从左往右前进
			while(array[i] <= middle && i < j){
				i++;
			}
			//将i和j对应的数交换位置
			int temp = array[j];
			array[j] = array[i];
			array[i] = temp;
			
		}
		//i和j汇合后,交换汇合点与基准值
		array[left] = array[i];
		array[i] = middle;
		
		//根据新的交汇点分成左右两部分,分别继续排序
		sort3(array, left, i-1);
		sort3(array, i+1, right);
		
	}
	
	
	public static void main(String[] args) {
	
		//动态生成一个指定长度的随机数组
		Demo2 demo2 = new Demo2();
		int[] array = demo2.createRandomArray4(1000000);
		
		Demo7 demo = new Demo7(); 
		
		//记录算法起始时间
		Date start = new Date();
		//冒泡排序
		demo.sort1(array,Demo7.ASC);
		//选择排序
		demo.sort2(array);
		//快速排序
		demo.sort3(array, 0, array.length-1);
		
		//使用Java自带的排序算法(升序)
		Arrays.sort(array);
		
		//记录算法结束时间
		Date end = new Date();
		//计算算法耗时
		long time = end.getTime()-start.getTime();
		System.out.println("运算耗时:"+time+"ms");	
	}
}

附:产生1~100不重复的随机数

import java.util.Date;
import java.util.Random;

import com.chiang.Demo7;

public class Demo2 {

	/** 产生1-100不重复的随机数 */
	public int[] createRandomArray1(){
		int[] array = new int[100];
		Random random = new Random();
		//循环的次数
		int count = 0;
		//如果最后一个元素为默认值0则继续生成随机数
		while(array[array.length-1] == 0){
			//生成一个1-100的随机值
			int n = random.nextInt(100)+1;
			//判断是否已经产生过该数据
			if(!hasNumber(array, n)){
				//先计算写入的索引
				int index = searchInsertIndex(array);
				//如果没有产生则写入数组
				array[index] = n;
			}
		}
		System.out.println("数组产生完毕,共计循环"+count+"次");
		return array;
	}
	
	/** 递归算法实现 */
	public int[] createRandomArray2(){
		int[] array = new int[100];
		Random random = new Random();
		//生成随机数
		createData(random, array);

		return array;
	}
	
	/** 生成随机数 */
	public void createData(Random random, int[] array){
		//生成一个1-100的随机值
		int n = random.nextInt(100)+1;
		//判断是否已经产生过该数据
		if(!hasNumber(array, n)){
			//先计算写入的索引
			int index = searchInsertIndex(array);
			//如果没有产生则写入数组
			array[index] = n;
		}
		//判断是否需要继续生成
		if(array[array.length-1] == 0){
			createData(random, array);
		}
	}
	
	/**查找数组中是否包含数据 */
	public boolean hasNumber(int[] array, int n){
		for(int i = 0; i < array.length; i++){
			if(array[i] == n){
				return true;
			}
		}
		return false;
	}
	
	/**查找写入数据的索引位置 */
	public int searchInsertIndex(int[] array){
		int index = 0;
		for(int i = 0; i < array.length; i++){
			//查找第一次出现的默认值得位置,该位置即数据插入的索引
			if(array[i] == 0){
				index = i;
				break;
			}
		}
		return index;
	}
	
	
	/**性能最好的算法 */
	public int[] createRandomArray4(int count){
		int[] array = new int[count];
		//初始化数组的值
		for(int i = 0; i < array.length; i++){
			array[i] = i+1;
		}
		//创建用于接收1-100不重复随机数的数组
		int[] randomArray = new int[count];
		Random random = new Random();
		//随机索引的范围
		int range = array.length;
		for(int i = 0; i < randomArray.length; i++){
			//生成随机索引
			int index = random.nextInt(range);
			//将索引对应的值写入数组
			randomArray[i] = array[index];
			//将最后个元素交换至索引位置
			array[index] = array[range-1];
			//缩小随机索引范围
			range--;
			
		}
		return randomArray;
	}
	
	
	
	public void typeResult(int[] array){
		for(int i = 0; i < array.length; i++){
			System.out.println(array[i]);
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Demo2 demo = new Demo2();
		//记录算法起始时间
		Date start = new Date();
		int[] array = demo.createRandomArray4(1000);
		demo.typeResult(array);
		//记录算法结束时间
		Date end = new Date();
		//计算算法耗时
		long time = end.getTime()-start.getTime();
		System.out.println("运算耗时:"+time+"ms");
		demo.typeResult(array);
		
		Demo7 demo7 = new Demo7();
		demo7.sort1(array, Demo7.ASC);
		demo.typeResult(array);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值