如果我们说另一种不同的语言,那么我们就会发觉有一个不同的世界
——Luduing Wittgerstein
1、面向对象的特征有哪些
封装
最常见的是把属性私有化封装在一个类里面,只能通过方法去访问
继承
子类继承父类,从而继承了父类的方法和属性
抽象
比如一个英雄类,抽象出了name、hp这些属性,使得开发过程中更加易于理解
多态
多态分操作符的多态和类的多态,类的多态指父类引用指向子类对象,并且有继承,有重写
2、String是最基本的数据类型吗
不是,String 是类类型
基本数据类型有四类八种
整型 byte short int long
字符 char
浮点 double float
布尔 boolean
3、int 和integer有什么区别
int是基本数据类型32位证书
Integer是类类型,是int的包装类
int和integer之间可以通过自动装箱、自动拆箱互相转换
自动装箱:不需要调用构造方法,通过=符号把基本类型转换为类类型就叫装箱
自动拆箱:不需要调用integer的intvalue方法,通过=就自动转换为int类型,就叫拆箱
4、String和StringBuffer的区别
String是immutable的,其内容一旦创建好之后,就不可以发生改变
StringBufffer是可以变长的,内容也可以发生改变
改变的原理是StringBuffer内部采用了字符数组存放数据,在需要增加长度的时候,创建新的数组,并且把原来的数据复制到新的数组这样的办法实现
5、为什么String类型不可变
String的成员变量都是private final的,初始化之后不可变。
不可变的好处:最主要还是安全问题
·便于实现字符串池
在java中会大量的使用String常量,如果每一次声明一个String都要创建一个String
对象,那将会造成极大的空间资源浪费。于是提出了String pool的概念,在堆中开辟一块存储空间String tool,当初始化String变量时,如果该字符串已经存在了,就不会创建一个新的字符串变量,而是会返回已经存在了的字符串的引用
· 使线程安全
· 避免安全问题
· 加快字符串处理速度
可通过反射破坏String的不可变性
6、运行时异常与一般异常有什么区别?
运行时异常又叫做非可排查异常,在编译过程中,不要求必须进行显示捕捉
一般异常又叫做可排查异常,在编译过程中,必须进行处理,要么捕捉,要么通过throws抛出去
7、说出ArrayList,Vector,LinkedList的存储性能和特性
ArrayList和Vector,两者都继承了抽象类AbstractList,但是Vector是线程安全的,而ArrayList是非线程安全的
ArrayList和LinkedList区别,参见8
8、ArrayList和LinkedList的区别
· ArrayList的实现是基于数组,LinkedList的实现是基于双向链表
· 对于随机访问,ArrayList优于LinkedList,ArrayList可以根据下标O(1)时间复杂度对元素进行随机访问。而LinkedList的每一个元素都依靠地址指针和它后一个元素连接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)
· 对于插入和删除操作,LinkedList优于ArrayList,因为当匀速被添加在LinkedList任意位置的时候,不需要像ArrayList那样重新计算大小或者更新索引
· LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素
9、Collection和Collections的区别
Collection是接口,是List和Set的父接口
Collections是工具类,提供了排序、混淆等等实用方法
10、&和&&的区别
&有两个作用,分别是位与和逻辑与
&& 就是逻辑与
作为逻辑与,& 和 &&分别表示长路与和短路与
长路与两次都会被运损
短路与 只要第一个是false,第二个就不进行运算了
11、HashMap和Hashtable的区别
HashMap和Hashtable都实现了Map接口,都是键值对保存数据的方式
区别1:HashMap可以存放null,Hashtable不能
区别2:HashMap不是线程安全的类,Hashtable是
12、final、finally、finalize的区别
final
final修饰类、方法、基本类型变量
修饰类,表示该类不能被继承
修饰方法,表示该方法不能被重写
修饰基本类型变量,表示该变量只能被赋值一次
修饰引用 表示引用只有一次指向对象的机会
finally
finally用于异常处理的场面,无论是否有异常抛出,都会执行
finalize
finalize是Object的方法,所有类都继承了该方法。当一个对象满足垃圾回收的条件,并且被回收的时候,其finalize()方法就会被调用
13、Overload和Override的区别,即重载和重写的区别,OverLoaded的方法是否可以改变返回值的类型?
OverLoad。重载
Override 重写
可以,重载其实本质上就是完全不同的方法,只是恰好取了相同的名字
14、Error和Exception的区别
Error和Exception都实现了Throwable接口
Error指的是JVM层面的错误,比如内存不足OOM
Exception指的是代码逻辑的异常,比如数组下表越界等
15、abstract 、class、抽象类和interface接口的区别
使用方式:
抽象类只能通过继承被使用
接口必须通过实现被使用
实现方法:
抽象类不近可以提供抽象方法,也可以提供实现方法
接口只能提供抽象方法,不能提供实现方法,但从1.8开始,接口可以提供实现方法了,前提是要在方法前加一个default修饰符
16、heap和stack有什么区别
heap:堆
stack:栈
存放的内容不一样:
heap是存放对象的
stack是存放基本类型,引用、方法调用的
存取方式不一样:
heap是自动增加大小的,所以不需要指定大小,但是存取相对较慢
stack是固定大小,并且是FILO陷入后厨的顺序,并且存取速度比较快
17、GC是什么?为什么要有GC
GC是垃圾回收英文的缩写
所谓的垃圾,指的是哪些不再被使用的对象,JVM的垃圾回收机制使得开发人员从无聊、容易犯错的手动释放内存资源的过程中解放出来,开发人员可以专注进行业务开发,而资源回收的工作交由更加专业的垃圾回收机制自动完成
18、short s1=1,s1=s1+1,有什么错误
short s1=1 无错误,1最终为short类型
s1=s1+1,会出现强制转换错误
19、Math.round(11.5)等于多少,Math,round(-11.5)等于多少?
Math.round取整数,四舍五入,第一步为12,第二部为-11
20、String s = new String(“xyz”)创建了几个String Object?
构造方法本身就是一个字符串对象
然后new'关键字一定会创建一个对象
所以总共创建了两个String对象
21、接口是否可继承接口?抽象类是否可实现接口?抽象类是否可继承实体类?
1>可以,比如List就是继承了Collection
2>可以
3>可以,所有抽象类都继承了Object
22、List、Set、Map是否继承自Collection接口
List和Set继承了Collection接口
Map和Collection之间没有继承关系,一个是键值对,一个是单值,无法兼容
23、abstract的method是否可同时是static,是否可同时是synchroized?
都不可以
24、数组没有length()方法?String有没有该方法?
数组获取长度的手段是.length属性
String获取长度的手段是length()方法
集合获取长度的手段是size()方法
文件获取长度的手段是length()方法
25、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
以hashSet为例,判断重复的逻辑是:
1>首先看hashcode是否相同,如果不同,就是不重复的
2>如果hashcode一样,再比较equals,如果不同就是不重复的,否则就是重复的
26、构造器Constructor是否可被override?是否可继承String类?
子类不能继承父类构造方法,所以就不存在重写父类的构造方法
27、switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch可以作用在byte、short、int、String、ENUM上,但是不能作用在long上面
28、try{}里有一个return语句,那么紧跟在这个try后的finally{}李的code会不会被执行,什么时候执行,在return前还是后?
try里的return和 finally里的return都会执行,但是当前方法知会采纳finally中return的值
29、两个对象值相同(x.equals(y)==true),但却可有不同的hash code,这句话对不对?
因为hashcode()方法和equals()方法都可以通过自定义重写,是可以做到equals相同,但是hashcode不同的
30、垃圾回收的有点和原理。并考虑2种回收机制
java提供垃圾回收机制,自行GC,将开发人员从容易犯错的内存管理中解放出来
原理:当某一个对象,没有任何引用指向它的时候,那么它就满足垃圾回收的条件,在适当的时候,jvm虚拟机进行GC将其回收,释放空间,以便后续再利用
常见回收机制:
1>定时回收
每隔30分钟进行一次回收,这种机制的弊端是如果垃圾产生的较快,有可能30分钟内垃圾已经把内存占用光了,导致性能变慢
2>当垃圾占到某个百分比的时候,进行回收
比如当垃圾占用到70%的时候,进行回收。这种机制的弊端是,如果垃圾产生的频率很快,那么jvm就必须高频率的进行垃圾回收。而在垃圾回收的过程中,jvm会停顿下来,只做垃圾回收,而影响业务功能的正常运行。
一般来说会将两种机制结合使用
31、你所知道的集合类有哪些?主要方法
常见的集合:ArrayList、LinkedList、HashSet、HashMap等等
常见方法:size(),add(),remove()等等
32、char型变量中能不能存储一个中文汉字?
char是16位的,占用2个字节。
汉字通常使用GBK编码,也是使用两个字节
所以可以存放汉字
33、解析XML文档有集中方式
SAX和DOM
SAX是逐行读取,直到找到目标为止
DOM是先全文档加载,然后读取
34、关键字:throws、throw、try~catch、finally分表代表什么意义,在try块中可以抛出异常吗?
throws:用在方法声明上面,表示该方法有可能抛出某个异常
throw:抛出一个指定异常
try~catch:在try中有可能会抛出某个异常,一旦某个异常抛出后,就会在catch中进行捕捉,一般是一起用的
finally:表示无论是否捕捉住异常,都会执行
35、java源文件中是否包括多个类?有什么限制
可以包括多个类,但是只能出现一个public修饰的类,但是可以出现多个非public修饰的类
36、java中有集中类型的流?
所有的流都是基于字节流,所以最基本的流是:
输入输出字节流:InputStream、OutputStream
在字节流的基础上,封装了字符流:Reader、Writer
进一步又封装了缓存流:BufferedReader、PrintWriter
以及数据流:DataInputStream、DataOutputStream
对象流:ObjectInputStream、ObjectOutputStream
等等
37、会出现内存泄露吗,具体说明
会的
当某些对象不被使用,但是又有非直接引用指向的时候,那么就不满足垃圾回收的条件,从而形成内存泄露
demo:
<pre style="color: rgb(0, 0, 0); font-family: "Courier New"; font-size: 12px; margin: 5px 8px; padding: 5px;">static ArrayList<Object> al = new ArrayList<Object>(); public static void main(String[] args){ for(int i = 0; i < 100; i++){
Object o = new Object();
al.add(o);
}
}</pre>
38、多态实现的机制是什么?
· 父类引用指向子类对象
· 重写
39、静态变量和实例变量的区别
静态变量直接通过类就可以访问,无需实例
示例变量,比如通过类的具体实例,才可以访问
40、什么是java序列化?如何实现java序列化
序列化就是把一个java对象,通过某种介质进行传输,比如Socket输入输出流,或者保存在一个文件里
实现java序列化的手段是让该类实现接口Serializable,这个接口是一个标识性接口,没有任何方法,仅仅用于表示该例可以序列化
41、是否可以从一个static方法内部发出对非static方法的调用?
不行,因为非static方法需要一个具体的实例才可以调用,而调用static方法的时候,不一定存在一个实例
42、List、Map、Set三个接口,存取元素的时候,各有什么特点?
List是有顺序的,并且可以重复的
Set是无序的,不可以重复
Map保存数据的方式是键值对
43、Anonymous Inner Class(匿名内部类)是否可以extends其他类,是否可以实现接口?
匿名内部类本质上就是在继承其他的类,实现其他的接口
44、内部类可以应用外部类的成员吗?有没有什么限制?
可以使用
如果是非静态内部类,可以使用外部类的所有成员
如果使静态内部类,只能使用外部类的静态成员
45、多线程有几种实现方式,都是什么?
三种
· 继承一个Thread类
· 实现Runnable接口
· 匿名内部类
46、sleep和wait有什么区别
这二者之间没有任何关系
sleep是Thread类的方法,指的是当前线程暂停
wait是Object类的方法,指的占用当前对象的线程临时释放对当前对象的占用,以使得其他线程有机会占用当前对象。所以调用wait方法一定是在synchronized中进行的
47、说说数据连接池的工作机制是什么
连接原理:因为创建链接和关闭连接的行为是非常耗时的。会显著降低软件的性能表现,解决办法就是先创建N条数据库连接Connection,循环使用,但是不进行关闭,这样再执行SQL语句,就不需要额外创建链接了,直接使用。现成的连接就可以,从而节约了创建链接和关闭连接的时间开销
48、简述synchronized和java,util,concurrent.locks.Lock的异同
·Lock是一个接口,而synchronized是java中的关键字,synchronized是内置的语言实现,Lock是代码层面的实现
·Lock可以选择性的获取锁,如果一段时间获取不到,可以放弃。synchronized不行,会一直获取下去,借助Lock这个特性,就能够规避死锁,synchronized必须通过谨慎和良好的设计,才能减少死锁的发生
·synchronized在发生异常和同步快结束的时候,会自动释放锁。而Lock必须手动释放,如果忘记释放锁,一样会造成死锁
49、Class.forName的作用,为什么要这么用
Class.forName常见场景是在数据库驱动初始化的时候调用
Class.forName本身的意义是加载类到JVM中,一旦一个类被加载到JVM中,它的静态属性就会被初始化,在初始化的过程中就会执行相关代码,从而达到“加载驱动的效果”
50、当一个线程进入到一个对象的一个synchronized方法后,其他线程是否可进入此对象的其他方法
视情况而定,如果该对象的其他方法也是有synchronized修饰的,那么其他线程就会被挡在外面,否则其他线程就可以进入其他方法
51、举例常见的runtime exception
NullpointException 空指针
ArithMeiticException 算数
ClassCastException 类型转换
ConcurrentModificationException 同步修改
IndexOutOfBoundsException 数组越界
NegativeArraySizeException 为数组分配的空间是负数
52、进程、线程和任务之间的区别是什么?
进程:是一个OS的抽象概念,是用来执行程序的环境,程序通常运行在用户模式,通过系统调用或自陷来进入内核模式。
线程:可被调度的运行在CPU上的可执行上下文,内核拥有多个线程,一个进程有一个或多个线程。
任务:一个Linux的可运行实体,可以指一个进程(含有单个线程),或一个多线程的进程里的一个线程,或内核线程。
53、什么是上下文切换?
内核程序切换CPU让其在不同的地址空间上做操作(上下文)。
有时也称做进程切换或任务切换,是指CPU 从一个进程或线程切换到另一个进程或线程。(百度百科)
54、paging和swapping之间的区别是什么?
内存和 SWAP 的这种交换过程称为页面交换(Paging),值得注意的是 paging 和 swapping 是两个完全不同的概念,国内很多参考书把这两个概念混为一谈,swapping 也翻译成交换,在操作系统里是指把某程序完全交换到硬盘以腾出内存给新程序使用,和 paging 只交换程序的部分(页面)是两个不同的概念。纯粹的 swapping 在现代操作系统中已经很难看到了,因为把整个程序交换到硬盘的办法既耗时又费力而且没必要,现代操作系统基本都是 paging 或者 paging/swapping 混合,swapping 最初是在 Unix system V 上实现的。(阿里云PTS)
55、说说进程和线程
进程是程序分配静态资源的基本单位
线程是程序动态执行的基本单位
56、缓存行大小标准以及一致性
64个字节
没有一致性标准
57、抽象类和接口的区别
相同点:
·都不能被实例化
·接口的实现类或者抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化
不同点:
·接口只有定义,不能有方法的实现,1.8之后可以定义default,而抽象类可以有定义与实现,方法可在抽象类中实现
·实现接口的关键字未implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以使用接口可以间接实现多重继承
·接口强调特定功能的实现,而抽象类强调所述关系
·接口成员默认为public static final,必须赋初始值,不能被修改;其他所有的成员方法都是public、abstract的。抽象类中成员变量默认为default,可以在子类中被重新定义,也可以被重新赋值;抽象方法被abstrace修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号