java面试知识大法【== 持续更新中ing...建议收藏关注 ==】
- first part 语法篇
- second part 设计模式篇
- third part 算法技巧篇
- forth part 存储技巧篇
- five part 模拟开发场景篇
- java编程思想篇
first part 语法篇
- 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以。
1、如果有公开类,只能有一个类的访问权限为public,且此类名为.java的文件名。 2、无公开类,符合命名规则即可。 注释:
1、一个编译单元(.java文件)只允许一个public对外出口,若有两个public文件时,将会引起歧义(将不能为编译单元,同一文件将会编译两次),导致报错。
2、因为public类是公共访问的,jvm运行时并不是把所有类都加载至内存,当遇到import的时候,才会根据路径(包名)去编译.java文件。public类名与文件名一致,便于寻找,开销减少。
3、若同一.java有非public类,将视为这些类为支持public类的辅助类,毕竟不是public,无法对外。
4、一个".java"源文件中包括多个类,编译结束将会产生多个.class文件。
5、main方法不一定要在public修饰了的类下才能执行(可以为辅助类)。但是main方法必须是public修饰的
- 2、Java有没有goto?
有,但没用,作为关键字进行保留。
- 3、说说&和&&的区别。
1、&和&&用作逻辑与的运算,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
2、双与还具有短路功能,双与运算时,当双与左边为假时,则不再计算双与右边的表达式了。双与更为高效,双与用的较多。
- 4、在JAVA中如何跳出当前的多重嵌套循环?
通过循环嵌套前但标签+break/continue
- 5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
1、在switch(expr1)中,expr1只能是一个整数表达式【byte,short,char,int】或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中【JDK1.7以前的版本】。
2、由于在JDK7.0中引入了新特性,所以switch语句可以接收一个String类型的值,String可以作用在switch语句上。
- 6、java为什么不能用protected修饰类,只有public和default。(内部类除外)
default权限为同一个包中的任何类可以访问该类。protected的权限为同一个包中的其他任何类以及任何子类(无论子类是在哪个包中声明的)可以访问该类。貌似看上去protected比default多了一个子类权限,但是这个权限前提是有子类。对于protected权限的类,根本无法在非该类所在包中创建子类。所以实际上,对于顶级类来说,protected修饰跟default是一样的。反而相比之下,protected修饰顶级类就显得没有任何意义了。
- 7、short s1= 1; s1 = (s1+1是int类型,而等号左边的是short类型,所以需要强转)1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?(没有错)
short s1= 1; s1 = s1+1;错误:s1+1运算时候会自动转型为int,而S1为short,故需要强转;s1 =
(short)s1+1; short s1 = 1; s1 += 1; 正确:+=会自动将int型的结果转为左侧变量的类型;
- 8、char型变量中能不能存贮一个中文汉字?为什么?
可以存储大部分的中文汉字,因为char存储的为unicode编码,占两个字节。而大部分汉字也是两个字节;不过最好用String存储汉字,因为String是utf-16编码,会有4字节编码,包含所有汉字(比unicode多两个扩展字节)。
- 9、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
引用不变,对象内容可以变动。
public void FindCase(final StringBuffer strBuffer){
strBuffer.append(“final obj context”);
}
- 10、是否可以从一个static方法内部发出对非static方法的调用?
不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方
法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联
到哪个对象上的呢?这个逻辑无法成立。所以不可以从一个static方法内部发出对非static方法的调用
- 11、Integer与int的区别
Integer是int的包装类; 1、存储内容不同,int基础类型之一,存储数据;Integer是对象,存储引用;
2、Integer为语法糖,在.class编译时决定结果;
3、自动装包/卸包(valueOf/intValue),缓存为-128–127;
- 12、Math.round(11.5)等於多少?Math.round(-11.5)等於多少?
Math.ceil(x)向上取整;Math.floor(x)向下取整;Math.round(x)是x+0.5向下取整;
Math.round(11.5)=12;Math.round(-11.5)=-11;
- 12、Java 中实现多态的机制是什么?
答:重载(overload)和重写(override)
如果一个子类继承了一个父类,子类中拥有和父类相同方法名称,返回值,参数类型的话,就是重写,会执行子类中的方法。
如果一个类中定义了多个同名方法,他们有不同的参数类型或者参数数量,那就叫重载(注:返回值类型可以不同)
- 13、抽象类可以被实例化吗?
抽象类其实是可以实例化的,但是他的实例化方式不是通过new方式来创建对象,而是通过父类的引用来指向子类的实例来间接地实现父类的实例化(因为子类要实例化前,一定会先实例化他的父类。这样创建了继承抽象类的子类的对象,也就把其父类(抽象类)给实例化了).但是:接口是不能被实例化的(接口压根就没有构造函数)。
- 14、SQL中between and 边界问题?
between前后闭区间,not between前后开区间。
- 15、Mysql中的replace into 与insert into ?
replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中, 1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。
(注意:
1、尝试向表里插入新行
当表里唯一索引或者primary key冲突的时候:
delete冲突行再尝试插入新行,有的情况下,存储引擎可能把replace当作update执行(能原地更新的时候,比如当唯一索引及对应的 primary key都相同时,是做的update操作),而不是delete+insert;
2、返回一个数表示受影响的行数,是删除和插入的行的总和
3、但在高并发插入的过程中,会偶发出现死锁!!!!
若需要详细的死锁原因了解,可以留言,若留言多的话,将补充replace into 高并发下死锁分析。
)
- 16、sql 中的字段宽度int(5),varchar(225)作用是什么?
链接:https://www.jianshu.com/p/53065fa934c4
- 17、Unicode和UTF-8区别?
Unicode 是「字符集」
UTF-8 是「编码规则」
【注:gbk是gb2312的超集】
second part 设计模式篇
third part 算法技巧篇
- 1、题目描述:
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。
返回滑动窗口最大值。
示例:
输入: nums =
[1,3,-1,-3,5,3,6,7]
, 和 k = 3
输出:
[3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
注意:
你可以假设 k 总是有效的,1 ≤ k ≤ 输入数组的大小,且输入数组不为空。
代码:
import java.util.*;
public class Solution {public ArrayList<Integer> maxInWindows(int [] num, int size){ArrayList<Integer> res=new ArrayList<>();LinkedList<Integer> linkedlist = new LinkedList<>();if(size == 0) return res;for(int i=0;i<num.length;i++){if(!linkedlist.isEmpty()){if(linkedlist.getFirst() < i- size+1){linkedlist.pollFirst();}}while(!linkedlist.isEmpty() && num[linkedlist.peekLast()] < num[i]){linkedlist.pollLast();}linkedlist.add(i);if(0 <= i- size+1){res.add(num[linkedlist.peekFirst()]);}}return res; }
}
注解:时间复杂度O(n);双端队列(Deque)
其实这题可以暴力解决O(n2);最大堆解决O(logN);但利用双端队列应该是最优解;
解答这题需要的一些基础:
1、双端队列的基本操作;(pop()/push()/peek()/add()/is.Empty()…对于一个常年混迹php/java,偶尔还写点go的rd来说,这些还真容易混淆。)
2、jar包引入;import java.util.*
思路:
1、边缘问题;if(size == 0) return res;也叫条件选择,对引出问题的参数进行判断,对问题中边缘情况进行处理。
2、发现潜在的数学逻辑问题;
2.1、当向右滑动窗口时,紧挨的两个数,当右边当数小于左边,那最大的值永远不会是右边;
2.2、最终结果集到底有多少元素; 及 什么时候是产生元素临届条件;
2.3、结合具体实现,捋顺解决问题逻辑顺序;
题中主要有三块:【结合具体实现,顺序发生变化,则结果无望】
2.3.1、干掉队列头【当到达元素产出临界条件时】
2.3.2、加入元素【队列尾元素小于新元素】
2.3.3、产出头元素至结果集
Q:需要学会分解问题,发现问题潜在逻辑,清晰的思路 == 处理问题的能力【数据结构,语法语意都是解决问题的工具】。
forth part 存储技巧篇
five part 模拟开发场景篇
java编程思想篇
- 1、访问机制关键字:public\protected\private
访问权限机制的目的是处理类库创建者和类库使用者之间的通信,目的就是1、防止使用者过度触碰与其无关部分;2、创建者优化,维护部分不影响使用者;
- 2、反射、RTTI --对象类型
RTTI/反射两者都可以用来确认对象类型。RTTI是在编译阶段打开和检查.class文件,相关的是类加载机制、.class对象(getName()/forName()/.type);反射是在运行时打开及检查.class文件。
RTTI的一个局限是当指向的对象引用不在本地的代码环境时【基于构建的编程架构】,程序无法处理对象类型。对应下面的一个反射动机:
要在运行时获取类的信息的其中一个动机是:希望提供在跨网络的远程平台上提供创建和运行对象的能力,就是远程方法调用【RMI】。
- 3、java容器/数组打印
一维数组打印【包含基础类型及引用类型】需要用System.out.println(Arrays.toString(array)),若直接System.out.println(array),则为数组首地址。
二维+【二维、三维…都适用】【包含基础类型及引用类型】数组打印为System.out.println(“b:”+Arrays.deepToString(b));
若System.out.println(Arrays.toString(array)),当执行Arrays.toString的时候相当于遍历数组,并且输出数组的元素,但是这个数组的元素是数组,所以这里输出的是数组元素的地址。
容器则直接输出即可,无需其他操作。