目录
1、JDK常用的包有哪些?
2、Get 和 Post的区别?
3、Hashtable 与 HashMap的区别?
4、Java九大隐式对象?
5、Forword(转发) 与 Redirect(重定向)的区别?
6、线程和进程的区别?
8、Java常见状态码及其含义?
9、抽象类与接口的区别?
10、GC 是什么?为什么要有 GC?
11、final、finally、finalize的区别?
12、Collection 和 Collections的区别?
13、启动一个线程是调用 run()还是 start()方法?
14、Java 中如何实现序列化,有什么意义?
15、Java 中 ++ 操作符是线程安全的吗?
16、a = a + b 与 a += b 的区别?
17、int 和 Integer哪个会占用更多的内存?
18、“==” 和 ”equals()”有什么区别?
19、有没有可能两个不相等的对象有有相同的 hashcode?
20、两个相同的对象会有不同的 hashcode吗?
21、equals() 和 hashCode()的区别?
22、public,private,protected继承有什么区别?
23、类加载的过程?有哪些类加载器?
24、Java泛型是什么?什么是类型擦除?介绍一下常用的通配符?
1、JDK常用的包有哪些?
- java.lang:这个是系统的基础类,比如String、Math、Integer、System和Thread,提供常用功能
- java.io:这里面是所有输入输出有关的类,比如文件操作等
- java.util:这个是系统辅助类,特别是集合类Collection,List,Map等
- java.sql:这个是数据库操作的类,Connection, Statememt,ResultSet等
2、Get 和 Post的区别?
- get是从服务器上获取数据,post是向服务器传送数据
- get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制
- get安全性非常低,post安全性较高。但是执行效率却比Post方法好
- 在进行文件上传时只能使用post而不能是get
3、Hashtable 与 HashMap的区别?
- HashTable底层数组+链表实现,无论key还是value都不能为null,线程安全
- HashMap底层数组+链表+红黑树实现,可以存储null键和null值,线程不安全
4、Java九大隐式对象?
隐式对象:访问容器所提供的服务或资源,在使用的时候不用显示的声明,可以直接使用的对象。
- 输入/输出对象:request、response、out
- 作用域通信对象:session、application、pageContext
- Servlet 对象:page、config
- 错误对象:exception
5、Forword(转发) 与 Redirect(重定向)的区别?
- redirect 地址栏发生变化,forward 地址栏不发生变化
- redirect 可以访问其他站点(服务器)的资源,forward 只能访问当前服务器下的资源
- redirect 是两次请求,不能使用 request对象来共享数据;forward 是一次请求,可以使用 request对象来共享数据
6、线程和进程的区别?
- 进程定义的是应用程序与应用程序之间的边界,通常来说一个进程就代表一个与之对应的应用程序
- 不同的进程之间不能共享代码和数据空间,而同一进程的不同线程可以共享代码和数据空间
- 一个进程可以包括若干个线程,同时创建多个线程来完成某项任务,便是多线程
- 实现线程的两种方式:继承Thread类,实现Runable接口
7、session 和 cookie的区别?
- cookie数据存放在客户的浏览器上,session数据放在服务器上
- cookie不是很安全,可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session
- session会在一定时间内保存在服务器上,当访问增多,会比较占用服务器的性能
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储与服务端,浏览器对其没有限制
8、Java常见状态码及其含义?
- 200:请求成功
- 400:请求和服务器对接不上,发送请求时出现的问题
- 401:unauthorized(未授权的、非法的)表示发送的请求需要有通过 HTTP 认证的认证信息
- 403:服务器拒绝请求,服务器不接受请求(可能没有权限)
- 404:找不到页面,路径有问题
- 500:服务器遇到错误,无法完成请求。服务器中的错误即请求成功后服务器运行出现错误,java代码写的有问题
9、抽象类与接口的区别?
- 一个类只能进行单继承,但可以实现多个接口
- 有抽象方法的类一定是抽象类,但是抽象类里面不一定有抽象方法
- 接口里面所有的方法的默认修饰符为public abstract,接口里的成员变量默认的修饰符为 pulbic static final
10、GC 是什么?为什么要有 GC?
- GC 是垃圾收集的意思,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法,垃圾收集器会自动进行管理
- 请求垃圾收集,可以调用下面的方法之一:System.gc() 或 Runtime.getRuntime().gc() ,但 JVM 可以屏蔽掉显示的垃圾回收调用。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收
11、final、finally、finalize的区别?
- final:修饰符有三种用法:如果一个类被声明为 final,它就不能被继承;将变量声明为 final,被声明为 final 的变量不能发生改变并且必须在声明时给定初值;被声明为 final的方法只能使用,不能在子类中被重写
- finally:通常放在 try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要 JVM 不关闭都能执行,可以将释放外部资源的代码写在 finally 块中finalize:Object 类中定义的方法,Java 中允许使用
- finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写 finalize()方法可以整理系统资源或者执行其他清理工作
12、Collection 和 Collections的区别?
- Collection 是一个接口,它是 Set、List容器的父接口
- Collections 是个一个工具类,提供了一系列的静态方法来辅助容器操作,比如对容器的搜索、排序等
13、启动一个线程是调用 run()还是 start()方法? 启动一个线程是调用 start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由 JVM 调度并执行,这并不意味着线程就会立即运行。run()方法是线程启动后要进行回调的方法
14、Java 中如何实现序列化,有什么意义?
- 序列化是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)
- 实现序列化,需要让一个类实现 Serializable 接口,该接口是一个标识性接口,标注该类对象是可被序列化的,然后使用一个输出流来构造一个对象输出流并通过 writeObject(Object)方法就可以将实现对象写出;如果需要反序列化则可以用一个输入流建立对象输入流,然后通过 readObject 方法从流中读取对象
15、Java 中 ++ 操作符是线程安全的吗? 不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交叉
16、a = a + b 与 a += b 的区别? += 隐式的将加操作的结果类型强制转换为持有结果的类型。如果两这个整型相加,如 byte、short 或者 int,首先会将它们提升到 int 类型,然后在执行加法操作
17、int 和 Integer哪个会占用更多的内存? Integer 是一个对象,会占用更多的内存;int是基本数据类型,所以占用的空间更少
18、“==” 和 ”equals()”有什么区别?
19、有没有可能两个不相等的对象有有相同的 hashcode?
有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突。相等 hashcode 值的规定只是说如果两个对象相等,必须有相同的 hashcode 值,但是没有关于不相等对象的任何规定
20、两个相同的对象会有不同的 hashcode吗?
不能,根据 hashcode 的规定,这是不可能的
21、equals() 和 hashCode()的区别?
- equals():反映的是对象或变量具体的值,即两个对象里面包含的值可能是对象的引用,也可能是值类型的值
- hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数。根类 Object的 hashCode()方法的计算依赖于对象实例的D(内存地址),故每个 Object对象的 hashCode都是唯一的;当对象所对应的类重写了 hashCode()方法时,结果就截然不同了
- 如果两个对象相等(equal),那么他们一定有相同的哈希值
- 如果两个对象的哈希值相同,但他们未必相等(equal)
21、equals() 和 hashCode()的区别?
- equals():反映的是对象或变量具体的值,即两个对象里面包含的值可能是对象的引用,也可能是值类型的值
- hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数。根类 Object的 hashCode()方法的计算依赖于对象实例的D(内存地址),故每个 Object对象的 hashCode都是唯一的;当对象所对应的类重写了 hashCode()方法时,结果就截然不同了
- 如果两个对象相等(equal),那么他们一定有相同的哈希值
- 如果两个对象的哈希值相同,但他们未必相等(equal)
22、public,private,protected继承有什么区别?
- 私有继承(private):默认的继承方式,基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问,父类的 protected和 public属性在子类中变为 private
- 保护继承(protected):基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数,基类的私有成员仍然是私有的,父类的 protected和 public属性在子类中变为 protected
- 公有继承(public):基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问,父类的 protected和 public属性不发生改变
23、类加载的过程?有哪些类加载器?
一般分为三个比较大的阶段,分别是加载阶段,连接阶段和初始化阶段,五个主要的阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段
JAVA中的类加载器主要分为下图的四种
引导类加载器(bootstrap class loader)
- 用来加载 Java 的核心库(JAVA_HOME/jre/lib/rt.jar,sun.boot.class.path路径下的内容),用原生代码(C语言)来实现的,并不继承自 java.lang.ClassLoader
- 加载扩展类和应用程序类加载器,并指定他们的父类加载器
扩展类加载器(extensions class loader)
- 用来加载 Java 的扩展库(JAVA_HOME/jre/ext/*.jar,或java.ext.dirs路径下的内容) 。Java 虚拟机的实现会提供一个扩展库目录,该类加载器在此目录里面查找并加载 Java类,由sun.misc.Launcher$ExtClassLoader实现
应用程序类加载器(application class loader)
- 根据 Java 应用的类路径(classpath,java.class.path 路径下的内容)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的,由sun.misc.Launcher$AppClassLoader实现
自定义类加载器
- 开发人员可以通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求
- 遵守双亲委派模型:继承ClassLoader,重写findClass()方法
- 破坏双亲委派模型:继承ClassLoader,重写loadClass()方法
24、Java泛型是什么?什么是类型擦除?介绍一下常用的通配符?
- Java泛型是 JDK 5 中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
- Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,这也就是通常所说类型擦除
常用的通配符为:T,E,K,V,?
- ?表示不确定的 Java类型
- T (type) 表示具体的一个 Java类型
- K V (key value) 分别代表 Java键值中的Key Value
- E (element) 代表Element



