前言:
作者:CodeCow · 阿牛,微信搜索公众号 “CodeCow ”,我们一起干“java”
正文:
1、Java 的基础数据类型有几种 ?都是啥 ?
8 种
byte、short、int、long、float、double、char、boolean
2、String是最基本的数据类型吗 ? 是否可以继承String类 ?
不是 是引用数据类型
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类
3、①:short s1 = 1; s1 = s1 + 1;有错吗 ? ②:short s2 = 1; s2 += 1;有错吗 ?
①:有错(s1+1运算结果是int型,需要强制转换类型)、 ②:正确
分析①:
s1 = s1 + 1 做运算的时候,1 是 int 类型,s1 会被提升为int类型
,
s1+1 后的结果是int类型
,将结果在赋值会short类型时发生错误
short 内存 2 个字节,int 类型 4 个字节
必须将int强制转成short才能完成赋值
分析②:
**+=
**是一个运算符,只运算一次,并带有强制转换的特点
也就是说 s2 += 1 就是 s2 = (short)(s2 + 1) ,因此程序没有问题编译通过,运行结果是2.
4、String s = new String(“CodeCow”); 创建了几个String Object?
两个
分析:
一个是 “xyz”,一个是指向 “xyz” 的引用对象 s
5、int 和 Integer 有什么区别 ?
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类
扩展:
Java为每个原始类型提供了封装类。
原始类型——封装类
boolean——Boolean,
char——Character,
byte——Byte,
short——Short,
int——Integer,
long——Long,
float——Float,
double——Double
6、String,StringBuffer 与 StringBuilder 的区别 ?
String类提供了数值不可改变的字符串(既:String的值是不可变的,每次对String的操作都会生成新的String对象)
StringBuffer 和StringBuilder 提供的字符串可以进行修改(既:并且不产生新的未使用对象)
StringBuffer 之间的最大不同在于 StringBuilder 的方法是线程不安全的
扩展:
由于 StringBuilder 是线程不安全的 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
7、被 final 修饰的 类、方法、变量 有什么特点?
final 修饰的类,不能被继承
final 修饰的方法,不能被重写
final 修饰的变量,不能被重新赋值
8、Overload 和 Override 的区别。Overloaded的方法是否可以改变返回值的类型?
重写 (Overriding) :如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写
重载(Overloading):如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载
Overloaded的方法是可以改变返回值的类型。
扩展:
方法的重写 Overriding 和 重载 Overloading 是Java多态性的不同表现
重写Overriding是父类与子类之间多态性的一种表现;
重载Overloading是一个类中多态性的一种表现。
9、final, finally, finalize的区别 ?
final 用于声明类,方法和变量,分别表示类不可继承,方法不可重写,变量不可重新赋值。
finally 是异常处理语句结构的一部分,表示总是执行。
finalize 是Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
扩展:
和 finally 藕断丝连 的问题 ===》 看下面 十九
10、Collection 和 Collections的区别 ?
Collection 是单例集合的顶层接口,继承与他的接口主要有 Set 和 List.
Collections 是集合的工具类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
11、你所知道的集合类都有哪些?主要方法 ?
最常用的集合类是 List 和 Map。
List 的具体实现包括 ArrayList 、 Vector、 LinkedList
Map 的具体实现包括 hashMap、hashTable、treeMap
12、List、Map、Set 三个接口,存取元素时,各有什么特点 ?
List 以特定次序来持有元素,可有重复元素。
Set 无法拥有重复元素,内部排序。
Map 保存key-value值,value可多值。
总结:
List ===> 有序、重复
Set ===> 无序、不重复
13、说说 ArrayList,Vector, LinkedList 的存 储性能 和 特性 ?
ArrayList 和Vector都是使用数组方式存储数据,所以索引(查询)数据快 而 插入数据慢
Vector 由于使用了 synchronized 方法(线程安全),通常性能上较ArrayList 差
而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
总结:
ArrayList 和 Vector ====> 查询数据快、增加和删除数据 慢
LinkedList ====> 查询数据 慢、增加和删除数据 快
14、HashMap和Hashtable的区别 ?
HashMap 是非线程安全 ;Hashtable 是线程安全的,因此,效率上可能低于HashMap 。
HashMap 允许将 null 作为一个 entry 的 key 或者value,而Hashtable不允许
扩展:
它两最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
15、&和&&的区别 ?
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。
16、List, Set, Map是否继承自 Collection 接口 ?
List,Set 是
Map 不是
17、数组 有没有 length() 这个方法? String 有没有 length() 这个方法 ?
数组没有length()这个方法,有length的属性。
String有有length()这个方法。
18、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals() ? 它们有何区别 ?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否
equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
19、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后 ?
会执行
在return前执行。
扩展:
和 finally 藕断丝连 的问题 ===》 看上面 九
20、error 和 exception 有什么区别 ?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
21、同步和异步有何异同,在什么情况下分别使用他们?举例说明 ?
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
22、 给我一个你最常见到的runtime exception ?
NullPointerException
IndexOutOfBoundsException
SecurityException
SystemException
。。。。。。
23、 接口是否可继承接口 ? 抽象类是否可实现(implements)接口 ? 抽象类是否可继承实体类(concrete class) ?
接口可以继承接口。
抽象类可以实现(implements)接口
抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数
24、 说说数据连接池的工作机制是什么 ?
服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。
如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
25、 abstract 的 method 是否可同时是static ? 是否可同时是 synchronized ?
都不能
26、 构造器Constructor是否可被override ?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
27、 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对 ?
不对,有相同的hash code。
28、 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法 ?
不能
一个对象的一个synchronized方法只能由一个线程访问。
29、 线程同步的方法有哪些 ?
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
30、 多线程有几种实现方法,都是什么 ?
多线程有两种实现方法
分别是继承Thread类与实现Runnable接口
31、 同步有几种实现方法,都是什么 ?
同步的实现方面有两种
分别是synchronized , wait与notify
32、写一个Singleton出来 (不用考虑其他)?
public class MySingleton {
private MySingleton(){}
private static MySingleton INSTANCE = null;
public static synchronized MySingleton getInstance() {
if (null == INSTANCE){
INSTANCE = new MySingleton();
}
return INSTANCE;
}
}
33、线程的基本概念、线程的基本状态以及状态之间的关系 ?
线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。
Java中的线程有四种状态分别是:运行、就绪、挂起、结束。
34、synchronized 和 java.util.concurrent.locks.Lock的异同 ?
主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
35、 写个冒泡排序 ?
public static void bubbleSort(int arr[]) {
for(int i =0 ; i<arr.length-1 ; i++) {
for(int j=0 ; j<arr.length-1-i ; j++) {
if(arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
后记
从Java基础—>SpringCloud面试题的详细答案,已经整理成PDF文档
★★ 小声BB ★★
若有需要PDF的小伙伴,可以微信搜索公众号 “CodeCow”,回复:2020青铜 小编直接发百度网盘
也可以加小编微信:CodeCow-6666 私信小编
坚持,因为我是阿牛