1 在Java中,使用 int a = ls.get(l); int b = ls.get(r); if (a != b) { return false; }
和 if (ls.get(l) != ls.get(r)) { return false; }
的结果可能不同,特别是在处理 Integer
对象时。这主要是由于Java的自动装箱和拆箱机制以及Integer
对象的比较方式引起的。
自动装箱与拆箱
- 自动装箱(Autoboxing):这是指Java自动地将基本数据类型转换为对应的包装类对象。例如,
int
转换为Integer
。 - 自动拆箱(Unboxing):这是指Java自动地将包装类对象转换为对应的基本数据类型。例如,
Integer
转换为int
。
比较运算符 !=
- 当你使用
!=
比较两个Integer
对象时,实际上是比较它们的引用地址,而不是它们的值。 - 而当你将
Integer
对象拆箱为int
后再比较时,比较的是它们的实际数值。
问题的具体解释
方法一:使用中间变量
int a = ls.get(l); int b = ls.get(r); if (a != b) { return false; }
在这种写法中,ls.get(l)
和 ls.get(r)
会被自动拆箱为 int
,然后比较它们的数值。如果它们的数值相等,即使它们的 Integer
对象引用不同,结果也是相等的。
方法二:直接比较
if (ls.get(l) != ls.get(r)) { return false; }
在这种写法中,ls.get(l)
和 ls.get(r)
返回的是 Integer
对象。使用 !=
比较的是两个 Integer
对象的引用地址,而不是数值。因此,如果 ls.get(l)
和 ls.get(r)
是不同的 Integer
对象,即使它们的值相等,!=
也会返回 true
,因为它们的引用地址不同。
2 数组和集合的排序
1)Arrays.sort
是一个静态方法,用于对数组进行排序。它可以对基本数据类型数组和对象数组进行排序。
自定义排序算法:
public static ArrayList<Integer> findAllPerson(int n, int[][] meetings, int firstPerson) {
// 按照接触时间从小到大排序
Arrays.sort(meetings, (o1, o2) -> Integer.compare(o1[2], o2[2]));
HashSet<Integer> set = new HashSet<>();
set.add(0); // 最初的人
set.add(firstPerson);
for (int i = 0; i < meetings.length; i++) {
int person1 = meetings[i][0];
int person2 = meetings[i][1];
if (set.contains(person1) || set.contains(person2)) {
set.add(person1);
set.add(person2);
}
}
ArrayList<Integer> res = new ArrayList<>(set);
Collections.sort(res);
return res;
}
2)Collections.sort
是一个静态方法,用于对集合进行排序。它通常用于排序实现了List
接口的集合。
自定义排序:
Collections.sort(intervals,new Comparator<Interval>(){
public int compare(Interval o1,Interval o2){
if(o1.start==o2.start)
return Integer.compare(o1.end,o2.end);
return Integer.compare(o1.start,o2.start);
}
});
//或者
public class IntervalComparator implements Comparator<Interval> {
@Override
public int compare(Interval o1, Interval o2) {
if (o1.start == o2.start) {
return Integer.compare(o1.end, o2.end);
}
return Integer.compare(o1.start, o2.start);
}
}
Collections.sort(intervals, new IntervalComparator());