面试知识点整理

计算机网络

1.TCP为何连接3次,挥手4次

 

2.为什么IP协议不保证可靠?

 


linux

1.linux查看某个端口是否被占用
常见参数
-a或--all:显示所有选项,默认不显示LISTEN相关
-t或--tcp:仅显示tcp相关选项
-u或--udp:仅显示udp相关选项
-n或--numeric:直接使用ip地址,而不通过域名服务器(拒绝显示别名,能显示数字的全部转化成数字)
-l或--listening:仅列出有在 Listen (监听) 的服務状态
-p或--programs:显示建立相关链接的程序名
-r或--route:显示路由信息,路由表
-e或--extend:显示扩展信息,例如uid等
-s或--statistice:显示网络工作信息统计表(按各个协议进行统计)
-c或--continuous:每隔一个固定时间,执行该netstat命令。
提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到

 

2.du -h, df -h查看磁盘使用情况;ps查看进程的使用情况

 

 

 


 Mysql

1.mysql千万级大表的优化:https://www.zhihu.com/question/19719997/answer/549041957

 

2.sql语句的关键字的顺序

where  group by  having  order by  limit 。

 


Redis

1.redis的集群机制:https://blog.csdn.net/miss1181248983/article/details/90056960

 

 

 


Java基础

1.Java创建对象过程详解

https://baijiahao.baidu.com/s?id=1637836912223474691&wfr=spider&for=pc

 

2.异常的理解

https://blog.csdn.net/sugar_no1/article/details/88593255

运行时异常也可以被捕获,但是不推荐

 

3.接口中的属性、方法的默认修饰符

https://blog.csdn.net/qq_33271461/article/details/84988858

  • 属性:public static final
  • 方法:public abstract

 

4.注解的理解

https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html

 

 

 

5.String被声明成不可变的原因?

https://www.cnblogs.com/wkfvawl/p/11693260.html

  1. 缓存Hash值
    因为 String hash 值经常被使用,例如 String 用做 HashMap key。不可变的特性可以使得 hash 值也不可变,因此只需要进行一次计算。
  1. 常量池的需要,一旦一个字符串常量被创建了,那么后续的该字符串都会引用常量池中的对象,而不会新建。只有 String 是不可变的,才可能使用String Pool。
  1. 线程安全
    1. 在并发场景下,多个线程同时读一个资源,是安全的,不会引发竞争,但对资源进行写操作时是不安全的,不可变对象不能被写,所以保证了多线程的安全
  2. 网络连接参数安全性
    1. 在网络连接和数据库连接中字符串常常作为参数,例如,网络连接地址URL,文件路径path,反射机制所需要的String参数。其不可变性可以保证连接的安全性。如果字符串是可变的,黑客就有可能改变字符串指向对象的值,那么会引起很严重的安全问题。

 

6. 枚举为什么能保证单例?你还知道哪些单例模式?咱们写一写?

 

7.访问控制修饰符

 

8.动态代理和静态代理的区别?

https://blog.csdn.net/zpf336/article/details/82751925

 

 


 

JVM

1.方法区与永久代的区别?

https://www.jianshu.com/p/66e4e64ff278

方法区和永久代的关系很像Java中接口和类的关系,类实现了接口,而永久代就是HotSpot虚拟机对虚拟机规范中方法区的一种实现方式。

元空间也是方法区的一种实现方式,将方法区的内存与堆内存分开了,不会影响gc的过程,因为方法区的内存的大小总是不定的。

 

 


并发

1.线程之间怎么传递数据?

  • 1) SynchronousQueue 同步队列
  • 2) Exchanger 工具类实现线程间的数据交换

 

2.线程池,如何设置参数,用到什么队列,shutdown,excute和submit区别;
https://www.cnblogs.com/gaopengpy/p/12148971.html
  • 核心线程数、最大线程数、组赛队列、抛弃策略
  • shutdown,停止接受线程,但是还会继续消费队列里的线程
    • stop停止接收线程,并且尝试停止所有的正在运行的线程
    • 1)execute和submit都属于线程池的方法,execute只能提交Runnable类型的任务,而submit既能提交Runnable类型任务也能提交Callable类型任务。
    • 2)execute会直接抛出任务执行时的异常,submit会吃掉异常,可通过Future的get方法将任务执行时的异常重新抛出。

线程池参数设置的具体考量:https://www.cnblogs.com/superming/p/12887552.html

 

 3.线程调度和进程调度

https://www.cnblogs.com/HuiH/p/11918006.html

线程同步,进程同步

 

 

4.阻塞队列是如何阻塞的?

https://www.cnblogs.com/it-science/p/5721104.html

[]为什么ArrayBlockingQueue只使用了一把锁?https://www.zhihu.com/question/41941103【因为底层是数组,读写效率高,不需要像链表那样使用两把锁分别读写,否则可能加锁解锁的开销、以及代码复杂度会过高】
  • LinkedBlockingQueue添加元素时有一个构造节点的时间,为了尽量减少这部分时间占比,使用一个读锁一个写锁可以实现并发存取的优化。而ArrayBlockingQueue在添加元素时不需要开辟空间等等(创建时指定数组大小),所以反而是加锁解锁时间占比较大,如果继续使用这种读写锁分离的设计,增加的时间损耗大于并发读写带来的收益。

 

 

 

 


智力题

1.100层楼扔鸡蛋,找出鸡蛋碎掉的临界楼层,最少需要多少次?

https://www.seotest.cn/jishu/27971.html

 


SSM

1.spring的事务失效场景

https://blog.csdn.net/m0_37701381/article/details/85066711

  • 1)事务方法的嵌套调用:在一个Service类的内部,事务方法之间的嵌套调用,普通方法和事务方法之间的嵌套调用,都不会开启新的事务.是因为spring采用动态代理机制来实现事务控制,而动态代理最终都是要调用原始对象的,而原始对象在去调用方法时,是不会再触发代理了!
    • 只有来自外部的方法调用才会呗AOP代理捕捉,类内部方法调用类内部的其他方法,子方法并会不引起事务行为,即使被调用的方法上使用有@Transactional注解。
  • 2)@Transactional注解应该只被应用到public方法上,不要用在protected、private等方法上,即使用了也将被忽略,不起作用。这是由Spring AOP决定的。
  • 3) 主方法名上有@Transactional注解,方法体内不能用try catch;如果用try catch,则catch中必须用throw new Exception();
    • 不抛出异常的话,spring的事务是无法回滚的

 

 

 

posted @ 2020-09-02 00:21  king断雨  阅读(173)  评论(0)    收藏  举报