arrays.sort() 对基本类型和引用类型采用不同算法且仅默认升序;int[]不支持comparator,需转integer[]或手动翻转;自定义对象须实现comparable或传comparator;多维数组只按首元素排序;binarysearch()前必须先sort;tostring()不展开嵌套,deeptostring()会递归但忌循环引用;aslist()返回不可变视图,基本类型数组会整体作为单元素。

Arrays.sort() 为什么有时不生效
因为 Arrays.sort() 对基本类型数组和引用类型数组的实现逻辑不同,且默认只支持升序。如果你传入的是 int[],它用双轴快排;但传 Integer[] 就走 TimSort,还能配合 Comparator。常见错误是误以为对 int[] 能直接传 Comparator——会编译报错:The method sort(int[]) in the type Arrays is not applicable for the arguments (int[], Comparator)。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 要降序排序
int[],先用Arrays.sort(arr)升序,再手写翻转,或转成Integer[]再用Comparator.reverseOrder() - 对自定义对象数组排序,必须确保类实现
Comparable,或显式传Comparator,否则运行时抛ClassCastException - 多维数组(如
int[][])调用sort()只按首元素排序,不会递归进子数组
Arrays.binarySearch() 必须先排序
Arrays.binarySearch() 不检查输入是否已排序,直接按二分逻辑找,结果不可信。没排序就搜,返回值可能是负数,但这个负数不是“不存在”的可靠标识——它只是插入点的取反减一,前提是原数组单调。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 永远在调用
binarySearch()前确认已执行Arrays.sort(),尤其注意多线程环境下可能被其他线程改写 - 搜索浮点数组要小心精度问题,
double类型建议用Double.compare()自定义比较器,避免==判等失效 - 返回值 ≥0 表示找到索引;
~index(按位取反)才是应插入位置,别直接用负值做判断逻辑
Arrays.toString() 和 Arrays.deepToString() 的区别在哪
Arrays.toString() 遇到嵌套数组(比如 String[][])只会打印子数组的哈希值,例如 [[Ljava.lang.String;@1b6d3586, [Ljava.lang.String;@4554617c];而 Arrays.deepToString() 会递归展开每一层。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 调试时打印二维数组,无条件用
Arrays.deepToString(arr),否则你会以为数据丢了 -
deepToString()对含循环引用的结构(如 A 引用 B、B 又引用 A)会栈溢出,生产环境日志中慎用 - 如果只要看某一层,比如只展开第一维,自己写个简单循环 +
Arrays.toString()更可控
Arrays.asList() 返回的 List 不能增删
Arrays.asList() 返回的是 Arrays.ArrayList(非 java.util.ArrayList),它是基于原数组的固定长度视图。调用 add() 或 remove() 会抛 UnsupportedOperationException。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 需要可变集合时,立刻包装:
new ArrayList(Arrays.asList(arr)) - 对基本类型数组(如
int[])调用asList(),结果是包含单个元素的列表(即整个数组当一个对象),不是你想要的元素列表——这是新手最常踩的坑 - 若只是临时查值、遍历,用
asList()没问题,它比新建ArrayList节省内存,也避免拷贝开销
真正容易被忽略的是:所有这些方法都依赖数组引用本身,而不是副本。传进去的数组如果后续被其他代码修改,asList() 返回的 List、binarySearch() 的结果、甚至 toString() 的输出都可能悄然变化——这不是 bug,是设计使然。








