容易遗漏的知识点
作者:互联网
文章目录
- 一、JAVA的三大特性
- 二、什么是JAVA的序列化以及反序列化?
- 三、cookie和session的区别
- 四、说说你对反射的理解
- 五、说说你对Java中泛型的理解
- 六、说说抽象类和接口的区别?
- 七、java中重写equals后为什么还有重新hashcode方法?
- 八、说说DoS/DDoS是什么?
- 八、TCP和UDP的区别和使用场景
- 九、mysql是怎么解决幻读的?
一、JAVA的三大特性
1、封装
Java中的封装是指一个类把自己内部的实现细节进行隐藏,只暴露对外的接口。封装又分为属性的封装和方法的封装,把属性定义为私有的,他们通过setter和getter方法对属性的值进行设定和获取。
封装目的:增强安全性和简化编程,使用者不必在意具体实现细节,通过外部接口就可以访问类的成员。
2、继承
继承是指将多个相同的属性和方法提取出来,新建一个父类。Java中一个类只能继承一个父类,且只能继承访问权限非private的属性和方法。
继承目的:实现代码复用
3、多态
它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。
对面向对象来说,多态分为编译时多态和运行时多态。
- 编译时多态:是指Java允许方法名相同而参数不同。
- 运行时多态: 是指Java运行根据调用该方法的类型决定调用哪个方法。
二、什么是JAVA的序列化以及反序列化?
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
- 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
- 在网络上传送对象的字节序列;
对象序列化机制(object serialization)是java语言内建的一种对象持久化方式,通过对象序列化,可以将对象的状态信息保存未字节数组,并且可以在有需要的时候将这个字节数组通过反序列化的方式转换成对象,对象的序列化可以很容易的在JVM中的活动对象和字节数组(流)之间进行转换。
Java为了方便开发人员将java对象序列化及反序列化提供了一套方便的API来支持。
java.io.Serializable
三、cookie和session的区别
cookie和session的共同之处在于:cookie和session都是用来跟踪浏览器用户身份的会话方式。
区别:
- cookie数据保存在客户端,session数据保存在服务端
- cookie不是很安全,对于HTTP别人可以分析存在本地的COOKIE并进行COOKIE欺骗,如果考虑到安全应当用session
- session会一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。
- 单个cookie在客户端的限制是4KB左右,对于复杂的业务逻辑需求分厂不友好。
- cookie会被附加在每个HTTP请求中,在HttpRequest和HttpResponse的header中都要被传输的,所以无形中增加了一些不必要的流量损失。
四、说说你对反射的理解
Java中创建对象大概有这几种方式:
- 使用new关键字:最简单的方式
- 使用Clone方法:无论何时调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去。
- 使用反序列化
简单来说,反射就是在程序的运行过程中被允许对程序本身进行操作,比如自我检查、进行装载、获取类本身、类的所有成员变量和方法、类对象。还可以在运行过程中动态的创建类的实例,通过实例来调用类的方法。
利用反射机制可以获取类对象
- 类名.class();
- 对象名.getClass();
- Class.forName(类的路径名);
五、说说你对Java中泛型的理解
泛型指的就是广泛通用的类型,就是为了参数化类型,或者说可以将类型当做参数传递给一个类或者方法。
泛型好处
泛型的主要目的是实现java的类型安全,泛型可以使编译器知道一个对象的限定类型是什么,消除了强制类型转换,使得代码可读性好,减少了很多出错的机会。
泛型的实现原理
泛型的实现时靠类型擦除技术,类型擦除是在编译期完成的,也就是在编译期编译器会将泛型的类型参数都擦除成它的限定类型,如果没有则擦除为object类型之后在获取的时候再强制类型转换为对应的类型。在运行期间并没有泛型的任何信息,因此也没有优化。
六、说说抽象类和接口的区别?
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
下面接着再说说两者在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重
七、java中重写equals后为什么还有重新hashcode方法?
hashCode:是一个native方法,返回的是对象的内存地址,
equals:对于基本数据类型,==比较的是两个变量的值。对于引用对象,==比较的是两个对象的地址。
从hashCode的注释中我们看到,hashCode方法在定义时做出了一些常规协定,即
1,当obj1.equals(obj2) 为 true 时,obj1.hashCode() == obj2.hashCode()
2,当obj1.equals(obj2) 为 false 时,obj1.hashCode() != obj2.hashCode()
hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。如果我们将对象的equals方法重写而不重写hashcode,当我们再次new一个新的对象的时候,equals方法返回的是true,但是hashCode方法返回的就不一样了,如果需要将这些对象存储到结合中(比如:Set,Map …)的时候就违背了原有集合的原则,下面让我们通过一段代码看下。
八、说说DoS/DDoS是什么?
1、与DoS攻击相关的几个概念
- DoS:Denial of Service,拒绝服务,即无法及时接受并处理外界合法请求。
- DoS攻击:指造成DoS的攻击行为,目的是使攻击目标计算机无法提供正常的服务。最常见的DoS攻击有计算机网络带宽攻击和连通性攻击。
带宽攻击:是指以极大量通信量冲击通往目标计算机的网络,使得所有可用网络资源都被消耗殆尽,导致合法的用户请求无法通过,无法达到目标计算机。
连通性攻击:是指大量的连接请求攻击目标计算机,使得所有可用的操作系统资源都被消耗殆尽,导致计算机无法处理合法用户请求。
-
DDoS攻击:DDoS即Distributed Denial of Service,DDoS攻击即是分布式DoS攻击。攻击者借助客户/服务器技术,控制并利用多个傀儡机(肉鸡),对一个或多个攻击目标发起DDoS攻击,从而成倍地提高DoS攻击的威力。
-
DRDoS攻击:DRDoS即Distributed Reflection Denial of Service,DRDoS攻击即是分布式反射DoS攻击。DRDoS攻击与DoS攻击、DDoS攻击不同,它不是直接对攻击目标发起请求,而是通过IP欺骗,发送大量源IP地址为攻击目标IP地址的数据包给攻击主机(第三方),然后攻击主机对IP地址源(即攻击目标)做出大量回应,从而形成DoS攻击。攻击者往往会选择那些响应包远大于请求包的第三方服务来利用,以达到放大反射攻击的效果,这样的服务包括DNS、NTP、SSDP、Chargen、Memcached等。
2、一些常见DoS攻击的攻击原理
SYN泛洪
SYN泛洪攻击是利用了TCP协议的缺陷进行的DoS攻击,首先看看TCP连接的三次握手过程。
1、客户端向服务端发送SYN报文段,并指明客户端的初始化序列号 ISN。
2、服务端收到客户端发送的SYN报文段,向客户端发送SYN报文,同时确定自己的ISN初始化序列号。
3、客户端向服务端发送ACK报文来建立TCP连接。
一般正常的三次握手过程是在这3部执行完后完后成。如果客户端通过伪造不存在的IP作为源地址向服务器发送SYN报文,服务器收到之后回应一个SYN+ACK报文并在自己的半连接队列中为收到的SYN创建一个条目,等待客户端的ACK应答。但是由于客户端采取了IP欺骗,服务器发送的SYN-ACK报文根本得不到回应,这个服务器会不断等待、重传直至重传次数超过系统规定的最大重传次数才停止,并将这个SYN项目从半连接队列中删除。
SYN泛洪攻击就是在短时间内伪造大量不存在的IP地址并快速发送大量这样的SYN报文给攻击目标计算机,使其半连接队列被阻塞,正常的SYN请求反而被丢弃,同时还要不断对这个庞大的半连接队列中所有项目进行SYN+ACK的重试,系统可用资源急剧减少,系统运行缓慢,严重者会引起网络拥堵甚至系统瘫痪。
解决措施:
- 缩短SYN Timeout时间,即从服务器收到一个SYN报文确认这个SYN报文无用这个过程花费的时间。
- 设置SYN Cookie,就是给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续收到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址来的包一概丢弃。
死亡之ping
在TCP/IP的RFC文档中对包的最大尺寸都有严格限制规定,许多操作系统的TCP/IP协议栈都规定ICMP包大小为64KB,且在对包的标题头进行读取之后,要根据该标题头里包含的信息来为有效载荷生成缓冲区。
死亡之ping就是故意产生畸形的ping包,声称自己的尺寸超过ICMP包大小上限,或者直接发送尺寸超过ICMP包上限的报文,使未采取保护措施的网络系统出现内存分配错误,缓冲区溢出,导致TCP/IP协议栈崩溃,最终报文接收方宕机。
泪滴
对于一些大的IP数据包,需要对其进行拆分传送,在IP报头中有一个拆分标志和一个偏移字段,如果拆分标志为1,则表示这是一个大IP包,接收方需要根据偏移字段对接收到的几个IP包分段进行重新组装成一个完整的大IP包。
由于在TCP/IP协议栈的实现中,对IP碎片中的包的标题头所包含的信息是信任的,泪滴攻击就是利用这一漏洞,在IP数据包中把偏移字段设置成错误的数值,这样接收方就无法按照数据包中的偏移字段值正确组装这些IP包分段,但是接收方会不断尝试,最终可能导致目标计算机操作系统资源耗尽而崩溃。
UDP泛洪
Unix服务器默认会打开一些容易被黑客恶意利用的UDP服务。例如,echo服务会显示接收到的每一个数据包,而原本作为测试功能的chargen服务会在接收到每一个数据包时随机反馈一些字符。UDP泛洪就是利用这两个简单的TCP/IP服务的漏洞进行恶意攻击,通过伪造与某一主机的chargen服务之间的一次UDP连接,回复地址指向开着echo服务的另一台主机,通过将chargen和echo服务互指,来回传送毫无用处且占满带宽的垃圾数据,在两台主机之间生成足够多的无用数据流,将很快导致网络可用带宽耗尽。
Land攻击
Land攻击就是向攻击目标发送一个SYN包,包中源地址和目标地址都设置成攻击目标的IP,这样将导致接收服务器创建一个空连接,每一个连接都将保留直到超时。在Land攻击下,许多Unix将崩溃,NT变得极其缓慢。
IP欺骗
利用TCP协议栈的RST位,使用IP欺骗,伪装成与攻击目标连接的合法用户,向攻击目标发送一个带有RST位的TCP数据段,使攻击目标清空缓冲区中与合法用户已经建立好的连接,这时合法用户再发送数据到攻击目标会被拒绝服务,因为已经不存在连接了,只能重新开始建立新的连接了。
八、TCP和UDP的区别和使用场景
区别
TCP的优点: 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。
TCP的缺点: 慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。
== UDP的优点==: 快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击……
UDP的缺点: 不可靠,不稳定 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。
使用场景
-
由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:
- FTP 文件传输
- HTTP / HTTPS
-
由于 UDP 面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:
- 包总量较少的通信,如 DNS 、SNMP 等
- 视频、音频等多媒体通信
- 广播通信
九、mysql是怎么解决幻读的?
一、什么是幻读
在一次事务里面,多次查询之后,结果集的个数不一致的情况叫做幻读。而多出来或者少的哪一行被叫做幻行。
二、为什么要解决幻读
在高并发数据库系统中,需要保证事务与事务之间的隔离性,还有事务本身的一致性。
三、MySQL 是如何解决幻读的
如果你看到了这篇文章,那么我会默认你了解了脏读 、不可重复读与可重复读。
- 多版本并发控制(MVCC)(快照读/一致性读)
多数数据库都实现了多版本并发控制,并且都是靠保存数据快照来实现的。以 InnoDB 为例,每一行中都冗余了两个字断。
一个是行的创建版本,一个是行的删除(过期)版本。具体的版本号(trx_id)存在 information_schema.INNODB_TRX 表中。版本号(trx_id)随着每次事务的开启自增。
事务每次取数据的时候都会取创建版本小于当前事务版本的数据,以及过期版本大于当前版本的数据。
普通的 select 就是快照读。
select * from T where number = 1;
原理:将历史数据存一份快照,所以其他事务增加与删除数据,对于当前事务来说是不可见的。
- next-key 锁 (当前读)
next-key 锁包含两部分:
记录锁(行锁)
间隙锁
记录锁是加在索引上的锁,间隙锁是加在索引之间的。(思考:如果列上没有索引会发生什么?)
select * from T where number = 1 for update;
select * from T where number = 1 lock in share mode;
insert
update
delete
原理:将当前数据行与上一条数据和下一条数据之间的间隙锁定,保证此范围内读取的数据是一致的。
其他:MySQL InnoDB 引擎 RR 隔离级别是否解决了幻读
引用一个 github 上面的评论 地址:
Mysql官方给出的幻读解释是:只要在一个事务中,第二次select多出了row就算幻读。
a事务先select,b事务insert确实会加一个gap锁,但是如果b事务commit,这个gap锁就会释放(释放后a事务可以随意dml操作),a事务再select出来的结果在MVCC下还和第一次select一样,接着a事务不加条件地update,这个update会作用在所有行上(包括b事务新加的),a事务再次select就会出现b事务中的新行,并且这个新行已经被update修改了,实测在RR级别下确实如此。
如果这样理解的话,Mysql的RR级别确实防不住幻读
有道友回复 地址:
在快照读读情况下,mysql通过mvcc来避免幻读。
在当前读读情况下,mysql通过next-key来避免幻读。
select * from t where a=1;属于快照读
select * from t where a=1 lock in share mode;属于当前读
不能把快照读和当前读得到的结果不一样这种情况认为是幻读,这是两种不同的使用。所以我认为mysql的rr级别是解决了幻读的。
先说结论,MySQL 存储引擎 InnoDB 隔离级别 RR 解决了幻读问题。面试问烂的 MySQL 四种隔离级别,这篇文章建议大家看下。
如引用一问题所说,T1 select 之后 update,会将 T2 中 insert 的数据一起更新,那么认为多出来一行,所以防不住幻读。看着说法无懈可击,但是其实是错误的,InnoDB 中设置了快照读和当前读两种模式,如果只有快照读,那么自然没有幻读问题,但是如果将语句提升到当前读,那么 T1 在 select 的时候需要用如下语法: select * from t for update (lock in share mode) 进入当前读,那么自然没有 T2 可以插入数据这一回事儿了。
注意
next-key 固然很好的解决了幻读问题,但是还是遵循一般的定律,隔离级别越高,并发越低。
标签:知识点,遗漏,IP,SYN,TCP,攻击,幻读,容易,序列化 来源: https://blog.csdn.net/weixin_44324174/article/details/110289551