前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >新出炉的java面试题

新出炉的java面试题

作者头像
爱明依
发布2022-04-01 08:00:10
3470
发布2022-04-01 08:00:10
举报
文章被收录于专栏:爱明依爱明依

面试题:

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()执行完了),那么将进入到结束状态。

  1. 死锁:发现此时程序执行之中将立刻停止向下运行,因为出现了线程彼此的等待问题,那么这样的问题就是死锁。

9.请问多个线程访问同一资源时需要注意什么?可能带来哪些问题?

多个线程访问同一资源必须考虑同步问题,同步可以使用synchronized定义方法或代码块;

过多的同步可能会造成死锁。

10.请解释wait()和sleep()的区别?

Wait()是Object类中定义的方法,必须通过notify(),notifyAll()唤醒;

Sleep()是Thread类中的static方法,到时间之后可以自动唤醒。

11.Hibernate 与 MyBatis 区别? Hibernate 的开发依然需要像传统 JDBC 那样编写数据层开发实现,而 MyBatis 不需要你去写数据层实现,只要你有接口,自 动实现数据层开发。 Hibernate 适合于可移植性的开发环境,MyBatis 没有此项功能。

  1. 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(序列号功能的接口):这是花费最高代价但是可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻象读。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • {}:表示一个占位符,避免sql注入,相当于ParpareStatement中的?,变量名可以为value或其他名称,如#{value},或#{id}等。value值加默认修饰’’
  • {}:那么该值在最终解析的时候会变为“?”解析。很大程度防止sql注入;
  • 1 Mybatis解决jdbc编程的问题
  • 2 与hibernate不同
  • 3 SqlSession使用方法
  • 4 Mapper动态代理方法
    • 4.1 Mapper开发规则
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档