1、为什么定义数组要采用type[] arrayName;这种方式?

因为这种方式具有很好的可读性,使用这种方式很容易就可以理解这是定义一个变量,其中变量名是arrayName,变量的类型是type[]。

2、定义数组是为什么不可以指定数组的长度?

我们知道数组是一种引用类型的变量,因此使用它来定义一个变量时,仅仅表示定义了一个引用变量(也就是定义了一个指针),这个引用变量还未指向任何有效内存,因此定义数组时不能指定数组的长度。

因为定义数组只是定义了一个引用变量,并未指向任何有效的内存空间,所以还没有内存空间来存储数组元素,因此这个数组也不能使用,只有对数组进行初始化之后才可以使用。

Arrays:针对数组进行操作的工具类。属于util包。没有构造方法。但是这个类的方法都是静态方法,可以通过类直接调用

public static String toString(T[] a):把数组转换成字符串

public static void sort(T[] a):对数组进行排序(底层是快速排序)

public static int binarySearch(T[] a,Tkey):二分查找

public class ArrayDemo {

public static void main(String[] args) {

int[] arr = {24,69,80,57,13};

System.out.println(Arrays.toString(arr)); //[24, 69, 80, 57, 13]

System.out.println(Arrays.binarySearch(arr, 57)); //-2(为什么呢?看后面的源码找答案)

Arrays.sort(arr);

System.out.println(Arrays.toString(arr)); //[13, 24, 57, 69, 80]

System.out.println(Arrays.binarySearch(arr, 57)); //2

}

}

为了更加深刻的了解这些方法的原理,下面贴出源码以供理解:

这个是toString的源码:只要是对象,我们在使用之前都要判断是不是null,以防出现空指针异常

public static String toString(int[] a) {

if (a == null)

return "null";

int iMax = a.length - 1;

if (iMax == -1)

return "[]";

StringBuilder b = new StringBuilder();

b.append('[');

for (int i = 0; ; i++) {

b.append(a[i]);

if (i == iMax)

return b.append(']').toString();

b.append(", ");

}

}

binarySearch的源码:

public static int binarySearch(int[] a, int key) {

return binarySearch0(a, 0, a.length, key);

}

private static int binarySearch0(int[] a, int fromIndex, int toIndex, int key) {

int low = fromIndex;

int high = toIndex - 1;

while (low <= high) {

int mid = (low + high) >>> 1;

int midVal = a[mid];

if (midVal < key)

low = mid + 1;

else if (midVal > key)

high = mid - 1;

else

return mid; // key found

}

return -(low + 1); // key not found.

}

冒泡排序

1、相邻元素两两比较,大的往后面放。

2、第一次排序完毕后,最大值就出现在了最大索引处。

3、第二次排序,最后一个索引的位置就不需要比较了

4、第三次排序,倒数第二个索引位置就不需要比较了

用i来表示比较的次数。每一次都会从索引为0的位置开始向后比较。

第一轮:i = 1,j 的范围是第一个到最后一个,所以j的索引范围是[0,arr.length-1](arr.length-1是数组最后一个位置的索引,看成一个整体)

第一轮之后,会确定一个最大值。因此第二轮比较的时候就不用去比较这个最大值了。

第二轮:i = 2,因为第一轮已经确定了一个最大值,有1个元素不会参与比较。因此第二轮 j 的索引范围变成了[0,(arr.length-1)-1]

第二轮比较之后,会确定两个应该在数组末尾的两个值。第三轮就不用去比较这两个值了。

第三轮:i = 3,因为第二轮已经确定了两个大值了,有2个元素不会参与比较。因此第三轮 j 的索引范围变成了[0,(arr.length-1)-2]

……..

依次类推:第 i 次 j 的索引范围应该是:[0,(arr.length-1)-(i-1)]

代码如下:

public class BubbuleDemo {

public static void main(String[] args) {

int[] arr = { 24, 69, 80, 57, 13 };

bubbleSort(arr);

}

// 冒泡排序

public static void bubbleSort(int[] arr) {

for (int i = 1; i <= arr.length - 1; i++) { // 控制比较的次数。次数 = 数组长度-1

for (int j = 0; j < (arr.length - 1) - (i - 1); j++) {

if (arr[j] > arr[j + 1]) {

int temp = arr[j];

arr[j] = arr[j + 1];

arr[j + 1] = temp;

}

}

}

for (int i = 0; i < arr.length; i++) {

System.out.print(arr[i] + " ");

}

}

}

选择排序

1、从索引为0的地方开始,依次和后面的比较,小的往前放

2、第一次比较从0索引开始往后比较。第一次比较完毕后,最小的元素就出现在了第一个位置上。

3、第二次比较的时候就不比较第一个元素了,就会从第二个元素开始比较。也就是第二次比较从1索引开始比较。

第二次比较完毕后,第二小的就出现在了第二个位置上。

4、第三次比较的时候就不比较前两个元素了,就会从第三个元素开始比较.也就是第三次比较从2索引开始比较。

…….

第 n 比较的时候就不比较前(n-1)个元素了,会从第n个元素开始比较。也就是第n次比较从(n-1)索引开始比较。

public class SelectSort {

public static void main(String[] args) {

int[] arr = { 24, 69, 80, 57, 13 };

selectSort(arr);

}

public static void selectSort(int[] arr) {

for (int i = 0; i <= (arr.length - 2); i++) { //已经确认好的值的个数,比如:确定了0个人,就从0索引开始依次跟后面的比较

for (int j = i + 1; j <= (arr.length - 1); j++) {

if (arr[i] > arr[j]) {

int temp = arr[j];

arr[j] = arr[i];

arr[i] = temp;

}

}

}

for (int i = 0; i < arr.length; i++) {

System.out.print(arr[i] + " "); //13 24 57 69 80

}

}

}

二分查找(折半查找算法):数组元素有序的情况下

1、每次都去找中间的那个元素,跟要查找的元素比较,

2、如果中间元素的值 > 要查找的值,就在左半部分找

3、如果中间元素的值 < 要查找的值,就在右半部分找

注意:只有有序数组才可以使用这个方法。不可以对无序数组采用二分查找,不可以先排序再二分查找,因为你的数组元素都变了,你查找的索引已经不再是原始数组的索引了。

public class BinarySearch {

public static void main(String[] args) {

int[] arr = { 11, 23, 34, 46, 57, 68, 79, 80 };

System.out.println(binarySearch(arr, 57)); //4

}

//二分查找

public static int binarySearch(int[] arr, int value) {

int min = 0;

int max = arr.length - 1;

int mid = (max + min) / 2;

while (min <= max) {

if (arr[mid] > value) {

max = mid - 1;

} else if (arr[mid] < value) {

min = mid + 1;

}else{

return mid;

}

mid = (max + min) / 2;

}

return -1; //找不到的情况

}

}

java的数组查找算法_java数组、排序算法、查找算法详解相关推荐

  1. java一个方法排他调用_Java编程实现排他锁代码详解

    一 .前言 某年某月某天,同事说需要一个文件排他锁功能,需求如下: (1)写操作是排他属性 (2)适用于同一进程的多线程/也适用于多进程的排他操作 (3)容错性:获得锁的进程若Crash,不影响到后续 ...

  2. java中 enum什么意思_Java中枚举Enum的使用详解

    在某些情况下,一个类的对象时有限且固定的,如季节类,它只有春夏秋冬4个对象这种实例有限且固定的类,在 Java 中被称为枚举类: 在 Java 中使用 enum 关键字来定义枚举类,其地位与 clas ...

  3. java原生类型没有封装_Java基本数据类型与封装类型详解(int和Integer区别)

    Java基本数据类型与封装类型详解(int和Integer区别) 发布于 2020-4-19| 复制链接 摘记: int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Int ...

  4. java 封装表单数据类型_Java基本数据类型与封装类型详解(int和Integer区别)

    int是java提供的8种原始数据类型之一. Java为每个原始类型提供了封装类,Integer是java为int提供的封装类(即Integer是一个java对象,而int只是一个基本数据类型).in ...

  5. java 获取oracle表结构_Java导出oracle表结构实例详解

    Java导出oracle表结构实例详解 发布于 2020-7-20| 复制链接 摘记:  Java导出oracle表结构实例详解最近用到的,因为plsql是收费的,不让用,找了很多方法终于发现了这个. ...

  6. java this关键字的使用_Java this 关键字的使用方法详解

    Java this 关键字的使用方法详解 构造方法中的this关键字 构造方法是一个类的对象在通过new关键字创建时自动调用的,在程序中不能向调用其他方法一样通过方法名(也就是类名)来调用.但如果一个 ...

  7. java中math的方法_Java中Math类常用方法代码详解

    近期用到四舍五入想到以前整理了一点,就顺便重新整理好经常见到的一些四舍五入,后续遇到常用也会直接在这篇文章更新... public class Demo{ public static void mai ...

  8. java case 多个值_Java switch多值匹配操作详解

    这篇文章主要介绍了Java switch多值匹配操作详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 我们都知道 switch 用来走流程分支,大 ...

  9. java uml类图教程_Java利器之UML类图详解

    原标题:Java利器之UML类图详解 (点击上方公众号,可快速关注) 来源:伯乐在线专栏作者- Code4Android 如需转载,发送「转载」二字查看说明 前言 UML(Unified Modeli ...

  10. java集合框架的接口_Java集合框架之Collection接口详解

    Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...

最新文章

  1. 迷你世界电锯机器人_迷你世界:三分钟制作超简单飞翔石像机器人报道!
  2. 计算机专业人事制度改革,清华大学计算机系人事制度改革正式启动-清华大学新闻网...
  3. Valgrind使用【转】
  4. c++二叉树编程实践
  5. 计算机等级考试模拟题卷子,二级VB模拟试卷 1
  6. python中哪个符号用于从包中导入模块__学小易找答案
  7. 2022年武汉科技大学成人高等学历教育招生简章--学历提升、高起专、专升本
  8. js url解码gbk_使用js解码url里的gbk汉字编码
  9. C++标准库string类型那些事儿
  10. token登录最详细代码实例
  11. Python 使用 PyOTP 实现二步验证
  12. 计算机屏幕自己动,ipad屏幕失灵自己乱跳怎么办【图文】
  13. 仪器仪表课程上的大作业——示波器的使用
  14. 阿里云免费个人Docker镜像仓库搭建
  15. 美国NBC电视台社论 中文版
  16. iview table 导出csv文件错行问题
  17. 华清远见荣获“华为云精英服务商”资质,助推“华为开发者创新中心”项目落地高校
  18. http协议中,get和post的区别
  19. 自动化测试题目(一)
  20. 微信小程序下拉刷新真机没效果_微信小程序 下拉刷新 上拉加载(示例代码)

热门文章

  1. SQL语句--INSERT INTO SELECT 语句用法示例
  2. Spring MVC生成PDF文件代码示例
  3. Spring 体系结构详解
  4. centos7自带python版本_CentOS7保留默认Python版本并安装更新Python2和Python3共存
  5. centos7中每天定时备份mysql数据库
  6. C语言中返回错误信息的函数总结
  7. python(numpy,pandas2)——numpy 运算
  8. 卷积网络的学习(卷积核,通道,padding,stride等概念)
  9. lstm 变长序列_keras在构建LSTM模型时对变长序列的处理操作
  10. microsoftonenote_Microsoft