logo资料库

java经典面试题.docx

第1页 / 共71页
第2页 / 共71页
第3页 / 共71页
第4页 / 共71页
第5页 / 共71页
第6页 / 共71页
第7页 / 共71页
第8页 / 共71页
资料共71页,剩余部分请下载后查看
序言
J2SE基础
JVM
操作系统
TCP/IP
数据结构与算法
J2SE基础
1.九种基本数据类型的大小,以及他们的封装类。
2.Switch能否用string做参数?
3.equals与==的区别。
4. Object有哪些公用方法?
5. Java的四种引用,强弱软虚,用到的场景。
6. Hashcode的作用。
7. ArrayList、LinkedList、Vector的区别。
8. String、StringBuffer与StringBuilder的区别。
9. Map、Set、List、Queue、Stack的特点与用法。
10. HashMap和HashTable的区别。
11. HashMap和ConcurrentHashMap的区别,HashMap的底层源码。
12. TreeMap、HashMap、LindedHashMap的区别。
13. Collection包结构,与Collections的区别。
14. try catch finally,try里有return,finally还执行么?
15. Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。
16. Java面向对象的三个特征与含义。
17. Override和Overload的含义和区别。
18. Interface与abstract类的区别。
19. Static class 与non static class的区别。
20. java多态的实现原理。
21. 实现多线程的两种方法:Thread与Runable。
22. 线程同步的方法:sychronized、lock、reentrantLock等。
23. 锁的等级:方法锁、对象锁、类锁。
24. 写出生产者消费者模式。
25. ThreadLocal的设计理念与作用。
26. ThreadPool用法与优势。
27. Concurrent包里的其他东西:ArrayBlockingQueue、CountDown
28. wait()和sleep()的区别。
29. foreach与正常for循环效率对比。
30. Java IO与NIO。
31. 反射的作用于原理。
32. 泛型常用特点,List能否转为List
33. 解析XML的几种方式的原理与特点:DOM、SAX、PULL。
34. Java与C++对比。
35. Java1.7与1.8新特性。
36. 设计模式:单例、工厂、适配器、责任链、观察者等等。
37. JNI的使用。
数据结构与算法
1. 选择排序
2 冒泡排序 
3 插入排序 
4 希尔排序 
5 堆排序
6 归并排序
7 快速排序 
8 基数排序
9 计数排序 
10 桶排序 
序言 J2SE 基础 catch finally,try 里有 return,finally 还执行么? 1. 九种基本数据类型的大小,以及他们的封装类。 2. Switch 能否用 string 做参数? 3. equals 与==的区别。 4. Object 有哪些公用方法? 5. Java 的四种引用,强弱软虚,用到的场景。 6. Hashcode 的作用。 7. ArrayList、LinkedList、Vector 的区别。 8. String、StringBuffer 与 StringBuilder 的区别。 9. Map、Set、List、Queue、Stack 的特点与用法。 10. HashMap 和 HashTable 的区别。 11. HashMap 和 ConcurrentHashMap 的区别,HashMap 的底层源码。 12. TreeMap、HashMap、LindedHashMap 的区别。 13. Collection 包结构,与 Collections 的区别。 14. try 15. Excption 与 Error 包结构。OOM 你遇到过哪些情况,SOF 你遇到过哪些情况。 16. Java 面向对象的三个特征与含义。 17. Override 和 Overload 的含义去区别。 18. Interface 与 abstract 类的区别。 19. Static class 与 non 20. java 多态的实现原理。 21. 实现多线程的两种方法:Thread 与 Runable。 22. 线程同步的方法:sychronized、lock、reentrantLock 等。 23. 锁的等级:方法锁、对象锁、类锁。 24. 写出生产者消费者模式。 25. ThreadLocal 的设计理念与作用。 26. ThreadPool 用法与优势。 27. Concurrent 包里的其他东西:ArrayBlockingQueue、CountDownLatch 等等。 28. wait()和 sleep()的区别。 29. foreach 与正常 for 循环效率对比。 30. Java IO 与 NIO。 31. 反射的作用于原理。 32. 泛型常用特点,List能否转为 List。 33. 解析 XML 的几种方式的原理与特点:DOM、SAX、PULL。 34. Java 与 C++对比。 35. Java1.7 与 1.8 新特性。 36. 设计模式:单例、工厂、适配器、责任链、观察者等等。 37. JNI 的使用。 static class 的区别。
Java 里有很多很杂的东西,有时候需要你阅读源码,大多数可能书里面讲的不是太清 楚,需要你在网上寻找答案。 推 荐 书 籍 : 《 java 核 心 技 术 卷 I 》 《 Thinking in java 》 《 java 并 发 编 程 》 《effictive java》《大话设计模式》 JVM 1. 内存模型以及分区,需要详细到每个区放什么。 2. 堆里面的分区:Eden,survival 3. 对象创建方法,对象的内存分配,对象的访问定位。 4. GC 的两种判定方法:引用计数与引用链。 5. GC 的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么 to,老年代,各自的特点。 from 地方,如果让你优化收集方法,有什么思路? GC 与 Full 6. GC 收集器有哪些?CMS 收集器与 G1 收集器的特点。 7. Minor 8. 几种常用的内存调试工具:jmap、jstack、jconsole。 9. 类加载的五个过程:加载、验证、准备、解析、初始化。 10. 双 亲 委 派 模 型 : Bootstrap GC 分别在什么时候发生? ClassLoader 、 Extension ClassLoader 、 ApplicationClassLoader。 11. 分派:静态分派与动态分派。 JVM 过去过来就问了这么些问题,没怎么变,内存模型和 GC 算法这块问得比较多,可 以在网上多找几篇博客来看看。 推荐书籍:《深入理解 java 虚拟机》 操作系统 1. 进程和线程的区别。 2. 死锁的必要条件,怎么处理死锁。 3. Window 内存管理方式:段存储,页存储,段页存储。 4. 进程的几种状态。 5. IPC 几种通信方式。 6. 什么是虚拟内存。 7. 虚拟地址、逻辑地址、线性地址、物理地址的区别。 因为是做 android 的这一块问得比较少一点,还有可能上我简历上没有写操作系统的原 因。 推荐书籍:《深入理解现代操作系统》
TCP/IP 1. OSI 与 TCP/IP 各层的结构与功能,都有哪些协议。 2. TCP 与 UDP 的区别。 3. TCP 报文结构。 4. TCP 的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT 的作用。 5. TCP 拥塞控制。 6. TCP 滑动窗口与回退 N 针协议。 7. Http 的报文结构。 8. Http 的状态码含义。 9. Http 10. Http1.1 和 Http1.0 的区别 11. Http 怎么处理长连接。 12. Cookie 与 Session 的作用于原理。 13. 电脑上访问一个网页,整个过程是怎么样的:DNS、HTTP、TCP、OSPF、IP、ARP。 14. Ping 的整个过程。ICMP 报文是什么。 15. C/S 模式下使用 socket 通信,几个关键函数。 16. IP 地址分类。 17. 路由器与交换机区别。 网络其实大体分为两块,一个 TCP 协议,一个 HTTP 协议,只要把这两块以及相关协议 request 的几种类型。 搞清楚,一般问题不大。 推荐书籍:《TCP/IP 协议族》 数据结构与算法 1. 链表与数组。 2. 队列和栈,出栈与入栈。 3. 链表的删除、插入、反向。 4. 字符串操作。 5. Hash 表的 hash 函数,冲突解决方法有哪些。 6. 各种排序:冒泡、选择、插入、希尔、归并、快排、堆排、桶排、基数的原理、平 均时间复杂度、最坏时间复杂度、空间复杂度、是否稳定。 7. 快排的 partition 函数与归并的 Merge 函数。 8. 对冒泡与快排的改进。 9. 二分查找,与变种二分查找。 10. 二叉树、B+树、AVL 树、红黑树、哈夫曼树。 11. 二叉树的前中后续遍历:递归与非递归写法,层序遍历算法。 12. 图的 BFS 与 DFS 算法,最小生成树 prim 算法与最短路径 Dijkstra 算法。 13. KMP 算法。 14. 排列组合问题。 15. 动态规划、贪心算法、分治算法。(一般不会问到) 16. 大数据处理:类似 10 亿条数据找出最大的 1000 个数.........等等
算法的话其实是个重点,因为最后都是要你写代码,所以算法还是需要花不少时间准备, 这里有太多算法题,写不全,我的建议是没事多在 OJ 上刷刷题(牛客网、leetcode 等), 剑指 offer 上的算法要能理解并自己写出来,编程之美也推荐看一看。 推荐书籍:《大话数据结构》《剑指 offer》《编程之美》
J2SE 基础 1.九种基本数据类型的大小,以及他们的封装类。 int, long, float, double, void. java 提供了一组基本数据类型,包括 boolean, byte, char, short, 同时,java 也提供了这些类型的封装类,分别为 Boolean, Byte, Character, Short, Integer, Long, Float, Double, Void 类型 字节 byte(字节型) short(短整型) int(整型) 4 long(长整型) float(浮点型) double(双精度型) char(字符型) Charater 表示范围 1 2 -2147483648~2147483647 Integer 8 4 -128~127 -32768~32767 -9223372036854775808 ~ 9223372036854775807 -3.4E38~3.4E38 Float 8 -1.7E308~1.7E308 Double 包装类 Byte Short Long 2 从 字 符 型 对 应 的 整 型 数 来 划 分 , 其 表 示 范 围 是 0 ~ 65535 booealn(布尔型) 1 true 或 false Boolean 2.Switch 能否用 string 做参数? 在 Java 7 之前,switch 只能支持 byte、short、char、int 或者其对应的封装类以及 Enum 类型。在 Java 7 中,String 支持被加上了。 3.equals 与==的区别。 “==”比较的是值【变量(栈)内存中存放的对象的(堆)内存地址】 equal 用于比较两个对象的值是否相同【不是比地址】 【特别注意】Object 类中的 equals 方法和“==”是一样的,没有区别,而 String 类,Integer 类等等一些类,是重写了 equals 方法,
才使得 equals 和“==不同”,所以,当自己创建类时,自动继承了 Object 的 equals 方法, 要想实现不同的等于比较,必须重写 equals 方法。 "=="比"equal"运行速度快,因为"=="只是比较引用. 4. Object 有哪些公用方法? Object 是所有类的父类,任何类都默认继承 Object。Object 类到底实现了哪些方法? (1)clone 方法 保护方法,实现对象的浅复制,只有实现了 Cloneable 接口才可以调用该方法,否则抛出 CloneNotSupportedException 异常。 主要是 JAVA 里除了 8 种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我 们有时候不希望在方法里讲参数改变,这是就需要在类中复写 clone 方法。 (2)getClass 方法 final 方法,获得运行时类型。 (3)toString 方法 该方法用得比较多,一般子类都有覆盖。 (4)finalize 方法 该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。 (5)equals 方法 该方法是非常重要的一个方法。一般 equals 和==是不一样的,但是在 Object 中两者是一样 的。子类一般都要重写这个方法。 (6)hashCode 方法 该方法用于哈希查找,可以减少在查找中使用 equals 的次数,重写了 equals 方法一般都要 重写 hashCode 方法。这个方法在一些具有哈希功能的 Collection 中用到。 一般必须满足 obj1.equals(obj2)==true。可以推出 obj1.hash- Code()==obj2.hashCode(), 但是 hashCode 相等不一定就满足 equals。不过为了提高效率,应该尽量使上面两个条件接 近等价。 如果不重写 hashcode(),在 HashSet 中添加两个 equals 的对象,会将两个对象都加入进去。 (7)wait 方法 wait 方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有 该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个 超时间隔,如果在规定时间内没有获得锁就返回。 调用该方法后当前线程进入睡眠状态,直到以下事件发生。 (7.1)其他线程调用了该对象的 notify 方法。 (7.2)其他线程调用了该对象的 notifyAll 方法。 (7.3)其他线程调用了 interrupt 中断该线程。 (7.4)时间间隔到了。 此时该线程就可以被调度了,如果是被中断的话就抛出一个 InterruptedException 异常。 (8)notify 方法 该方法唤醒在该对象上等待的某个线程。 (9)notifyAll 方法 该方法唤醒在该对象上等待的所有线程。
5. Java 的四种引用,强弱软虚,用到的场景。 (1)强引用 以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有 强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足, Java 虚拟机宁愿抛出 OutOfMemoryError 错误,使程序异常终止,也不会靠随意回收具有强 引用的对象来解决内存不足问题。 (2)软引用(SoftReference) 如果一个对象只具有软引用,那就类似于可有可无的生活用品。如果内存空间足够,垃圾回 收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有 回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾 回收,JAVA 虚拟机就会把这个软引用加入到与之关联的引用队列中。 (3)弱引用(WeakReference) 如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于: 只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域 的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内 存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有 弱引用的对象。 弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾 回收,Java 虚拟机就会把这个弱引用加入到与之关联的引用队列中。 (4)虚引用(PhantomReference) "虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命 周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃 圾回收。 虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚 引用必须和引用队列(ReferenceQueue)联合使用。当垃 圾回收器准备回收一个对象时, 如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用 队列中。程序可以通过判断引用队列中是 否已经加入了虚引用,来了解 6. Hashcode 的作用。 Hash 是散列的意思,就是把任意长度的输入,通过散列算法变换成固定长度的输出,该输 出就是散列值。关于散列值,有以下几个关键结论: 1、如果散列表中存在和散列原始输入 K 相等的记录,那么 K 必定在 f(K)的存储位置上 2、不同关键字经过散列算法变换后可能得到同一个散列地址,这种现象称为碰撞 3、如果两个 Hash 值不同(前提是同一 Hash 算法),那么这两个 Hash 值对应的原始输入必 定不同 HashCode 然后讲下什么是 HashCode,总结几个关键点: 1、HashCode 的存在主要是为了查找的快捷性,HashCode 是用来在散列存储结构中确定对象 的存储地址的
2、如果两个对象 equals 相等,那么这两个对象的 HashCode 一定也相同 3、如果对象的 equals 方法被重写,那么对象的 HashCode 方法也尽量重写 4、如果两个对象的 HashCode 相同,不代表两个对象就相同,只能说明这两个对象在散列存 储结构中,存放于同一个位置 HashCode 有什么用 回到最关键的问题,HashCode 有什么用?不妨举个例子: 1、假设内存中有 0 1 2 3 4 5 6 7 8 这 8 个位置,如果我有个字段叫做 ID,那么我要把这 个字段存放在以上 8 个位置之一,如果不用 HashCode 而任意存放,那么当查找时就需要到 8 个位置中去挨个查找 2、使用 HashCode 则效率会快很多,把 ID 的 HashCode%8,然后把 ID 存放在取得余数的那 个位置,然后每次查找该类的时候都可以通过 ID 的 HashCode%8 求余数直接找到存放的位置 了 3、如果 ID 的 HashCode%8 算出来的位置上本身已经有数据了怎么办?这就取决于算法的实 现了,比如 ThreadLocal 中的做法就是从算出来的位置向后查找第 一个为空的位置,放置 数据;HashMap 的做法就是通过链式结构连起来。反正,只要保证放的时候和取的时候的算 法一致就行了。 4、如果 ID 的 HashCode%8 相等怎么办(这种对应的是第三点说的链式结构的场景)?这时 候就需要定义 equals 了。先通过 HashCode%8 来判断类在哪一 个位置,再通过 equals 来在 这个位置上寻找需要的类。对比两个类的时候也差不多,先通过 HashCode 比较,假如 HashCode 相等再判断 equals。如果两个类的 HashCode 都不相同,那么这两个类必定是不 同的。 举个实际的例子 Set。我们知道 Set 里面的元素是不可以重复的,那么如何做到?Set 是根 据 equals()方法来判断两个元素是否相等的。比方 说 Set 里面已经有 1000 个元素了,那 么第 1001 个元素进来的时候,最多可能调用 1000 次 equals 方法,如果 equals 方法写得复 杂,对比的 东西特别多,那么效率会大大降低。使用 HashCode 就不一样了,比方说 HashSet, 底层是基于 HashMap 实现的,先通过 HashCode 取一 个模,这样一下子就固定到某个位置了, 如果这个位置上没有元素,那么就可以肯定 HashSet 中必定没有和新添加的元素 equals 的 元素,就可以直接存 放了,都不需要比较;如果这个位置上有元素了,逐一比较,比较的 时候先比较 HashCode,HashCode 都不同接下去都不用比了,肯定不一 样,HashCode 相等, 再 equals 比较,没有相同的元素就存,有相同的元素就不存。如果原来的 Set 里面有相同 的元素,只要 HashCode 的生 成方式定义得好(不重复),不管 Set 里面原来有多少元素, 只需要执行一次的 equals 就可以了。这样一来,实际调用 equals 方法的次数大大降低, 提 高了效率。 7. ArrayList、LinkedList、Vector 的区别。 ArrayList,Vector 底层是由数组实现,LinkedList 底层是由双线链表实现,从底层的实现 可以得出它们的性能问题,ArrayList,Vector 插入速度相对较慢,查询速度相对较快,而 LinkedList 插入速度较快,而查询速度较慢。再者由于 Vevtor 使用了线程安全锁,所以 ArrayList 的运行效率高于 Vector。
分享到:
收藏