Java和框架的基本面试题汇总

java:

1.Java 中实现多态的机制是什么?

重载(overload)和重写(override)
如果一个子类继承了一个父类,子类中拥有和父类相同方法名称,返回值,参数类型的话,就是重写,会执行子类中的方法。
如果一个类中定义了多个同名方法,他们有不同的参数类型或者参数数量,那就叫重载(注:返回值类型可以不同)

2.java中的集合

java中的集合分为value(Collection),和key-value(Map)两种;

存储value的有list和set两种:
list是有序的,可重复的
set是无序的,不可重复的

存储为key-value是map:HashMap,Hashtable,CurrentHashMap

3.==和EQUALS的区别

关于==
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值。

2.复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地

equals
Java 语言里的 equals方法其实是交给开发者去覆写的,让开发者自己去定义满足什么条件的两个Object是equal的。

4.线程的的实现方式?怎么启动线程?怎么区分线程?

继承Thread类,不推荐
实现Runnable 接口
实现java.util.concurrent下的Callable接口
线程启动:调用start()方法;
怎么区分线程:给线程设置名字

5.设计模式和常用的设计模式

创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。

结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。

行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

6.说说 synchronized 关键字和 volatile 关键字的区别

volatile是线程同步的轻量级实现,性能比synchronized要好,但是volatile只能用于修饰变量,而synchronized可以修饰方法和代码块。
多线程访问volatile关键字不会发生阻塞,而synchonized可能会发生阻塞。
volatile关键字能保证数据的可见性,但不能保证数据的原子性。synchronized两者都能保证。
volatile关键字主要用于解决变量在多个线程之间的可见性,而synchronized关键字解决的是多线程之间访问资源的同步性。

7.多态: 为了实现多态要满足三个条件:(重写)

1、有类继承或者接口继承2、子类重写父类的方法3、父类的引用指向子类的对象。

8.有了synchronized,还要volatile干什么?

volatile通常被比喻成”轻量级的synchronized“,volatile可以保证可见性和有序性,实现原理是通过内存屏障实现的。
volatile有一个重要的作用,是synchronized不具备的,那就是禁止指令重排序。
这一特点在双重校验锁实现单例的时候有用到,虽然使用了synchronized关键字,但是如果不用volatile修饰单例对象,就会存在问题。

9.为什么重写equals必须重写hashcode?

比较两个相等时,先比较在list中的hashcode值,是否相等,如果相等再比较equals,若equals也相等则两个值相等,否则两个值不相等,因此两个是递进关系,重写了hashcode必须重写equals

10.为什么在静态方法中不能访问类的非静态成员变量和非静态成员方法?

由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。
并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。

11.讲一下Java内存模型?以及各个区域有什么作用?

堆:Java虚拟机栈是线程私有的,它的生命周期与线程相同。
虚拟机栈描述的是java方法执行的内存模型:每个方法执行的时候都会同时创建一个帧栈用于存储局部变量表、操作栈、动态链接、方法返回地址等信息。每个方法从调用到执行结束的过程,就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。
方法区:方法区也是线程共享的区域,用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。垃圾收集在这个区域较少出现,这个区域的内存回收目标主要针对常量池的回收和对类型的卸载。
Java虚拟机栈:Java虚拟机栈是线程私有的,它的生命周期与线程相同。
虚拟机栈描述的是java方法执行的内存模型:每个方法执行的时候都会同时创建一个帧栈用于存储局部变量表、操作栈、动态链接、方法返回地址等信息。每个方法从调用到执行结束的过程,就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。
本地方法栈:本地方法栈也是线程私有的。
虚拟机栈是为虚拟机执行Java方法,本地方法栈为虚拟机使用到的Native方法服务。
程序计数器:线程私有
程序计数器可以看做当前线程所执行的字节码的行号指示器。
字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理和线程恢复都依赖这个计数器来完成。

13.什么是Zookeeper?

Zookeeper是一个开放源码的分布式服务协调组件,是Google Chubby的开源实现。是一个高性能的分布式数据一致性解决方案。
他将那些复杂的、容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并提供一系列简单易用的接口给用户使用。

框架:

1.spring aop和ioc的理解

面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面
1.面向切面编程提供声明式事务管理
2.spring支持用户自定义的切面
ioc
许多应用都是通过彼此间的相互合作来实现业务逻辑的,
如类A要调用类B的方法,以前我们都是在类A中,通过自身new一个类B,然后在调用类B的方法,
现在我们把new类B的事情交给spring来做,在我们调用的时候,容器会为我们实例化。

2.说一下ioc实现原理?从源码分析?

创建容器Map,加载xml文件,遍历bean标签,遍历标签,将bean注册到容器中,通过name获取bean对象

3.Spring的事务管理机制实现的原理

通过这样一个动态代理对所有需要事务管理的Bean进行加载,
并根据配置在invoke方法中对当前调用的 方法名进行判定,
并在method.invoke方法前后为其加上合适的事务管理代码,
这样就实现了Spring式的事务管理。

4.spring常用注解

@Autowired顾名思义,就是自动装配,其作用是为了消除Java代码里面的getter/setter与bean属性中的property
。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。
@Autowirred默认按类型匹配的方式,在容器查找匹配的Bean,当且仅有一个匹配的Bean时,
Spring将其注入@AutoWired标注的变量中。
@Resource注解与@Autowired注解作用非常相似
区分一下@Autowired和@Resource两个注解的区别:
(1)、@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
(2)、@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了
Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。

@Component,用于标注一个普通的类
@Controller 用于标注一个控制器类
@Service 用于标注业务逻辑类
@Repository 用于标注DAO数据访问类

5.有没有使用过自定义注解?

自定义注解类编写的一些规则:

  1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.
  2. 参数成员只能用public或默认(default)这两个访问权修饰
  3. 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组.
  4. 要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,因为你除此之外没有别的获取注解对象的方法
  5. 注解也可以没有定义成员, 不过这样注解就没啥用了
    PS:自定义注解需要使用到元注解

6.在一个JAVA文件新增一行打印语句,tomcat需要重启吗?

就是不能修改方法名或者参数个数,否则是一定要重启的。

7.Spring中的工厂容器有哪两个,它们的区别是什么?

答:BeanFactory和ApplicationContext。

BeanFactory接口是Spring框架的顶层接口,是最原始的接口,ApplicationContext是对BeanFactory扩展,BeanFactory在第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean。

8.Spring框架中属性注入有哪几种方式:

答:Spring中的输入注入方式包括set方法注入、构造函数注入、p名称空间注入、spel注入,除此之外,还包括复杂方式注入,如数组、List、Map、Properties等属性的注入。

9.?简述一下bean的生命周期?

答:bean的生命周期包括bean的定义、bean的初始化、bean的调用和bean的销毁。

在配置文件里面通过来完成bean的定义,通过配置init-method属性来完成bean的初始化,通过得到bean的实例对象来完成bean的调用,通过配置destory-method属性来完成bean的销毁。

10.Spring的配置有哪些?简单说一下。

答:Spring整合Dao,要配置数据库启动,配置SqlSessionFactory,配置Mapper动态代理。

? ?Spring整合Service,要配置包扫描器(开启注解驱动),要配置事务管理(事务管理器,事务通知,事务切面)。

? ?Spring整合Web,要配置包扫描器(扫描Controller),配置处理器映射器和处理器适配器(采用注解驱动的方法),配置视图解析器。

??在web.xml,要加载Spring容器,并且要配置一个springMVC的前端控制器。

11.如何在 spring 中启动注解装配?

默认情况下,Spring 容器中未打开注解装配。因此,要使用基于注解装配,我们必须通过配置<context:annotation-config /> 元素在 Spring 配置文件中启用它。

12.Spring 框架中用到了哪些设计模式?请举例说明

Spring 框架中使用到了大量的设计模式,下面列举了比较有代表性的:

代理模式 — 在 AOP 和 remoting 中被用的比较多 。

单例模式 — 在 spring 配置文件中定义的 bean 默认为单例模式 。

模板方法 — 用来解决代码重复的问题 。 比如 RestTemplate, ? JmsTemplate, ? JpaTemplate。

前端控制器 —Spring 提供了 DispatcherServlet 来对请求进行分发 。

视图帮助 (View Helper ? )—Spring 提供了一系列的 JSP 标签,高效宏来辅助将分散的代码整合在视图里 。

依赖注入 — 贯穿于 BeanFactory ? / ? ApplicationContext 接口的核心理念 。

工厂模式 —BeanFactory 用来创建对象的实例

有技术问题欢迎在下方评论交流!!!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值