PrepatedStatement原理
PrepatedStatement好处:
1.预编译SQL,性能更高
2.防止SQL注入:将敏感字符进行转移,加上了\
1.PrepatedStatement预编译功能开启:useServerPrepStmts=true
2.配置MySQL执行日志(重启mysql服务后生效)
PrepatedStatement原理:
1.在获取PrepatedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)
2.执行时就不用再进行这些步骤了,速度更快
3.如果sql模板一样,则只需要进行一次检查、编译
学习心得:了解了PrepatedStatement的原理,就是将敏感字符进行转移,加上了\

一 JavaSE 典面试题

  1. 为什么重写 equals 还要重写 hashcode?
  2. == 和 equals 比较的区别
  3. 为啥有时会出现 4.0 - 3.6 = 0.40000001 这种现象?
  4. final 关键字的作用
  5. 介绍 Java 的集合类
  6. ArrayList 和 LinkedList 的区别

请你讲讲Java里面的final关键字是怎么用的?

当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。

“使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。“

对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

请说明ArrayList和LinkedList的区别?

ArrayList和LinkedList都实现了List接口,他们有以下的不同点: ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。 相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。 LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

请解释hashCode()和equals()方法有什么联系?

Java对象的eqauls方法和hashCode方法是这样规定的:

➀相等(相同)的对象必须具有相等的哈希码(或者散列码)。

➁如果两个对象的hashCode相同,它们并不一定相同。

请你解释为什么重写equals还要重写hashcode?

HashMap中,如果要比较key是否相等,要同时使用这两个函数!

因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义的两个对象,比较也是不相等的。

HashMap中的比较key是这样的,先求出key的hashcode(),比较其值是否相等,若相等再比较equals(),若相等则认为他们是相等的。

若equals()不相等则认为他们不相等。如果只重写hashcode()不重写equals()方法,当比较equals()时只是看他们是否为同一对象(即进行内存地址的比较),所以必定要两个方法一起重写。

HashMap用来判断key是否相等的方法,其实是调用了HashSet判断加入元素 是否相等。

重载hashCode()是为了对同一个key,能得到相同的Hash Code,这样HashMap就可以定位到我们指定的key上。重载equals()是为了向HashMap表明当前对象和key上所保存的对象是相等的,这样我们才真正地获得了这个key所对应的这个键值对。

请你比较一下Java和JavaSciprt?

JavaScript 与Java是两个公司开发的不同的两个产品。Java 是原Sun Microsystems公司推出的面向对象的程序设计语言,特别适合于互联网应用程序开发;而JavaScript是Netscape公司的产品,为了扩展Netscape浏览器的功能而开发的一种可以嵌入Web页面中运行的基于对象和事件驱动的解释性语言。JavaScript的前身是LiveScript;而Java的前身是Oak语言。 下面对两种语言间的异同作如下比较: - 基于对象和面向对象:Java是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象;JavaScript是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言,因而它本身提供了非常丰富的内部对象供设计人员使用。 - 解释和编译:Java的源代码在执行之前,必须经过编译。JavaScript是一种解释性编程语言,其源代码不需经过编译,由浏览器解释执行。(目前的浏览器几乎都使用了JIT(即时编译)技术来提升JavaScript的运行效率) - 强类型变量和类型弱变量:Java采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量是弱类型的,甚至在使用变量前可以不作声明,JavaScript的解释器在运行时检查推断其数据类型。 - 代码格式不一样。

请你说明符号“==”比较的是什么?

“==”对比两个对象基于内存引用,如果两个对象的引用完全相同(指向同一个对象)时,“==”操作将返回true,否则返回false。“==”如果两边是基本类型,就是比较数值是否相等。

请你解释为什么会出现4.0-3.6=0.40000001这种现象?

原因简单来说是这样:2进制的小数无法精确的表达10进制小数,计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现了误差。

请说明String是最基本的数据类型吗?

基本数据类型包括byte、int、char、long、float、double、boolean和short。   888888888888

java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类。

请你说明String 和StringBuffer的区别

JAVA 平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据

请你讲讲数组(Array)和列表(ArrayList)的区别?什么时候应该使用Array而不是ArrayList?

Array和ArrayList的不同点: Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。 Array大小是固定的,ArrayList的大小是动态变化的。 ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。 对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

请你解释什么是值传递和引用传递?

值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量. 引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。 所以对引用对象进行操作会同时改变原对象. 一般认为,java内的传递都是值传递.

请你简单描述一下正则表达式及其用途。

在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。计算机处理的信息更多的时候不是数值而是字符串,正则表达式就是在进行字符串匹配和处理的时候最为强大的工具,绝大多数语言都提供了对正则表达式的支持。

请简述一下线程的sleep()方法和yield()方法有什么区别?

①sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;

② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;

③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;

④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。

二 操作系统 经典面试题


  1. 什么是死锁?死锁产生的条件?
  2. 线程有哪几种状态?
  3. 有哪些进程调度算法?
  4. 什么是缓冲区溢出?

进程调度算法

为了确定进程的执行顺序,实现CPU利用率最大化

【1】先到先服务算法(FCFS)

按照进入就绪队列的顺序为进程分配资源,并立即执行,一直执行到完成/发生阻塞放弃cpu时再重新调度

【2】短作业优先算法(SJF)

从就绪队列中选出估计运行时间最短的进程,为之分配资源,使它立即执行并一直到结束

【3】时间片轮转调度算法(Round Robin RR)

时间片轮转是一种最古老,最简单,最公平且使用最广泛的算法

每一个进程都被分配一个时间段(时间片),代表该进程允许被运行的时间

【4】多级反馈队列调度算法

目前被公认效果最好的算法

既能使得高优先级作业得到响应,也能使得短作业进程迅速完成

目前Unix操作系统就是采用的多级反馈队列调度算法

————————————————

版权声明:本文为CSDN博主「我是小杨我就这样」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_44478378/article/details/107449173

什么是死锁?

死锁可以这样理解,就是互相不让步不放弃,同时需要对方的资源。造成互相不满足资源需求,也不放弃自身已有资源。死锁就这样了。

死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。

产生死锁的原因主要是:

1) 因为系统资源不足。

2) 进程运行推进的顺序不合适。

3) 资源分配不当等。

死锁产生的4个必要条件:

  • 互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
  • 不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。
  • 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
  • 循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

死锁的四个条件 :1、互斥 2、保持锁并请求锁 3、不可抢夺 4、循环等待

产生死锁的四个必要条件:

1) 互斥条件:一个资源每次只能被一个进程使用。

2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之

一不满足,就不会发生死锁。

死锁的解除与预防

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态

的情况下占用资源。因此,对资源的分配要给予合理的规划。


预防死锁,预先破坏产生死锁的四个条件。互斥不可能破坏,所以有如下三种方法:

1、破坏请求和保持条件,

进程必须等所有要请求的资源都空闲时才能申请资源,这种方***使资源浪费严重(有些资源可能仅在运行初期或结束时才使用,甚至根本不使用)。

允许进程获取初期所需资源后,便开始运行,运行过程中再逐步释放自己占有的资源,比如有一个进程的任务是把数据复制到磁盘中再打印,前期只需获得磁盘资源而不需要获得打印机资源,待复制完毕后再释放掉磁盘资源。这种方法比第一种方法好,会使资源利用率上升。

2、破坏不可抢占条件

这种方法代价大,实现复杂。

3、破坏循坏等待条件

对各进程请求资源的顺序做一个规定,避免相互等待。这种方法对资源的利用率比前两种都高,但是前期要为设备指定序号,新设备加入会有一个问题,其次对用户编程也有限制。

死锁,基本就是资源不够,互相需要对方资源却不肯放弃自身资源。N线程访问N资源,为了避免死锁,可以为其加锁并指定获取锁的顺序,这样线程按照顺序加锁访问资源,依次使用依次释放,可以避免死锁。

使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。可以确保N个线程可以访问N个资源同时又不导致死锁了。

三 计算机网络

  1. 计算机网络各层有哪些协议?
  2. TCP 和 UDP 协议的区别?
  3. TCP 为什么需要三次握手和四次挥手?
  4. HTTP 和 HTTPS 协议的区别?

什么是TCP/IP和UDP协议

TCP协议中的三次握手和四次挥手过程

为什么连接的时候是三次握手,关闭的时候却是四次握手

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态

TCP与UDP的区别

什么时候使用TCP

一、什么是TCP/IP和UDP协议

1、什么是TCP/IP协议

了解本概念之前我觉得可以了解一下什么是通信,两台计算机要通过网络进行通信,必须满足3条件

协议(讲解)

端口(讲解)

IP地址(讲解)

而TCP/IP协议是世界上应用最为广泛的协议,是以TCP和IP为为基础的不同层次上多个协议的集合,TCP协议俗称传输控制协议,是面向连接,需要三次握手建立连接,4次挥手断开连接报头最小长度20字节的协议

2、什么是UDP协议

UDP协议,用户数据包协议,面向无连接,报头只有8个字节。

二、TCP协议中的三次握手和四次挥手

TCP协议通过三次握手建立连接,通过四次挥手断开连接。首先了解一些概念

SYN:TCP/IP建立连接时使用的握手信号,

三次握手建立连接

首先我们看一组图嘛

,下面我简要概述一下(纯属个人理解,不喜欢勿喷)

为方便理解我把客户端看成A服务器B

首先A和B建立连接,要通过三次握手,首先A发送连接请求报文SYN,B接受连接后回复ACK报文,并为这次连接分配资源,A接收到ACK报文后也向B发送ACK报文并分配资源,这样实现三次握手TCP连接就建立起来了。

四次挥手断开连接

整个过程Client端所经历的状态图解

Server端所经历的状态图解

注意:

在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

三、为什么连接的时候是三次握手,关闭的时候却是四次握手?

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

四、为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

五、TCP与UDP的区别

TCP    UDP    备注

面向有链接的通信服务    —无连接—-    

提供可靠的通信传输    不可靠,会丢包    TCP是面向连接的,建立连接之后才发送数据,而UDP不管对方存不存在都会发送数据,TCP有确认机制,接收端每收到一个正确包都会回应给发送端。超时或者数据包不完整的话发送端会重传。UDP没有。因此可能丢包。

保证数据顺序    不保证    

数据无边界    有    TCP无边界:客户端分多次发送数据给服务器,若服务器的缓冲区够大,那么服务器端会在客户端发送完之后一次性接收过来,所以是无边界的,UDP有边界:客户端每发送一次,服务器端就会接收一次,即发送多少次就会接收多少次,因此是有边界的

速度慢    快    TCP需要三次握手,有流量控制,拥塞控制UDP没有,所以UDP快

面向字节流    面向报文    

一对一    可以一对一,一对多    

报头至少20字节    报头8字节    

有流量控制    没有    

六、什么时候使用TCP和UDP

1、什么时候使用TCP

对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 eg: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输

2、什么时候使用UDP

对网络通讯质量要求不高,速度要求快时,使用。eg:QQ语音 QQ视频 TFTP

————————————————

版权声明:本文为CSDN博主「-大锅饭-」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Tomasyb/article/details/73459736

四 数据库

  1. MySQL 索引的最左原则
  2. InnoDB 和 MyIsam 引擎的区别?
  3. 有哪些优化数据库性能的方法?
  4. 如何定位慢查询?
  5. MySQL 支持行锁还是表锁?分别有哪些优缺点?