面试题汇总
试题汇总
1.以下可以修饰接口的 private final abstract protected
abstract
2.栈的原理
1、java 的栈内存。它的真正名称叫做:java虚拟机栈。它和java堆内存的有一个很大的区别在于,
它是线程私有的。它的生命周期也和线程的生命周期捆绑在一起。
每个java方法在执行的时候都会创建一个栈帧用来存储局部变量表,
操作数栈,动态链接,方法出口等信息。
每一个方法从调用直至完成执行后的过程,
就对应着一个栈帧在虚拟机栈中的入栈到出栈的过程。
在java虚拟机栈中,
局部变量表所需要的内存空间在编译期间完成分配的。
也就是说在进入一个方法时,
这个方法在帧中分配多大的局部变量空间是完全确定的,
在方法运行期间不会改变局部变量表的大小。
那如果这个方法的线程所需要的内存大于这个空间呢?结果是会抛出OutOfMemoryError异常。
另外如果线程请求的栈深度大于虚拟机所设的深度,将抛出 StackOverflowError异常。
3.泛型的作用
类型安全 泛型的主要目标是实现java的类型安全。 泛型可以使编译器知道一个对象的限定类型是什么,这样编译器就可以在一个高的程度上验证这个类型
消除了强制类型转换 使得代码可读性好,减少了很多出错的机会
Java语言引入泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
4.final的作用d
1、被final修饰的类不可以被继承
2、被final修饰的方法不可以被重写
3、表示变量只能一次赋值以后值不能被修改(常量)
关键字final的好处小结
1、final关键字提高了性能。JVM和Java应用都会缓存final变量。
2、final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
3、使用final关键字,JVM会对方法、变量及类进行优化。
4、对于不可变类,它的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销。
5.是否存在i+1<i的数据,请说明理由
两边同时减去i
则1<0
这个式子不成立
所以原来的不等式也不可能成立
所以不存在这样的数
6. 数据库主键自增会有什么影响
优点:
1.自增,趋势自增,可作为聚集索引,提升查询效率
2.节省磁盘空间。500W数据,UUID占5.4G,自增ID占2.5G.
3.查询,写入效率高:查询略优。写入效率自增ID是UUID的四倍。
缺点:
1.导入旧数据时,可能会ID重复,导致导入失败。
2.分布式架构,多个Mysql实例可能会导致ID重复。
7.RPC运用和过程
说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样。
RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC,它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC。会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化。
众所周知,TCP 是传输层协议,HTTP 是应用层协议,而传输层较应用层更加底层,在数据传输方面,越底层越快,因此,在一般情况下,TCP 一定比 HTTP 快。就序列化而言,Java 提供了默认的序列化方式,但在高并发的情况下,这种方式将会带来一些性能上的瓶颈,于是市面上出现了一系列优秀的序列化框架,比如:Protobuf、Kryo、Hessian、Jackson 等,它们可以取代 Java 默认的序列化,从而提供更高效的性能。
为了支持高并发,传统的阻塞式 IO 显然不太合适,因此我们需要异步的 IO,即 NIO。Java 提供了 NIO 的解决方案,Java 7 也提供了更优秀的 NIO.2 支持,用 Java 实现 NIO 并不是遥不可及的事情,只是需要我们熟悉 NIO 的技术细节。
我们需要将服务部署在分布式环境下的不同节点上,通过服务注册的方式,让客户端来自动发现当前可用的服务,并调用这些服务。这需要一种服务注册表(Service Registry)的组件,让它来注册分布式环境下所有的服务地址(包括:主机名与端口号)。
8.ArrayList与LinkedList的区别
区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也previous)
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
4.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
5.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
6.LinkedList不支持高效的随机元素访问。
7.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。
总结:
当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
9.简单说明一下乐观锁和悲观锁
悲观锁
悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
Java synchronized 就属于悲观锁的一种实现,每次线程要修改数据时都先获得锁,保证同一时刻只有一个线程能操作数据,其他线程则会被block。
乐观锁
乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁适用于读多写少的应用场景,这样可以提高吞吐量。
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
乐观锁一般来说有以下2种方式:
使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。
使用时间戳(timestamp)。乐观锁定的第二种实现方式和第一种差不多,同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。
10.Spring框架为企业级开发带来的好处有哪些?(至少两点)
可以从以下几个方面作答:
- 非侵入式:支持基于POJO的编程模式,不强制性的要求实现Spring框架中的接口或继承Spring框架中的类。
-IoC容器:IoC容器帮助应用程序管理对象以及对象之间的依赖关系,对象之间的依赖关系如果发生了改变只需要修改配置文件而不是修改代码,因为代码的修改可能意味着项目的重新构建和完整的回归测试。有了IoC容器,程序员再也不需要自己编写工厂、单例,这一点特别符合Spring的精神"不要重复的发明轮子"。
- AOP(面向切面编程):将所有的横切关注功能封装到切面(aspect)中,通过配置的方式将横切关注功能动态添加到目标代码上,进一步实现了业务逻辑和系统服务之间的分离。另一方面,有了AOP程序员可以省去很多自己写代理类的工作。
- MVC:Spring的MVC框架是非常优秀的,从各个方面都可以甩Struts 2几条街,为Web表示层提供了更好的解决方案。
- 事务管理:Spring以宽广的胸怀接纳多种持久层技术,并且为其提供了声明式的事务管理,在不需要任何一行代码的情况下就能够完成事务管理。
- 其他:选择Spring框架的原因还远不止于此,Spring为Java企业级开发提供了一站式选择,你可以在需要的时候使用它的部分和全部,更重要的是,你甚至可以在感觉不到Spring存在的情况下,在你的项目中使用Spring提供的各种优秀的功能。
11. Spring容器和springmvc容器的区别联系
Spring是根容器,SpringMVC是其子容器。子容器的创建依赖于父容器的创建,父容器先于子容器创建。子容器(SpringMVC容器)可以访问父容器(Spring容器)的Bean,父容器(Spring容器)不能访问子容器(SpringMVC容器)的Bean
12. Delete、truncate、drop的区别?
drop直接删掉表
truncate删除表中数据,再插入时自增长id又从1开始
delete删除表中数据,可以加where字句。
13. 编写一个函数,判断101-200之间有多少个素数,并输出所以素数
for (int i = 101; i < 200; i++) {
boolean b = true;//默认此数就是素数
for (int j = 2; j <= Math.sqrt(i);j++){
if(i%j ==0){
b = false;
break;
}
}
if(b){
count++;
System.out.print(i + " ");
}
}
System.out.println("\n素数的个数:"+count);
14. “a==b”和”a.equals(b)”有什么区别?
如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,当内容相同时,返回true,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于两个不同对象,但是包含的字母相同的比较。
15. Java支持多继承么?如果不支持,如何实现
Java 类 不支持多继承,但是可以通过实现多个接口来弥补多继承带来的好处
另外Java 接口是可以多继承的;因为接口只是定义了一些抽象方法,特定的行为不包含类别的含义,不指代特定的事物,接口多继承是合理的。
16. Wait()和sleep()的区别
1.wait只能在同步(synchronize)环境中被调用,而sleep不需要。
2.进入wait状态的线程能够被notify和notifyAll线程唤醒,但是进入sleeping状态的线程不能被notify方法唤醒。
3.wait通常有条件地执行,线程会一直处于wait状态,直到某个条件变为真。但是sleep仅仅让你的线程进入睡眠状态。
4.wait方法在进入wait状态的时候会释放对象的锁,但是sleep方法不会。
5.wait方法是针对一个被同步代码块加锁的对象,而sleep是针对一个线程
17. Union和union all有什么不同
UNION去重且排序
UNION ALL不去重不排序
18. Leftjoin、rightjoin、innerjoin查询结果的区别
1.left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
2.right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
3.inner join(等值连接) 只返回两个表中联结字段相等的行
19. 有个特殊的餐厅,对客人的要求是如果要离开餐厅一定要看下餐厅内有没有比你迟进来的人,一定要所有比你迟进来的人离开欧你才能离开,有一天甲乙丙丁是个客人先后进入这家餐厅,那么她们离开的顺序不可能是什么(写出至少2种),可能的顺序是什么(写出至少2种)并简要分析给出的答案。
链接:https://www.nowcoder.com/questionTerminal/ec6a7d9fa9a34c868f7e19bd6548e7be?toCommentId=379730
来源:牛客网
1
丙,乙,甲,丁 <====甲乙丙进,甲乙丙出,丁进丁出
2
甲,乙,丙,丁 <====甲进甲出,乙进乙出,丙进丙出,丁进丁出
3
乙,甲,丙,丁 <====甲乙进甲乙出,丙进丙出,丁进丁出
4
乙,丙,甲,丁 <====甲进,乙进乙出,丙进丙出,甲出,丁进丁出
5
丁,丙,甲,乙
6
丁,丙,乙,甲 <====甲进,乙丙丁进乙丙丁出,甲出
模拟了一个栈的结构,
20. 分布式事务解决方案
1.XA 方案
2.TCC 方案
3.本地消息表
4.可靠消息最终一致性方案
5.最大努力通知方案
https://blog.csdn.net/weixin_34211761/article/details/91441749
21. 用递归实现字符串反转(关键字可用中文或简写代替)
public static void main(String[] args) {
System.out.println(reverse("123456"));
}
public static String reverse(String originStr) {
if(originStr == null || originStr.length() <= 1) {
return originStr;
}
return reverse(originStr.substring(1)) + originStr.charAt(0);
}
22. 写一个单例模式(关键字可用中文或简写代替)或者可代替代单例模式的方案,并简单说明写出的单例模式的设计特点
https://www.jianshu.com/p/965f6929c808
23. 线程的创建方式
1. 继承Thread类
2. 实现Runnable接口
3. 实现Callable接口
https://www.cnblogs.com/htyj/p/10848646.html
24. 线程之间如何通信
https://blog.csdn.net/u011514810/article/details/77131296
25.分布式锁的实现方式有几种,挑一种讲下如何实现
https://juejin.im/post/5cff593c6fb9a07ec56e6ed4
26. 数据库中in和exists的区别
in是在内存里遍历比较,而exists需要查询数据库,所以当B表数据量较大时,exists效率优于in
https://www.jianshu.com/p/f212527d76ff
27. 什么是ORM
简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写
http://www.ruanyifeng.com/blog/2019/02/orm-tutorial.html
28. 冒泡排序
import com.jiajia.ArrayUtil.*; // 按包名导入
public class BubbleSortMain {
public static void main(String[] args) {
int[] arr = {2,5,1,3,8,5,7,4,3};
bubbleSort(arr);
ArrayUtil.print(arr);
}
/**
* 冒泡排序
* @param arr
*/
private static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i -1; j++) { // 这里说明为什么需要-1
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
}
29. having的作用
having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。
https://www.cnblogs.com/lmaster/p/6373045.html
30. spring mvc的注解及作用
1、controller、service、repository、component、
以上四个注解分别作用域控制层、业务层、持久层,其中component不太常用。
当spring容器进行加载的时候,会将标记为以上注解的类注入到spring容器中。使用Autowired可以引入注入到spring容器的bean
31. 集群中如何同步消息会话
1. 利用数据库同步session
2. 利用cookie同步session
3. 利用memcache同步session
https://blog.csdn.net/weixin_44118685/article/details/88064729
32. 设计程序删除List<Integer>中大于10的数。
利用iterator.remove()
https://blog.csdn.net/Jin_Amy/article/details/78198726
33. 分布式生成唯一ID的几种方式及作用
https://juejin.im/post/5b3a23746fb9a024e15cad79
34. java,jvm逃逸分析、锁消除
Jvm虚拟机知识点
https://www.cnblogs.com/dugk/p/8900856.html
35. & , && ,| ,|| ,++i,i++
位与逻辑运算符区别
https://www.cnblogs.com/qlqwjy/p/8158239.html
36. springboot和springcloud 区别
https://www.cnblogs.com/wwct/p/12942982.html
37. springboot异常处理
https://blog.csdn.net/qq_24598601/article/details/89243914
38. springboot异常处理
https://blog.csdn.net/en_joker/article/details/89946034
39. Dubbo:基本原理机制。
https://blog.csdn.net/en_joker/article/details/89946034
40. 有哪些线程池,分别有什么特点
41. Mybatis实体类字段与数据库表不一样的时候如何处理
42. 有一个二维数组int[][] is=new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12,13},{14,15,16,17}}输入一个整数可以查询出这个整数是否存在
int[][] is=new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12,13},{14,15,16,17}};
int a=5;
for(int i=0;i<is.length;i++) {
for(int j=0;j<is[i].length;j++) {
if(a==is[i][j]) {
System.out.println("位置["+i+"]["+j+"]");
}
}
}
一、选择题(每题4分)
1、关于构造器是否可以被override,是否可以被overload(b)
A、能,能
B、不能,能
C、不能,能
D、能,不能
2、“abcdefg”sbustring(2,3)的结果是(c)
A、cde
B、b
C、c
D、bcd
3、如果对象的引用被置为null,垃圾收集器什么时候释放对象占用的(c)
A、立即释放
B、方法调用结束后释放
C、下一个垃圾回收周期
D、不确定
4、下面哪个流类属于面向字符的输入流?(d)
A、BufferedWriter
B、FilelnputStream
C、ObjectlnputStream
D、InputStreamReader
5、是java接口的修饰符是?(d)
A、prvate
B、protected
C、stotic
D、abstract
6、以下描述中,对抽象类和接口的区别描述正确的是(a)
A、抽象类可以有构造方法,接口不能有构造方法
B、抽象类可以包含静态方法,接口中不能包含静态方法
C、一个类可以继承多个抽象类,但只能实现一个接口
D、抽象类中不可以包含静态方法,接口中可以包含静态方法
7、以下哪些会使索引失效(a)
A、使用like关键字
B、条件包含or
C、查询条件使用函数在索引列上
D、条件中包含< >
8、下列哪个是jdk提供的编译器(b)
A、java exe
B、javac exe
C、javap exe
D、javaw exe
9、在jdk目录中,java程序语行环境的根目录是(d)
A、bin
B、demo
C、lib
D、jre
10、使用JDBC链接数据库的程序是()
A、加载驱动
B、导入驱动包
C、发送并处理SQL语句
D、建立数据库的链接
E、关闭链接
二、简答题(每题6分)
1、简单说明一下数据库隔离级别?
根据隔离程度从低到高分为:
Read Uncommitted(读未提交);
Read Committed(读已提交);
Repeatable Read(可重复读);
Serializable(串行化);
https://blog.csdn.net/Weixiaohuai/article/details/103796730
2、ArrayList与LinkedList的区别?
区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也previous)
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
4.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
5.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
6.LinkedList不支持高效的随机元素访问。
7.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。
总结:
当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
3、简单说明一下乐观锁和悲观锁?
https://www.jianshu.com/p/f5ff017db62a
悲观锁
悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
Java synchronized 就属于悲观锁的一种实现,每次线程要修改数据时都先获得锁,保证同一时刻只有一个线程能操作数据,其他线程则会被block。
乐观锁
乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁适用于读多写少的应用场景,这样可以提高吞吐量。
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
乐观锁一般来说有以下2种方式:
使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。
使用时间戳(timestamp)。乐观锁定的第二种实现方式和第一种差不多,同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。
4、什么是YAML?
YAML是一种人类可读的数据序列化语言。它通常用于配置文件。 与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据
5、Spring框架为企业级开发带来的好处有哪些?(至少两点)
可以从以下几个方面作答:
- 非侵入式:支持基于POJO的编程模式,不强制性的要求实现Spring框架中的接口或继承Spring框架中的类。
-IoC容器:IoC容器帮助应用程序管理对象以及对象之间的依赖关系,对象之间的依赖关系如果发生了改变只需要修改配置文件而不是修改代码,因为代码的修改可能意味着项目的重新构建和完整的回归测试。有了IoC容器,程序员再也不需要自己编写工厂、单例,这一点特别符合Spring的精神"不要重复的发明轮子"。
- AOP(面向切面编程):将所有的横切关注功能封装到切面(aspect)中,通过配置的方式将横切关注功能动态添加到目标代码上,进一步实现了业务逻辑和系统服务之间的分离。另一方面,有了AOP程序员可以省去很多自己写代理类的工作。
- MVC:Spring的MVC框架是非常优秀的,从各个方面都可以甩Struts 2几条街,为Web表示层提供了更好的解决方案。
- 事务管理:Spring以宽广的胸怀接纳多种持久层技术,并且为其提供了声明式的事务管理,在不需要任何一行代码的情况下就能够完成事务管理。
- 其他:选择Spring框架的原因还远不止于此,Spring为Java企业级开发提供了一站式选择,你可以在需要的时候使用它的部分和全部,更重要的是,你甚至可以在感觉不到Spring存在的情况下,在你的项目中使用Spring提供的各种优秀的功能
6、Spring容器与SpringMVC的容器联系与区别?
Spring是根容器,SpringMVC是其子容器。子容器的创建依赖于父容器的创建,父容器先于子容器创建。子容器(SpringMVC容器)可以访问父容器(Spring容器)的Bean,父容器(Spring容器)不能访问子容器(SpringMVC容器)的Bean
https://blog.csdn.net/a745233700/article/details/79172859
7、Delete、truncate、drop的区别?
drop直接删掉表
truncate删除表中数据,再插入时自增长id又从1开始
delete删除表中数据,可以加where字句。
8、表TEACHER包含如下字段:
3、编写一个函数,判断101-200之间有多少个素数,并输出所以素数。(10分)
int count = 0;
for (int i = 101; i < 200; i++) {
boolean b = true;//默认此数就是素数
for (int j = 2; j <= Math.sqrt(i);j++){
if(i%j ==0){
b = false;
break;
}
}
if(b){
count++;
System.out.print(i + " ");
}
}
System.out.println("\n素数的个数:"+count);
一、选择题。
1、(单选题)如果‘xyz’没有被创建过,string s=new String(‘xyz’) 创建几个字符串对象?( b )
A.1 B.2 C.3 D.4
2、(单选题)语句:charfoo=‘中’,下列说法正确的是?(假设源文件以GB2312编码存储,并且以JavaC-GB2312命令编译) (b)
A 可以编译,但不能运行。B 可以编译且能运行。C 不可以编译,但能运行。D不可以编译且不能运行。
3、(单选题)构造器(constructor)是否可被重写(override)或重载?(d)
A可重写不可重载 B 可重写可重载 C 不可重写不可重载 D不可重写可重载
4、(多选题)Java中能创建volatile数组吗?(b,c)
A能,但数组元素没有原子性 B 能,且数组元素具有原子性 C 能,且数组对象具有原子性 D 能,但数组对象不具有原子性
5、(单选题)方法的异常是否必须跑出(throws)或主动抓取处理(try..catch)?b
A,必须抛出但不必须主动抓取;B 必须抛出或必须主动抓取;C 不必须抛出且不必须主动抓取;D 不必须抛出但必须主动抓取;
6.(多选题)当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B。(a,b,c,d)
- 静态方法A,静态方法B,不可以;
- 静态方法A,非静态方法B,不可以;
- 非静态方法A,非静态方法B,不可以;
- 非静态方法A,静态方法B,不可以;
- (单选题)小a和小b一起玩一个游戏,两个人一起抛一枚硬币,正面为H,反面为T,2个人把抛到的结果写成一个序列,如果出现HHT则小a赢,游戏结束,如果HTT出现则小b赢。小a想问一下他获胜的概率是多少?(d`)
A.1/2 B.3/4 C.1/3 D.2/3
- 简要说明‘a==b’和‘a.equals(b)’有什么区别?
如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,当内容相同时,返回true,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于两个不同对象,但是包含的字母相同的比较。
- Java支持多继承么?如果不支持,如何实现?
Java 类 不支持多继承,但是可以通过实现多个接口来弥补多继承带来的好处
另外Java 接口是可以多继承的;因为接口只是定义了一些抽象方法,特定的行为不包含类别的含义,不指代特定的事物,接口多继承是合理的
- 简要说明sleep方法和wait方法的区别?
1.wait只能在同步(synchronize)环境中被调用,而sleep不需要。
2.进入wait状态的线程能够被notify和notifyAll线程唤醒,但是进入sleeping状态的线程不能被notify方法唤醒。
3.wait通常有条件地执行,线程会一直处于wait状态,直到某个条件变为真。但是sleep仅仅让你的线程进入睡眠状态。
4.wait方法在进入wait状态的时候会释放对象的锁,但是sleep方法不会。
5.wait方法是针对一个被同步代码块加锁的对象,而sleep是针对一个线程
- Union和union all有什么不同?
UNION去重且排序
UNION ALL不去重不排序
- Leftjoin、rightjoin、innerjoin查询结果的区别?
1.left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
2.right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
3.inner join(等值连接) 只返回两个表中联结字段相等的行
- 有个特殊的餐厅,对客人的要求是如果要离开餐厅一定要看下餐厅内有没有比你迟进来的人,一定要所有比你迟进来的人离开欧你才能离开,有一天甲乙丙丁是个客人先后进入这家餐厅,那么她们离开的顺序不可能是什么(写出至少2种),可能的顺序是什么(写出至少2种)并简要分析给出的答案。
1
丙,乙,甲,丁 <====甲乙丙进,甲乙丙出,丁进丁出
2
甲,乙,丙,丁 <====甲进甲出,乙进乙出,丙进丙出,丁进丁出
3
乙,甲,丙,丁 <====甲乙进甲乙出,丙进丙出,丁进丁出
4
乙,丙,甲,丁 <====甲进,乙进乙出,丙进丙出,甲出,丁进丁出
5
丁,丙,甲,乙
6
丁,丙,乙,甲 <====甲进,乙丙丁进乙丙丁出,甲出
模拟了一个栈的结构
- 简单描述一下dubbo或微服务或分布式架构,可画图说明.
- 分布式事务的解决方案。
1.XA 方案
2.TCC 方案
3.本地消息表
4.可靠消息最终一致性方案
5.最大努力通知方案
https://blog.csdn.net/weixin_34211761/article/details/91441749
- 用递归实现字符串反转(关键字可用中文或简写代替)
public static void main(String[] args) {
System.out.println(reverse("123456"));
}
public static String reverse(String originStr) {
if(originStr == null || originStr.length() <= 1) {
return originStr;
}
return reverse(originStr.substring(1)) + originStr.charAt(0);
}
- 写一个单例模式(关键字可用中文或简写代替)或者可代替代单例模式的方案,并简单说明写出的单例模式的设计特点
https://www.jianshu.com/p/965f6929c808
- jvm新建一个类的过程
类加载,分配内存,线程安全,初始仳和设置
2 java分配内存过程
3 spring bean作用域
Request,session.globle session,单例,
4.SQL语句优化
慢查询配置,分析慢查询日志,优化数据库结构,分解关联查询,
5.Dubo容错机制
- 失败自动切换。2快速失败3失败安全,写入审计日志4失败自动恢复
6.在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
public boolean Find(int target, int [][] array) {
int row=array.length;
int col=array[0].length;
int left=0;
int right=col-1;
while(left<row && right>=0){
if(target==array[left][right])
return true;
else if(array[left][right]<target)
left++;
else if(array[left][right]>target)
right--;
}
return false;
}
https://blog.csdn.net/qq_40109075/article/details/88699066
7.spring boot和spring cloud区别
8.java常见线程池和作用
- sleep() 和 wait()的区别(Java面试题)
1. sleep()方法是Thread的静态方法,而wait是Object实例方法
2. wait()方法必须要在同步方法或者同步块中调用,也就是必须已经获得对象锁。而sleep()方法没有这个限制可以在任何地方种使用。另外,wait()方法会释放占有的对象锁,使得该线程进入等待池中,等待下一次获取资源。而sleep()方法只是会让出CPU并不会释放掉对象锁;
3. sleep()方法在休眠时间达到后如果再次获得CPU时间片就会继续执行,而wait()方法必须等待Object.notift/Object.notifyAll通知后,才会离开等待池,并且再次获得CPU时间片才会继续执行。
————————————————
版权声明:本文为CSDN博主「alan_gaohaodong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/alan_gaohaodong/article/details/85264609

浙公网安备 33010602011771号