一面面试问题汇总,这家提前批,我投递的是java后台,但是被调剂到了安卓岗位了,所以全程没有问项目,以下是面试过程中问的问题。
1、个人问题,不写了
2、职业发展方向?是从事开发?现在面的是安卓开发你知道吗?
3、意愿是不是不匹配?
4、这个岗位你的优势是什么?
5、java中的值类型和引用类型有什么区别?
答案
6、java中的引用,强引用,还有哪三个引用?
以下答案来源于深入理解JVM书
java中不管是使用引用计数算法还是可达性算法判断一个对象是不是存活都和引用离不开,在jdk1.2之前的版本,引用是很传统的定义;如果一个reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这个数据是代表某块内存、某个对象的引用。这种定义并没有什么不对,但是只有两个状态就是被引用和没有被引用,对于一些食之无味弃之可惜的对象就显得无法描述,比如我们希望能描述一类对象:当内存空间还足够时,能够保留在内存中,但是当内存空间在进行垃圾回收之后还是很紧张的话,那就可以抛弃这些对象,这在很多系统的缓存功能里都有这样的应用场景。
java 中的引用就4个分别是: 强引用,软引用,弱引用,虚引用,这四种引用的引用强度一次减弱。
强引用 就是传统的引用的定义,类似于欧Object obj = new Objrect();这种引用关系。无论在何种情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。
软引用 用来描述一些还有用但是不是必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常
弱引用 也是用来描述哪些非必须的对象,但是它的强度比软引用更弱一些,被弱引用引用的对象只能活到下一次GC前,GC后一定会被回收
虚引用 没有实际的应用,只是用来在被关联的对象被垃圾回收器回收时收到一个系统通知
7、GC的规则,遇到弱引用怎么处理?
参考6的答案
8、static关键字有哪些作用?
static修饰变量
static修饰的变量我们称之为静态变量,没有用static修饰的变量称之为实例变量,他们两者的区别是: 静态变量是随着类加载时被完成初始化的,它在内存中仅有一个,且JVM也只会为它分配一次内存,同时类所有的实例都共享静态变量,可以直接通过类名来访问它。但是实例变量则不同,它是伴随着实例的,每创建一个实例就会产生一个实例变量,它与该实例同生共死。
static修饰方法
static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。 但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。 因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
总结一下,对于静态方法需要注意以下几点:
(1)它们仅能调用其他的static 方法。
(2)它们只能访问static数据。
(3)它们不能以任何方式引用this 或super。
static修饰代码块
static关键字还有一个比较关键的作用就是用来形成静态代码块以优化程序性能。
static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。 为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。
static是不允许用来修饰局部变量。不要问为什么,这是Java语法的规定。
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问。
9、final关键字的作用?
final关键字的使用
1. 1.修饰类
表明这个类不能被继承,类中所有成员方法都会被隐式地指定为final方法,比如:String类,Integer及其他包装类
1. 2.修饰方法
表明该方法不能被子类重写
1. 3.修饰变量
如果final修饰基本数据类型的变量,其数值一旦初始化后不能被修改。
如果final修饰引用类型的变量,初始化后不能再让其指向另一个对象,但引用类型变量指向的对象的内容是可变的。
10、 final private 修饰一个方法 可不可以
可以
11、面向对象有哪些特性?
继承 多态 重载
12、继承的时候 构造方法可不可以被继承?
不可以
13、private方法可以被继承吗?可以被重写吗?
不可以被继承,不可以重写,子类不能重写父类的静态方法,私有方法。即使你看到子类中存在貌似是重写的父类的静态方法或者私有方法,编译是没有问题的,但那其实是你重新又定义的方法,不是重写。
关于继承:父类方法的构造方法和private 方法不可以被继承
这个题我回答错了,下面两个估计是面试官看我写没写过java,问的我有点莫名其妙,什么JB问题啊当时想
14、一个java文件里面可以有多少个类?
只能有一个public 的类,可以有多个不是public 的类
15、java类名可以小写吗?
可以
16、float转成int型 怎么处理 四舍五入还是截取
这个我自己试了一下是截取的,不是四舍五入,就是截取
float tt = (float) 3.5;
int ss = (int) (tt);
System.out.println(ss);
不管是3.5还是3.4输出结果都是3
17、循环嵌套,2层for里面写break和continue有什么区别?
break 会直接跳出2层循环,continue的话会放弃执行这个循环里面后面的代码直接去执行这个循环里的下一个i++操作了,
18、collection 和collections有什么区别?
1、collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
2、java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
例如以下Java代码使用工具类collections实现排序功能,当然还有很多其他功能
19、抽象类和接口有什么区别?
1.接口的方法默认是public,所有方法在接口中不能有实现,抽象类可以有非抽象的方法
2.接口中的实例变量默认是final类型的,而抽象类中则不一定
3.一个类可以实现多个接口,但最多只能实现一个抽象类
4.一个类实现接口的话要实现接口的所有方法,而抽象类不一定
5.接口不能用new实例化,但可以声明,但是必须引用一个实现该接口的对象
从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
20、设计模式?有用过哪些?
单例,装饰器模式,工厂模式,
21、用设计模式的好处?
什么是设计模式?
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
设计模式的好处 这玩意背就完了
模式是在某一背景下某个问题的一种解决方案。
-
复用解决方案——通过复用已经公认的设计,我能够在解决问题时取得先发优势,而且避免重蹈前人覆辙。我可以从学习他人的经验中获益,用不着为那些总是会重复出现的问题再次设计解决方案了。
-
确立通用术语——开发中的交流和协作都需要共同的词汇基础和对问题的共识。设计模式在项目的分析和设计阶段提供了共同的基准点。
-
提高观察高度--模式还为我们提供了观察问题、设计过程和面向对象的更高层次的视角,这将使我们从“过早处理细节”的桎梏中解放出来。
-
大多数设计模式还能使软件更容易修改和维护。其原因在于,它们都是久经考验的解决方案。所以,它们的结构都是经过长期发展形成的,比新构思的解决方案更善于应对变化。而且,这些模式所用代码往往更易于理解——从而使代码更易维护。
一个人的技术水平的高低,整个项目的分层架构,代码的书写规范程度,以及代码的性能程度,足矣体现出来。不是会几个特效的制作,就说技术水平高,但系也不能全盘否定。
22、什么是耦合?
这个不想回答了
23、一道算法题 两个无序的数组,里面放的都是数字,怎么合并成一个有序数组?
先把两个数组进行快速排序,使得每个数组是有序的,然后进行两路归并排序,也就是两个指针分别指向两个数组的头,然后开始比较大小插入到新的数组中去,这样的话快速排序时间复杂度是O(nlogn) 然后归并排序时间复杂度是O(n+m)所以时间复杂度为这两个相加。 我说了这个思路还有就是先加入到Arraylist中然后调用Sort()方法成功给自己挖了坑。
24、sort方法里面用的什么排序
我首先看Collections.sort() 跟踪代码到达这个函数,然后看一下啊,我们发现里面用了插入排序,归并排序。 首先判断数组的长度是不是大于7?如果不大于,对于这种小数组,采用插入排序。 如果大于7就分开成2半,分别进行递归的排序, 到最后其实还是插入排序和归并排序的结合
/**
* Src is the source array that starts at index 0
* Dest is the (possibly larger) array destination with a possible offset
* low is the index in dest to start sorting
* high is the end index in dest to end sorting
* off is the offset to generate corresponding low, high in src
* To be removed in a future release.
*/
@SuppressWarnings({"unchecked", "rawtypes"})
private static void mergeSort(Object[] src,
Object[] dest,
int low,
int high,
int off) {
int length = high - low;
// Insertion sort on smallest arrays
//判断list的长度,如果是小于7就用插入排序
if (length < INSERTIONSORT_THRESHOLD) {
for (int i=low; i<high; i++)
for (int j=i; j>low &&
((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
swap(dest, j, j-1);
return;
}
// Recursively sort halves of dest into src
将list分成两半,然后递归的调用mergeSort()进行排序,所以最后的话,其实当子List长度小于7之后就是插入排序了。把这两半数组分别排序之后再进行归并排序。
int destLow = low;
int destHigh = high;
low += off;
high += off;
int mid = (low + high) >>> 1;算中间的index
//递归的排序
mergeSort(dest, src, low, mid, -off);
mergeSort(dest, src, mid, high, -off);
// If list is already sorted, just copy from src to dest. This is an
// optimization that results in faster sorts for nearly ordered lists.
if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {
System.arraycopy(src, low, dest, destLow, length);
return;
}
// Merge sorted halves (now in src) into dest
//两路归并排序
for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)
dest[i] = src[p++];
else
dest[i] = src[q++];
}
}
25、快拍的事件复杂度是多少?
O(nlogn)
26、快拍的最坏情况事件复杂度?最坏情况是怎么出现的?
O(n^2) 最坏情况就是123456789这种情况,选1作为标量,然后没有吧整个数组分开,就是最坏的情况
27、快拍的算法稳定性?
快排不是一个稳定的排序算法
28、算法稳定性是什么意思?
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的