1.==和equals,输出结果为false
String a = "ab"; String b = "a" + new String("b"); System.out.println(a==b);
==比较的是2个对象的地址,而equals比较的是2个对象的内容
2.多线程,输出结果为ba
new Thread(()-> System.out.println("a")).start(); System.out.println("b");
线程创建后处于可执行状态,主线程执行过程中并不会等待子线程,而是继续执行后面的代码打印出b,主线程执行完毕后,子线程被唤醒执行打印出a
3.类型转换,结果为double
byte x=1; double y=2; System.out.println((short)x/y*2);
数字类型进行运算时,会将范围小的转换为范围大的类型
4.jvm,下面创建了2个对象
String a=new String("a");
"a"为第一个对象,创建在堆中;new String()的参数为第二个对象,也在堆中
5.抽象类和接口的区别
参数 | 抽象类 | 接口 |
默认的方法实现 | 它可以有默认的方法实现 | 它可以有默认的方法实现(jdk8+) |
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
与正常Java类的区别 | 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。default(jdk8+)可以使用 |
main方法 | 抽象方法可以有main方法并且我们可以运行它 | 接口没有main方法,因此我们不能运行它。 |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 |
添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 | 如果你往接口中添加非默认方法,那么你必须改变实现该接口的类。默认方法则不需要 |
6.netty中server端的socket连接流程以及pipeline和Channel的作用
流程:1创建工作组,2创建引导服务器,3设置NIO传输,4将处理程序添加到通道管道
ChannelPipeline:责任链模式的核心组件,ChannelHandler的容器,按顺序组织各个ChannelHandler,并在它们之间转发事件
Channel:封装了jdk原生的channel,提供统一的API,作为其它各个功能组件的容器
7.若try中有return语句,finally会执行吗?在return之前还是之后呢?
会执行,在方法return动作之前,return语句执行之后,若finally中再有return语句,则此方法以finally的return作为最终返回,若finally中无return语句,则此方法以try的return作为最终返回。
8.什么是IOC,SpringIOC有哪些方式
IOC是依赖注入
接口注入:接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限
setter方法注入:对于习惯了传统 javabean 开发的程序员,通过 setter 方法设定依赖关系更加直观。如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。如果用到了第三方类库,可能要求我们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。
构造器注入:在构造期间完成一个完整的、合法的对象。所有依赖关系在构造函数中集中呈现。依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。
9.java反射机制的概念和原理及其应用
概念:反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
原理:通过字节码文件找到某一个类、类中的方法以及属性
应用:生成动态代理,面向切片编程
10.关系型数据库和非关系型数据库的区别
关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据
非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决
数据库类型 |
特性 | 优点 | 缺点 |
关系型数据库 Oracle、mysql |
1、关系型数据库,是指采用了关系模型来组织数据的数据库; 2、关系型数据库的最大特点就是事务的一致性; |
1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解; 2、使用方便:通用的SQL语言使得操作关系型数据库非常方便; 3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率; 4、支持SQL,可用于复杂的查询。 |
1、为了维护一致性所付出的巨大代价就是其读写性能比较差; 2、固定的表结构; 3、高并发读写需求; 4、海量数据的高效率读写; |
非关系型数据库 MongoDb、redis |
1、使用键值对存储数据; 2、分布式; 3、一般不支持ACID特性; 4、非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。 |
1、无需经过sql层的解析,读写性能很高; 2、基于键值对,数据没有耦合性,容易扩展; 3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,而关系型数据库则只支持基础类型。 |
1、不提供sql支持,学习和使用成本较高; 2、无事务处理,附加功能bi和报表等支持也不好; |
11.mysql储存引擎
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,上图也看到了,InnoDB是默认的MySQL引擎
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事物
MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问
如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择
如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果
如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive
12.多线程数据同步方案
信号量 Semaphore 应用场景:用于流量控制,限流
同步屏障 CyclicBarrier 应用场景:用于多线程计算数据,最后合并计算结果,例如多个老师打分,最后合并算平均分
Exchanger 两个线程之间进行数据交换 应用场景:用于两个线程之间交换数据,例如校对工作
ConutDownLatch 倒计时器 应用场景:可以用于模拟高并发
ConutDownLatch 一般用于某个线程A等待若干个其他线程执行完任务之后,它才能执行
CyclicBarrier 一般用于一组线程互相等待到某个状态,然后这一组线程在同时执行
ConutDownLatch 是不能重用的,CyclicBarrier 可以重复使用
https://blog.csdn.net/yz2015/article/details/79436123
13.serverlet生命周期
响应时创建,服务器关闭时销毁
14.常用第三方包
log4j:一个非常常用的log日志jar包。
apache commons:包含了大量组件,很多实用小工具。
maven:项目管理的;
gson:Google 的Json解析库;
JUnit:java单元测试;
jsoup:html解析;
15.常用正则表达式
https://www.cnblogs.com/coder-wzr/p/7838527.html
16.Linux常用指令
https://www.cnblogs.com/javastack/p/8796178.html
17.数据库连接池及其实现方案
DBCP数据源、C3P0数据源
连接池初始化、连接池销毁、取连接、关闭连接、删除连接、维护连接池大小、定时器事件处理
https://www.cnblogs.com/joshul/p/6224680.html
18.有两个不均匀分布的香,香烧完的时间是一个小时,你能用什么方法来确定一段15分钟的时间?
一根香点燃一端,另一根香同时点燃两端,这样点两端的香烧完是半小时,点燃一端的香还剩下半小时。这时,把点燃一端香的另外一端也点燃,从这时起这根香烧完的时间就是15分钟。
19.一群人开舞会,每人头上都戴着一顶帽子。帽子只有黑白两种,黑的至少有一顶。每个人都能看到其它人帽子的颜色,却看不到自己的。主持人先让大家看看别人头上戴的是什幺帽子,然后关灯,如果有人认为自己戴的是黑帽子,就打自己一个耳光。第一次关灯,没有声音。于是再开灯,大家再看一遍,关灯时仍然鸦雀无声。一直到第三次关灯,才有劈劈啪啪打耳光的声音响起。问有多少人戴着黑帽子?
第一次时,若有人没看到黑帽子,就知道是自己了,就会自打耳光;但是没有人打自己耳光,说明每个人都看到黑帽子了。因此,可以推断至少有两顶黑帽子。
第二次时,若有人看到只有一个黑帽子,就知道是他和自己两个人戴了黑帽子,就会自打耳光;但是没有人打自己耳光,说明每个人都看到两顶黑帽子了。因此,可以推断至少有三顶黑帽子。
第三次时,自然是三个人都只看到了两顶,因此判断自己头上戴的必定是黑帽子。因此,到了关灯时就自打耳光了。
其实以次类推,到了第几次动手,就可以知道有几个戴了黑帽子。
20.解决死锁
1.按顺序访问2.加锁时限3.设置随机优先级,优先级低的线程进行回退3.信号量获取对象4.阻塞队列5.使用线程安全的类进行无锁编程