面试小结

待我称王封你为后i 2022-03-18 13:06 287阅读 0赞
1.mybatis中的resultMap和resultType 有什么区别?

resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些 ,可自定义。因为resultMap要配置一下,表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来,但是,resultType就比较鸡肋了,必须字段名一样,比如说 cId和c_id 这种的都不能映射 。

2.String、StringBuffer、StringBulder三者的区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。
速度上:StringBuilder > StringBuffer > String
安全上:StringBuilder不安全,StringBuffer 安全
综上:
String:适用于少量的字符串操作的情况
  StringBuilder:(不安全)适用于单线程下在字符缓冲区进行大量操作的情况
  StringBuffer:(安全)适用多线程下在字符缓冲区进行大量操作的情况

3.List、Set、Map的区别

list和set是实现了collection接口,Map不是collection的子接口或者实现类。Map是一个接口。

  1. List1.可以允许重复的对象。
  2.    2.可以插入多个null元素。
  3.    3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
  4.    4.常用的实现类有 ArrayListLinkedList VectorArrayList 适用于查询的时候,和在表数据的后边添加和修改时,而 LinkedList 更适合在表数据中间添加和修改。
  5. Set1.不允许重复对象
  6.    2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
  7.    3. 只允许一个 null 元素。
  8.    4.Set 接口最流行的几个实现类是 HashSetLinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSetTreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() compareTo() 的定义进行排序的有序容器。
  9. Map:1.Map 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
  10. 2. TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
  11. 3. Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
  12. 4.Map 接口最流行的几个实现类是 HashMapLinkedHashMapHashtable TreeMap。(HashMapTreeMap最常用)
4.mybatis中的xml文件中${}和#{}有什么区别?
#是将传入的值当做字符串的形式,
  1. select id,name,age from student where id =#{id},
  2. 当前端把id1,传入到后台的时候,
  3. 就相当于 select id,name,age from student where id ='1'.
$是将传入的数据直接显示生成sql语句,
  1. select id,name,age from student where id =${id},
  2. 当前端把id1,传入到后台的时候,
  3. 就相当于 select id,name,age from student where id = 1.

使用#可以很大程度上防止sql注入。

必须使用#{}

在parameterType是int时

  1. <select id="selectMessageByIdI" parameterType="int" resultType="Message">
  2. select * from message where id=#{id};
  3. </select>
必须使用${}

含有orser by 的时候

  1. select * from ${tableName} order by ${id}
5.mybatis中能不能直接用小于号?

方法一:使用特殊转义字符
例如,>=开始日期 并且<=结束日期

大于号

< < 小于号 、

  1. <if test="searchTimeBegin != null and searchTimeBegin != ''">
  2. AND tcci.consume_time >= CONCAT(#{searchTimeBegin},' 00:00:00')
  3. </if>
  4. <if test="searchTimeEnd != null and searchTimeEnd != ''">
  5. AND tcci.consume_time <= CONCAT(#{searchTimeEnd},' 23:59:59')
  6. </if>

方法二:使用<![CDATA[ ]]>符号
这里面的内容将不被解析

  1. <if test="beginTime!=null">
  2. AND DATE (os.show_start_time) >= DATE(#{beginTime})
  3. </if>
  4. <if test="endTime!=null">
  5. AND DATE (os.show_start_time) <![CDATA[<=]]> DATE(#{endTime})
  6. </if>

在mybatis中<=不能使用,需要使用上面任意一种方法转义,但是>=可以使用!

6.jq选择器
  1. 元素选择器:$("p")
  2. id选择器:$("#test")
  3. 类选择器:$(".test")
  4. 输入框inputname属性值为'xxx'的标签:$("input[name='xxx']")
7.sql中的limit关键字

从表student(主键为id)中从第10条记录(不包括第10条记录)开始检索20条记录,语句如下:

select * from student limit 10,20
默认从0开始,select * from student limit 10,意为从0开始查10条。

8.static能修饰什么?

static修饰变量和方法
静态方法内部是不能访问非静态方法,因为静态资源是在类加载的时候就建立好的,而类加载时非静态方法需要类new的时候才能创建,所以不可以,反之可以。静不能不静,非静可以静。

  1. static可以修饰变量,这个变量属于类本身,不需要创建实例就可以直接获取到值。
  2. static可以修饰方法,这个方法属于类本身,同样,不要创建实例就可以通过类调用。

static修饰代码块

  1. static修饰的代码块是静态代码块,也具有静态的特点,属于类本身,在加载时只需要加载一次,
  2. 也就是说,如果加载过这个代码块,就不会再加载了。

static修饰类

  1. static修饰类只有一种情况,那就是这个类属于静态内部类
9.Thread有哪些方法?

Thread类的实例方法

  1. 1.start()
  2. 这个方法的作用就是通知线程规划器此现场可以运行了。要注意,调用start方法的顺序不代表线程启动的顺序,也就是cpu执行哪个线程的代码具有不确定性。。
  3. 2.run()
  4. 这个方法是线程类调用start后执行的方法,如果在直接调用run而不是start方法,那么和普通方法一样,没有区别。
  5. 3.isAlive()
  6. 是判断当前线程是否处于活动状态。活动状态就是已经启动尚未终止。
  7. 4.getPriority()和setPriority(int newPriority)
  8. 这两个方法是用于获取当前和设置线程的优先级。优先级高的线程得到的cpu多。也就是说,两个等待的线程,优先级高的线程容易被cpu执行。
  9. 默认情况下,线程的优先级是5。线程的优先级分为1~10等级。
  10. 5.isDaeMonsetDaemon(boolean on)
  11. java线程有两种,一种是用户线程,一种是守护线程。守护线程是一个特殊的线程,任何一个守护线程都是jvm中所有非守护线程的保姆。当进程中不存在非守护线程时,守护线程会自动销毁。典型的守护线程就是垃圾回收线程。
  12. 第一个是判断线程是不是守护线程,第二个是设置线程为守护线程,必须在线程start之前setDaemon(true)。
  13. 6.interrupt()
  14. 使用这个方法并不会中断线程。实际上,调用interrupt实际作用是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞状态。
  15. 7.join()

Thread类的静态方法

  1. 1.currentThread()
  2. 该方法返回的当前正在执行线程对象的引用。、
  3. 2.sleep(long millis)
  4. sleep方法的作用就是在指定的时间让正在执行的线程休眠。并不释放锁。
  5. 3.yield()
  6. 暂停当前执行的线程对象,并执行其他线程。这个暂停会放弃cpu资源,放弃的时间不确定。
10.Thread 的start() 和 run()区别?
  1. 1 start
  2.   start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
  3.   
  4. 2 run
  5.   run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
  6.   
  7. 总结:
  8. 调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void

相当于玩游戏机,只有一个游戏机(cpu),可是有很多人要玩,于是,start是排队!等CPU选中你就是轮到你,你就run(),当CPU的运行的时间片执行完,这个线程就继续排队,等待下一次的run()。

11.Thread状态:
  1. Java 当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。
  2. 第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
  3. 第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
  4. 第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
  5. 第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspendwait等方法都可以导致线程阻塞。
  6. 第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。
12.实现多线程方法:
  1. 1、写一个类继承自Thread类,重写run方法。用start方法启动线程
  2. 2、写一个类实现Runnable接口,实现run方法。用new Thread(Runnable target).start()方法来启动
13.linux通过关键字实现查看log日志的命令:

-n是显示行号 ,关键字为“debug”,cat 正序。tac倒序(cat反过来tac)

  1. cat -n 1.log |grep "debug"
14.左连接和右链接
左连接where只影向右表,右连接where只影响左表。
Left Join
  1. select * from tbl1 Left Join tbl2 where tbl1.ID = tbl2.ID

左连接后的检索结果是显示tbl1的所有数据和tbl2中满足where 条件的数据。

简言之 Left Join影响到的是右边的表

Right Join
  1. select * from tbl1 Right Join tbl2 where tbl1.ID = tbl2.ID

检索结果是tbl2的所有数据和tbl1中满足where 条件的数据。

简言之 Right Join影响到的是左边的表。

15.数据库索引是什么?

1、首先要明白无名无实莫要用索引:因为数据中的记录很多,为了方便我们查找,提高查询的效率;

2、索引的原理:对要查询的字段建立索引其实就是把该字段按照一定的方式排序;建立的索引只对该字段有用,如果查询的字段改变,那么这个索引也就无效了,比如图书馆的书是按照书名的第一个字母排序的,那么你想要找作者叫张三的就不能用改索引了;还有就是如果索引太多会降低查询的速度

3、索引是优缺点: 首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。那么在任何时候都应该加索引么?这里有几个反例:1、如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了,那么是否加索引也没有意义了。2、对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。3、对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存储空间的,而且有个致命缺点是对于update/insert/delete的每次执行,字段的索引都必须重新计算更新。所以并不是任何情况下都改建立索引的

16.sql调优?

1.尽量选择较小的列,内容少的列。
2.将where中用的比较频繁的字段建立索引。
3.select子句中尽量避免使用 ‘*’
4.避免在WHERE子句中使用in,not in,or 或者having。
可以使用 exist 和not exist代替 in和not in。
可以使用表链接代替 exist。Having可以用where代替,如果无法代替可以分两步处理。
例子

  1. SELECT * FROM ORDERS WHERE CUSTOMER_NAME NOT IN
  2. (SELECT CUSTOMER_NAME FROM CUSTOMER)

优化

  1. SELECT * FROM ORDERS WHERE CUSTOMER_NAME not exist
  2. (SELECT CUSTOMER_NAME FROM CUSTOMER)

5.不要以字符格式声明数字,要以数字格式声明字符值。(日期同样)否则会使索引无效,产生全表扫描。

例子使用:

  1. 使用:SELECT emp.ename, emp.job FROM emp WHERE emp.empno = 7369;
  2. 不要使用:SELECT emp.ename, emp.job FROM emp WHERE emp.empno = 7369

6.索引问题
在做性能跟踪分析过程中,经常发现有不少后台程序的性能问题是因为缺少合适索引造成的,有些表甚至一个索引都没有。这种情况往往都是因为在设计表时,没去定义索引,而开发初期,由于表记录很少,索引创建与否,可能对性能没啥影响,开发人员因此也未多加重视。然一旦程序发布到生产环境,随着时间的推移,表记录越来越多

这时缺少索引,对性能的影响便会越来越大了。

这个问题需要数据库设计人员和开发人员共同关注

法则:

◆不要在建立的索引的数据列上进行下列操作:

◆避免对索引字段进行计算操作

◆避免在索引字段上使用not,<>,!=

◆避免在索引列上使用IS NULL和IS NOT NULL

◆避免在索引列上出现数据类型转换

◆避免在索引字段上使用函数

◆避免建立索引的列中使用空值。
7.使用UNION ALL能解决的话,尽量避免使用UNION。UNION 因为会将各查询子集的记录做比较,故比起UNION ALL ,通常速度都会慢上许多。

17.ajax同步于一步的区别?

async:true, //或false,是否异步

  1. $.ajax({
  2. url:'',
  3. type:'POST', //GET
  4. async:true, //或false,是否异步
  5. data:{
  6. name:'llc',
  7. age:22
  8. },

async:true, //或false,是否异步

同步:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
用户填写所有信息后,提交给服务器,等待服务器的回应(检验数据),是一次性的。信息错误又要重新填写!

异步:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
当用户填写完一条信息后,该信息会自动向服务器提交,然后服务器响应客户端,在此过程中,用户依然在填写表格的信息,即向服务器请求多次,节省了用户的时间,提高了用户的体验。
一般都用异步。

18、TCP和UDP的区别?

TCP是确认包的到达,所以不丢失包(数据),顺序也是好的。
UDP不会确认包的到达,所以可能会丢失数据包,当然顺序也有可能会乱。
除了这些以外:

  1. TCP是面向连接(三次握手)的,所以稳定、可靠,那相对就慢了
    比如平时的:文件传输,右键,http等用的都是tcp协议
  2. UDP是面向无连接的,所以不稳定,但是相对快,实时性高
    比如平时:做什么现场直播,视频通话啥的
    当然,大家平时用的QQ就是UDP协议(有没有消息错乱的时候)
    MSN用的TCP,所以你感觉很卡,很慢
19、三次握手四次挥手
三次握手形象的说

我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。

四次挥手的详述

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说”我Client端没有数据要发给你了”,但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,“告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息”。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,“告诉Client端,好了,我这边数据发完了,准备好关闭连接了”。Client端收到FIN报文后,”就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,“就知道可以断开连接了”。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

20、在使用MyBatis开发DAO层时,当实体类中的属性名和表中的字段名不一样时,查询出来的值为null,此时有3种解决方法:
解决方法1
  1. Mapper.xml映射文件中,写SQL语句时起别名
解决方法2
  1. Mybatis全局配置文件中开启驼峰命名,注意:前提是数据库中的字段是按驼峰命名规则的两个单词之间加“_”命名的
  2. <settings>
  3. <!-- 开启驼峰命名规则,可以将数据库中的下划线映射为驼峰命名 例如:user_name可以映射为userName -->
  4. <setting name="mapUnderscoreToCamelCase" value="true" />
  5. </settings>
解决方法3
  1. Mapper.xml映射文件中使用resultMap自定义映射规则
21、事务

事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行,在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。 。所以,应该把它们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。
2.事务的语句
在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。
 开始事务:BEGIN TRANSACTION(事务)
 提交事务:COMMIT TRANSACTION(事务)
 回滚事务:ROLLBACK TRANSACTION(事务)
3.事务的4个属性
Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败(减款,增款必须一起完成)。
● Consistency(一致性):只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。事务的运行并不改变数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变。
● Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。
● Durability(持久性):事务完成之后,它对于 系统的影响是永久的,该修改即使出现系统故障也将一直保留,真实的修改了数据库

22、其他问题:

IO
js打印怎么实现的?
nginx+tomcat性能调优和负载均衡
redis
通讯协议
tomcat优化
数据库索引。事务
dubbo+zookeper
junit单元测试
设计模式 并举例
oop mvc
oracle存储过程 触发器 函数
socket编程?
sql语句性能调优
ssh
同步异步
sql左连接右链接
分布式缓存,队列,搜索
webservice
微信支付
抽象类与接口区别
spring的aop ioc di分别是什么
抽象类与接口区别
jsp九大内置对象
timest…datetime区别

发表评论

表情:
评论列表 (有 0 条评论,287人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JVM面试小结

    1、java内存管理中的出现的典型问题: 1. 悬挂指针问题:一个指针引用了一个已经被回收的内存地址,导致程序的运行完全不可知。 2. 内存泄漏:内存已经分配,但是已

    相关 redis面试小结

    1. 使用redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)  (2

    相关 MySQL__面试小结

    1、如何设计一个高并发的系统 ① 数据库的优化,包括合理的事务隔离级别、SQL语句优化、索引的优化 ② 使用缓存,尽量减少数据库IO ③ 分布式数据库、分布式缓存 ④ 

    相关 面试小结

    百度内推一面: 1.深浅拷贝。 2.const char \,char \ const。 3.对象的复制拷贝。注意的四个点,初级,高级程序员做法 4.介绍项目。