1. JavaOOP
1. 面向对象的特征有哪些方面?
1. 抽象
抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两个方面。抽象只关注对象有哪些属性和行为,并不关心这些行为的细节是什么。
2. 封装
封装就是把数据和操作数据的方法绑定起来,对数据的访问只能通过以定义的接口。简单说:封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。
3. 继承
继承是从已有类得到继承信息创建新类的过程。提供继承的类叫做父类(超类、基类), 得到继承的类叫子类(派生类)
4. 多态
简单说就是同样的对象引用调用同样的方法但是做不同的事情。
2. 访问修饰符的区别?
java中访问修饰符有四种:public protected default private
public可以在任何类中访问
protected 可以在当前类、同包、子类中访问
default 可以在当前类、同包下访问
private 只能在本类中访问
3. String是基本数据类型吗?
不是,是引用数据类型,
java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean类型;
除了基本数据类型其余的都是引用数据类型,java5以后引用了枚举类型
4. float f=3.4; 是否正确?
不正确, 3.4是双精度,将双精度赋值给浮点型属于向下转型,会造成精度损失,
因此需要强制类型转换3.4F或(float)3.4
5. short s1 = 1; s1=s1+1;有错吗?short s1=1; s1+=1 有错吗?
对于short s1 = 1; s1 = s1 + 1;由于1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。而short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换。
6. Java有没有goto?
goto是java中的保留字,在目前版本中java没有使用
7. int和Integer有什么区别?
int 是基本数据类型,编译效率要高于Integer
Integer 是int的包装类型,Integer根符合Java面向对象编程。
8. &和&&的区别
&运算符有两种用法:(1)按位与;(2)逻辑与。 &无论怎样,都会验证两边的值
&&运算符是短路与运算。&&只要前面为false,后面就不验证了。
9. 解释内存中的栈、堆、方法区的用法?
栈的使用:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间。
堆的使用:通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域。
方法区的使用:方法区和堆都是各个线程共享的内存区域,用于存储已经被JVM加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据;程序中的字面量如直接书写的100、"hello"和常量都是放在常量池中,常量池是方法区的一部分。
10. Math.round(11.5) 等于多少? Math.round(-11.5)等于多少?
等于12和-11, round表示四舍五入
11. switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch目前支持:byte,short,char,int,enum,String类型
其中:byte,short,char,int是jdk5之前就可以使用
enum是jdk5开始使用的,
String是jdk7开始使用的
12. 用最有效率的方法计算2乘以8?
2 << 3 左移3位相当于乘以2的3次方
2 >> 3 右移3位相当于除以2的3次方
13. 数组有没有length()方法,String有没有length()方法?
数组中没有length()方法,有length属性,String中有length()方法
14. 在Java中,如何跳出当前的多重嵌套循环?
在最外层循环前加一个标记如A, 然后用break A;可以跳出多重循环
15. 构造器是否可以被重写?
构造器不能被继承,所有不能被重写,但是可以重载
16. 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。
17. 是否可以继承String类
不可以,String类是用final类修饰的,使用final修饰的类不可以被继承
18. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。在Java中方法调用只支持参数的值传递。
19. String、StringBuffer、StringBuilder的区别
String长度和内容是不可变的,而StringBuffer和StringBuilder都是内容可变字符串类型
StringBuffer是线程安全的,StringBuilder线程不安全
StringBuilder比StringBuffer的效率要高
20. 重载和重写的区别
重载:
在同一个类中,方法名相同,参数列表或返回值类型不同,构成方法重载。
构造方法就是典型的方法重载。
重写:
在具有继承关系的子类中重写,方法名、参数列表和返回值类型必须完全相同
比如接口实现类去实现接口的时候,就会重写接口中所有发抽象方法
21、描述一下JVM加载class文件的原理机制?
22、char 型变量中能不能存贮一个中文汉字,为什么?
char类型占2个字节, 一个中文也占2个字节, 所以可以存储汉字
23、抽象类(abstract class)和接口(interface)有什么异同?
相同点: (1) 都可以存在抽象方法
(2) 都可以被继承
(3) 普通子类都需要重写抽象方法
(4) 不能实例化
不同点: (1) 关键字:abstract(抽象类), interface(接口);
(2) 抽象类中可以有普通方法,接口中不可以
(3) 类能继承抽象类,接口继承接口
24、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
静态嵌套类是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。
而通常的内部类需要在外部类实例化后才能实例化,其语法看起来挺诡异的
25、Java 中会存在内存泄漏吗,请简单描述。
理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。例如hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。下面例子中的代码也会导致内存泄露。
26、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?
都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。
27、阐述静态变量和实例变量的区别。
静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。
28、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化。
29、如何实现对象克隆?
实现Cloneable接口并重写Object类中的clone()方法; 2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,
30、GC是什么?为什么要有GC?
31、String s = new String(“xyz”);创建了几个字符串对象?
两个对象,一个是静态区的"xyz",一个是用new创建在堆上的对象。
32、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类
接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类。
33、一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?
可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。
34、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?
可以继承其他类或实现其他接口。毕竟它也是一个类
35、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?
一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。 因为它也属于当前类的一部分
36、Java 中的final关键字有哪些用法?
final是一个修饰符:
final修饰类:类不能被继承
final修饰方法:方法不能被重写
final修饰变量:变量变常量
final不能修饰抽象类和接口,因为他们的抽象方法都需要子类来实现
37、数据类型之间的转换:- 如何将字符串转换为基本数据类型?- 如何将基本数据类型转换为字符串?
如果字符串转换基本数据类型就可以使用自己的包装类,如果 Integer.parseInteger("1");
如果基本数据类型转换字符串就可以使用 +"" ,或 强制转换 或调用toString方法
38、如何实现字符串的反转及替换?
反转:StringUtils.reverse("asaf");
替换:使用String类中的replace("a","1");
39、怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?
new String("获取这个字符串的getBytes".getBytes("GB2312"),"ISO-8859-1");
40、日期和时间:- 如何取得年月日、小时分钟秒?- 如何取得从1970年1月1日0时0分0秒到现在的毫秒数?- 如何取得某月的最后一天?- 如何格式化日期?
Date date = new Date();
date.getDate();
date.getYear();
# java8新语法
LocalDateTime dt = LocalDateTime.now();
System.out.println(dt.getYear());
System.out.println(dt.getMonthValue()); // 1 - 12
System.out.println(dt.getDayOfMonth());
System.out.println(dt.getHour());
System.out.println(dt.getMinute());
System.out.println(dt.getSecond());
41、打印昨天的当前时刻。
new Date(new Data.getTime-24*60*60*60*1000);
System.out.println(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(yesterday));
// java8新特性
LocalDateTime today = LocalDateTime.now();
System.out.print(today.minusDays(1));
42、LocalDate和Date的比较与区别
Date可读性太差,必须配合SimpleDateFromat进行格式化,而且SimpleDateFromat线程是不安全的
LocalDate可以直接获取某年月日,而且设计的时候是线程安全的接口
43、比较一下Java和JavaScriprt。
Java是Sun公司开发的一套面向对象程序设计语言。主要用于后端开发。
JavaScript是网景开发的一套脚本语言,嵌入在web页面运行。
44、什么时候用断言(assert)?
没用过,我只在微服务中使用过
45、Error和Exception有什么区别?
error 表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;
exception 表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。
46、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?
会执行,在return 前执行。
因为return是最后返回时执行的, try-finally是一个整体
47、Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?
(1)、try: 监听可能出现异常的代码
catch:用于捕获异常
finally:有没有异常都会执行,一般用于释放资源
throw:用于抛出异常
throws: 用于声明方法可能抛出的异常
(2)、System.exit(1)
48、运行时异常与受检异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。
java 编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
49、列出一些你常见的运行时异常?
(1)、数组下标越界异常:IndexOutOfBoundsException
(2)、空指针异常:NullPointerException
(3)、输入非法参数的异常:IllegalArgumentException
(4)、强制类型转换异常:ClassCastException
(5)、算数异常(除零异常):ArithmeticExceptio
50、阐述final、finally、finalize的区别。
final是一个修饰符:
final修饰类:类不能被继承
final修饰方法:方法不能被重写
final修饰变量:变量变常量
final不能修饰抽象类和接口,因为他们的抽象方法都需要子类来实现
finally:
finally只能与try/catch语句结合使用,经常使用在释放资源的情况下
finalize:
finalize是一个方法,属于java.lang.Object类,finalize()方法是GC运行机制的一部分,finalize()方法是在GC清理它所从属的对象时被调用的
51、集合框架底层数据结构
Collection
1. List
Arraylist: Object数组
Vector: Object数组
LinkedList: 双向循环链表
2. Set
HashSet(无序,唯一):基于 HashMap 实现的,底层采用 HashMap 来保存元素
LinkedHashSet: LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别的。
TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树。)
Map
1. HashMap: JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间
2. LinkedHashMap:LinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。
3. HashTable:数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的
4. TreeMap:红黑树(自平衡的排序二叉树)
52、List、Set、Map是否继承自Collection接口?
List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。
53、阐述ArrayList、Vector、LinkedList的存储性能和特性。
54、Collection和Collections的区别?
Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。
55、Java中HashMap和Hashtable的区别
HashMap和HashTable是Map接口的具体的实现
HashMap是线程非安全的,HashTable是线程安全的,所以HashMap的效率高于HashTable.
HashMap允许键或值为空,而HashTable不允许键或值为空.
56、List、Map、Set三个接口存取元素时,各有什么特点?
57、TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
58、根据你的理解,请说明ArrayList和LinkedList的区别?
ArrayList和LinkedList是List接口的具体实现
ArrayList实现了可变大小的数组,在进行随机访问和遍历元素时,它提供更好的性能。
LinkedList提供了额外的addFirst()、addLast()、removeFirst()、removeLast()等方法,可以在LinkedList的首部或尾部进行插入或者删除操作。
两者相比:
ArrayList在查询遍历元素时效率高。
LinkedList在插入或者删除元素时效率高。