背景
前两天一个朋友面试,遇到了一个题目
1 | import java.util.LinkedList; |
前两天一个朋友面试,遇到了一个题目
1 | import java.util.LinkedList; |
1 | private static final int tableSizeFor(int c) { |
该算法相当奇妙,目的是输入一个数字c,然后返回离它最近的且值大于它的2的n次幂,例如输入7,返回8,输入123,返回128。
首先定义一个变量n为c-1,至于为什么为c-1,之后会说到。
我们输入c=13来带入计算一下
1 | 1. n = c-1 //此时n = 12,二进制为1100 |
这里我们可以回头看上面的第一步,n = c-1,如果不执行c-1的话,我们加入c为16,那么二进制就是10000,经过一番操作之后,会得到最后的n为11111,然后加一就会变成100000,也就是32,而理论结果应该是16。
对于一个传进来的非0数字,从第一个1开始,右移一位,然后或运算,相当于第一位和第二位都变成了1,然后右移两位,变成了第一二三四位都变成了1,依次类推,一直右移1+2+4+8+16位,也就是最大右移了31位,最终再加一,就是2的32位
Spring中的事务,主要有以下几个参数
之前使用的nginx伪装流量,后来发现是有问题的,很快就被封了。
之前的思路是,机器保留443端口,然后使用ssr去链接跳板机的443端口,如果是ssr协议,就转发到本地的ssr服务,如果是http请求,就返回对应的页面。
这么做存在一个漏洞,所有经过443端口的流量都会被探测到,如果检测到ssr的特征,就会直接导致机器的端口被封,连不上。而443和80又是被检测的高风险端口
java中提供的线程池基本都是继承自ExecutorService,可以通过Executors来创建线程池。
java中提供了以下几种线程池,
固定容量的线程池,除非某个线程被显式关闭,否则线程会一直存活。在执行任务的时候,如果线程池的线程都已经在工作状态了,新来的任务就会被加入等待队列,直到线程池中有线程执行完,或者出现异常被终止等情况,新的任务就会占据这个线程开始执行。
该线程池不能传入线程池大小,默认设定代销为Integer的MAX_VALUE。每个执行完的线程,会保留60s,如果60s内有新任务进来,则重复利用该线程去跑,如果超过60s,没被利用,则线程就会被销毁。如果长时间没有新任务进来,该线程池不消耗任何资源
只有一个线程的线程池,在线程挂了之后,会起一个新的线程来替代
可以定期执行线程,或者是延迟一定时间后,执行