面试随笔

2017年05月08日

考虑一下代码的输出结果

    Number n1 = 1L;
    Number n2 = 1;
    System.out.println(n1==n2);

原因:通过将n1和n2的class打印出来,你会发现 n1是被包装为了 java.lang.Long,n2被包装为了 java.lang.Integer, 所以它俩并不相等。

两个不同的jar包中含有相同全限定名的class文件时,能否编译通过?程序能否正常执行?

强一致性,弱一致性,最终一致性

  • 强一致性:系统中的某个数据被成功更新后,后续任何对该数据的读取操作都将得到更新后的值;

  • 弱一致性:系统中的某个数据被更新后,后续对该数据的读取操作可能得到更新后的值,也可能是更改前的值。但经过“不一致时间窗口”这段时间后,后续对该数据的读取都是更新后的值;

  • 最终一致性:是弱一致性的特殊形式,存储系统保证在没有新的更新的条件下,最终所有的访问都是最后更新的值。

ConcurrentHashMap 是弱一致性的 参考, 而且 ConcurrentHashMap 在迭代时如果数据被修改,也不会抛出异常(其他集合则会抛出ConcurrentModificationException)

考虑以下代码的输出结果:

        @Test
        public void concurrentHashMapTest() {
            Map<String, Integer> map = new ConcurrentHashMap<>();
            map.put("key1",1);
            map.put("key2",2);
            map.put("key3",3);

            for (Map.Entry<String, Integer> en : map.entrySet()) {
                map.remove("key2");
                System.out.println(en.getKey());
            }
        }

设计一个函数 f(),每次调用时,返回最近5min内的调用次数

log文件中有格式如下,shell命令获取前10的

方法中获得当前方法的名称

Thread.currentThread() .getStackTrace() 可以获取到整个线程执行的执行链调用信息。

Thread.currentThread() .getStackTrace() 方法返回的信息中,第一个信息是对 getStackTrace() 这个方法的调用信息,所以如果要获取当前执行的main()方法的方法名,则是getStackTrace()返回信息中的第二个元素,即下标为1的元素信息。

        public static void main(String[] args) {
              // 获得当前类名
              String clazz = Thread.currentThread() .getStackTrace()[1].getClassName();
              // 获得当前方法名
              String method = Thread.currentThread() .getStackTrace()[1].getMethodName();
              System.out.println(method);
          }

Integer.MAX_VALUE+1 是多少

(1«31)-1 = Integer.MAX_VALUE

Integer.MAX_VALUE+1 相当于 最高位变为了1, 其余位全是0,由于最高位是符号位,这样算的话,也就是 -0,但是在计算机里面,-0 和 0 重复了,所以用 -0 来表示负数的最小值,所以 Integer.MAX_VALUE+1 = Integer.MIN_VALUE,这也就是为什么 负数的范围比正数范围多一个的原因。同理 (byte)(Byte.MAX_VALUE+1) = Byte.MIN_VALUE

rabbitmq是推模式还是拉模式

默认是推模式,也可选择使用拉模式

项目中遇到的问题

  • CPU 100% 问题排查
  • 偶发性 频繁FGC 问题排查
  • 数据reshard追数据问题

short s1 = 1; s1 = s1 +1;有错吗?short s1 = 1; s1 += 1;有错吗?

答:short s1 = 1; s1 = s1 + 1是错的,s1 + 1在运算过程中1是int类型,s1是short类型,向高的转,结果为int类型,所以这里需要强转,而 s1 += 1是正确的,因为jvm自动帮我们处理好了

面试问题

https://juejin.im/post/5c813c185188250f03184e1d#heading-4