1.面试官:从源码分析一下TreeSet(基于jdk1.8)
2.java代码实现将100分拆成四个整数之和,一共有多少种拆法?
面试官:从源码分析一下TreeSet(基于jdk1.8)
面试官可能会询问关于TreeSet(基于JDK1.8)的源码分析,实际上,TreeSet与HashSet类似,都利用了TreeMap底层的红黑树结构。主要特性包括:
1. TreeSet是百搜源码基于TreeMap的NavigableSet实现,元素存储在TreeMap的奇迹 main 源码key中,value为一个常量对象。
2. 不是直接基于TreeMap,而是NavigableMap,因为TreeMap本身就实现了这个接口。
3. 对于内存节省的疑问,TreeSet在add方法中使用PRESENT对象避免了将null作为value可能导致的逻辑冲突。添加重复元素时,frp源码编译PRESENT确保了插入状态的区分。
4. 构造函数提供了多样化的选项,允许自定义比较器和排序器,基本继承自HashSet的alde源码大全特性。
5. 除了基本的增删操作,TreeSet还提供了如返回子集、头部尾部元素、区间查找等方法。劫持补丁源码
总结来说,TreeSet在排序上优于HashSet,但插入和查找操作由于树的结构会更复杂,不适用于对速度有极高要求的场景。如果不需要排序,HashSet是更好的选择。
感谢您的关注,关于TreeSet的源码解析就介绍到这里。
java代码实现将分拆成四个整数之和,一共有多少种拆法?
如果没有负整数,一共有 种拆法。
源码:
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;
public class Main {
public final static int Sum = ;
static Set<String> Combinations = new TreeSet<>();
public static void main(String[] args) throws IOException {
for (int i1 = 0; i1 <= Sum; i1++) {
for (int i2 = 0; i2 <= Sum; i2++) {
for (int i3 = 0; i3 <= Sum; i3++) {
for (int i4 = 0; i4 <= Sum; i4++) {
String s = GetString(new int[] { i1, i2, i3, i4});
if (CheckNumbers(i1, i2, i3, i4)) {
Combinations.add(s);
}
}
}
}
}
System.out.println(Combinations);
System.out.println(Combinations.size());
FileWriter writer = new FileWriter("results.json");
writer.write(Combinations.toString());
writer.flush();
writer.close();
}
public static String GetString(int[] numbers) {
sort(numbers, 0, 3);
return Arrays.toString(numbers);
}
public static void sort(int[] arr,int begin,int end) {
int a = begin;
int b = end;
if (a >= b) return;
int x = arr[a];
while (a < b) {
while (a < b && arr[b] >= x) b--;
if (a < b) {
arr[a] = arr[b];
a++;
}
while (a < b && arr[a] <= x) a++;
if (a < b) {
arr[b] = arr[a];
b--;
}
}
arr[a] = x;
sort(arr,begin,a-1);
sort(arr,a+1,end);
}
public static boolean CheckNumbers(int i1, int i2, int i3, int i4) {
return (i1 + i2 + i3 + i4) == Sum;
}
}