1.Interface与abstract类的区别
No. | 区别 | 抽象类 | 接口 |
---|---|---|---|
1 | 定义关键字 | abstract class | interface |
2 | 组成 | 常量、变量、抽象方法、普通方法、构造方法 | 全局常量、抽象方法 |
3 | 权限 | 可以使用各种权限 | 只能是public |
4 | 关系 | 一个抽象类可以实现多个接口 | 接口不能继承抽象类,却可以继承多接口 |
5 | 使用 | 子类使用extends继承抽象类 | 子类使用implements实现接口 |
5 | 使用 | 抽象类和接口的对象都是利用对象多态性的向上转型,进行接口或抽象类的实例化操作 | 抽象类和接口的对象都是利用对象多态性的向上转型,进行接口或抽象类的实例化操作 |
6 | 设计模式 | 模板设计模式 | 工厂设计模式、代理设计模式 |
7 | 局限 | 一个子类只能继承一个抽象类 | 一个子类可以实现多个接口 |
2.Static class 与non static class的区别
静态内部类表示为“外部类”,并且只能访问外部类中static类型的操作。
3.java多态的实现原理
方法的覆写(Overriding)和重载(Overloading)。
4.实现多线程的两种方法:Thread与Runable
简单说来,继承Thread类,覆写它的run()方法,再启动start()启动一个线程;实现Runnable接口使用线程,依旧再覆写它的run()方法,之后使用Thread类中定义的public Thread(Runnable target)启动线程。
5.线程同步的方法:sychronized、lock、reentrantLock等
sychronized可以用来定义同步代码块或同步方法实现每次只有一个线程操作,其他线程等待。
Java5引入了ReentrantLock类。
lock()是sychronized关键字提供的一个锁,除此外还提供了锁的条件。
6.锁的等级:方法锁、对象锁、类锁
请看这篇文章(点击此处)
7.写出生产者消费者模式
public class ProducerAndConsumer {
public static void main(String[] args) {
Message msg = new Message();
new Thread(new Producer(msg)).start();
new Thread(new Consumer(msg)).start();
}
}
class Message {
private String title;
private String content;
//flag = true:表示可以生产,但是不能取走
//flag = false:表示可以取走,但是不能生产
private boolean flag = true;
public synchronized void set(String title,String content){
if(this.flag == false){
try {
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.title = title;
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
this.content = content;
this.flag = false;
super.notify();
}
public synchronized void get(){
if(this.flag == true){
try {
super.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(this.title + "==>" + this.content);
this.flag = true;
super.notify();
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
//定义生产者
class Producer implements Runnable{
private Message msg = null;
public Producer(Message msg){
this.msg = msg;
}
@Override
public void run() {
for(int x = 0;x < 50;x++){
if(x % 2 == 0){
this.msg.set("《西游记》","一部神魔小说");
} else{
this.msg.set("《红楼梦》","一一部人情小说");
}
}
}
}
//定义消费者
class Consumer implements Runnable{
private Message msg;
public Consumer(Message msg){
this.msg = msg;
}
@Override
public void run() {
for(int x = 0; x < 50 ; x++){
this.msg.get();
}
}
}
8.ThreadLocal的设计理念与作用
一个关于创建线程局部变量的类。一般创建的变量是可以被任何一个线程访问并修改的。使用ThreadLocal创建的变量只能被当前线程访问,其他线程无法访问和修改。
详细请移步到这篇文章(点击这里)
9.ThreadPool用法与优势
Java中线程池是通过Executor框架实现的。这篇文章值得一读(点击这里这里写链接内容)
10.Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等
11.wait()和sleep()的区别
sleep()是Thread类定义的static方法,表示线程休眠,将执行机会给其他线程,但是监控状态依然保持,到时候会自动恢复。
wait()是Object类定义的方法,表示线程等待,一直到执行了notify()或notifyAll()后才结束等待。
12.foreach与正常for循环效率对比
foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。(参考:这里)
13.Java IO与NIO
IO:面向流;阻塞IO
NIO:面向缓冲;非阻塞IO
14.反射的作用于原理
Class类是反射机制操作的源头。
15.泛型常用特点,List< String >能否转为List< Object >
不可以。因为<>里面的类型不一样。
16.设计模式:单例、工厂、适配器、责任链、观察者等等
17.JNI的使用
关于这个JNI完全可以另写一套专题了。就不再写出答案了,大家可以搜索JNI百度百科或者去官网查看JNI文档(就是点这里)。