笔记(二)

2022-06-10 20:10:35 浏览数 (1)

以下的内容比较杂,后面抽时间整理一下进行分类

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的生命周期

  1. 加载:容器通过类加载器使用Servlet类对应的文件来加载Servlet
  2. 创建:通过调用Servlet的构造函数来创建一个Servlet实例
  3. 初始化:通过调用Servlet的init()方法来完成初始化工作,这个方法是在Servlet已经被创建,但在向客户端提供服务之前调用。
  4. 处理客户请求:Servlet创建后就可以处理请求,当有新的客户端请求时,Web容器都会创建一个新的线程来处理该请求。接着调用Servlet的 Service()方法来响应客户端请求(Service方法根据请求的method属性来调用doGet()和doPost())
  5. 卸载:容器在卸载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/笔记二

0 人点赞