基本功
面向对象的特征
final, finally, finalize 的区别
int 和 Integer 有什么区别
重载和重写的区别
抽象类和接口有什么区别
说说反射的用途及实现
说说自定义注解的场景及实现
HTTP 请求的 GET 与 POST 方式的区别
session 与 cookie 区别
session 分布式处理
JDBC 流程
MVC 设计思想
equals 与 == 的区别
集合
List 和 Set 区别
List 和 Map 区别
Arraylist 与 LinkedList 区别
ArrayList 与 Vector 区别
HashMap 和 Hashtable 的区别
HashSet 和 HashMap 区别
HashMap 和 ConcurrentHashMap 的区别
HashMap 的工作原理及代码实现
ConcurrentHashMap 的工作原理及代码实现
线程
创建线程的方式及实现
sleep() 、join()、yield()有什么区别
说说 CountDownLatch 原理
说说 CyclicBarrier 原理
说说 Semaphore 原理
说说 Exchanger 原理
说说 CountDownLatch 与 CyclicBarrier 区别
ThreadLocal 原理分析
讲讲线程池的实现原理
线程池的几种方式
线程的生命周期
锁机制
说说线程安全问题
volatile 实现原理
synchronize 实现原理
synchronized 与 lock 的区别
CAS 乐观锁
ABA 问题
乐观锁的业务场景及实现方式
基本功
1.面向对象的特征
封装(encapsulation)
继承(inheritance)
多态(polymorphism)
2.final, finally, finalize 的区别
final—修饰符(关键字)。
finally—再异常处理时提供 finally 块来执行任何清除操作。
finalize—方法名。
类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
3.int 和 Integer 有什么区别
int 是基本数据类型
Integer是其包装类,注意是一个类。
其实java在编译Integer i5 = 127的时候,被翻译成-> Integer i5 = Integer.valueOf(127);
-128到127之间的数,会进行缓存,Integer i5 = 127时,会将127进行缓存,下次再写Integer i6 = 127时,就会直接从缓存中取,就不会new了。
①无论如何,Integer与new Integer不会相等。不会经历拆箱过程,i3的引用指向堆,而i4指向专门存放他的内存(常量池),他们的内存地址不一样,所以为false
②两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false
java在编译Integer i2 = 128的时候,被翻译成-> Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存
③两个都是new出来的,都为false
④int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比
4.重载和重写的区别
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与
子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定
义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。
5.抽象类和接口有什么区别
当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
接口是对动作的抽象,表示这个对象能做什么,对类的局部行为进行抽象。
抽象类是对根源的抽象,表示这个类是什么,对类的整体进行抽象,对一类事物的抽象描述。
比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。
人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.
6.说说反射的用途及实现
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和
方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的
信息以及动态调用对象的方法的功能称为java语言的反射机制。
7.说说自定义注解的场景及实现
java的元注解一共有四个:
@Document 将此注解包含在Javadoc中
@Target 表示该注解可以用于什么地方
@Retention 表示需要在什么级别保存该注解信息
@Inherited 允许子类继承父类中的注解
8.HTTP 请求的 GET 与 POST 方式的区别
1. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,在URL中可以看到。
2.post是通过HTTPPOST机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
9.session 与 cookie 区别
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
简单来说,当第一次request server时,server产生JSESSIONID对应的值1,通过http header set-cookie,传递给browser,browser检测到http response header 里带set-cookie,那么browser就会create一个cookie,key=JSESSIONID,value=值1,而后的每次请求,browser都会把cookie里的键值对,放到http request header里,传递给server。
当在server端调用http.getSession()方法时,server会先从http request header里解析出来JSESSIONID的值,再从一个Map容器里去找有没有value,如果没有,就会产生一个HttpSessioon对象,放到这个Map容器里,同时设置一个最大生存时间。HttpSession你也可以把它想象成是一个Map,可以getAttribute(),可以setAttribute()。
10.session 分布式处理
1.session共享的问题.最容易的一种方法,你可以把session独立出来,放在一个单独的
服务器上,然后给session一个凭证(token),当用户访问应用程序的时候根据凭证(token)来获取服务器中的session,这样就可以实现session.
2.在所有的服务器上都生成一份session,不过这样的话,对服务器的压力会很大,不建
议使用.
3.基于数据库的Session共享
4.粘性Session、当用户访问集群中某台机器后,强制指定后续所有请求均落到此机器上
11.JDBC 流程
(1).注册驱动
Class.forName("oracle.jdbc.OracleDriver");
(2).连接数据库
String url = "jdbc:oracle:thin:@localhost:1521:xe";//其中xe为sid
String user = "XXX";
String password = "XXX";
Connection conn = DriverManager.getConnection(url,name,password);
(3).创建搬运工statement
Statement state = conn.createStatement();
(4).搬运数据,执行SQL语句
String sql = "select id,name from s_emp"; //"insert into s_emp(id,name) values(12,'zhangsan')";
ResultSet rs = state.executeQuery(sql);
(5).处理结果集
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString(2);
System.out.println(id+" "+name);
}
(6).关闭连接
rs.close();
state.close();
conn.close();
createStatement():创建向数据库发送sql的statement对象
prepareStatement(sql):创建向数据库发送预编译sql的 PrepareStatement对象
prepareCall(sql):创建执行存储过程的callableStatement对象
setAutoCommit(boolean autoCommit):设置事务是否自动提交
commit():在链接上提交事务
rollback():在此链接上回滚事务
Jdbc程序中的Statement对象用于向数据库发送sql语句,Statement常用方法有:
executeQuery(String sql):用于向数据库发送查询语句
executeUpdate(String sql):用于向数据库发送insert、update或delete语句
execute(String sql):用于向数据库发送任意sql语句(一般不用,返回的是Boolean,麻烦)
addBatch(String sql):把多条sql语句放到一个批处理中
executeBatch():向数据库发送一批sql语句执行
12.MVC 设计思想
MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。 MVC应用程序总是由三个部分组成.Event(事件)导致Controller改变Model或View,或者同时改变两者.只要Controller改变了Models的数据或者属性,所有依赖的View都会自动更新.类似的,只要Controller改变了View,View会从潜在的Model中获取数据来刷新自己 。
以一个大型餐馆做比喻,model相当于厨师,controller相当于调度人员,view相当于服务员。当有顾客要一份北京烤鸭时,调度人员(controller)负责将任务通知给厨师,然后相应的厨师负责做北京烤鸭,做完后交给服务生,由服务生将最终的餐品呈现给顾客,三者之间各管各的,不能越粗代庖。MVC设计模式提倡分工与专注
13.equals 与 == 的区别
==比较的是两个对象的地址
equals比较的是两个对象的内容
"=="比"equals"运行速度快,因为"=="只是比较引用。
String foo = "loveu";
String bar = "loveu";
System.out.println(foo == bar); // 输出为 true
System.out.println(foo.equals(bar)); // 输出为 true
String foo = new String("loveu");
String bar = new String("loveu");
System.out.println(foo == bar); // 输出为 false
System.out.println(foo.equals(bar)); // 输出为 true