面试题总结

1、mybatis配置文件在项目开始之前需要写什么东西?
environments标签:数据库环境的配置,支持多环境配置
mapper标签:该标签的作用是加载映射的
2、@Autowired和@Resource的区别?
相同点:@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上
不同点:
@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如:@Autowired() @Qualifier(“baseDao”)

@Resource 是JDK1.6支持的注解,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名,按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。Java代码:@Resource(name=“baseDao”)

他们的主要区别就是@Autowired是默认按照类型装配的 @Resource默认是按照名称装配的
byName 通过参数名 自动装配,如果一个bean的name 和另外一个bean的 property 相同,就自动装配。
byType 通过参数的数据类型自动自动装配,如果一个bean的数据类型和另外一个bean的property属性的数据类型兼容,就自动装配

3、“#{}”和“${}”的区别?
#{}是预编译处理,Mybatis在处理#{}时,会把sql中的#{}替换为问号占位符(?),调用PreparedStatement的set方法来赋值。使用#{}可以有效的防止SQL注入,提高系统安全性。
是 字 符 串 替 换 , M y b a t i s 在 处 理 {}是字符串替换,Mybatis在处理 Mybatis{}时,就是把${}直接替换成变量的值。不能防止sql注入。

4、数据库三大范式?
第一范式:保证表中所有列都不可以再拆分,原子性
第二范式:表中的所有列都要与主键相关
第三范式:表中的所有列都与主键直接相关而不是间接的

5、如何在数据库中实现分页?
使用limit关键字

6、String a = “xxx” 和 String a = new String(“xxx”)的区别,用==判断的结果?
结果为false,前者是存在字符常量池中,后者是new出来的在堆中,地址不一样结果自热为false

7、那些线程是安全的?
Vector、HashTable、Properties

8、创建线程的的方式?
继承Thread
AdditionThread thread = new AdditionThread(nums, “AdditionThread”);
thread.start();
实现Runnable接口
// 自定义的 Runnable
Runnable runnable = new MyRunnable();
Thread thread = new Thread(runnable, “Runnable-Thread”);
thread.start();

9、线程的五大状态以及如何设置优先级?
线程的5个状态:
创建状态:Thread t = new Thread线程一旦创建就进入到新生状态。(new)
就绪状态:当调用start()方法,线程立即进入就绪状态;但并不一定立即被调用执行。
运行状态:获得CPU调度进入运行状态;进入运行状态,线程才开始执行线程体的代码块。
阻塞状态:当调用sleep、wait或同步锁时,线程进入阻塞状态(即代码不再执行),阻塞事件解除后,重新进入就绪状态,等待CPU调度。
死亡状态:线程中断或者结束,线程进入死亡状态;一旦进入死亡状态,就不能再次启动。

创建线程时的参数中,含有设置优先级的参数,设置进去即可
例子:
AfxBeginThread(Thread****, this, THREAD_PRIORITY_TIME_CRITICAL);

10、什么是事务和事务回滚?
事务应用于各种场景,订单系统、银行系统
例如:
小明去某银行取钱,首先有以下几个步骤:
银行卡放入ATM机。,输入密码
连接数据库,验证账户密码
验证成功,获得用户信息(银行余额:5000)
用户输入取款金额,按下确认键(取款:1000)
从后台数据库中减掉用户取款金额(剩下余额:4000)
ATM机吐出钱
用户拿走钱
这时候就出现了事务。
事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
在取钱这个过程中,用户账号的余额减少了,但是钱却没有到手。这时候就要用到事务回滚了
什么是事务回滚?

事务回滚是指将该事务已经完成对数据库的更新操作撤销,在事务中,每个正确的原子都会被顺序执行,知道遇到错误的原子操作。

什么是回滚?
回滚是删除由一个或多个部分完成的事务执行的更新,为保证应用程序、数据库或系统错误后还原数据库的完整性,需要使用回滚。

回滚包括程序回滚数据回滚等类型(泛指程序更新失败,返回上一次正确状态行为)

11、如果一个liunx有个程序关闭了,但是线程还在执行如何关闭?
用ps-l查出该线程的线程id,如何用kill pid杀死这个线程

12、hashmap如何存取值?
存值用put方法
取值:
for循环取值:
for (String key:map.keySet()){
String s = map.get(key);
System.out.println(s);
}
迭代器取值:
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()){
String key = iterator.next();
String value = map.get(key);
System.out.println(“key:”+key+“value:”+value);
}

13、数据库如何去重?
1、用rowid方法
根据Oracle带的rowid属性,可以进行判断是否存在重复语句
2、用group by方法
主要用于分组统计,一般都是使用在聚合函数中使用
3、用distinct方法
一般用于比较小的表进行去重,会过滤掉多余的重复记录,返回不重复的记录或字段;

14、单例模式中的懒汉和饿汉那个更安全?
1.基本了解
懒汉模式:在类加载的时候不被初始化。
饿汉模式:在类加载的时候就完成了初始化,但是加载比较慢,获取对象比较快。
2.安全方面
懒汉模式在创建对象时不加上synchronized,会导致对象的访问是线程不安全的。
饿汉模式是线程安全的,在类创建好一个静态对象提供给系统使用。
3.实现方式的区别
懒汉模式延时加载,就是在需要的时候被创建。
饿汉模式在虚拟机启动的时候就会被创建。

15、数据库having的搭配?
Having语句是对分组之后的数据进行过滤,因此使用having前通常会使用group by
Where 和 having的异同
相同:
都是对数据进行过滤,只保留原始数据
where和having一样,都不允许出现字段的别名,只允许出现最原始的字段的名字
不同:
where对原始数据进行过滤,having对分组后的数据过滤
where必须写在having的前面,否则运行出错

16、IOC他的底层是怎么实现的?
xml解析、工厂模式、反射

17、如何实现一个ioc容器?
配置文件配置包扫描路径
递归包扫描获取.class文件
反射、确定需要交给IOC管理的类
对需要注入的类进行依赖注入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值