Java 基础面试题(五)
集合题型
先通过相关视频学习,再进行下面的作答:
视频链接:(P660-P719)按顺序复习即可,由于之前已经学习过了,所以这次复习整理了一下系统的知识,便于巩固记忆,熟练使用!
集合
通过视频的复习,在这里将知识点整理为了思维导图,希望能让大家对集合有整体性的认识:
集合中涉及到的一些数据结构:
- Map集合对象
- 迭代器原理
- 单链表
- 双链表
- HashMap存取原理
1、你所知道的集合类都有哪些?主要方法有哪些?
在这里回顾一下集合:
在Java中结合分为两大类:
- 单个方式存储元素:这一类集合中超级父接口:java.util.Collection;
- 以键值对的方式存储元素:这一类集合中超级父接口:java.util.Map。
主要的方法看思维导图,对整体方法有个系统的复习!
2、List 和 Map的区别。
List是存储单列数据的集合,Map是存储键和值的双列数据的集合,List 中存储的数据是有顺序的,并且允许重复;Map 中存储的数据是没有顺序的,其键是不能重复的,它的值可以重复。
3、ArrayList 和 Vector 的区别。
4、List、Map、Set 三个接口,存取元素时,各有什么特点?
5、说出 ArrayList、Vector、LinkedList 的存储性能和特性。
6、HashMap 和 Hashtable 的区别。
7、Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equal()?它们有何区别?两个对象值相同(x.equals(y)==true),但却可以有不同的hash code,这句话对吗?
Set里的元素不能重复,元素重复与否是使用equals()方法进行判断的。equals()和==决定引用值是否指向同一个对象,因为覆盖了equals()方法,目的是为了当两个对象的内容相等的话返回真值。
对的。因为需要分情况讨论:
- 如果对象要保存在HashSet或HashMap中,它们的equals相等,那么他们的hashCode值就必须相等。
- 如果不是保存在HashSet和HashMap中,则与hashCode没有关系,这时候hashCode不等也是可以的,如ArrayList存储的对象就不用实现hashCode,但是一般我们都会去实现hashCode方法。
8、TreeSet 里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo 方法还是使用的子类的compareTo 方法,还是抛异常?
从以上代码的运行结果我们可得知:当前的add方法放入的是哪个对象,就调用哪个对象的compareTo方法,至于这个compareTo方法怎么做,就看当前这个对象的类中是如何编写这个方法的。
IO流题型
视频讲解链接:P720-P756 进行复习即可。
流
系统思维导图:
1、说出一些常用的类,包,接口,请列举五个。
常用的类:BufferedReader,BufferedWriter,FileReader,FileWriter,String,Integer,java.util.Date,System,Class,HashMap等
常用的包:java.lang,java.io,java.util,javax.servlet,java.sql等
常用的接口:List,Map,Servlet,HttpServletRequest,HttpServletResponse,Session等
2、Java 提供了几种类型的流?每种类型的流继承于什么类?
字节流,字符流。字节流继承于InputStream,OutputStream,字符流继承于InputStreamReader,OutputStreamWriter。当然还有其他的流,主要是为了提高性能和使用方便。
3、字节流与字符流的区别。
4、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用?
Serializable接口是一个mini接口,其中没有需要实现的方法,实现接口只是为了标识该对象是可被序列化的。
应用:在web开发中,如果对象被保存在session中,tomcat在重启时需要把session对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输或通过rmi等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口。
JVM 题型
1、heap 和 stack 有什么区别?
2、GC是什么?为什么要有GC?
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
视频讲解链接:
GC
3、垃圾回收的优点和原理。并考虑2种垃圾回收机制?
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解。它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效地防止内存泄漏,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时地调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收,标记垃圾回收和增量垃圾回收。
视频讲解链接:
回收机制
4、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常GC采用有向图的方式记录和管理堆中的所有对象。通过这种方式确定哪些对象是“可达的”,哪些对象是“不可达的”。当GC确定一些对象为“不可达”时,GC就有责任回收这些内存空间。 垃圾回收器可以马上回收内存,程序员可以手动执行 System.gc(); 通知GC运行,但是Java语言规范并不保证GC一定会执行。
5、什么时候用 assert?
assert(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,assert将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启,为了提高性能,在软件发布后,assertion检查通常是关闭的。
6、Java会存在内存泄漏吗?请简单描述。
所谓的内存泄漏也称“存储渗漏”。严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。尽管内存泄漏并不会立刻引起程序崩溃,但是一旦发生内存泄漏,程序中的可用内存就会被逐步蚕食,直至耗尽所有内存,最终出现OutOfMemory异常,导致程序崩溃。
简单的举两个内存泄漏的例子:
- 单例模式:单例的声明周期和应用程序是一样长的,所以单例程序中,如果持有对外部对象的引用的话,那么这个外部对象是不能被回收的,则会导致内存泄漏的产生。
- 一些提供close的资源未关闭导致内存泄漏:数据库链接(dataSource.getConnection(),网络连接(socket)和IO链接必须手动close,否则是不能被回收的。
视频讲解链接:
内存泄漏
7、描述一下JVM加载 class 文件的原理机制?能不能自己写个类,也叫 java.lang.String?
JVM中类的加载是由CLassLoader和它的子类实现的,ClassLoader是一个重要的Java运行时系统组件,负责在运行时查找和装入类文件的类。
可以自己写个类叫java.lang.String,但是在应用的时候,需要用自己的类加载器去加载,否则系统的类加载器永远只是去加载jar包中的java.lang.String。
视频讲解链接:类加载