谈谈最近做题心得

Java为什么直接打印输出集合不是哈希值而是直接输出值

Collection—AbstractCollection–AbstractList–ArrayList

在翻阅了源码之后发现ArrayList的父类AbstractList的父类AbstractCollection里面有实现toString()方法,所以打印出来的是内容不是堆栈地址。

Object类的toString()方法中,返回的是 getClass().getName() + "@" + Integer.toHexString(hashCode())也就是地址值,打印ArrayList对象没有输出地址值,便可知道ArrayList重写了toString()方法。

Java如何打印数组

数组和集合并不同,如果直接System.out.println()打印输出数组,则会显示地址值,而并不会输出内容。

  1. 使用Arrays.toString()将数组转成String再打印输出
  2. 使用Arrays.deepToString()可以把二维数组直接打印输出

Comparator的个人简单理解(升序降序)与使用

Java实现Comparator排序是升序,即自然排序,根据参数,返回值来判断是否交换。

jdk官方的升序基于:

1
2
3
< return -1
> return 1
= return 0

把-1理解为false,1理解为true(实际上底层源码并不是这样,实现原理参考dalao的博客,只是为了方便记忆使用)
如果要升序:那么a<b就是想要的顺序,所以return -1 ,false,不交换
如果要降序:那么a<b就是不想要的顺序,所以return 1,true,要交换
简而言之,返回1的时候进行位置交换

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
注意!这边不用Collections.sort也行,可以使用LinkedList继承自List的sort方法,即list.sort()
*/
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if(o1>o2) return 1;
else if(o1<o2) return -1;
else return 0;
}
}
);
//使用lambda表达式进一步简化
//lambda+compareTo()/compare()
list.sort((a,b) ->{
return a.compareTo(b);
});
list.sort((a,b)->{
return Integer.compare(a,b);
});

以上就是最近的感悟了,算法还得继续刷,数据结构还不够熟悉。