【Java面试最近遇到的问题总结】

问题:一张表数据千万级,关联好几张表做查询现在性能很慢,提出优化思路
1.查看索引是否导致问题,索引创建是否合理;
2.经常更新一张表,会导致维护索引的代价提升,因而索引常见不应该在主键上面,如果主键不存在索引,因而可以考虑读写分离的表;
3.系统I/O问题;
4.SQL语句是否有进一步优化的余地;

问题:struts1、struts2线程安全问题
struts1线程不安全,采用的是单例模式,所有的请求共享同一个action对象;在用struts1的时候不能在action里面定义属性。要用到只的话只能在方法里面定义。
struts2线程安全;Strtus2会获取到用户的http请求,然后负责给每个请求实例化一个Action 对象;
struts1的 action对servlet没有进行任何的包装,它是直接实现的Java WEB API 里面的servlet 接口。所以才会有线程安全的问题,但是struts2底层帮我们封装了Servlet,使开发人员不用直接接触Servlet。具体做法是
Strtus2截获servlet请求,然后给每个请求实例化一个Action对象,请求结束之后销毁Action对象。至于Strtus2具体是怎么做的,我这里不赘叙,大家可以去参看Struts2的有关介绍。
spring里面去定义bean的时候,spring默认用的是单例模式--即修改scope为prototype。

问题:hibernate缓存问题
hibernate是一个线程对应一个session,一个线程可以看成一个用户。也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和线程绑定了。
hibernate一级缓存生命周期很短,和session生命周期一样,一级缓存也称session级的缓存或事务级缓存。如果tb事务提交或回滚了,我们称session就关闭了,生命周期结束了。
缓存和连接池的区别:缓存和池都是放在内存里,实现是一样的,都是为了提高性能的。但有细微的差别,池是重量级的,里面的数据是一样的,比如一个池里放100个Connection连接对象,这个100个都是一样的。缓存里的数据,每个都不一样。比如读取100条数据库记录放到缓存里,这100条记录都不一样。
二级缓存需要sessionFactory来管理,它是进初级的缓存,所有人都可以使用,它是共享的。二级缓存比较复杂,一般用第三方产品。hibernate提供了一个简单实现,用Hashtable做的,只能作为我们的测试使用,商用还是需要第三方产品。

问题:struts如何获取页面上form表单的数据
提交的表单struts获取一个文本框的值可以通过get/set实现

问题:jdbc与hibernate区别
JDBC与Hibernate在性能上相比,JDBC灵活性有优势。而Hibernate在易学性,易用性上有些优势。当用到很多复杂的多表联查和复杂的数据库操作时,JDBC有优势
相同点:
◆两者都是JAVA的数据库操作中间件。
◆两者对于数据库进行直接操作的对象都不是线程安全的,都需要及时关闭。
◆两者都可以对数据库的更新操作进行显式的事务处理。
不同点:
◆使用的SQL语言不同:JDBC使用的是基于关系型数据库的标准SQL语言,Hibernate使用的是HQL(Hibernate query language)语言
◆操作的对象不同:JDBC操作的是数据,将数据通过SQL语句直接传送到数据库中执行,Hibernate操作的是持久化对象,由底层持久化对象的数据更新到数据库中。
◆数据状态不同:JDBC操作的数据是“瞬时”的,变量的值无法与数据库中的值保持一致,而Hibernate操作的数据是可持久的,即持久化对象的数据属性的值是可以跟数据库中的值保持一致的。
JDBC与Hibernate读取性能
1、JDBC仍然是最快的访问方式,不论是Create还是Read操作,都是JDBC快。
2、Hibernate使用uuid.hex构造主键,性能稍微有点损失,但是不大。
3、Create操作,JDBC在使用批处理的方式下速度比Hibernate快,使用批处理方式耗用JVM内存比不使用批处理方式要多得多。
4、读取数据,Hibernate的Iterator速度非常缓慢,因为他是每次next的时候才去数据库取数据,这一点从观察任务管理器的java进程占用内存的变化也可以看得很清楚,内存是几十K几十K的增加。
5、读取数据,Hibernate的List速度很快,因为他是一次性把数据取完,这一点从观察任务管理器的java进程占用内存的变化也可以看得很清楚,内存几乎是10M的10M的增加。
6、JDBC读取数据的方式和Hibernate的List方式是一样的(这跟JDBC驱动有很大关系,不同的JDBC驱动,结果会很不一样),这从观察java进程内存变化可以判断出来,由于JDBC不需要像Hibernate那样构造一堆Cat对象实例,所以占用JVM内存要比Hibernate的List方式大概少一半左右。
7、Hibernate的Iterator方式并非一无是处,它适合于从大的结果集中选取少量的数据,即不需要占用很多内存,又可以迅速得到结果。另外Iterator适合于使用JCS缓冲。

问题:AOP原理解释、使用场景
AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。
AOP使用场景
AOP用来封装横切关注点,具体可以在下面的场景中使用:
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging  调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence  持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
实现AOP的技术,主要分为两大类:
一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;
二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
横切关注点可能包含很多,比如非业务的:日志、事务处理、缓存、性能统计、权限控制等等这些非业务的基础功能;
参考资料:
http://sishuok.com/forum/blogPost/list/2466.html
http://blog.csdn.net/moreevan/article/details/11977115

问题:单例模式代码
//懒汉式单例类.在第一次调用的时候实例化   
public class Singleton2 {  
    //私有的默认构造子  
    private Singleton2() {}  
    //注意,这里没有final      
    private static Singleton2 single=null;  
    //静态工厂方法   
    public synchronized  static Singleton2 getInstance() {  
         if (single == null) {    
             single = new Singleton2();  
         }    
        return single;  
    }  
}  
//饿汉式单例类.在类初始化时,已经自行实例化   
public class Singleton1 {  
    //私有的默认构造子  
    private Singleton1() {}  
    //已经自行实例化   
    private static final Singleton1 single = new Singleton1();  
    //静态工厂方法   
    public static Singleton1 getInstance() {  
        return single;  
    }  
}  
Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例在。 使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回(garbage collection)。


问题:jdk中的动态代理
http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html
http://blog.csdn.net/z69183787/article/details/8263995


问题:简述GC机制
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的".当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。但是,为了保证 GC能够在不同平台实现的问题,Java规范对GC的很多行为都没有进行严格的规定。
http://blog.csdn.net/ithomer/article/details/6252552


问题:系统采用ssh结构时,需要做两张表的union,hql语句是否能实现?
hql不支持union


问题;一个form表单中有一个ajax验证数据的,假如提交验证不通过,此时form表单还会提交,请问该问题如何处理?
使用ajax做表单的提交,


问题:简述MVC


问题:工厂模式简单描述
定义一个类用于创建对象的接口,让子类决定实例化哪一个类,工厂方法是一个类的实例化延迟到子类;


问题:jsp的内置对象、jsp的属性
request,response,application servlet,pagecontext,session,out,config servlet,page jsp exception
jsp:include jsp:useBean,jsp:getproperty,jsp:setproperty,jsp:plugin,jsp:forward


问题;java访问权限
属性     当前类 同一个包 不同包子类 不同包的非子类
private    R
default    R      R
protected  R      R        R
public     R      R        R          R


问题:abstract class和interface




问题:java中多线程即区别
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。
Thread和Runnable的区别:
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。


http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html


问题:java事务类型
Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值