4 数组

4.1 概念

数组:是相同类型数据的有序集合,相同类型的若干个数据,按照一定先后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们

4.2 特点

  • 数组长度是确定的,数组一旦被创建,它的大小就是不可以改变的(有局限性)
  • 存放的元素类型相同
  • 元素可以是任何数据类型,包括基本类型和引用类型
  • 可以存放重复的元素
  • 下标:用来表示数组元素的顺序

    • 数组下标是从0开始,第一个元素下标为0,可以通过下标访问数组元素

4.3 数组的创建和应用

4.3.1 数组的初始化

一维数组

  • 等号左边:

    • 元素类型[] 数组名 例如:int[] arr
    • 元素类型 数组名[] 例如:int arr[]
  • 等号右边:

    • 静态初始化:(根据元素的个数来确定数组的长度)

      • new 元素类型[]{元素,元素…} 例如:new int[]{1, 3, 5},代表有3个int类型元素的数组
      • {元素,元素…} 例如:{1, 3, 5},代表是有3个元素的数组
    • 动态初始化:(根据元素的个数来确定数组的长度)

      • new 元素类型[5] 例如:new String[3],代表是一个可以存放3个String类型元素的数组
  • 示例:

    • int arr[] = new int[3];
    • int arr[] = new int[]{1, 2, 3};
    • int[] arr = {4, 5, 6};

二维数组

  • 等号左边:

    • 元素类型[] 数组名 例如:int[][] arr
    • 元素类型 数组名[] 例如:int arr[][]
  • 等号右边:

    • 静态初始化:

      • new 元素类型[]{元素,元素…} 例如:new int[]{{1, 2, 3}, {4, 5}, {6}}
      • {元素,元素…} 例如:{{1, 2, 3}, {4, 5}, {6}}
    • 动态初始化:

      • new 元素类型[5] 例如:new String[3][2]代表可以存放3个元素,每个元素是可以存放2个String类型数据的数组
  • 示例:

    • int arr[][] = new int[3][2];
    • int arr[][] = new int[][]{{1, 2, 3}, {4, 5}, {6}};
    • int[][] arr = {{1, 2, 3}, {4, 5}, {6}};

4.3.2 数组的访问及遍历

  • 数组的访问

    • 通过下标进行访问 例如:arr[下标]
  • 数组的遍历

    • for循环遍历 例如:for (int i = 0; i < 数组.length; i++) {}

      • 可以进行数组遍历,并且可以在过程中对数组进行修改
      • 定义下标方式进行遍历
    • 增强for循环遍历(for each循环) 例如:for (数据类型 变量名 : 数组) {}

      • 只能进行遍历,不能对数据进行修改
      • for each遍历的效率比普通for循环高
      • 采用声明一个临时的变量来保存元素方式遍历,只能访问元素,不能使用这个变量来改变原来数组中的元素

4.3.3 代码示例

  1. /**
  2. * 数组基本使用
  3. */
  4. public class ArrayBase {
  5. public static void main(String[] args) {
  6. initArray();
  7. visitArray();
  8. dynamicInit();
  9. traversalArray();
  10. traversalArrayUpdate();
  11. //String[] args 可以接收命令行参数
  12. System.out.println(args); // [Ljava.lang.String;@74a14482
  13. for (int i = 0; i < args.length; i++) {
  14. System.out.println(args[i]);
  15. }
  16. }
  17. // 数组的定义
  18. public static void initArray() {
  19. // 动态初始化
  20. int arr[] = new int[3];
  21. // 静态初始化
  22. int arr1[] = new int[]{1, 2, 3};
  23. int[] arr2 = {4, 5, 6};
  24. }
  25. // 通过下标访问数组
  26. public static void visitArray() {
  27. int[] in = new int[]{23,34,645,234,22,46};
  28. // 下 标 : 0 1 2 3 4 5
  29. System.out.println(in); // [I@1b6d3586 地址
  30. System.out.println(in.toString()); // [I@1b6d3586
  31. System.out.println(in[0]); // 23
  32. System.out.println(in[1]); // 34
  33. // 修改数组中的数据
  34. in[0] = 0;
  35. System.out.println(in[0]); // 0
  36. }
  37. // 动态初始化
  38. public static void dynamicInit() {
  39. // 动态初始化
  40. String str[] = new String[3];
  41. System.out.println(str); // [Ljava.lang.String;@4554617c
  42. System.out.println(str.toString()); // [Ljava.lang.String;@4554617c
  43. // 动态赋值
  44. str[0] = "jason";
  45. str[1] = "lyl";
  46. System.out.println(str[0]); // jason
  47. System.out.println(str[1]); // lyl
  48. System.out.println(str[2]); // null -> String (引用数据类型)类型默认值为 null
  49. int ar[] = new int[3];
  50. System.out.println(ar[0]); // 0 int 类型默认值为 0
  51. }
  52. // 数组的遍历
  53. public static void traversalArray() {
  54. String[] str = new String[]{"张三","李四","王五","23","564"};
  55. /*
  56. * 第一种方式
  57. * for循环遍历 快捷键: fori
  58. * i : 下标
  59. */
  60. for (int i = 0; i < str.length; i++) {
  61. System.out.println(str[i]);
  62. }
  63. /*
  64. * 第二种方式
  65. * foreach循环遍历 快捷键 iter (iterator迭代)
  66. * 把 str 中的数据一个一个给 s,并打印输出
  67. */
  68. for (String s : str) {
  69. System.out.println(s);
  70. }
  71. // java.util 数组工具类
  72. System.out.println(Arrays.toString(str));
  73. }
  74. // 遍历中修改数据 测试
  75. public static void traversalArrayUpdate() {
  76. int[] arr = new int[]{1, 3, 5};
  77. // for循环修改数组 测试
  78. for (int i = 0; i < arr.length; i++) {
  79. arr[i] += 1;
  80. System.out.println(arr[i]); // 2 4 6
  81. }
  82. System.out.println(Arrays.toString(arr)); // 可以修改 [2, 4, 6]
  83. // foreach循环修改数组 测试
  84. for (int i : arr) {
  85. i += 1;
  86. System.out.println(i); // 3 5 7
  87. }
  88. System.out.println(Arrays.toString(arr)); // 修改失败 [2, 4, 6]
  89. }
  90. }
  1. /**
  2. * 数组常见问题
  3. */
  4. public class ArrayException {
  5. public static void main(String[] args) {
  6. /*
  7. * 常见问题
  8. *
  9. * 数组下标越界异常
  10. * 报错:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
  11. */
  12. String[] str = new String[]{"张三","李四",null,"王五"};
  13. // System.out.println(strr[4]);
  14. /*
  15. * 空指针异常
  16. * 报错:java.lang.NullPointerException
  17. */
  18. String[] str2 = null;
  19. // System.out.println(str2[0]);
  20. // int len = str2.length; // NullPointerException
  21. int len = str.length; // 数组长度跟具体存储的数据多少有关,不是从0开始
  22. System.out.println(len); // 4
  23. }
  24. }
  1. /**
  2. * 二维数组
  3. */
  4. public class Array2d {
  5. public static void main(String[] args) {
  6. initArray2d();
  7. visitArray2d();
  8. traversalArray2d();
  9. }
  10. // 二维数组的初始化
  11. public static void initArray2d() {
  12. // 动态初始化
  13. // int arr[][] = new int[3][2];
  14. int arr[][] = new int[3][];
  15. arr[0] = new int[2];
  16. arr[1] = new int[2];
  17. arr[2] = new int[2];
  18. // 静态初始化
  19. int arr1[][] = new int[][]{{1, 2, 3}, {4, 5}, {6}};
  20. int[][] arr2 = {{1, 2, 3}, {4, 5}, {6}};
  21. }
  22. // 二维数组的访问及修改
  23. public static void visitArray2d() {
  24. int arr[][] = new int[][]{{1, 2, 3}, {4, 5}, {6}};
  25. // 一维 下标 0 1 2
  26. // 二维 下标 0 1 2 0 1 0
  27. System.out.println(arr[0][2]); // 3
  28. // 修改数据
  29. arr[0][2] = 7;
  30. System.out.println(Arrays.toString(arr)); // [[I@1b6d3586, [I@4554617c, [I@74a14482]
  31. System.out.println(Arrays.toString(arr[0])); // [1, 2, 7]
  32. }
  33. // 二维数组的遍历
  34. public static void traversalArray2d() {
  35. int arr[][] = new int[][]{{1, 2, 3}, {4, 5}, {6}};
  36. // 双重for循环
  37. for (int i = 0; i < arr.length; i++) {
  38. // System.out.println(arr[i]);
  39. for (int j = 0; j < arr[i].length; j++) {
  40. System.out.println(arr[i][j]);
  41. }
  42. }
  43. }
  44. }
  1. /**
  2. * 数组练习
  3. */
  4. public class ArrayTest {
  5. public static void main(String[] args) {
  6. int[] arr = new int[]{12,23,33,213,11,31,94};
  7. testMaxAndMin(arr);
  8. int sum = testSum(arr);
  9. testAverage(arr, sum);
  10. testReversal(arr);
  11. testToString(arr);
  12. testEqual(arr);
  13. testVarages(110, 119, 120);
  14. testVarages(arr);
  15. }
  16. /**
  17. * 测试:求最值
  18. * @param arr int[]
  19. */
  20. public static void testMaxAndMin(int[] arr) {
  21. // 求数组最大值
  22. int max = arr[0];
  23. for (int i = 1; i < arr.length; i++) {
  24. if(max < arr[i]){
  25. max = arr[i];
  26. }
  27. }
  28. System.out.println("max:" + max);
  29. // 求数组最小值
  30. int min = arr[0];
  31. for (int i = 1; i < arr.length; i++) {
  32. if(max > arr[i]){
  33. max = arr[i];
  34. }
  35. }
  36. System.out.println("min:" + min);
  37. }
  38. /**
  39. * 测试:求数组总和
  40. * @param arr int[]
  41. * @return
  42. */
  43. public static int testSum(int[] arr) {
  44. int sum = 0;
  45. for (int i = 0; i < arr.length; i++) {
  46. sum += arr[i];
  47. }
  48. System.out.println("总和: "+sum);
  49. return sum;
  50. }
  51. /**
  52. * 测试:求平均数
  53. * @param arr int[]
  54. * @param sum 数组总和
  55. */
  56. public static void testAverage(int[] arr, int sum) {
  57. System.out.println("平均数:"+sum/arr.length);
  58. }
  59. /**
  60. * 测试:数组的反转
  61. * @param arr int[]
  62. */
  63. public static void testReversal(int[] arr) {
  64. System.out.println("原数组:" + Arrays.toString(arr));
  65. for (int x = 0, y = arr.length-1; x<y; x++,y--) {
  66. int temp = arr[x];
  67. arr[x] = arr[y];
  68. arr[y] = temp;
  69. }
  70. System.out.println("反转后:" + Arrays.toString(arr));
  71. }
  72. /**
  73. * 测试:遍历数组元素
  74. * @param arr int[]
  75. */
  76. public static void testToString(int[] arr) {
  77. System.out.print("[");
  78. for (int i = 0; i < arr.length; i++) {
  79. System.out.print(arr[i]+" ");
  80. }
  81. System.out.print("]");
  82. System.out.println();
  83. }
  84. /**
  85. * 测试:判断是否相等
  86. * @param arr int[]
  87. */
  88. public static void testEqual(int[] arr) {
  89. int[] arr1 = arr;
  90. // 判断两个数组是否相等
  91. boolean bn = Arrays.equals(arr,arr1);
  92. System.out.println("是否相等:"+ bn);
  93. }
  94. /**
  95. * 测试:解析可变长参数列表
  96. * @param arr 可变长参数列表
  97. */
  98. public static void testVarages(int... arr) {
  99. for (int i = 0; i < arr.length; i++) {
  100. System.out.println(arr[i]);
  101. }
  102. }
  103. }
  1. /**
  2. * 数组的拷贝
  3. */
  4. public class ArrayTestCopy {
  5. public static void main(String[] args) {
  6. int[] arr = new int[]{12,23,33,213,11,31,94};
  7. testArrayCopy(arr);
  8. testArraysUtilCopy(arr);
  9. testSystemArrayCopy(arr);
  10. testClone(arr);
  11. testArray2dCopy();
  12. }
  13. /**
  14. * 浅拷贝和深拷贝区别
  15. * @param arr
  16. */
  17. public static void testArrayCopy(int[] arr) {
  18. // 浅拷贝 - 复制的是引用(引用原来的对象)
  19. int[] arr1 = null;
  20. arr1 = arr;
  21. // 深拷贝 - 复制的是数据(重新创建了一个对象)
  22. int[] arr2 = new int[arr.length];
  23. for (int i = 0; i < arr.length; i++) {
  24. arr2[i] = arr[i];
  25. }
  26. System.out.println("原数据 arr:" + arr);
  27. System.out.println("浅拷贝 arr1:" + arr1);
  28. System.out.println("深拷贝 arr2:" + arr2);
  29. // 修改浅拷贝数组,会修改原来数组数据
  30. arr1[0] = 100;
  31. System.out.println("修改浅拷贝后原数据 会改变 arr: " + Arrays.toString(arr));
  32. System.out.println("浅拷贝的数据 arr1: " + Arrays.toString(arr1));
  33. // 修改深拷贝数组,不会修改原来数组数据
  34. arr2[0] = 200;
  35. System.out.println("修改深拷贝后原数据 不会改变 arr: " + Arrays.toString(arr));
  36. System.out.println("深拷贝的数据 arr2: " + Arrays.toString(arr2));
  37. }
  38. /**
  39. * Arrays工具类拷贝方法 - 深拷贝
  40. * @param arr
  41. */
  42. public static void testArraysUtilCopy(int[] arr) {
  43. int[] arr3 = Arrays.copyOf(arr,arr.length);
  44. System.out.println(arr);
  45. System.out.println(arr3);
  46. System.out.println(Arrays.toString(arr));
  47. System.out.println(Arrays.toString(arr3));
  48. }
  49. /**
  50. * System.arraycopy(src, srcPos, dest, destPos, length);
  51. * 复制数组解析: (原数组,从原数组的起始位置,目标数组,目标数组的起始位置,要复制的数组长度)
  52. * @param arr
  53. */
  54. public static void testSystemArrayCopy(int[] arr) {
  55. int[] arr4 = new int[arr.length];
  56. System.arraycopy(arr, 0 , arr4, 0, arr.length);
  57. // int[] arr4 = new int[arr.length-1];
  58. // System.arraycopy(arr, 1 , arr4, 0, arr.length-1);
  59. System.out.println("arr4: " + Arrays.toString(arr4));
  60. System.out.println(arr4 == arr);
  61. System.out.println(Arrays.equals(arr4, arr));
  62. }
  63. /**
  64. * clone()方法拷贝
  65. * @param arr
  66. */
  67. public static void testClone(int[] arr) {
  68. int[] clone = arr.clone();
  69. System.out.println(clone == arr); // false
  70. System.out.println(clone.equals(arr)); // false
  71. System.out.println(Arrays.equals(clone, arr)); // true
  72. System.out.println(Arrays.toString(clone));
  73. }
  74. public static void testArray2dCopy() {
  75. int[][] arr = new int[][]{{1,2,3},{4,5},{6}};
  76. int[][] newArr = new int[3][];
  77. System.arraycopy(arr, 0, newArr, 0, arr.length);
  78. // 新旧二维数组的内部对象引用是指向同一个地方,所以如果修改数据,新旧数组会同时受到影响
  79. System.out.println(Arrays.toString(arr)); // [[I@1b6d3586, [I@4554617c, [I@74a14482]
  80. System.out.println(Arrays.toString(newArr)); // [[I@1b6d3586, [I@4554617c, [I@74a14482]
  81. arr[0][0] = 100;
  82. System.out.println(Arrays.toString(arr[0]));
  83. System.out.println(Arrays.toString(newArr[0]));
  84. }
  85. }

二维数组拷贝内存结构图分析

04-数组 - 图1

  1. /**
  2. * 数组常用排序方法练习
  3. */
  4. public class ArrayTestSort {
  5. public static void main(String[] args) {
  6. int[] arr = new int[]{3, 5, 8, 2, 1, 6, 9, 4, 7};
  7. testArraysSort(arr);
  8. testSelectSort(arr);
  9. testSelectSortMoreEfficient(arr);
  10. testBubbleSort(arr);
  11. new ArraySortTest().testObjectSort();
  12. }
  13. /**
  14. * 使用Arrays工具类方法,按升序排列数组
  15. * @param arr
  16. */
  17. public static void testArraysSort(int[] arr) {
  18. Arrays.sort(arr);
  19. System.out.println("ArraysSort:" + Arrays.toString(arr));
  20. }
  21. /**
  22. * 选择排序
  23. * @param arr
  24. */
  25. public static void testSelectSort(int[] arr) {
  26. for (int i = 0; i < arr.length; i++) {
  27. for (int j = i+1; j < arr.length; j++) {
  28. if (arr[j] < arr[i]) {
  29. int temp = arr[i];
  30. arr[i] = arr[j];
  31. arr[j] = temp;
  32. }
  33. }
  34. }
  35. System.out.println("SelectSort: " + Arrays.toString(arr));
  36. }
  37. /**
  38. * 效率更高的方法
  39. * @param arr
  40. */
  41. public static void testSelectSortMoreEfficient(int[] arr) {
  42. // 效率较高的排序,减少交换次数,每次比较完后只进行一次交换
  43. for (int i = 0; i < arr.length; i++) {
  44. int k = i; // 定义k变量,假设下标为k的值最小
  45. for (int j = i+1; j < arr.length; j++) {
  46. if (arr[j] < arr[k]) {
  47. k = j;
  48. }
  49. }
  50. if (k != i) {
  51. int temp = arr[i];
  52. arr[i] = arr[k];
  53. arr[k] = temp;
  54. }
  55. }
  56. // 在for循环外部定义k和temp,这样不用每次在循环时重新在栈上分配空间,只分配一次
  57. int k, temp;
  58. for (int i = 0; i < arr.length; i++) {
  59. k = i;
  60. for (int j = i+1; j < arr.length; j++) {
  61. if (arr[j] < arr[k]) {
  62. k = j;
  63. }
  64. }
  65. if (k != i) {
  66. temp = arr[i];
  67. arr[i] = arr[k];
  68. arr[k] = temp;
  69. }
  70. }
  71. System.out.println("SelectSortMoreEfficient: " + Arrays.toString(arr));
  72. }
  73. /**
  74. * 冒泡排序
  75. * @param arr
  76. */
  77. public static void testBubbleSort(int[] arr) {
  78. // 第一种思路
  79. for (int i = arr.length - 1; i >= 1; i--) {
  80. for (int j = 0; j <= i - 1; j++) {
  81. if (arr[j] > arr[j+1]) {
  82. int temp = arr[j];
  83. arr[j] = arr[j+1];
  84. arr[j+1] = temp;
  85. }
  86. }
  87. }
  88. // 另一种思路
  89. for (int i=0; i<arr.length-1; i++){
  90. for (int j = 0; j < arr.length-1-i; j++) {
  91. if (arr[j] > arr[j+1]){
  92. // int temp = arr[j];
  93. // arr[j] = arr[j+1];
  94. // arr[j+1] = temp;
  95. swap(arr, j);
  96. }
  97. }
  98. }
  99. System.out.println("BubbleSort从小到大:" + Arrays.toString(arr));
  100. // 从大到小排序
  101. for (int i=0; i<arr.length-1; i++){
  102. for (int j = 0; j < arr.length-1-i; j++) {
  103. if (arr[j] < arr[j+1]){ // 修改一下条件即可
  104. // int temp = arr[j];
  105. // arr[j] = arr[j+1];
  106. // arr[j+1] = temp;
  107. swap(arr, j);
  108. }
  109. }
  110. }
  111. System.out.println("BubbleSort从大到小:" + Arrays.toString(arr));
  112. }
  113. /**
  114. * 对象的排序
  115. */
  116. public void testObjectSort() {
  117. Person[] people = new Person[5];
  118. people[0] = new Person(160, 1000);
  119. people[1] = new Person(180, 1000);
  120. people[2] = new Person(170, 500);
  121. people[3] = new Person(180, 500);
  122. people[4] = new Person(170, 1500);
  123. for (int i = people.length - 1; i >= 1; i--) {
  124. for (int j = 0; j <= i - 1; j++) {
  125. if (people[j].compare(people[j+1]) < 0) {
  126. Person temp = people[j];
  127. people[j] = people[j+1];
  128. people[j+1] = temp;
  129. }
  130. }
  131. }
  132. System.out.println(Arrays.toString(people));
  133. for (int i = 0; i < people.length; i++) {
  134. System.out.println(people[i]);
  135. }
  136. }
  137. /**
  138. * 交换位置
  139. * @param arr
  140. * @param j
  141. */
  142. private static void swap(int[] arr, int j) {
  143. int temp = arr[j];
  144. arr[j] = arr[j+1];
  145. arr[j+1] = temp;
  146. }
  147. class Person {
  148. private int height;
  149. private double money;
  150. Person(int height, double money) {
  151. this.height = height;
  152. this.money = money;
  153. }
  154. /**
  155. * 自定义比较方法
  156. * @param person
  157. * @return 大于返回正数,小于返回负数,等于返回0
  158. */
  159. public int compare(Person person) {
  160. return height > person.height ? 1
  161. : height < person.height ? -1
  162. : money > person.money ? 1
  163. : money < person.money ? -1
  164. : 0;
  165. }
  166. @Override
  167. public String toString() {
  168. return "Person{" +
  169. "height=" + height +
  170. ", money=" + money +
  171. '}';
  172. }
  173. }
  174. }
  1. /**
  2. * 数组练习:数三减一
  3. */
  4. public class ArrayTestCount3Quit {
  5. public static void main(String[] args) {
  6. testCount3Quit();
  7. testCount3QuitObjectOriented();
  8. }
  9. /**
  10. * 数三减一:普通方法
  11. */
  12. public static void testCount3Quit() {
  13. // 初始化数组
  14. boolean[] bn = new boolean[100];
  15. for (int i = 0; i < bn.length; i++) {
  16. bn[i] = true;
  17. }
  18. int leftNum = bn.length; // 剩下的个数,剩下最后一个后停止
  19. int index = 0; // 下标标记,数完一圈后重新从0开始
  20. int countNum = 0; // 从0开始数,数到3后重新归零
  21. while (leftNum > 1) {
  22. if (bn[index] == true) {
  23. countNum++;
  24. if (countNum == 3) {
  25. bn[index] = false;
  26. countNum = 0;
  27. leftNum--;
  28. }
  29. }
  30. index++;
  31. if (index == bn.length)
  32. index = 0;
  33. }
  34. for (int i = 0; i < bn.length; i++) {
  35. if (bn[i] == true)
  36. System.out.println(i);
  37. }
  38. }
  39. /**
  40. * 数三减一:采用面向对象思想
  41. */
  42. public static void testCount3QuitObjectOriented() {
  43. KidCircle kidCircle = new KidCircle(100);
  44. // System.out.println(kidCircle.count);
  45. // for (int i = 0; i < kidCircle.count; i++) {
  46. // System.out.println(kidCircle.kids[i]);
  47. // }
  48. int countNum = 0; // 从0开始数,数到3后重新归零
  49. Kid currentKid = kidCircle.first;
  50. while (kidCircle.count > 1) {
  51. countNum++;
  52. if (countNum == 3) {
  53. kidCircle.delete(currentKid);
  54. countNum = 0;
  55. }
  56. currentKid = currentKid.right;
  57. }
  58. System.out.println(kidCircle.first);
  59. System.out.println(kidCircle.last);
  60. }
  61. }
  62. /**
  63. * 定义小朋友类
  64. */
  65. class Kid {
  66. int id;
  67. Kid left;
  68. Kid right;
  69. Kid(int id) {
  70. this.id = id;
  71. }
  72. @Override
  73. public String toString() {
  74. return "Kid{" +
  75. "id=" + id +
  76. " left_id=" + left.id +
  77. " right_id=" + right.id +
  78. '}';
  79. }
  80. }
  81. /**
  82. * 定义Kid圆圈类
  83. */
  84. class KidCircle {
  85. int count = 0; // 当前Kid圈总数
  86. Kid first; // 第一个小朋友
  87. Kid last; // 最后一个小朋友
  88. Kid[] kids;
  89. /**
  90. * 构造函数:构建小朋友手拉手圆圈
  91. * @param total
  92. */
  93. KidCircle(int total) {
  94. kids = new Kid[total];
  95. for (int i = 0; i < total; i++) {
  96. Kid kid = add(i);
  97. kids[i] = kid;
  98. }
  99. }
  100. /**
  101. * 添加小朋友方法
  102. * @param index
  103. * @return
  104. */
  105. public Kid add(int index) {
  106. index++;
  107. Kid kid = new Kid(index);
  108. if (index <= 0) {
  109. return null;
  110. } else if (index == 1) {
  111. first = kid;
  112. last = kid;
  113. kid.left = kid;
  114. kid.right = kid;
  115. } else {
  116. kid.left = last;
  117. kid.right = first;
  118. last.right = kid;
  119. first.left = kid;
  120. last = kid;
  121. }
  122. count++;
  123. return kid;
  124. }
  125. /**
  126. * 删除小朋友
  127. * @param kid
  128. */
  129. public void delete(Kid kid) {
  130. if (count <= 0) {
  131. return;
  132. } else if (count == 1) {
  133. first = last = null;
  134. } else {
  135. kid.left.right = kid.right;
  136. kid.right.left = kid.left;
  137. if (kid == first) {
  138. first = kid.right;
  139. }
  140. if (kid == last) {
  141. last = kid.left;
  142. }
  143. }
  144. count--;
  145. }
  146. @Override
  147. public String toString() {
  148. return "KidCircle{" +
  149. "count=" + count +
  150. ", first=" + first +
  151. ", last=" + last +
  152. '}';
  153. }
  154. }