面试小结

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是一个接口。

List:1.可以允许重复的对象。
    2.可以插入多个null元素。
    3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
    4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 适用于查询的时候,和在表数据的后边添加和修改时,而 LinkedList 更适合在表数据中间添加和修改。

Set:1.不允许重复对象
     2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator  或者 Comparable 维护了一个排序顺序。
     3. 只允许一个 null 元素。
     4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。

Map:1.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
    	2. TreeMap 也通过 Comparator  或者 Comparable 维护了一个排序顺序。
    	3. Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
    	4.Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)
4.mybatis中的xml文件中${}和#{}有什么区别?
#是将传入的值当做字符串的形式,
  select id,name,age from student where id =#{id},
  当前端把id值1,传入到后台的时候,
  就相当于 select id,name,age from student where id ='1'.
$是将传入的数据直接显示生成sql语句,
  select id,name,age from student where id =${id},
  当前端把id值1,传入到后台的时候,
  就相当于 select id,name,age from student where id = 1.

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

必须使用#{}

在parameterType是int时

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

含有orser by 的时候

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

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

> > 大于号

< < 小于号 、

 
   <if test="searchTimeBegin != null and searchTimeBegin != ''">
       AND tcci.consume_time &gt;= CONCAT(#{searchTimeBegin},' 00:00:00')
   </if>
   <if test="searchTimeEnd != null and searchTimeEnd != ''">
       AND tcci.consume_time &lt;= CONCAT(#{searchTimeEnd},' 23:59:59')
   </if>

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

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

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

6.jq选择器
元素选择器:$("p")
id选择器:$("#test")
类选择器:$(".test")
输入框input的name属性值为'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的时候才能创建,所以不可以,反之可以。静不能不静,非静可以静。

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

static修饰代码块

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

static修饰类

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

Thread类的实例方法

1.start()

这个方法的作用就是通知线程规划器此现场可以运行了。要注意,调用start方法的顺序不代表线程启动的顺序,也就是cpu执行哪个线程的代码具有不确定性。。

2.run()

这个方法是线程类调用start后执行的方法,如果在直接调用run而不是start方法,那么和普通方法一样,没有区别。

3.isAlive()

是判断当前线程是否处于活动状态。活动状态就是已经启动尚未终止。

4.getPriority()和setPriority(int newPriority)

这两个方法是用于获取当前和设置线程的优先级。优先级高的线程得到的cpu多。也就是说,两个等待的线程,优先级高的线程容易被cpu执行。

默认情况下,线程的优先级是5。线程的优先级分为1~10等级。

5.isDaeMon、setDaemon(boolean on)

java线程有两种,一种是用户线程,一种是守护线程。守护线程是一个特殊的线程,任何一个守护线程都是jvm中所有非守护线程的保姆。当进程中不存在非守护线程时,守护线程会自动销毁。典型的守护线程就是垃圾回收线程。

第一个是判断线程是不是守护线程,第二个是设置线程为守护线程,必须在线程start之前setDaemon(true)。

6.interrupt()

使用这个方法并不会中断线程。实际上,调用interrupt实际作用是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞状态。

7.join()

Thread类的静态方法

   1.currentThread()
   该方法返回的当前正在执行线程对象的引用。、
   2.sleep(long millis)

sleep方法的作用就是在指定的时间让正在执行的线程休眠。并不释放锁。

3.yield()

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

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

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

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

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

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

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

Right Join
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代替,如果无法代替可以分两步处理。
例子

SELECT *  FROM ORDERS WHERE CUSTOMER_NAME NOT IN 
(SELECT CUSTOMER_NAME FROM CUSTOMER)

优化

SELECT *  FROM ORDERS WHERE CUSTOMER_NAME not exist 
(SELECT CUSTOMER_NAME FROM CUSTOMER)

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

例子使用:

使用:SELECT emp.ename, emp.job FROM emp WHERE emp.empno = 7369;
不要使用: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,是否异步

$.ajax({
    url:'',
    type:'POST', //GET
    async:true,    //或false,是否异步
    data:{
        name:'llc',
        age:22
    },

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
           在Mapper.xml映射文件中,写SQL语句时起别名
解决方法2
           在Mybatis全局配置文件中开启驼峰命名,注意:前提是数据库中的字段是按驼峰命名规则的两个单词之间加“_”命名的
<settings>
        <!-- 开启驼峰命名规则,可以将数据库中的下划线映射为驼峰命名
        例如:user_name可以映射为userName -->
        <setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
解决方法3
           在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区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值