面试题:
1.请解释一下Overloading与Override的区别?在OverLoading时能否改变返回值类型?
2.请解释ArrayList与LinkList的区别?
ArrayList和LinkList都属于List接口的子类:
ArrayList是针对于数组的包装,而LinkedList是针对于链表的包装。
3.请解释String类两种实例化方法的区别?
直接赋值:只会开辟一块堆内存空间,并且声明的对象可以自动保存在对象池之中,以供相同内容的字符串对象引用;
构造方法实例化:会开辟两块堆内存空间,并且有一块堆内存将成为垃圾,此类模式产生的实例化对象,不会自动入池,但是可以通过intern()方法手工入池。开发之中全部都要求使用直接赋值的模式完成。
4.如果要使用抽象类,在java中请按照如下的规则进行:
·抽象类必须有子类:
·抽象类的子类(如果不是抽象类)则要求覆写抽象类中的全部抽象方法;
·如果要想实例化抽象类对象,则可以依靠子类对象的向上转型方式实现;
特点:
·抽象类作为参数统一的类型;
·抽象方法实际上要比普通方法多了一个强制的概念,要求子类必须覆写;
·抽象类的子类依然使用extends关键字定义,所以一个子类只能够继承一个抽象类,依然存在单继承局限。
接口:接口与抽象类的最大区别在于:抽象子类只允许继承一个抽象类,而接口的子类可以同时实现多个接口,避免了单继承局限。
5.class Singleton {
Private static final Singleton INSTANCE=new Singleton();
Private Singleton(){}
Public void print(){
System.out.println(“Hello World!”);
}
Public static Singleton getInstance(){
Return INSTANCE;
}
}
Public class TestDemo{
Public stastic void main(String args[]){
Singleton inst = null; //声明对象
inst = Singleton.getInstance(); //实例化对象
inst.print(); //通过实例化对象调用方法
}
}
6.线程
最重要的一句话,启动多线程一定需要Thread类中的Start()方法。而且start()方法实际上最终依然会调用run()方法
7.Thread 与Runnable实现区别(面试题),首先从使用上讲一定使用Runables实现多线程,因为可以避免单继承局限。使用Runable实现的多线程处理要比Thread实现的多线程处理可以更加方便的描述出数据共享的概念
8.线程的状态控制(面试题)
所有的线程实际上都是通过主方法创建的,那么对于线程的创建与,执行实际上并不是像大家想的那样,安装顺序完成的。因为所有的线程执行都有一段自己创建以及执行阶段。
(1)线程对象使用new来进行创建,但是由于JVM而言,此时也只是创建了一个线程类的对象而已,这个对象还没有意义;
(2)当线程对象调用了start()之后才表示线程已经启动了,但是此时可能有20个线程同时调用start()不表示你就可以执行了;
(3)所有的线程调用了start()之后将进入就绪状态,等待系统分配资源(等着抢占资源);
(4)抢占到资源的线程开始执行,但是一个线程并不能够一直占用资源,而是需要进行轮流运行,所以当一个线程运行一段时间(不固定)之后,那么就会让出资源,虽有其他线程继续开始抢占。
(5)如果此时线程的操作执行完毕(run()执行完了),那么将进入到结束状态。
- 死锁:发现此时程序执行之中将立刻停止向下运行,因为出现了线程彼此的等待问题,那么这样的问题就是死锁。
9.请问多个线程访问同一资源时需要注意什么?可能带来哪些问题?
多个线程访问同一资源必须考虑同步问题,同步可以使用synchronized定义方法或代码块;
过多的同步可能会造成死锁。
10.请解释wait()和sleep()的区别?
Wait()是Object类中定义的方法,必须通过notify(),notifyAll()唤醒;
Sleep()是Thread类中的static方法,到时间之后可以自动唤醒。
11.Hibernate 与 MyBatis 区别? Hibernate 的开发依然需要像传统 JDBC 那样编写数据层开发实现,而 MyBatis 不需要你去写数据层实现,只要你有接口,自 动实现数据层开发。 Hibernate 适合于可移植性的开发环境,MyBatis 没有此项功能。
- Spring MVC 指的是 Spring 本身针对于 MVC 设计开发所提出一种框架,那么这种框架最直接的优点在于:简单易用,并且其 结构设计完全复合于传统的 MVC 设计开发。
13.SpringMVC常用注解@Controller //当前的这个程序属于Spring MVC的一个控制器@RequestMapping 请求映射路径 @RequestParam(“empno” ) 最大的好处在于:如果现在你没有设置参数内容,则可以自动使用一个默认值来替换。
Annotation注入:
数据层(仓库配置类):@Repository
业务层(业务配置类):@Service
控制层(控制配置类):@Controller
工具组件(工具配置类):@Component
注入一个bean(对象):@Autowired, @Resource
14.在配置文件中两种标记的区别:
{}:表示一个占位符,避免sql注入,相当于ParpareStatement中的?,变量名可以为value或其他名称,如#{value},或#{id}等。value值加默认修饰’’
${}:表示sql拼接,相当于sql字符串拼接,无法避免sql注入
{}拼接符,变量名必须使用value
${value}直接将value获取到拼接地址sql中,value值不加任何修饰
{}方法无法防止sql注入;3.${}一般用与传入数据库对象,比如数据库表名;4.能用#{}时尽量用#{}
{}:那么该值在最终解析的时候会变为“?”解析。很大程度防止sql注入;
15.接口和抽象类的区别?
16.resultType和resultMap区别。
17.继承和接口的区别
18.Mybatis和hibernate的区别
Orm:mybatis不是一个完全的orm框架,hibernate是一个完全的orm框架。Mybatis需要程序员自己写sql,但是也存在映射(输入参数映射,输出结果映射)
学习门槛:mybatis比hibernate低。
应用的领域:
对于中小型项目,且需求固定,关系模型相对固定建议使用hibernate。适用传统项目,比如ERP。
对于需求不固定的项目,比如:互联网项目,建议使用mybatis,可以灵活去编写sql语句。
Mybatis开发:
第一步:编写SqlMapConfig.xml全局配置文件(重点配置mapper)
第二步:编写mapper.xml映射文件(重点)
定义statement(包括sql语句,输入和输出 参数类型)
在SqlMapConfig.xml全局配置文件配置mapper.xml(此配置可以通过规则省略)
第三步:编写程序(重点)
获取SqlSessionFactory
通过SqlSessionFactory获取SqlSession
通过SqlSession操作数据库(调用上边定义的statement)
得到statement的输出映射java对象
19.zookeeper与dubbo的关系?
1 Mybatis解决jdbc编程的问题
1、 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
2、 Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4、 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
2 与hibernate不同
Orm:mybatis不是一个完全的orm框架,hibernate是一个完全的orm框架。Mybatis需要程序员自己写sql,但是也存在映射(输入参数映射,输出结果映射)
学习门槛:mybatis比hibernate低。
应用的领域:
对于中小型项目,且需求固定,关系模型相对固定建议使用hibernate。适用传统项目,比如ERP。
对于需求不固定的项目,比如:互联网项目,建议使用mybatis,可以灵活去编写sql语句。
3 SqlSession使用方法
SqlSessionFactoryBuilder:用于创建SqlSessionFactory,将SqlSessionFactoryBuilder当成工具类使用。
SqlSessionFactory:会话工厂,用于创建SqlSession,SqlSessionFactory一旦创建成功,不用每次创建工厂,建议单例模式使用工厂。如果和spring整合后,由spring来管理SqlSessionFactory,在spring容器中SqlSessionFactory是一个单例对象。
SqlSession:(重点)是一个面向用户的接口,通过SqlSessionFactory获取SqlSession,每次数据操作都需要创建新的SqlSession,SqlSession 不是线程安全,最佳应用场合是方法体内,在方法中定义一个SqlSession局部变量。
4 Mapper动态代理方法
Mapper动态代理方法:程序员只需要写dao接口(Mapper),而不需要写dao实现类,由mybatis根据dao接口和映射文件中statement的定义生成接口实现代理对象。可以调用代理对象方法。
Mybatis官方建议:将dao接口叫做mapper。
目标:通过一些规则让mybatis根据dao接口和映射文件中statement的定义生成接口实现代理对象
mybatis将以下代码自动在代理对象实现:
User user = sqlSession.selectOne("test.findUserById", id);
如何让mapper接口找到mapper.xml中statement的id
4.1 Mapper开发规则
1、 在mapper.xml中将namespace设置为mapper.java的全限定名
2、 将mapper.java接口的方法名和mapper.xml中statement的id保持一致。
3、 将mapper.java接口的方法输入参数类型和mapper.xml中statement的parameterType保持一致
4、 将mapper.java接口的方法输出 结果类型和mapper.xml中statement的resultType保持一致
[图片上传失败...(image-85841d-1552140274566)]
Spring事务传播行为
在TransactionDefinition(事务的定义)接口中定义了七个事务传播行为:
PROPAGATION(传播[per,rou,pergeishen]) REQUIRED([rikuaierde]必修的):如果存在一个事务,则支持当前事务。如果没有事务则开启一个新事务。
PROPAGATION_SUPPORTS([sepaote]支持):如果存在一个事务,支持当前事务。如果没有事务则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。
PROPAGATION_MANDATORY(mandeteri强制的):如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
PROPAGATION_REQUIRES(需要)_NEW:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
PROPAGATION_NOT_SUPPORTED([sepaotid]支持):总是非事务地执行,并挂起任何存在的事务。
PROPAGATION_NEVER:总是非事务地执行,如果存在一个活动事务,则抛出异常;
PROPAGATION_NESTED([nestid]嵌套的):如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行
Spring事务隔离级别
在TransactionDefinition接口中定义了五个不同的事务隔离级别:
ISOLATION([aseleisen]隔离)_DEFUALT:这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应;
ISOLATION_READ_UNCOMMITTED([ankemeitide] 不受约束的):这是事务最低的隔离级别,它允许别一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。
ISOLATION_READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取改事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻象读。
ISOLATION_REPEATABLE([ripitebao]可重复的)_READ:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻象读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
ISOLATION_SERIALIZABLE(序列号功能的接口):这是花费最高代价但是可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻象读。