大家好,我是码农阿豪,一位热爱 Java 编程的程序员。今天我想和大家分享一些常见的 Java 面试题,通过收集解析这些问题,希望能够帮助大家更好地准备面试,突破技术瓶颈,把面试官按在地上摩擦 。
经典面试题收集一
第一章 1. 运算符 2. 数据类型 3. try-catch-finally 4. try-with-resource 5. 文件API和递归 第二章 1. 字符串(重点) 2. 面向对象 3. 接口 第三章(集合框架List) 1. 说下Vector和ArrayList、LinkedList联系和区别?分别的使用场景 2. 如果要保证线程安全,ArrayList应该怎么做,有几种方式? 3.了解CopyOnWriteArrayList吗?它和Collections.synchronizedList实现线程安全有什么区别,使用场景是怎样的? 4.CopyOnWriteArrayList的设计思想是怎样的,有什么缺点? 5.说一下ArrayList的扩容机制是怎样的? 6.设计一个简单的ArrayList(需要包含构造函数、add(e)、扩容机制) 期望与后续更新 感谢阅读
第一章
1. 运算符
运算符&和&&、|和||的区别?//& 按位与操作,只有对应的两个二进制数为1时,结果位才为11&1=11&0=00&1=00&0=0//| 按位或操作,有一个为1的时候,结果位就为11|1=11|0=10|1=10|0=0//& 和 && 都能实现 和 这个功能//区别:& 两边都运算,而&&先算左侧,若左侧为false,那么右边就不运算,判断语句中推荐&&,效率高//| 和 || 和上面的类型//区别:|| 只要满足第一个条件,后面的条件就不再判断,而|要对所有条件进行判断//把&&和||称为短路运算符
用最有效率的方法计算2乘以2的3次方 //原理:将一个数左移n位,就是将这个数乘以2的n次方2 << 3 = 16//扩展:常见的JDK源码里面HashMap的默认容量是16int DEFAULT_INITAL_CAPACITY = 1 << 4; //16//直接是二进制操作了,表示将1左移4位,变成10000,变成十进制就是16
写个方法,传递两个非0的int数值进去,实现变量交换,有几种方式? //方式一public static void swap(int a, int b) { System.out.printf("a=%d,b=%d", a, b); a = a + b; b = a - b; //b = a + b - b = a a = a - b; //a = a + b - a = b System.out.printf("a=%d,b=%d", a, b);}//方式二 异或运算(一个数与另一个数异或两次是其本身,一个数和自身异或结果是0)public static void swap2(int a, int b) { System.out.printf("a=%d,b=%d", a, b); a = a ^ b; //a1 = a^b b = b ^ a; //b = b^a^b = a a = a ^ b; //a = a1^b = a^b^a = b System.out.printf("a=%d,b=%d", a, b);
2. 数据类型
说下Java数据类型分类//基础数据类型:byte、short、int、long、float、double、char、boolean//引用类型:其它都是引用类型//String和Enum也是引用类型
运算:定义变量int i = 5,那么return i++;和return ++i; 返回的结果是什么? //i++ 返回 5,先返回后增加//++i 返回 6,先增加后返回
==和equals的区别 //基本数据类型的比较,要用==判断是否相等//引用数据类型:==比较的是内存地址是否一样,不同对象的内存地址不一样,equals比较的是具体内容,也可以自定义什么条件去判断两个对象是否一样