Java面试总结

Java基础部分

1、冒泡排序算法

int []arr = {43,12,56,90,3,100};
        for(int i = 0;i<arr.length;i++){
            for(int j=0;j<arr.length-i-1;j++){
                if(arr[j]>arr[j+1]){
                    int a = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = a;
                }
            }
        }

2、基本数据类型

byte、int、char、long、float、double、boolean和short。

java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。

3、GC

GC是Java中的垃圾回收,Java中垃圾收集器会自动进行管理。要请求垃圾收集,也可以通过System.gc() 或Runtime.getRuntime().gc()。

4、垃圾回收算法

标记--清除:在存活对象较多时,很高效,但是会造成内存碎片。

复制:控件存活的对象较少时很高效,但需要一块内存交换空间用于移动。

标记--整理:在回收不存活的对象占用空间后,将存活对象向空闲空间移动,成本较高,但没有内存碎片。

5、堆,栈

堆:new创建的对象,不随方法结束而消失。局部变量使用final修饰后放在堆中。

栈:存储方法内部局部变量,方法结束后栈会释放,变量也会释放。

6、Collection和Collections的区别

Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。

7、List和Set

ArrayList:底层为数组实现,初始长度为10,扩容规则为:扩容后的大小= 原始大小+原始大小/2 + 1,查询效率较高,插入时必须创建空间并且将其所有引用向前移动,代价较高。

LinkedList:底层为双向链表结构,没有初始大小,也不需要扩容,插入时只需要链接新的元素,不需要改变其他元素,效率较高。

TreeSet:用于维持元素的排序状态,是有序的。

HashSet:在查询和添加元素都优于TreeSet。Set中不允许有重复元素。

8、Map

HashMap:综合了数组和链表,初始大小为16,扩容因子默认0.75(当容量达到默认大小的75%时进行扩容),扩容规则为扩大一倍。基于hashing原理,将键值对传给put方法,计算hashcode,找到bucket位置存储对象,获取对象时,通过equals找到键值对。若不通键对象的hashcode相同,则它们存储在同一个bucket位置的LinkedList中,通过equals找到键值对。

TreeMap:要求Map始终保持有序才使用。底层使用红黑树。

LinkedHashMap:插入稍慢,保持插入时的顺序。

HashTable:线程安全的,每个方法都有synchronized,不常用。

ConcurrentHashMap:线程安全的Map,把Map分成若干个Segment,在put和get时,根据key.hashCode()算出在哪个segment中。

源码分析:http://blog.csdn.net/jzhf2012/article/category/1314885/1

9、线程调度相关的方法

wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁。

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常。

notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关。

notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态。

10、synchronized 和java.util.concurrent.locks.Lock

Lock 能完成synchronized所实现的所有功能;

主要不同点:Lock有比synchronized更精确的线程语义和更好的性能,而且不强制性的要求一定要获得锁。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且最好在finally 块中释放(这是释放外部资源的最好的地方)。

11、单例模式

饿汉式单利:在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。也会有内存浪费问题。

public class Singleton1 {  
    private Singleton1() {}  
    private static final Singleton1 single = new Singleton1();  
    //静态工厂方法   
    public static Singleton1 getInstance() {  
        return single;  
    }  

懒汉式单利:在需要的时候才去创建的,如果单例已经创建,再次调用获取接口将不会重新创建新的对象,而是直接返回之前创建的对象懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的,并发环境下很可能出现多个Singleton实例。

public class Singleton {
    private Singleton() {}
    private static Singleton single=null;
    //静态工厂方法
    public static Singleton getInstance() {
         if (single == null) {  
             single = new Singleton();
         }  
        return single;
    }
}

线程安全的单例:双重检查

public static Singleton getInstance() {
        if (singleton == null) {  
            synchronized (Singleton.class) {  
               if (singleton == null) {  
                  singleton = new Singleton();
               }  
            }  
        }  
        return singleton;
    }

JavaWeb

1、转发(forward)和重定向(redirect)

forward是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个URL 的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。

redirect就是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,因此从浏览器的地址栏中可以看到跳转后的链接地址,很明显redirect无法访问到服务器保护起来资源,但是可以从一个网站redirect到其他网站。

forward更加高效,所以在满足需要时尽量使用forward(通过调用RequestDispatcher对象的forward()方法,该对象可以通过ServletRequest对象的getRequestDispatcher()方法获得),并且这样也有助于隐藏实际的链接;在有些情况下,比如需要访问一个其它服务器上的资源,则必须使用重定向(通过HttpServletResponse对象调用其sendRedirect()方法实现)。

2、get和post

get请求用来从服务器上获得资源,而post是用来向服务器提交数据。

get将表单中数据按照name=value的形式,添加到action 所指向的URL 后面,并且两者使用"?"连接,而各个变量之间使用"&"连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URLget将表单中数据按照name=value的形式,添加到action 所指向的URL 后面,并且两者使用"?"连接,而各个变量之间使用"&"连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL。

3、JSP和Servlet

Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容。

JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成。

JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)。

 

数据库

1、分页

Oracle:select * from (select rownum r,* from t where r<=10) where r>5

MySql:select * from t order by id limit 30,10

2、Drop,Delete,Truncate

Drop:删除数据和表结构,不需要commit,删除速度最快。

Delete:删除数据,需要commit,可以回滚,效率较低。

Truncate:删除所有数据,保留表结构,不可回滚。

3、高级查询

where:先进行条件过滤,再分组。

having:先分组,再进行过滤。

where效率较高,应优先使用,但where中不能使用分组函数(AVG,SUM,MIN,MAX)。

group by:select后面的字段group by后面也一定要有,除非放在分组函数中。

左连接:查出左边表的所有字段和右边表符合条件的字段,右表无数据,则右表字段显示为null。

右连接:查出右边表所有字段和左边表符合条件的字段,左表无数据,则左表字段显示为null。

全连接:查出所有表的字段。

内连接:查出符合条件的字段。

4、union和unionAll

unionAll:直接将子查询结果求并,不去重。

union:去重且会排序。

5、索引

索引代价:需要占硬盘空间,这是空间方面的代价;一旦插入新的数据,就需要重新建索引,这是时间上的代价

索引失效情况:

如果条件中有or,即使其中有条件带索引也不会使用。

没有where语句,不会用到索引。

like查询是以%开头,不会用到索引。

当数字型字段遇到非等值操作符时,如果对索引字段进行了某种左值操作,那么无法用到索引。

如果对索引字段进行了函数操作,那么无法用到索引。

框架

1、Spring IOC与AOP

 

IOC:一种编程思想,即控制反转,将对象的控制权交给Spring容器,实现对象之间的解耦。其实现方法是DI,即依赖注入。注

 

入的方式有:构造器依赖注入,setter方法注入。用反射实现注入。

 

AOP:面向切面编程,系统中各个不相关的类的方法,在这些方法中加入某种系统功能的代码,如日志、权限判断、异常处理

 

等。AOP采用的代理技术。

 

2、Spring常用注解

 

@Controller 将该类标注为控制层,控制层是视图层和业务层的桥梁,负责接收前台的请求,并且将后台处理数据传送给前台。

 

@Service 将该类标注为业务层,开发人员可以在这一层编写业务逻辑,而不需要更多的关注如何与数据库进行交互。

 

@Component 将该类定义类DAO层,负责与数据库进行数据交互。

@RequestMapping 匹配前台请求路径,可以标注在类之上,也可以标注在方法上面,然后类与方法进行路径拼接。


@Resource 对象的注入,可以将容器创建的对象直接注入到需要的类中。@Autowired是按照类型注入,而@Resource的装配顺序是如果指定名

称或者没有指定时,按照名称装配;如果指定类型时,按照类型
装配。


@ResponseBody 这个注解很好用,是将后台需要返回的Map、list、字符串或者对象自动封装成json格式,但是后台需要引入对应的jar

包,jackson-all.jar、jackson-mapping.jar等。


@Transactional 这个注解标注方法为事务,保持操作的原子性,如果成功就提交;如果抛出异常,就回滚。但是在容器的配置文件中需要配置事

务。

 

3、Struts

 

Struts是采用JavaServlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。采用Struts能开发出基于

 

MVC(Model-View-Controller)设计模式的应用构架。 Struts有如下的主要功能:一.包含一个controllerservlet,能将用户的请

 

求发送到相应的Action对象。二.JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。

 

三.提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息。

 

 

4、MyBatis

定义Sql标签:<select>,<insert>,<update>,<delete>。

配置对象与查询结果集:<resultMap>。

动态拼接Sql:
<if>:if标签通常用于WHERE语句中,通过判断参数值来决定是否使用某个查询条件, 他也经常用于UPDATE语句中判断是否更新某一个字段,还可以在INSERT语句中用来判断是否插入某个字段的值。

<foreach>:foreach标签主要用于构建in条件,他可以在sql中对集合进行迭代。

<choose>:按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行 otherwise中的sql。

格式化输出:
<where>

<set>

<trim>:更灵活的去处多余关键字的标签,他可以实践where和set的效果。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值