当前位置:  首页>> 技术小册>> Java语言基础9-常用API和常见算法

  • java.util.Arrays 数组工具类,提供了很多静态方法来对数组进行操作,而且如下的每一个方法都有重载,以下只列出 int[] 类型的,其他类型依次类推:

二分查找法:要求数组有序,在数组中查找 key 是否存在,如果存在返回第一次找到的下标,不存在返回负数

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

根据 original 原数组复制一个长度为 newLength 的新数组,并返回新数组:

  1. public static int[] copyOf(int[] original, int newLength) {}

复制 original 原数组的 [from,to) 构成新数组,并返回新数组:

  1. public static int[] copyOfRange(int[] original, int from, int to){}

比较两个数组的长度、元素是否完全相同:

  1. public static boolean equals(int[] a, int[] a2) {}

用 val 填充整个 a 数组:

  1. public static void fill(int[] a, int val) {}

将 a 数组 [fromIndex,toIndex) 部分填充为 val :

  1. public static void fill(int[] a, int fromIndex, int toIndex, int val){}

将 a 数组按照从小到大进行排序:

  1. public static void sort(int[] a) {}

将 a 数组的 [fromIndex, toIndex) 部分按照升序排列:

  1. public static void sort(int[] a, int fromIndex, int toIndex){}

把 a 数组的元素,拼接为一个字符串,形式为:[元素1,元素2,元素3。。。]

  1. public static String toString(int[] a) {}

示例:

  1. package com.github.array.demo13;
  2. import java.util.Arrays;
  3. import java.util.Random;
  4. /**
  5. * @author maxiaoke.com
  6. * @version 1.0
  7. *
  8. */
  9. public class Test {
  10. public static void main(String[] args) {
  11. int[] arr = new int[5];
  12. // 打印数组,输出地址值
  13. System.out.println(arr); // [I@1540e19d
  14. // 数组内容转换为字符串
  15. System.out.println("arr数组的初始状态:" + Arrays.toString(arr)); // [0, 0, 0, 0, 0]
  16. // 向数组中填充数据
  17. Arrays.fill(arr, 3);
  18. System.out.println("arr数组的现在状态:" + Arrays.toString(arr)); // [3, 3, 3, 3, 3]
  19. // 向数组中赋值100以内的随机数
  20. Random random = new Random();
  21. for (int i = 0; i < arr.length; i++) {
  22. arr[i] = random.nextInt(100);
  23. }
  24. System.out.println("arr数组的现在状态:" + Arrays.toString(arr)); // [3, 19, 72, 81, 66]
  25. // 根据original原数组复制一个长度为newLength的新数组,并返回新数组
  26. int[] arr2 = Arrays.copyOf(arr, 10);
  27. System.out.println("新数组:" + Arrays.toString(arr2)); // [93, 62, 31, 90, 88, 0, 0, 0, 0, 0]
  28. // 两个数组比较
  29. System.out.println(Arrays.equals(arr, arr2)); // false
  30. // 数组排序
  31. Arrays.sort(arr);
  32. System.out.println(Arrays.toString(arr)); // [17, 23, 32, 57, 98]
  33. }
  34. }

示例:使用数组工具类实现动态数组

  1. package com.github.array;
  2. import org.junit.jupiter.api.Test;
  3. import java.util.Arrays;
  4. import java.util.Iterator;
  5. /**
  6. * 动态数组
  7. *
  8. * @author maxiaoke.com
  9. * @version 1.0
  10. */
  11. public class MyArrayList<E> implements Iterable<E> {
  12. /**
  13. * 底层存储的数据的容器
  14. */
  15. private Object[] all = new Object[5];
  16. /**
  17. * 记录实际存储元素的个数
  18. */
  19. private int total;
  20. /**
  21. * 插入元素
  22. *
  23. * @param e
  24. * @return
  25. */
  26. public boolean add(E e) {
  27. // 判断是否要扩容
  28. if (total >= all.length) {
  29. all = Arrays.copyOf(all, all.length + (all.length >> 1));
  30. }
  31. all[total++] = e;
  32. return true;
  33. }
  34. /**
  35. * 插入指定位置的元素
  36. *
  37. * @param index
  38. * @param e
  39. * @return
  40. */
  41. public boolean add(int index, E e) {
  42. // 校验 index ,合理的范围是 [0,total]
  43. if (index < 0 || index > total) {
  44. throw new IndexOutOfBoundsException(index + "越界" + ",合理的范围是 [0," + total + "]");
  45. }
  46. // 判断是否要扩容
  47. if (total >= all.length) {
  48. all = Arrays.copyOf(all, all.length + (all.length >> 1));
  49. }
  50. System.arraycopy(all, index, all, index + 1, total - index);
  51. all[index] = e;
  52. total++;
  53. return true;
  54. }
  55. /**
  56. * 删除某个位置上的元素:元素前移,最后一个元素位置[total-1]设置为 null
  57. *
  58. * @param index
  59. * @return
  60. */
  61. public boolean remove(int index) {
  62. // 校验 index ,合理的范围是 [0,total-1]
  63. if (index < 0 || index >= total) {
  64. throw new IndexOutOfBoundsException(index + "越界" + ",合理的范围是 [0," + (total - 1) + "]");
  65. }
  66. System.arraycopy(all, index + 1, all, index, total - index - 1);
  67. all[total - 1] = null;
  68. total--;
  69. return true;
  70. }
  71. @Test
  72. public void test() {
  73. MyArrayList<String> list = new MyArrayList<>();
  74. list.add("1");
  75. list.add("2");
  76. list.add("3");
  77. list.add("4");
  78. list.add("5");
  79. list.add("6");
  80. list.add("7");
  81. for (String s : list) {
  82. System.out.println("s = " + s);
  83. }
  84. list.remove(1);
  85. for (String s : list) {
  86. System.out.println("s = " + s);
  87. }
  88. }
  89. @Override
  90. public Iterator<E> iterator() {
  91. return new Intr<>();
  92. }
  93. private class Intr<E> implements Iterator<E> {
  94. private int cursor; // 默认指向第一个元素
  95. @Override
  96. public boolean hasNext() {
  97. return cursor < total;
  98. }
  99. @Override
  100. public E next() {
  101. return (E) all[cursor++];
  102. }
  103. }
  104. }

该分类下的相关小册推荐: