本文的Java方面基础知识是我在面试过程中的积累和总结。

  1. Java基本数据类型、所占空间大小及对应包装类
基本类型 大小 包装类
boolean - Boolean
char 16-bit Character
byte 8 bits Byte
short 16 bits Short
int 32 bits Integer
long 64 bits Long
float 32 bits Float
double 64 bits Double
  1. HashMap和Hashtable的区别
  • 存储:HashMap允许key和value为null;而Hashtable不允许。
    public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
...
  • 线程安全:Hashtable为线程安全的,而HashMap是线程不安全的。
  • 推进使用:Hashtable是保留类不建议使用,推荐在单线程环境下使用HashMap代替,如果需要多线程使用则用ConcurrentHashMap代替。
 * Java Collections Framework</a>.  Unlike the new collection
* implementations, {@code Hashtable} is synchronized. If a
* thread-safe implementation is not needed, it is recommended to use
* {@link HashMap} in place of {@code Hashtable}. If a thread-safe
* highly-concurrent implementation is desired, then it is recommended
* to use {@link java.util.concurrent.ConcurrentHashMap} in place of
* {@code Hashtable}.
  1. static关键字

static意思是静态的,全局的。一旦被static修饰,说明被修饰的东西在一定范围内是共享的,谁都可以访问。static可以修饰类变量、方法和方法块。

static修饰变量的时候,如果该变量是public的话,表示改变量可以被任何类访问,而无需初始化类,直接使用 类名.变量名进行访问。

static修饰方法的时候,代表该方法和当前类是无关的,如果方法又被public修饰,那么任何类都可以访问该方法。static方法内部只能调用static方法,不能调用普通方法。

static修饰方法块的时候,该段代码被称为静态代码块。静态代码块常用于在类启动之前的初始化工作。

  1. final关键字

final修饰的类叫最终类,不能被继承;

final修饰的方法不能被重写;

final修饰的变量叫常量,常量必须被初始化,初始化之后值不能被修改。

  1. 重写和重载

重写(Override)是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写。

重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。

重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。

重载(Overload)是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。

最常用的地方就是构造器的重载。

重载规则:

被重载的方法必须改变参数列表(参数个数或类型不一样);

被重载的方法可以改变返回类型;

被重载的方法可以改变访问修饰符;

被重载的方法可以声明新的或更广的检查异常;

方法能够在同一个类中或者在一个子类中被重载。

无法以返回值类型作为重载函数的区分标准。

  1. BIO、NIO、AIO区别

BIO:Block IO,同步阻塞式IO,模式简单,使用方便,并发处理能力低

NIO:NEW IO,同步非阻塞IO,传统IO的升级,客户端和服务器端通过Channel通讯,实现多路复用

AIO:Asynchronous是NIO的升级,实现异步非阻塞IO,异步IO的操作基于时间和回调机制。

  1. String、StringBuffer、StringBuilder的区别

String和StringBuffer、StringBuilder的区别在于String声明的是不可变对象,每次操作都会生成新的String对象;而StringBuffer和Stringbuilder可以在原有对象的基础上进行操作,所以经常改变字符串内容的情况下最好不用String。

StringBuffer和StringBuilder的最大区别在于,StringBuffer是线程安全的,而StringBuilder是非线程安全的,但是StringBuilder的性能高于StringBuffer,所以在单线程环境下推荐使用Stringbuilder,多线程环境下推荐使用StringBuffer。

  1. 接口和抽象类区别

实现:抽象类的子类使用extends来继承;接口必须使用implements来实现接口

构造函数:抽象类可以有构造函数;接口不能有

实现数量:类可以实现多个接口;但是只能继承一个抽象类,Java是单继承

访问修饰符:接口中的方法默认是public修饰;抽象类中的方法可以是任意访问修饰符

  1. TCP为什么要三次握手,两次不行吗?

如果采用两次握手,那么只要服务器发出确认数据包就会建立连接,但由于客户端此时并未响应服务端的请求,那此时服务器端就会一直在等待客户端,这样服务器端就白白浪费了一定的资源。如果采用三次握手,服务端没有收到客户端的再次确认,就会知道客户端并没有要求建立请求,就不会浪费服务器的资源。

  1. ThreadLocal类

当访问共享的可变数据的时候,通常需要使用同步技术。一种避免使用同步的方式就是不共享数据。如果仅在单线程内访问数据,就不需要同步了。这种技术被称为线程封闭技术,它是实现线程安全性的最简单方式之一。当某个对象封闭在一个线程中,这种用法将自动实现线程安全性,即使被封闭的对象本身并不是线程安全的。

线程封闭技术的常见应用是JDBC的Connection对象。典型应用场景是这样的,线程从连接池中获得一个Connection独享,并且用该对象来处理请求,使用完后再将对象返还给连接池。

ThreadLocal类是Java语言提供的一种线程封闭技术。这个类提供了get的set等访问接口或方法,这些方法为每个使用该变量的线程都存有一分独立的副本,因此总是返回有当前执行线程在调用set时候设置的最新值。

	private static final ThreadLocal threadSession = new ThreadLocal();

    public static Session getSession() throws InfrastructureException {
Session s = (Session) threadSession.get();
try {
if (s == null) {
s = getSessionFactory().openSession();
threadSession.set(s);
}
} catch (HibernateException ex) {
throw new InfrastructureException(ex);
}
return s;
}

private static final ThreadLocal<HttpClient> clients = new ThreadLocal<HttpClient>();

最新文章

  1. ORA-00600 3020 ORA-10567案例
  2. mysqlbinlog抽取某个表的信息
  3. shell
  4. iOS开发--Swift 基于AFNetworking 3.0的网络请求封装
  5. [MetaHook] Quake Bink function
  6. nginx安装-源码编译
  7. 将 Wing IDE 与 Maya 结合使用(摘自Maya用户指南)
  8. return 和 echo 的小坑
  9. 在android中,如何去掉webview读取网页后点击网页上的按钮出现的方框
  10. HDU-5421Victor and String
  11. sap 内表
  12. ubuntu16.04 caffe 安装
  13. Kaldi nnet3的前向计算
  14. SSM的 日常错误 之 mybatis
  15. SpringMVC+HibernateValidator,配置在properties文件中的错误信息回显前端页面出现中文乱码
  16. DDOS 攻击的防范
  17. PHP 弹窗 源代码 css Jquery.js
  18. tensorflow训练打游戏ai
  19. Python 装饰器(进阶篇)
  20. 每天一个linux命令:【转载】mv命令

热门文章

  1. Spring方法级别数据校验:@Validated + MethodValidationPostProcessor
  2. 使用jquery删除链接所在的行
  3. 负载分配—DNS的域名解析
  4. TCP加速机制是如何加速的?
  5. 【Android Studio】Frameworks detected: Android framework is detected in the project Configure
  6. Flask+APScheduler定时任务
  7. 201312-2ISBN号码
  8. Spark 系列(四)—— RDD常用算子详解
  9. Caddy 源码全解析
  10. 百度Echarts,蚂蚁金服G2,D3三种主流可视化工具对比