以下的内容比较杂,后面抽时间整理一下进行分类
1.java中public,private,protected和default的区别
修饰符 | 同一个类 | 同一个包 | 不同包的子类 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
priavte:本类可见
public:所有类可见
protected:本包和所有子类都可见(本包中的子类非子类均可访问,不同包中的子类可以访问,不是子类不能访问)
default:本包可见(即默认的形式)(本包中的子类非子类均可访问,不同包中的类及子类均不能访问)
2. 什么是内存泄漏?一般如何排查内存泄漏?
作者:McAce链接:https://www.zhihu.com/question/40560123/answer/512873873来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 内存泄露本意是申请的内存空间没有被正确释放,导致后续程序里这块内存被永远占用(不可达),而且指向这块内存空间的指针不再存在时,这块内存也就永远不可达了,内存空间就这么一点点被蚕食,借用别人的比喻就是:比如有10张纸,本来一人一张,画完自己擦了还回去,别人可以继续画,现在有个坏蛋要了纸不擦不还,然后还跑了找不到人了,如此就只剩下9张纸给别人用了,这样的人多起来后,最后大家一张纸都没有了。内存溢出是指存储的数据超出了指定空间的大小,这时数据就会越界,举例来说,常见的溢出,是指在栈空间里,分配了超过数组长度的数据,导致多出来的数据覆盖了栈空间其他位置的数据,这种情况发生时,可能会导致程序出现各种难排查的异常行为,或是被有心人利用,修改特定位置的变量数据达到溢出攻击的目的。而Java中的内存溢出,一般指【OOM:发生位置】这种Error,它更像是一种内存空间不足时发生的错误,并且也不会导致溢出攻击这种问题,举例来说,堆里能存10个数,分了11个数进去,堆就溢出了1个数,JVM会检测、避免、报告这种问题,所以虽然实际上JVM规避了内存溢出带来的问题,但在概念上来说,它确实是溢出才导致的,只是Java程序员在看到这个问题时,脑袋里的反应会是“内存不够了,咋回事,是不是又是哪个大对象没释放”之类,而不是像C程序员“我X被攻击了/程序咋写的搞溢出了”(这段是我臆想的)。同时对于Java来说,传统意义的溢出攻击也无法奏效,因为Java的数组会检查下标,对超出数组下标的赋值会报ArrayOutOfIndex错误。
内存泄漏的定位与分析:https://blog.csdn.net/lc0817/article/details/67014499
3. NIO是什么,适用于什么场景?
这个后面有时间要深入了解一下阻塞IO和非阻塞IO
4. http 3次握手,4次挥手
参考:https://www.cnblogs.com/jainszhang/p/10641728.html
5. nginx 的负载均衡策略
- 轮询(默认方式)
- 权重
- ip_hash,根据ip的哈希结果进行转发,确保相同的ip访问同一台机器
- lest_conn,选取最少连接的机器转发
- 第三方(1),根据响应时间,时间最短的机器优先
- 第三方(2),url_hash,根据url的哈希结果分发,某个url固定发到某台机器
6.接口和抽象类的区别
1、接口的方法默认是public,所有接口方法不能有实现 (java8开始可以有默认实现),抽象类可以有非抽象的方法;
2、接口除了static、final变量,不能有其他变量;抽象类可以有其他变量
3、一个类可以实现多个接口,只能实现一个抽象类,接口可以通过extends关键字扩展多个接口;
4、接口的默认修饰符是public,抽象类可以有public、protected、default等修饰符(抽象方法为了能被重写不能用private修饰符) 5、从设计层面,抽象类是对类的抽象,是一种模板设计;接口是对行为的抽象,是一种行为规范。
jdk8开始,接口也可以定义静态方法和默认方法,可以直接用接口名称调用,实现类和实现是不可以调用的。jdk9接口可以允许定义为私有方法
7. hashCode() 和 equals();为什么重写equals()必须重写hashCode()?
1、如果两个对象相等,则hashCode一定是相等的;
2、如果两个对象相等,调用equals返回的一定是true;
3、如果两个对象有相同的hashCode值,不一定是相等的;
4、重写hashCode()必须同时重写equals()方法;
5、hashCode()的默认行为是对堆上的对象产生独特值,如果没有重写hashCode(),则两个对象无论如何都不会相等,即使两个对象指向同样的数据;
https://www.cnblogs.com/skywang12345/p/3324958.html为什么java中只有值传递https://juejin.im/post/6844904045426016263
8.关于final关键字
主要用来修饰变量、方法、类。
1、当用来修饰变量时,如果是基本数据类型的变量,一旦初始化后就不能进行更改;如果是引用类型的变量,初始化后就不能再指向另一个对象;
2、当用来修饰方法时,
(1)表示将该方法锁定,以防任何继承类对它进行修改;
(2)效率原因;类中的所有private方法都隐式的指向final
3、当用来修饰类时,表示这个类无法被继承。final类中的所有方法都会被隐式的指定为final方法。
9.final,static,this,super 关键字总结
参考:https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/basic/final,static,this,super.md
10.TCP、UDP协议的区别
(1)UDP在传送数据前不需要建立连接,远程主机在收到UDP报文后,不需要给出任何确认。虽然UDP不提供可靠交付,在某种情况下是一直最有效的工作方式。一般用于即时通讯。
(2)TCP提供面向连接的服务,在传送数据前必须建立连接,数据结束后释放连接。
类型|是否面向连接|传输可靠性|传输形式|传输效率|所需资源|应用场景|首部字节 :-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-: TCP|面向连接|可靠|字节流|慢|多|要求数据通信可靠|20-60个字节 UDP|无连接|不可靠|数据报文|快|少|要求通信速度快|8个字节
11.面向对象的五大基本原则
- 单一职责原则(SPR)
- 开放封闭原则(OCP)
- 里氏替换原则(LSP)
- 依赖倒置原则(DIP)
- 接口隔离原则(ISP)
12.Servlet的生命周期
- 加载:容器通过类加载器使用Servlet类对应的文件来加载Servlet
- 创建:通过调用Servlet的构造函数来创建一个Servlet实例
- 初始化:通过调用Servlet的init()方法来完成初始化工作,这个方法是在Servlet已经被创建,但在向客户端提供服务之前调用。
- 处理客户请求:Servlet创建后就可以处理请求,当有新的客户端请求时,Web容器都会创建一个新的线程来处理该请求。接着调用Servlet的 Service()方法来响应客户端请求(Service方法根据请求的method属性来调用doGet()和doPost())
- 卸载:容器在卸载Servlet之前需要调用destroy()方法,让Servlet释放其占用的资源。
1、加载:容器通过类加载器使用Servlet类对应的文件夹来加载Servlet
2、创建:通过调用Servlet的构造函数来创建一个Servlet实例
3、初始化:通过调用init()方法来完成初始化工作
4、处理请求:Servlet创建后就可以处理请求,当有新的客户端请求时,web容器会创建一个新的线程来处理该请求。通过调用Servlet的Service()方法来响应客户端请求。Service()根据请求的method属性来调用doGet()和doPost()
5、卸载:容器在卸载Servlet之前会调用destroy()方法,让Servlet释放其占用的资源
Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/笔记二