读书笔记之《Java程序员面试宝典》
介绍
最近想了解关于Java面试方面的书籍,我首先选的是《编程之美》这本书,看了前面一部分之后,真的觉得智商受虐了。
然后翻阅了这本书,本书主要介绍的是Java面试的考点,看完之后整体觉得内容比较基础,本书作者写错的地方也有好几处。
虽然本书存在一些错误和知识点内容介绍的也比较简单,但是对于梳理Java面试考点倒是有一定帮助。
推荐指数:☆☆
正文
Java程序基础
1、JDK与JRE的区别?
JDK:java开发工具,提供一系列编译、运行等工具如javac、java等
JRE:其核心就是JVM
2、Java与C/C++程序在编译和运行上的区别?
不管任何语言其最终都会编译成机器码指令,比如汇编指令。
C/C++源码在编译之后是生成特别机器文件,在该机上可以直接运行,但是在其它系统机器上未必能够正常运行。
Java源码编译之后的字节码并不能直接运行于机器上,
而是运行于其自带安装的JVM虚拟机之上的。
备注:明白Java代码运行的原理
3、什么是JVM以及其工作原理
备注:虚拟机其实你就应该把它当作真实的机器来看待,这样理解很多问题就很容易了
4、Java的GC与C++的析构函数
Java中虽然也提供了类似C++析构函数功能的方法finalize(),但是原则上不推荐使用
备注:Java内存回收交给GC处理,我们负责写好代码就行。
Java语法基础
1、变量及其作用范围
静态变量、成员变量、局部变量
2、Java中变量分为几种数据类型
基本数据类型和引用数据类型(也称对象)
基本数据类型:
字符类型:字节、字符
数值类型:short、int、long、float、double
布尔类型:false/true
备注:引用数据类型的变量在作用域上与基本数据类型是一样的,它们也有一定的生存周期。只不过它们存在的值比较特别,是一个内存地址.(严格讲是不正确的只有指针才是真正存放的是内存地址也就是数值表示的内存地址)
3、理解Java中自动装箱和自动拆箱
备注:jdk1.5后的新特性
4、Java引用与C++指针的区别
Java引用看起来很像C++的指针,但是并不完全相同,可以将引用看作是在指针的基础上封装了一下,将其看作字符串,指针就直接是内存地址了可以将其看作int数值。
5、Java中equal和==的区别
简单理解是说==比较的是基本数据类型,equal比较的是引用数据类型。(这是错误不严谨的)
当都是基本数据类型时==比较的是基本数据类型的值,当都是引用数据类型时比较的引用的地址是否相同。
6、java多态的解释
备注:一种对象表现出的多种行为
7、java中静态成员的特点
1)加载时机
2)静态变量也称类变量
8、Java中this与super关键字
9、简述接口与抽象类的区别
数据类型及类型转换
1、基本数据类型与其对应的包装类型
基本数据类型与其对应的包装类型
1、自动装箱和自动拆箱(JDK1.5之后支持)
备注:为什么会有对应的包装类型,我自己觉得有两点原因
1、为了体现面向对象(并不是用)
2、为了在集合框架中使用基本数据类型作为元素
注意包装类型通常比对应的基本数据类型多了null取值,开发中药特别注意。
2、如何使用BigDecimal类进行精确运算
float和double计算都不是精确计算,会出现精度差
使用BigDecimal类进行计算时,主要分为以下几步
1)将float或double变量构建BigDecimal对象
2)通过BigDecimal的加减乘除方法进行运算
3)将BigDecimal对象转换为float、double、int类型(xxxValue方法)
3、String字符串特性
不变性是其非常重要的一个特性、字符串常量池
String str1 = "hello world";
String str2 = str1;
str2 = "世界你好";
System.out.println(str1);// hello world
System.out.println(str2);// 世界你好
备注:java5.0之后,Java虚拟机启动时会实例化9个对象池,8个是基本数据类型对应的还有一个是String字符串常量池
4、StringBuffer和StringBuilder作用
它们出现主要是为了解决字符串拼接场景下的效率问题
备注:StringBuffer是线程安全的,StringBuilder是线程不安全的
5、如何反转一个字符串
1)倒序遍历
2)使用StringBuffer的reverse()方法
个人总结:
1、推荐使用基本数据类型而不使用包装数据类型(效率和便捷性)
2、理解清楚基本数据类型和包装数据类型存储的位置
3、字符串的不变性
4、基本数据类型对象池和字符串常量池
数组与集合
1、关于数组分配空间说明
int[] data=new int[1024];//真的就是直接分配内存空间的(1024个整数大小空间)
Object[] data=new Object[1024];//并没有分配内存空间,因为其根本就不知道分配大小
备注:以上就是典型的两种分别表示基本数据类型和引用数据类型
2、解释迭代器功能和原理
Iterator(迭代器)接口很重要
备注:所有Collection的子类都实现了迭代功能
jdk1.5之后集合对象的遍历可以使用增强for循环更加简捷,但是foreach底层还是使用Iterator实现的
3、比较器的功能与原理
Comparable接口
Comparator接口
通常可排序的集合里面存放的元素都是实现了比较器接口的
4、集合遍历注意点
最好不要在遍历集合时修改集合,否则会出现快速失败异常
5、集合使用泛型带来的好处
主要就是安全和方便
Java泛型是停留在编译层的,也就是说JVM在对待泛型数据时候,依然把其看作Object类型,只不过在使用这个元素时候,JVM会自动将其转为对应的数据类型。
个人总结:数组和集合石比较重要的,应该好好研究研究。数组往往出现在考算法时的载体
输入输出流
Java相比其它语言对IO的设计非常的灵活和巧妙,让开发者有很多的选择。
同时也增加了学习成本,不如C/Python就靠一个openFile就能直接操作文件了。
个人总结:这一部分没什么好说的,理解流和面向对象才能使用好Java中IO操作。
除了基本的IO,NIO也应该重点掌握,尤其在开发高性能网络应用时,肯定是会使用的。
多线程编程
1、生产者和消费者模型实现
参考我博客关于这方面知识介绍
2、Java线程池应用
Java线程池技术
线程池就是将一个或多个线程放到一个容器中进行有效管理
线程池和数据库连接池有相同的理念:对资源的高效重复利用
线程任务代码和业务代码分离
参考我博客关于线程池知识点的解读
个人总结:多线程的知识点远比这本书上讲的多的多,并且难很多,这本书上说的这些没有很大参考意义,因此不写。
Java反射机制
1、什么事反射以及反射的原理
反射是为了能够动态加载一个类,动态调用一个方法,动态访问一个属性等动态要求而设计的。
2、反射访问属性、方法、构造方法等
个人总结:本书关于反射讲解太浅,请自己深入学习和研究
Java网络编程
1、TCP/IP协议以及四层五层模型
2、TCP编程模型
3、UDP编程模型
4、基于URL和URLConnection的网络请求
个人总结:网络编程是一个很大的方向,够你学的。
Java对数据库操作(JDBC规范)
1、理解JDBC访问数据库原理
2、使用JDBC开发步骤
3、JDBC事务
4、数据库连接池
个人总结:JDBC是java操作数据库的基石,很重要应该好好掌握,推荐学习下DbUtils组件的源码
Java EE相关
java web开发:认真研究Servlet技术非常有帮助
过滤器、监听器、拦截器等工作原理和应用
个人总结:多花时间在Spring上绝对没错。
编程试题
1、打印100以内的质数
2、打印10000以内的回文数
3、实现快速排序算法
4、实现单例设计模式
总结
读这本书总的来是说是比较轻松的,可以回顾一下基础知识。