3.3 数组2 -【Java入门--疯狂Java讲义】

学习了数组的创建于赋值,来看看数组的基本操作。

数组的复制,有两种方法:

1.java.lang.System   arraycopy();

int[] arr1 = new int[]{1,2,3};
int[] arr2 = new int[3];
System.arraycopy(arr1, 0, arr2, 0,3);
//输出 1 2 3
for(int i : arr2){
	System.out.println(i);
}

2.java.util.Arrays  copyOf();

int[] arr1 = new int[]{1,2,3};
int[] arr2 = Arrays.copyOf(arr1, 3);
//输出1 2 3
for(int i : arr2){
	System.out.println(i);
}

上面两段代码演示了如何用两种方法如何复制一个数组,复制数组可以用于数组的“扩容”,这里说的扩容只是形式上的,其实数组的长度是不能改变的,只不过是新建了一个数组而已。

public static int[] copyOf(int[] original, int newLength) {
        int[] copy = new int[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
}

上面是粘的CopyOf的源码,可以看出,copyOf()的底层也是调用的arraycopy实现的。


 数组的排序:

java.util.Arrays  sort()

int[] arr1 = new int[]{1,5,8,9,4,3,6};
	Arrays.sort(arr1);
	for(int i : arr1){
		System.out.println(i);
}

可以使用Arrays里的sort()方法进行排序,这里默认是升序的,当然里面可以指定比较器,用以控制排序规则,这里先不用了解,或者也可以自己写比较方法,用来控制比较排序,sort方法使用的是快速排序法,排序的方法有很多,这里我们作为初级入门的话也许理解不了,对于一些知识点的刨析,我会更新到博客,有兴趣的话 可以看看,下面我们以二分法排序来对数组进行排序:

冒泡排序的原理就是用一个数与相邻元素依次比较,大就交换位置,依次比较完以后,大数就都飘上去了,类似于吹泡泡一样,越往上升泡泡越大,例如 1 5 8 9 4 3 6,先用1与5比较,遇到比较大的就交换位置,比较过程如下:

1 5 8 9 4 3 6    1与5比较

5 1 8 9 4 3 6    1与8比较

5 8 1 9 4 3 6    1与9比较

5 8 9 1 4 3 6    1与4比较

5 8 9 4 1 3 6    1与3比较

5 8 9 4 3 1 6    1与6比较

5 8 9 4 3 6 1    

第一轮结束,最小的数到了最后,注意,第二轮最后一个数就不用比了,肯定最小

int[] arr = new int[]{1,5,8,9,4,3,6};
for(int i=0; i<arr.length-1;i++){//捆支比较轮数
	for(int j=0; j<arr.length-1-i; j++){//控制比较次数
		//如果该数小于后一个数,替换
		if(arr[j]<arr[j+1]){
			int temp = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = temp;
		}
	}
}

数组的查找:

可以自己循环遍历查找,在java.util.Arrays 里面也有 binarySearch 方法,使用二分法来查找值,但是使用binarySearch前一定要将数组排序,不然会出现错误结果,

int[] arr = new int[]{1,5,8,9,4,3,6};
Arrays.sort(arr);
int index = Arrays.binarySearch(arr, 1);

binarySearch查找到以后,返回的是下标,没有这个值,返回的是 -(插入点) - 1,例如1 2 4中查找3,没有返回的是-3,因为3如果插入到1 2 4 中,应该是1 2 3 4,坐标为2,而 -2-1=-3。

 

数组是Java基础部分比较重要的概念,学习好数组,对于以后集合的学习有很大的帮助意义,因为集合的底层都直接或者间接的使用到了数组的相关操作。因为数组的内容太多,篇幅有限,这里只能列出一些最为基础的,在学习中还是要多去钻研。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值