今天又去面试了,做了一些笔试题,淦!
1、分析以下代码,写出结果和并说明原因
public class App
{
public static void main( String[] args )
{
Long a = new Long(3);
Long b = 3L;
int c = 3;
System.out.println(a == b); // false
System.out.println(b == c); //true
}
}
解释说明
==
符号判断的内存地址所对应的值得相等性,具体来说,基本类型判断值是否相等,引用类型判断其指向的地址是否相等!
Long a = new Long(3); a 是个引用地址值;
而 Long b = 3L
, 其实相当于Long b = Long.valueOf(3L);
直接指向栈地址;
为什么 System.out.println(b == c); //true
因为具体类型比较是判断值是否相等的。
额外扩展
Long g = 127L;
Long h = 127L;
System.out.println(g == h);//true
Long i = 128L;
Long j = 128L;
System.out.println(i == j);//false
看 Long
类中的valueOf()
方法的源代码才能找到缘由:
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // 判断实参是否在可缓存范围内,默认为[-128, 127]
return LongCache.cache[(int)l + offset];// 如果在,则取出初始化的 Long 对象
}
return new Long(l);如果不在,则创建一个新的 Long 对象
}
2、对以下代码写结果并分析原因
public class App
{
public static void main( String[] args )
{
String a = null;
String b = "null";
System.out.println(a.equals(b));//java.lang.NullPointerException
}
}
而
System.out.println(b.equals(a));// false
解释说明
0、 NullPointerException 由 RuntimeException 派生出来,是一个运行级别的异常。运行的时候会报错,使得业务逻辑中断。
1、 空指针异常发生在对象为空,但是引用这个对象的方法。例如: String a = null;
//对象 a 为空(null) a.equals();
//发生空指针异常
1、 null 是 Java 中的关键字 , 是任何引用类型的默认值 。
2、 null 既不是对象也不是一种类型,它仅是一种特殊的值,,没有实值内容,也没分配内存 ,所以生命一个变量时最好给它分配好内存空间,给予赋值。
3、 可以使用 ==或者 != 操作来比较 null 值,但是不能使用其他算法或者逻辑操作,例如 > 或 < 。
4、 如果一个初值可能为空的对象实例,调用equals方法时,一定要遵循 “常量”.equals(变量)
5、或者推荐使用 Objects.equals(obj1, obj2)
方法避免空指针
3、写出以下代码的结果,并分析原因
public class App
{
public static void main( String[] args )
{
List list = new ArrayList<>();
for (int i = 0 ; i < 10; i ++){
list.add(i);
}
list.stream().filter(i -> i>6).forEach(System.out::println);
System.out.println("---------------------------------");
list.stream().filter(i -> (i > 6)).findAny().get().toString();
System.out.println(list);
}
}
结果打印
7
8
9
---------------------------------
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
解释说明
考察 Java 8 新特性 Stream 的 filter
和 findAny()
以及 Lambda 表达式
下面是Java lambda表达式的简单例子:
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
filter
过滤
findAny()
方法允许您从Stream中查找任何元素。 在寻找元素时使用时不会关注元素顺序。
回到代码 list.stream().filter(i -> (i > 6)).findAny().get().toString();
按理来说应该是 7 、 8、9,但实际上所有结果都出来了。
(未完待续)
4、设计一个用户表,里面又 用户id 、用户账号、用户密码以及剩下的 20 多个字段,预计未来用户量是千万级别的,有什么建议?
(未完待续)
5、一个网站有用户充值,要取排行榜 Top10,而且每天 0 点更新,有什么建议?
6、如何快速定位排查线上的故障?
思路:
看有没有做链路监控?
单体应用还是微服务化?
一般有线程监控,找到CPU占用高的线程,然后分析其执行的代码段?
阿里有 Arthas 可以借助分析哪个方法执行耗时长
参考文献:
https://colobu.com/2016/03/02/Java-Stream/#find
https://www.jianshu.com/p/7d4ba86ff885
https://blog.csdn.net/tolcf/article/details/41832733
https://blog.csdn.net/xialei199023/article/details/63251295