Java学习笔记

集合中List类型遍历最高效的方法依然是使用迭代Iterator

import java.util.*;

public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Start");
list.add("End");
System.out.println(list.size());
// *使用for循环迭代遍历
for (Iterator<String> it = list.iterator(); it.hasNext();) {
String s = it.next();
System.out.println(s);
}
// *使用for each循环迭代遍历
for (String s : list) {
System.out.println(s);
}
}
}

List转换为Array有三种方法

toArray():返回一个object[]数组

import java.util.*;

public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Start");
list.add("mid");
list.add("End");
System.out.println(list.size());
Object[] array = list.toArray();
for (Object s : array) {
System.out.println(s);
}
}
}

//这样会丢失掉类型的信息,通常不会使用

第二种方式是给toArray(T[])传入一个类型相同的ArrayList内部自动把元素复制到传入的Array中:

public class Main {
public static void main(String[] args) {
List<Integer> list = List.of(12, 34, 56);
Integer[] array = list.toArray(new Integer[list.size()]);
for (Integer n : array) {
System.out.println(n);
}
}
}

练习题的解:

import java.util.*;

public class Main {
public static void main(String[] args) {
// 构造从start到end的序列:
final int start = 10;
final int end = 20;
List<Integer> list = new ArrayList<>();
for (int i = start; i <= end; i++) {
list.add(i);
}
// 洗牌算法shuffle可以随机交换List中的元素位置:
Collections.shuffle(list);
// 随机删除List中的一个元素:
int removed = list.remove((int) (Math.random() * list.size()));
int found = findMissingNumber(start, end, list);
System.out.println(list.toString());
System.out.println("missing number: " + found);
System.out.println(removed == found ? "测试成功" : "测试失败");
}

static int findMissingNumber(int start, int end, List<Integer> list) {
Integer[] array = list.toArray(new Integer[list.size()]);
for (int i = 0; i < list.size() - 1; i++) {
for (int j = 0; j < i; j++) {
int temp;
if (array[j] < array[j + 1]) {
temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
}
}
}
for (int i = start; i <= end; i++) {
if (i != array[i - start]) {
return i;
}
}
return 0;
}
}

使用’contains’可以相当简洁:

static int findMissingNumber(int start, int end, List<Integer> list) {
for (int i = start; i <= end; i++) {
if (!list.contains(i)) {
return i;
}
}
return 0;
}

如何正确编写equals()方法?equals()方法要求我们必须满足以下条件:

  • 自反性(Reflexive):对于非nullx来说,x.equals(x)必须返回true
  • 对称性(Symmetric):对于非nullxy来说,如果x.equals(y)true,则y.equals(x)也必须为true
  • 传递性(Transitive):对于非nullxyz来说,如果x.equals(y)truey.equals(z)也为true,那么x.equals(z)也必须为true
  • 一致性(Consistent):对于非nullxy来说,只要xy状态不变,则x.equals(y)总是一致地返回true或者false
  • null的比较:即x.equals(null)永远返回false