面试题总结
目 录
0、通用问题
0.1 自我介绍
0.2 项目中遇到的困难,如何解决的?
0.3 面向对象的特点
0.4 常用的Java类
1、数据结构
1.1
1.2
2、Java基础
2.1 怎么创建线程池?
2.2 sleep()和wait()的区别?
2.3 Java中的异常有几种?
2.4 Java中的序列化和反序列化?存储和传输。
2.5 NIO和BIO
3、设计模式
3.1 设计模式的六大原则:开闭、里氏替换、接口隔离、合成复用、最少知道、依赖倒转
3.2 手写单例模式、饿汉懒汉模式
3.3
4、SSHM框架
5、Linux命令
5.1 查看内存命令
6、SQL常用
/*************************************************************************************************************************/
零、自我介绍
一、数据结构
二、Java基础
2.1 怎么创建线程池?
在Java中线程池的实现类主要通过ThreadPoolExecutor类来实现。我们创建线程通常使用Executors类中的四个静态方法来创建的,分别如下:
/*
* 创建一个单线程的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO)执行.
* 适用于那种需要按照线程数量执行的场景。
*/
newSingleThreadExecutor();
/*
* 创建一个固定线程数的线程池,可控制线程最大并发数,适用需要限制线程池数量的应用场景。
*/
newFixedThreadPool();
/*
* 创建一个可以根据需要创建新线程的线程池,它是没有线程数量限制的,适用于短期异步任务的操作,
* 或者是负载比较轻的服务器。
*/
newCachedThreadPool();
/*
* 创建一个固定线程数的线程池,支持定时及周期性执行后台任务。
*/
newScheduledThreadPool();
接着介绍一下在ThreadPoolExecutor的构造方法中的几个参数:
public ThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime, TimeUnit unit, BlockingQueueworkQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler);
参数说明:corePoolSize,初始化线程池时候,拥有的线程数量
maximumPoolSize,线程池允许的最大线程数
keepAliveTime,线程存活时间,跟单位一起时间片轮转调度
unit,时间单位,TimeUnit的枚举值
workQueue,任务队列:基于数组阻塞、基于链表阻塞、
threadFactory,线程工厂
handler,饱和策略
创建线程池的常用方法有:
/*
* 第一种:
*/
Executor executor = Executors.newFixedThreadPool();
executor.execute( new newFixedThreadPool() {
}
);
/*
* 第二种:
*/
publicstaticExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue()));
}
publicstaticExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), threadFactory)); }
2.2 Java中sleep()和wait()的区别与联系
在Java中,wait方法是属于Object类的,sleep方法则是属于Thread类的。
sleep方法不会释放对象锁,当指定的时间到了,又自动恢复运行状态;wait会放弃对象锁,只有针对此对象调用notify方法之后,才进入准备状态,之后获取对象锁进入运行状态。
2.3 Java中的异常有几种?
异常都是由java.lang.Throwable衍生而来的,有两个子类Exception和Error。
2.5 NIO和BIO
BIO(Blocking IO)阻塞IO
NIO(Non-Blocking IO)非阻塞IO
共同点:两者都是同步操作。即必须先进行IO操作后才能进行下一步操作。
不同点:BIO多线程对某资源进行IO操作时会出现阻塞,即一个线程进行IO操作完才会通知另外的IO操作线程,必须等待。
NIO多线程对某资源进行IO操作时会把资源先操作至内存缓冲区。然后询问是否IO操作就绪,是则进行IO操作,否则进行下一步操作,然后不断的轮询是否IO操作就绪,直到iIO操作就绪后进行相关操作。
NIO主要是引入了管道的概念,你可以先看看netty这个项目。就是用nio实现的一个网络层开发框架。做tcp/udp开发用的比较多,服务器通信,RPC调用。游戏服务端基本都是这个套路。
三、设计模式
3.2 手写单例模式、饿汉懒汉模式
单例模式,确保一个类只有一个实例,整个系统公用该实例。如:日志logger。单例模式包括三大要素:私有的构造方法、指向自己实例的私有静态引用、以自己实例为返回值的静态的公有的方法。
饿汉模式和懒汉模式的区分在于,实例化对象的时机不同。饿汉模式,在单例类被加载的时候,就实例化对象。懒汉模式,在调用取得实例方法的时候,才实例化对象。代码分别如下:
/** 饿汉单例*/
public classSingleton {private static Singleton singleton = newSingleton();privateSingleton() {}public staticSingleton getInstance() {returnsingleton;
}
}/** 懒汉单例*/
public classSingleton {private staticSingleton singleton;privateSingleton(){};public static synchronizedSingleton getInstance() {if (singleton == null) {
singleton= newSingleton();
}returnsingleton;
}
}
特点:
1.在内存中只有一个对象,节省内存空间。
2.避免频繁的创建销毁对象,可以提高性能。
3.避免对共享资源的多重占用。
4.可以全局访问。
3.3
四、SSHM框架
五、Linux命令
5.1 linux查看内存命令:top、free、cat proc/meminfo、less proc/meminfo
基础;线程和进程理解加掌握、会用进程和线程编程序、多态、父类引用指向子类对象、List和Set和Map、synchronized同步、重写和重载、String和StringBuffer、
数据结构;排序算法、红黑树、KMP算法、
操作系统:
Jsp内置对象:在.jsp页面中,可以不加申明,就可以在页面脚本中使用的成员变量。(jsp的页面脚本是用Java语言写的)
1.requeset对象。客户端的所有请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest的实例。
/**************************知识点-重载、重写**************************************/
重载,方法名相同;参数个数、类型、次序不同;返回值可以相同也可以不同。(对返回值没有规定)
重写,方法名、参数个数类型顺序都必须相同;返回值类型或者与父类返回值相同,或者是父类返回值类型的子类;(如父类返回Object,子类可以返回String);子类权限不能低于父类权限;子类异常跟基类相等或者更小。
/**************************知识点-Spring依赖注入**************************************/
依赖注入:程序中的某个类需要依赖其他类的方法。通常的做法是new一个其他类,然后再调用类实例化后对象的方法,这种开发带来的问题是,new来的对象不好统一管理。于是,Spring提出了依赖注入的思想:其他类不需要程序来实例化,而是通过Spring容器new好,并把对象注入到需要该对象的类中。然后就可以调用方法了。
setter注入;构造方法注入;静态工厂方法注入;实例工厂方法注入;(set注入优先于构造方法注入)
http://blessht.iteye.com/blog/1162131
/**************************知识点-Servlet初始化参数***********************************/
/**************************知识点-线程和进程**************************************/
1.sleep()和wait()区别。
2.关键字synchronize。
3.
/**************************知识点-JVM知识***************************************/
1、JVM调优