JAVA基础整理

来源:互联网 发布:手机画板软件免费版 编辑:程序博客网 时间:2024/06/09 18:37

面试

40min

1.java基础掌握+框架 2.做事态度3.思维活跃性 安卓转Java??确认要做服务器端开发

1.别人问你们这个是干什么的??

项目[逻辑性+做事态度和习惯]

描述一下项目,项目中哪些是你负责的?项目上遇到的问题?怎么解决的?做完项目的反思和总结?有梳理文档吗?

情感文本分析

http://www.jianshu.com/p/4cfcf1610a73?nomobile=yes

框架  接触过java web开发吗?【1.会spring,mybatis配置和写代码吗?能干活吗?2学习的深度】

了解spring吗?简单说一下?

SpringIOC注入方式

谈谈你对springIOC和DI的理解,它们有什么区别?

BeanFactory接口和ApplicationContext 接口有什么区别 ?

spring配置bean实例化有哪些方式?

简单的说一下spring的生命周期?

请介绍一下Spring框架中Bean的生命周期和作用域

Spring里面applicationContext.xml文件能不能改成其他文件名?

介绍一下Spring的事物管理

SpringAOP思想

spring(IOCAOP) 实现原理

mybatis用过吗 

Spring里面如何配置数据库驱动?

数据库【能干活吗】

基本的sql语句写一条看看

基础【1.经常写java代码吗?2.了解的深度和原理?】

hashmap实现(挖一下)

再散列rehash过程

操作系统内存管理方式

javaGC机制(挖一下)

什么是值传递和引用传递?一段代码(细节部分)

java支持的数据类型有哪些?什么是自动拆装箱?

jvm内存模型

集合类

private、默认、protectedpublic作用范围

使用静态工厂方法的好处和坏处?(设计模式)

手写代码【代码风格+经常写代码否?+ 代码严谨性】

栈的实现二分查找 floyed 反转数组判断一个数是否是2的幂次方 x&(x-1)  随便一种排序算法讲讲算法思想,内存复杂度和时间复杂度的分析过程?

java读文件

一个数组求出最大值的比较次数,最小值的比较次数?

求出一个数二进制值最低位

个人规划 逻辑思维(可以从算法题里和项目总结,自我介绍里挖,如何简洁清晰的描述项目) 做事态度(可以从项目里挖)

面试

40min

1.java基础掌握+框架

2.做事态度

3.思维活跃性

安卓转Java??

一个数组求出最大值的比较次数,最小值的比较次数?

求出一个数二进制值最低位

确认要做服务器端开发

1.别人问你们这个是干什么的??

 

项目

情感文本分析

http://www.jianshu.com/p/4cfcf1610a73?nomobile=yes

描述一下项目,项目中哪些是你负责的?项目上遇到的问题?怎么解决的?做完项目的反思和总结?有梳理文档吗?

框架

1.SpringIOC注入方式

1)配置文件中,配置属性,提供setter/getter方法

2)零配置,@Autowired,统一配置根据名称或者类型注入

 

SpringAOP思想

针对请求做统一预处理,如有效性校验;或后处理,如记录处理结果;针对方法加before或after处理

spring(IOCAOP) 实现原理

切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用通用类(基于模式的风格)或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。

 

连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在Spring AOP中,一个连接点总是 代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。

 

通知(Advice):在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。

 

切入点(Pointcut):匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。

 

引入(Introduction):(也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。

 

目标对象(Target Object):被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做被通知(advised)对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。

 

AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。

 

织入(Weaving):把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其他纯Java AOP框架一样,在运行时完成织入。

 

mybatis用过吗 

谈谈你对springIOC和DI的理解,它们有什么区别?

IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spring框架管理,简单说,就是创建UserService对象控制权被反转到了Spring框架

DI:Dependency Injection依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件

面试题: IoC 和 DI的区别?

IoC 控制反转,指将对象的创建权,反转到Spring容器 , DI 依赖注入,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入

BeanFactory接口和ApplicationContext 接口有什么区别 ?

 

    ①ApplicationContext接口继承BeanFactory接口,Spring核心工厂是BeanFactory ,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean,ApplicationContext是会在加载配置文件时初始化Bean。

    ②ApplicationContext是对BeanFactory扩展,它可以进行国际化处理、事件传递和bean自动装配以及各种不同应用层的Context实现

开发中基本都在使用ApplicationContext, web项目使用WebApplicationContext,很少用到BeanFactory

BeanFactory beanFactory = newXmlBeanFactory(new ClassPathResource("applicationContext.xml"));

IHelloService helloService =(IHelloService) beanFactory.getBean("helloService");

helloService.sayHello();

spring配置bean实例化有哪些方式?

    1)使用类构造器实例化(默认无参数)

<bean id="bean1"class="cn.itcast.spring.b_instance.Bean1"></bean>

    2)使用静态工厂方法实例化(简单工厂模式)

//下面这段配置的含义:调用Bean2Factory的getBean2方法得到bean2

<bean id="bean2"class="cn.itcast.spring.b_instance.Bean2Factory"factory-method="getBean2"></bean>

    3)使用实例工厂方法实例化(工厂方法模式)

 //先创建工厂实例bean3Facory,再通过工厂实例创建目标bean实例

<bean id="bean3Factory" class="cn.itcast.spring.b_instance.Bean3Factory"></bean>

<bean id="bean3"factory-bean="bean3Factory"factory-method="getBean3"></bean>

简单的说一下spring的生命周期?

   1)在配置 <bean> 元素,通过 init-method 指定Bean的初始化方法,通过 destroy-method 指定Bean销毁方法

<beanid="lifeCycleBean"class="cn.itcast.spring.d_lifecycle.LifeCycleBean"init-method="setup"destroy-method="teardown"></bean>

需要注意的问题:

   *  destroy-method 只对scope="singleton" 有效

   *  销毁方法,必须关闭ApplicationContext对象(手动调用),才会被调用

ClassPathXmlApplicationContextapplicationContext = newClassPathXmlApplicationContext("applicationContext.xml");

applicationContext.close();

   2)Bean的完整生命周期(十一步骤)【了解内容,但是对于spring内部操作理解有一定帮助】

 

①instantiate bean对象实例化

 

②populate properties 封装属性

 

③如果Bean实现BeanNameAware 执行 setBeanName

 

④如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象setApplicationContext

 

⑤如果存在类实现 BeanPostProcessor(后处理Bean),执行postProcessBeforeInitialization,BeanPostProcessor接口提供钩子函数,用来动态扩展修改Bean。(程序自动调用后处理Bean)

publicclassMyBeanPostProcessorimplementsBeanPostProcessor{

publicObjectpostProcessAfterInitialization(Object bean,String beanName)

throwsBeansException{

System.out.println("第八步:后处理Bean,after初始化。");

//后处理Bean,在这里加上一个动态代理,就把这个Bean给修改了。

return bean;//返回bean,表示没有修改,如果使用动态代理,返回代理对象,那么就修改了。

}

publicObjectpostProcessBeforeInitialization(Object bean,String beanName)

throwsBeansException{

System.out.println("第五步:后处理Bean的:before初始化!!");

//后处理Bean,在这里加上一个动态代理,就把这个Bean给修改了。

return bean;//返回bean本身,表示没有修改。

}

}

注意:这个前处理Bean和后处理Bean会对所有的Bean进行拦截。

⑥如果Bean实现InitializingBean 执行 afterPropertiesSet

⑦调用<bean init-method="init"> 指定初始化方法 init

⑧如果存在类实现 BeanPostProcessor(处理Bean),执行postProcessAfterInitialization

⑨执行业务处理

⑩如果Bean实现 DisposableBean 执行 destroy

⑪调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy

请介绍一下Spring框架中Bean的生命周期和作用域

 (1)bean定义

    在配置文件里面用<bean></bean>来进行定义。

 (2)bean初始化

    有两种方式初始化:

A.在配置文件中通过指定init-method属性来完成

B.实现org.springframwork.beans.factory.InitializingBean接口

 (3)bean调用

 

    有三种方式可以得到bean实例,并进行调用

 

(4)bean销毁

 

    销毁有两种方式

 

A.使用配置文件指定的destroy-method属性

 

B.实现org.springframwork.bean.factory.DisposeableBean接口

##作用域

 

singleton

 

当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。

prototype

Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean() 方法)时都会创建一个新的bean实例。根据经验,对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用 singleton作用域

request

在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。

session

在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

global session

在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于 web的Spring ApplicationContext情形下有效。

9.Spring里面如何配置数据库驱动?

使用”org.springframework.jdbc.datasource.DriverManagerDataSource”数据源来配置数据库驱动。示例如下:

<bean id=”dataSource”>

   <property name=”driverClassName”>

       <value>org.hsqldb.jdbcDriver</value>

   </property>

   <property name=”url”>

       <value>jdbc:hsqldb:db/appfuse</value>

   </property>

   <propertyname=”username”><value>abc</value></property>

   <propertyname=”password”><value>abc</value></property>

</bean>

10.Spring里面applicationContext.xml文件能不能改成其他文件名?

ContextLoaderListener是一个ServletContextListener,它在你的web应用启动的时候初始化。缺省情况下,它会在WEB-INF/applicationContext.xml文件找Spring的配置。 你可以通过定义一个<context-param>元素名字为”contextConfigLocation”来改变Spring配置文件的 位置。示例如下:

<listener>

   <listener-class>org.springframework.web.context.ContextLoaderListener

       <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>/WEB-INF/xyz.xml</param-value>

       </context-param>   

   </listener-class>

</listener>

 

14.介绍一下Spring的事物管理

 

    事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库数据出现问题。

 

开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。spring提供了几个关于事务处理的类:

 

TransactionDefinition //事务属性定义

 

TranscationStatus //代表了当前的事务,可以提交,回滚。

 

PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类 AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。

 

一般事务定义步骤:

TransactionDefinition td=newTransactionDefinition();

TransactionStatus ts =transactionManager.getTransaction(td);

try{

   //do sth

    transactionManager.commit(ts);

}catch(Exception e){

   transactionManager.rollback(ts);

}

   spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。

 

 

编程式主要使用transactionTemplate。省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象.

void add(){

   transactionTemplate.execute(newTransactionCallback(){

       pulic Object doInTransaction(TransactionStatus ts){

        //do sth

       }

    }

}

声明式:

使用TransactionProxyFactoryBean:PROPAGATION_REQUIREDPROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly

 

围绕Poxy的动态代理能够自动的提交和回滚事务

 

org.springframework.transaction.interceptor.TransactionProxyFactoryBean

 

PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

 

PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。

 

PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。

 

PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。

 

PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

 

PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。

 

PROPAGATION_NESTED–如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与 PROPAGATION_REQUIRED类似的操作。

数据库

基本的sql语句写一条看看

基础

hashmap实现

再散列rehash过程

当哈希表的容量超过默认容量时,必须调整table的大小。当容量已经达到最大可能值时,那么该方法就将容量调整到Integer.MAX_VALUE返回,这时,需要创建一张新表,将原表的映射到新表中。

使用的时候有哪些注意点??

在迭代器里使用hashmap?

操作系统内存管理方式

javaGC机制

我自己分析一下这个问题,首先是“什么时候”,不同层次的回答从低到高排列:

1.系统空闲的时候。

分析:这种回答大约占30%,遇到的话一般我就会准备转向别的话题,譬如算法、譬如SSH看看能否发掘一些他擅长的其他方面。

 

2.系统自身决定,不可预测的时间/调用System.gc()的时候。

分析:这种回答大约占55%,大部分应届生都能回答到这个答案,起码不能算错误是吧,后续应当细分一下到底是语言表述导致答案太笼统,还是本身就只有这样一个模糊的认识。

 

3.能说出新生代、老年代结构,能提出minorgc/full gc

分析:到了这个层次,基本上能说对GC运作有概念上的了解,譬如看过《深入JVM虚拟机》之类的。这部分不足10%。

 

4.能说明minorgc/full gc的触发条件、OOM的触发条件,降低GC的调优的策略。

分析:列举一些我期望的回答:eden满了minor gc,升到老年代的对象大于老年代剩余空间full gc,或者小于时被HandlePromotionFailure参数强制full gc;gc与非gc时间耗时超过了GCTimeRatio的限制引发OOM,调优诸如通过NewRatio控制新生代老年代比例,通过 MaxTenuringThreshold控制进入老年前生存次数等……能回答道这个阶段就会给我带来比较高的期望了,当然面试的时候正常人都不会记得每个参数的拼写,我自己写这段话的时候也是翻过手册的。回答道这部分的小于2%。

 

PS:加起来不到100%,是因为有确实少数直接说不知道,或者直接拒绝回答的= =#

 

分析第二个问题:“对什么东西”:

 

1.不使用的对象。

分析:相当于没有回答,问题就是在问什么对象才是“不使用的对象”。大约占30%。

 

2.超出作用域的对象/引用计数为空的对象。

分析:这2个回答站了60%,相当高的比例,估计学校教java的时候老师就是这样教的。第一个回答没有解决我的疑问,gc到底怎么判断哪些对象在不在作用域的?至于引用计数来判断对象是否可收集的,我可以会补充一个下面这个例子让面试者分析一下obj1、obj2是否会被GC掉?

class C{

publicObject x;

}

C obj1、obj2= new C();

obj1.x = obj2;

obj2.x = obj1;

obj1、obj2= null;

 

3.从gcroot开始搜索,搜索不到的对象。

分析:根对象查找、标记已经算是不错了,小于5%的人可以回答道这步,估计是引用计数的方式太“深入民心”了。基本可以得到这个问题全部分数。

PS:有面试者在这个问补充强引用、弱引用、软引用、幻影引用区别等,不是我想问的答案,但可以加分。

 

4.从root搜索不到,而且经过第一次标记、清理后,仍然没有复活的对象。

分析:我期待的答案。但是的确很少面试者会回答到这一点,所以在我心中回答道第3点我就给全部分数。

 

最后由一个问题:“做什么事情”,这个问发挥的空间就太大了,不同年代、不同收集器的动作非常多。

 

1.删除不使用的对象,腾出内存空间。

分析:同问题2第一点。40%。

 

2.补充一些诸如停止其他线程执行、运行finalize等的说明。

分析:起码把问题具体化了一些,如果像答案1那样我很难在回答中找到话题继续展开,大约占40%的人。

补充一点题外话,面试时我最怕遇到的回答就是“这个问题我说不上来,但是遇到的时候我上网搜一下能做出来”。做程序开发确实不是去锻炼茴香豆的“茴”有几种写法,不死记硬背我同意,我不会纠语法、单词,但是多少你说个思路呀,要直接回答一个上网搜,我完全没办法从中获取可以评价应聘者的信息,也很难从回答中继续发掘话题展开讨论。建议大家尽量回答引向自己熟悉的,可讨论的领域,展现给面试官最擅长的一面。

 

3.能说出诸如新生代做的是复制清理、fromsurvivor、to survivor是干啥用的、老年代做的是标记清理、标记清理后碎片要不要整理、复制清理和标记清理有有什么优劣势等。

分析:也是看过《深入JVM虚拟机》的基本都能回答道这个程度,其实到这个程度我已经比较期待了。同样小于10%。

 

4.除了3外,还能讲清楚串行、并行(整理/不整理碎片)、CMS等搜集器可作用的年代、特点、优劣势,并且能说明控制/调整收集器选择的方式。

分析:同上面2个问题的第四点。

 

最后介绍一下自己的背景,在一间不大不小的上市软件公司担任平台架构师,有3年左右的面试官经验,工作主要方向是大规模企业级应用,参与过若干个亿元级的项目的底层架构工作。

 

什么是值传递和引用传递?一段代码

java支持的数据类型有哪些?什么是自动拆装箱?

jvm内存模型

集合类

private、默认、protected、public作用范围

1)private,同类

2)默认,同类、同包

3)protected,同类,同包,子类

4)public,所有

 

使用静态工厂方法的好处和坏处?

【手写代码】

栈的实现二分查找 floyed 反转数组判断一个数是否是2的幂次方 x&(x-1)  随便一种排序算法讲讲算法思想,内存复杂度和时间复杂度的分析过程?

 

java读文件

个人规划 逻辑思维 做事态度

 
原创粉丝点击