目录
2.集合常用方法:Collection 和 Collections的区别。
9.final、finally和finalize这三者之间的区别?
12.String 和StringBuffer、StringBuilder的区别?
14.说出ArrayList,Vector, LinkedList的存储性能和特性。
16.Overload和Override的区别,即重载和重写的区别。 Overloaded的方法是否可以改变返回值的类型?
18.abstract class和interface有什么区别?
20.short s1 = 1; s1 = s1 + 1;有什么错?
21.Math.round(11.5)等於多少? Math.round(-11.5)等於多少?解释Math.floor()
22.String s = new String("xyz");创建了几个String Object?
24.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
25.List, Set, Map是否继承自Collection接口?
26.abstract的method是否可同时是static,是否可同时是synchronized?
27.数组有没有length()这个方法? String有没有length()这个方法?
28.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
29.构造器Constructor是否可被override?是否可以继承String类?
30.switch 是否能作用在byte上,是否能作用在long上,是否能作用在String上?
31.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
32.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
35.关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
36.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
42.是否可以从一个static方法内部发出对非static方法的调用?
44.List、Map、Set三个接口,存取元素时,各有什么特点?
45.Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以 implements(实现)interface(接口)?
简述synchronized和java.util.concurrent.locks.Lock的异同 ?
当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法
1.Object()中方法:
1 registerNatives() //私有方法
2 getClass() //返回此 Object 的运行类。
3 hashCode() //用于获取对象的哈希值。
4 equals(Object obj) //用于确认两个对象是否“相同”。
5 clone() //创建并返回此对象的一个副本。
6 toString() //返回该对象的字符串表示。
7 notify() //唤醒在此对象监视器上等待的单个线程。
8 notifyAll() //唤醒在此对象监视器上等待的所有线程。
9 wait(long timeout) //在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或 者超过指定的时间量前,导致当前线程等待。
10 wait(long timeout, int nanos) //在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。
11 wait() //用于让当前线程失去操作权限,当前线程进入等待序列
12 finalize() //当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
2.集合常用方法:Collection 和 Collections的区别。
Collection是接口,是List和Set的父接口 size()、add()、remove()
- add(E e) ,添加元素
- clear() ,暴力清除集合中所有元素
- contains(Object o), 返回值类型:boolean。判断集合是否包含某个元素
- isEmpty() ,返回值类型:boolean。如果此集合不包含元素,则返回true。
- iterator() 迭代器。返回值类型:Iterator
- size() 返回值类型:int。返回集合中的元素数
Collections是工具类,提供了排序,混淆等等很多实用方法(https://www.cnblogs.com/guweiwei/p/6511974.html)
(1). 排序操作(主要针对List接口相关)
- reverse(List list):反转指定List集合中元素的顺序
- shuffle(List list):对List中的元素进行随机排序(洗牌)
- sort(List list):对List里的元素根据自然升序排序
- sort(List list, Comparator c):自定义比较器进行排序
- swap(List list, int i, int j):将指定List集合中i处元素和j出元素进行交换
- rotate(List list, int distance):将所有元素向右移位指定长度,如果distance等于size那么结果不变
(2). 查找和替换(主要针对Collection接口相关)
- binarySearch(List list, Object key):使用二分搜索法,以获得指定对象在List中的索引,前提是集合已经排序
- max(Collection coll):返回最大元素
- max(Collection coll, Comparator comp):根据自定义比较器,返回最大元素
- min(Collection coll):返回最小元素
- min(Collection coll, Comparator comp):根据自定义比较器,返回最小元素
- fill(List list, Object obj):使用指定对象填充
- frequency(Collection Object o):返回指定集合中指定对象出现的次数
- replaceAll(List list, Object old, Object new):替换
(3). 同步控制
- Collections工具类中提供了多个synchronizedXxx方法,该方法返回指定集合对象对应的同步对象,从而解决多线程并发访问集合时线程的安全问题。HashSet、ArrayList、HashMap都是线程不安全的,如果需要考虑同步,则使用这些方法。这些方法主要有:synchronizedSet、synchronizedSortedSet、synchronizedList、synchronizedMap、synchronizedSortedMap。
(4) 设置不可变集合
- Collections有三类方法可返回一个不可变集合:
- emptyXxx():返回一个空的不可变的集合对象
- singletonXxx():返回一个只包含指定对象的,不可变的集合对象。
- unmodifiableXxx():返回指定集合对象的不可变视图
(5) 其它
- disjoint(Collection<?> c1, Collection<?> c2) - 如果两个指定 collection 中没有相同的元素,则返回 true。
- addAll(Collection<? super T> c, T... a) - 一种方便的方式,将所有指定元素添加到指定 collection 中。示范:
Collections.addAll(flavors, "Peaches 'n Plutonium", "Rocky Racoon"); - Comparator<T> reverseOrder(Comparator<T> cmp) - 返回一个比较器,它强行反转指定比较器的顺序。如果指定比较器为 null,则此方法等同于 reverseOrder()(换句话说,它返回一个比较器,该比较器将强行反转实现 Comparable 接口那些对象 collection 上的自然顺序)。
3.进程与线程
进程:执行中的一段程序;
线程:线程是进程中执行运算的最小单位;
联系:一个进程中有不少于一个的线程;一个线程只归属于一个进程
4.start() / run()
start() : 启动线程;
run() : 只是一个普通的run()方法;
5.sleep() / wait()
sleep() : 线程的方法,暂停一段时间后继续执行,没有释放锁;
wait() : Object中的方法,会释放锁进入等待状态,直到接到唤醒通知(notify() /notifyAll())
6.多线程实现方式
(1)继承一个Thread类
(2)实现Runnable接口
(3)匿名内部类
7.连接池
创建n条连接,循环使用
8.switch语句中case标签可以是哪些?
- char、byte、short、int(或其包装类Character、Byte、Short、Integer)的常量表达式。
- 枚举类型。
- 从Java SE 7开始,case标签还可以是String。
9.final、finally和finalize这三者之间的区别?
- final表示最终的,可以修饰成员变量、成员方法、类。
final修饰成员变量,表示常量,其值只能被赋值一次,之后便不能更改。
final修饰成员方法,表示最终的方法,也即这个方法不能被子类重写。
final修饰类,表示最终类,也即这个类不能被继承。 - finally是异常处理机制的语法关键字,finally中的语句,无论是否发生异常,都将会被执行。
- finalize是Object类中的方法,当垃圾回收器回收对象空间之前,会自动调用的一个方法。
(经过的return中的语句都会执行,但真正跳出是在finally)
10.堆栈、队列
堆栈(stack):先进后出(First In Last Out 或 FILO)——如同一个杯子。
队列(queue):先进先出(First In First Out)FIFO——如同一个水管。
11.堆(heap)、栈(stack)
heap: 堆
stack: 栈 (在一些书籍里,会被翻译为堆栈,实际上指的就是单纯的这个栈)
存放的内容不一样:
heap: 是存放对象的
stack: 是存放基本类型(int, float, boolean 等等)、引用(对象地址)、方法调用
存取方式不一样:
heap: 是自动增加大小的,所以不需要指定大小,但是存取相对较慢
stack: 是固定大小的,并且是FILO 先入后出的顺序,并且存取速度比较快
堆(heap):堆总是一棵完全二叉树;堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。
栈(stack):又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。
堆、栈区别总结:
1.堆栈空间分配
①栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
②堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
2.堆栈缓存方式
①栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
②堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
3.堆栈数据结构区别
①堆(数据结构):堆可以被看成是一棵树,如:堆排序。
②栈(数据结构):一种先进后出的数据结构。
12.String 和StringBuffer、StringBuilder的区别?
String是不可变的,其内容一旦创建好之后,就不可以发生改变。
StringBuffer 是可以变长的,内容也可以发生改变
改变的原理是StringBuffer内部采用了字符数组存放数据,在需要增加长度的时候,创建新的数组,并且把原来的数据复制到新的数组这样的办法来实现。
StringBuilder 是线程不安全的,比StringBuffer快;
13.运行时异常与一般异常有何异同?
运行时异常 又叫做非可查异常,在编译过程中,不要求必须进行显示捕捉
一般异常又叫做可查异常,在编译过程中,必须进行处理,要么捕捉,要么通过throws 抛出去.
14.说出ArrayList,Vector, LinkedList的存储性能和特性。
先说ArrayList和Vector
两者都继承了抽象类AbstractList,但是Vector是线程安全的,而ArrayList是非线程安全的
再说ArrayList和LinkedList的区别
ArrayList 是数组结构,所以定位很快,但是插入和删除很慢
LinkedList 是双向链表结构,所以插入和删除很快,但是定位很慢
15.HashMap和Hashtable的区别
HashMap和Hashtable都实现了Map接口,都是键值对保存数据的方式
区别1:
HashMap可以存放 null
Hashtable不能存放null
区别2:
HashMap不是线程安全的类
Hashtable是线程安全的类
16.Overload和Override的区别,即重载和重写的区别。 Overloaded的方法是否可以改变返回值的类型?
Overload是方法重载的意思,指的是在同一个类里面,方法名一样,但是参数不一样
Override是方法重写的意思,指的是子类继承了父类的某个方法后,重新又写了一遍
Overloaded的方法是否可以改变返回值的类型?
可以,重载其实本质上就是完全不同的方法,只是恰好取了相同的名字
17.Error和Exception有什么区别?
Error和Exception都实现了Throwable接口
Error指的是JVM层面的错误,比如内存不足OutOfMemoryError
Exception 指的是代码逻辑的异常,比如下标越界OutOfIndexException
18.abstract class和interface有什么区别?
abstract class 抽象类和interface接口的区别
使用方式:
抽象类只能够通过继承被使用
接口必须通过实现被使用
实现方法:
抽象类不仅可以提供抽象方法,也可以提供实现方法
接口只能提供抽象方法,不能提供实现方法。 但是在JAVA8版本开始,接口可以提供实现方法了,前提是要在方法前加一个default修饰符
19.GC是什么? 为什么要有GC?
GC是Garbage Collection的缩写,即垃圾回收
这里所谓的垃圾,指的是那些不再被使用的对象,JVM的垃圾回收机制使得开发人员从无聊、容易犯错的手动释放内存资源的过程中解放出来。
开发人员可以更加专注的进行业务功能的开发,而资源回收的工作交由更加专业的垃圾回收机制自动完成。
20.short s1 = 1; s1 = s1 + 1;有什么错?
short s1 = 1; 这一句没有错误,编译器会自动把1这个整数处理为short.
s1 = s1 + 1; 右侧的表达式会返回一个Int类型的整数,再把这个int类型的整数赋给short类型的s1的时候,就会出现强制转换错误
21.Math.round(11.5)等於多少? Math.round(-11.5)等於多少?解释Math.floor()
Math.round 的意思是+0.5 取整数,四舍五入(取天花板)
所以 Math.round(11.5) 即 11.5+0.5 = 12
Math.round(-11.5) 即 -11.5+0.5 = -11
floor就是直接去掉小数保留整数,舍弃小数(取地板)
即如果参数是正数则小数部分全舍,参数是负数则小数部分全入。 例如:Math.floor(2.6)的值是2,Math.floor(-2.1)的值是-3
22.String s = new String("xyz");创建了几个String Object?
String s = new String("xyz");
首先构造方法 new String("xyz"); 中的"xyz" 这本身就是一个字符串对象
然后 new 关键字一定会创建一个对象
所以总共创建了两个String对象
23.Java有没有goto?
有,goto是关键字,但是是保留字,并不具备功能性
24.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口是否可继承接口?
可以,比如List 就继承了接口Collection
抽象类是否可实现(implements)接口?
可以,比如 MouseAdapter鼠标监听适配器 是一个抽象类,并且实现了MouseListener接口
抽象类是否可继承实体类(concrete class)?
可以,所有抽象类,都继承了Object
25.List, Set, Map是否继承自Collection接口?
List 和 Set 继承了Collection接口
但是Map和Collection之间没有继承关系,因为一个是键值对容器,一个是单值容器,无法兼容
26.abstract的method是否可同时是static,是否可同时是synchronized?
都不可以,
27.数组有没有length()这个方法? String有没有length()这个方法?
数组获取长度的手段是 .length 属性
String获取长度的手段是 length()方法
集合获取长度的手段是 size()方法
文件获取长度的手段是 length()方法
28.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
以HashSet为例,判断重复的逻辑是:
1. 首先看hashcode是否相同,如果不同,就是不重复的
2. 如果hashcode一样,再比较equals,如果不同,就是不重复的,否则就是重复的。
更多关于hashcode的原理,参考 Java HashCode原理详解
29.构造器Constructor是否可被override?是否可以继承String类?
子类不能继承父类的构造方法,所以就不存在重写父类的构造方法。
注: super() 表示子类调用父类的构造方法,这不能被叫做继承父类的构造方法
String是final修饰的,所以不能够被继承
30.switch 是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch 可以作用在 byte,short,int String,Enum(枚举) 上,但是不能作用在long上面
注:注:switch 作用在String上从JDK1.7开始支持,实质是编译时将字符串替换为了其对应的hash值
31.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
try里的return 和 finally里的return 都会执行,但是当前方法只会采纳finally中return的值
示例 28 :
32.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
因为hashCode()方法和equals()方法都可以通过自定义类重写,是可以做到equals相同,但是hashCode不同的
但是,在Object类的equals()方法中有这么一段话
* Note that it is generally necessary to override the {@code hashCode}
* method whenever this method is overridden, so as to maintain the
* general contract for the {@code hashCode} method, which states
* that equal objects must have equal hash codes.
- 翻译如下:
通常来讲,在重写这个方法的时候,也需要对hashCode方法进行重写,
以此来保证这两个方法的一致性——
当equals返回true的时候,这两个对象一定有相同的hashcode.
两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
所以这个题的答案应该是否定的,但是得搞清楚里面的原委
33.垃圾回收的优点和原理。并考虑2种回收机制。
与C语言开发人员需要手动进行内存资源的释放不同,Java提供垃圾回收机制,自动进行GC,将开发人员从容易犯错的内存资源管理中解放出来。
原理:当某个一个对象,没有任何引用指向它的时候,那么它就满足垃圾回收的条件,在适当的时候,JVM虚拟机进行GC将其回收,释放空间,以供后续再利用。
两种常见的回收机制:
1. 定时回收
每隔30分钟进行一次回收,这种机制的弊端是如果垃圾产生的比较快,有可能30分钟之内垃圾已经把内存占用光了,导致性能变慢
2. 当垃圾占到某个百分比的时候,进行回收
比如,当垃圾占到70%的时候,进行回收。 这种机制的弊端是,如果垃圾产生的频率很快,那么JVM就必须高频率的进行垃圾回收。 而在垃圾回收的过程中, JVM会停顿下来,只做垃圾回收,而影响业务功能的正常运行。
一般说来 JVM会采用两种机制结合的方式进行垃圾回收。
34.解析XML文档有哪几种方式?
主要是两种,SAX和DOM
SAX 就是逐行读取,直到找到目标数据为止
DOM 是先全文档加载,然后读取
35.关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
throws 用在方法声明上面,表示该方法有可能抛出某个异常
throw 抛出一个指定的异常
try catch 在try中有可能会抛出某个异常,一旦某个异常抛出后,就会在catch中进行捕捉,他俩一般说来都是成对出现的。
finally: 表示无论是否捕捉住异常,都会执行
36.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以包括多个类,但是只能出现一个public修饰的类,但是可以出现多个非public修饰的类。
37.java中有几种类型的流?
Java中所有的流都是基于字节流,所以最基本的流是
输入输出字节流
InputStream
OutputStream
在字节流的基础上,封装了字符流
Reader
Writer
进一步,又封装了缓存流
BufferedReader
PrintWriter
以及数据流
DataInputStream
DataOutputStream
对象流
ObjectInputStream
ObjectOutputStream
以及一些其他的奇奇怪怪的流 ~~~
38.java中会存在内存泄漏吗,请简单描述。
因为Java是自动进行垃圾回收管理的,所以不存在 C语言中同等概念的内存泄漏,但是存在Java特色的内存泄漏
当某些对象不被使用,但是又有非直接引用指向的时候,那么就不满足垃圾回收的条件,而形成内存泄漏。
比如代码中的例子,每个Object创建的时候,有一个引用o指向,接着就被放进了集合al中。 下一个Object创建的时候,上一个Object就没有引用指向了。
这些Object都没有引用指向,但是却放在ArrayList中,而这个Arraylist忘记了回收,那么里面的所有对象,都会一直存活下去,虽然不再被使用了。
代码比较复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
39.java中实现多态的机制是什么?
类的多态的条件:
1. 父类(接口)引用指向子类对象
2. 方法有重写
40.静态变量和实例变量的区别?
静态变量 直接通过类就可以访问,无需实例
实例变量 比如同构类的某个具体实例,才可以访问
41.什么是java序列化,如何实现java序列化?
序列化指的是把一个Java对象,通过某种介质进行传输,比如Socket输入输出流,或者保存在一个文件里
实现java序列化的手段是让该类实现接口 Serializable,这个接口是一个标识性接口,没有任何方法,仅仅用于表示该类可以序列化。
42.是否可以从一个static方法内部发出对非static方法的调用?
不行,因为非static方法需要一个具体的实例才可以调用,而调用 static方法的时候,不一定存在一个实例
示例 41 :
43.在JAVA中,如何跳出当前的多重嵌套循环?
在外部循环的前一行,加上标签
在break的时候使用该标签
即能达到结束多重嵌套循环的效果
代码比较复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
44.List、Map、Set三个接口,存取元素时,各有什么特点?
List 是有顺序的,并且可以重复
Set 是无序的,不可以重复 (参考如何判断Set中的对象是否重复)
Map 保存数据的方式是键值对
45.Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以 implements(实现)interface(接口)?
匿名内部类本质上就是在继承其他类,实现其他接口
如例:
匿名类1,就是继承了Thread
匿名类2 ,就是实现了Runnable接口
示例 44 :
内部类可以引用外部类的成员吗?有没有什么限制?
可以使用
如果是非静态内部类,可以使用外部类的所有成员
如果是静态内部类,只能使用外部类的静态成员
多线程有几种实现方法,都是什么?
通常来讲,Java 创建一个线程有三种方式
1. 继承一个Thread类
2. 实现Runnable接口
3. 匿名内部类
详细请参考 Java 创建一个线程的三种方式
示例 46 :
sleep() 和 wait() 有什么区别?
首先sleep和wait之间没有任何关系
sleep 是Thread类的方法,指的是当前线程暂停。
wait 是Object类的方法, 指的占用当前对象的线程临时释放对当前对象的占用,以使得其他线程有机会占用当前对象。 所以调用wait方法一定是在synchronized 中进行
示例 47 :
说出数据连接池的工作机制是什么?
数据库连接池原理:
因为创建连接和关闭连接的行为是非常耗时的,会显著降低软件的性能表现。解决办法就是先创建n条数据库连接Connection,循环使用,但是不进行关闭,这样再执行SQL语句,就不需要额外创建连接了,直接使用现成的连接就可以了,从而节约了创建连接和关闭连接的时间开销。
参考 自己设计一个数据库连接池类:ConnectionPool
示例 48 :
简述synchronized和java.util.concurrent.locks.Lock的异同 ?
1. Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,Lock是代码层面的实现。
2. Lock可以选择性的获取锁,如果一段时间获取不到,可以放弃。synchronized不行,会一根筋一直获取下去。 借助Lock的这个特性,就能够规避死锁,synchronized必须通过谨慎和良好的设计,才能减少死锁的发生。
3. synchronized在发生异常和同步块结束的时候,会自动释放锁。而Lock必须手动释放, 所以如果忘记了释放锁,一样会造成死锁。
完整的Lock教程请查看:Lock对象
示例 49 :
Class.forName的作用?为什么要用?
Class.forName常见的场景是在数据库驱动初始化的时候调用。
Class.forName本身的意义是加载类到JVM中。 一旦一个类被加载到JVM中,它的静态属性就会被初始化,在初始化的过程中就会执行相关代码,从而达到"加载驱动的效果"
当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法
这要看情况而定,如果该对象的其他方法也是有synchronized修饰的,那么其他线程就会被挡在外面。否则其他线程就可以进入其他方法。
你最常见到的runtime exception。
NullPointerException 空指针异常
ArithmeticException 算术异常,比如除数为零
ClassCastException 类型转换异常
ConcurrentModificationException 同步修改异常,遍历一个集合的时候,删除集合的元素,就会抛出该异常
IndexOutOfBoundsException 数组下标越界异常
NegativeArraySizeException 为数组分配的空间是负数异常
常见异常:
空指针异常类型:NullPointerException
数组下标越界异常:ArrayIndexOutOfBoundsException
类型强制转换类型:ClassCastException
类没有找到:ClassNotFoundException
文件未找到异常:FileNotFoundException
方法未找到异常:NoSuchMethodException
算数异常类:ArithmeticExecption,比如除数为零
文件已结束异常:EOFException
输入输出异常:IOException
非法参数异常:IllegalArgumentException
ConcurrentModificationException 同步修改异常,遍历一个集合的时候,删除集合的元素,就会抛出该异常
NegativeArraySizeException 为数组分配的空间是负数异常