JAVA面试
java
- 举例说明多态和重载区别
多态性就是父类引用时被赋予不同的子类对象引用,从而表现出不同的行为,多态性为程序提供更好的可扩展性和代码重用。
如果在子类中定义了于其父类同名的成员方法,成为 重写;
如果在一个类中定义了两个或两个以上的具有不同参数列表(参数个数不同或参数类型不同)的同名方法,成为重载;
class Triangle extends Shape { public int getSides() //重写 { return 3; } } class Rectangle extends Shape { public int getSides(int i) //重载 { return i; } } public class Shape { public boolean isSharp(){ return true; } public int getSides(){ return 0 ; } public int getSides(Triangle tri){ return 3 ; } //重载 public int getSides(Rectangle rec){ return 4 ; }//重载 public static void main(String[] args) { Triangle tri = new Triangle(); System.out.println(“Triangle is a type of sharp? ” + tri.isSharp()); Shape shape = new Triangle(); //多态 System.out.println(“My shape has ” + shape.getSides() + ” sides.”); }}
- 堆栈
JVM内存结构图
第一块:PC寄存器
PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息。
第二块:JVM栈
JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址
第三块:堆(Heap)
它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。
(1) 堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的
(2) Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配
(3) TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。
第四块:方法区域(Method Area)
(1)在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。
(2)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class
对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。
第五块:运行时常量池(Runtime Constant Pool)
存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。
第六块:本地方法堆栈(Native Method Stacks)
JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。 - 垃圾回收
GC的基本原理:**将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停
(1)对新生代的对象的收集称为minor GC;
(2)对旧生代的对象的收集称为Full GC;
(3)程序中主动调用System.gc()强制执行的GC为Full GC。
**不同的对象引用类型, GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型:
(1)强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)
(2)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)
(3)弱引用:在GC时一定会被GC回收
(4)虚引用:由于虚引用只是用来得知对象是否被GC - Final,finally,finalize
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。 - 序列化反序列化,为什么要有自定义序列化
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
1). 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中。
在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。
2). 在网络上传送对象的字节序列。
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
想将父类对象也序列化,就需要让父类也实现Serializable 接口。如果父类不实现的话的,就 需要有默认的无参的构造函数。在父类没有实现 Serializable 接口时,虚拟机是不会序列化父对象的,而一个 Java 对象的构造必须先有父对象,才有子对象,反序列化也不例外。所以反序列化时,为了构造父对象,只能调用父类的无参构造函数作为默认的父对象。
如果子类实现了java.io.Serializable,但父类没有实现此接口,子类的值域保留下来了,但是父类的值域丢失了,这对jvm 来说是正常的,因为父类不可序列化。为了解决这个问题,只能自定义序列化行为,在序列化的默认动作之后将父类里值域写入流或写出流,顺序要一致。
自定义序列化有两种:
1).实现java.io.Serializable,重写private void writeObject(ObjectOutputStream os) throws IOException
private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException ,执行默认序列化外( 先调用outputStream.defaultWriteObject();或 inputStream.defaultReadObject();),可以控制声明为static或transient的数据成员。
2).实现java.io.Externalizable,要有无参数的默认构造函数,重写void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; 完全负责序列化和恢复数据成员,除了头以外,根本没有自动序列化。实现了这个接口就不会调用1中的两个方法。
- Java的灵活性体现在什么机制上
JVM ? 反射? - Jdk1.5到1.7有什么新特性
自行百度 - 排序算法
自行百度 - 无序数组ab,每个数组有一次循环遍历的机会,找出a有b没有的数字(不能使用外部东西)
public class SearchArray { public static void main(String[] args) { // TODO Auto-generated method stub int a[] = { 5, 9, -4 }; int b[] = { 10, 8, 4, 5, -3 }; Arrays.sort(a); Arrays.sort(b); search(a, a.length, b, b.length); } private static void search(int a[], int lenA, int b[], int lenB) { int pa = 0, pb = 0; while (pa < lenA && pb < lenB) { if (a[pa] == b[pb]) { ++pa; continue; } else if (a[pa] < b[pb]) { System.out.println(a[pa]); ++pa; } else { ++pb; } } while (pa < lenA) { System.out.println(a[pa]); ++pa; } } }
- Hashtable和hashmap
他们都实现了Map接口
区别:
1).HashTable是java早期版本中Dictionary的子类
2).HashTable的方法是同步的,儿HashMap不是同步的。
3).HashTable不允许null值作为Key和 value;HashMap中null值可以作为Key,但是这样的Key必须只有一个,Value可以有多个null。 - Hashcode是怎么得到的
Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。即在散列集合包括HashSet、HashMap以及HashTable里,对每一个存储的桶元素都有一个唯一的"块编号",即它在集合里面的存储地址;当你调用contains方法的时候,它会根据hashcode找到块的存储地址从而定位到该桶元素。
详情查看http://www.importnew.com/13384.html - 线程和进程
进程:程序的一次执行,是资源的集合
线程:CPU的基本调度单位
其他解释都是扯淡,这个是最核心的抽象! - sleep和wait区别
1).sleep属于Thread类,wait属于Object类
2).sleep没有释放锁;wait释放了锁,使其他线程可以使用同步控制块或者同步方法
3).wait(),notify(),notifyAll()只能在同步控制方法或者同步块中使用;sleep可以在任何地方使用
4).sleep必须捕获异常,wait不需要。 - 二叉平衡树,满二叉树
满二叉树:除了叶结点外每一个结点都有左右子叶且叶结点都处在最底层的二叉树
二叉平衡树:又称AVL树。它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的高度之差的绝对值不超过1 - Object有哪些基本的方法
1.clone方法
保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
2.getClass方法
final方法,获得运行时类型。
3.toString方法
该方法用得比较多,一般子类都有覆盖。
4.finalize方法
该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
5.equals方法
该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。
6.hashCode方法
该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
一般必须满足obj1.equals(obj2)==true。可以推出obj1.hashCode()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
7.wait方法
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
调用该方法后当前线程进入睡眠状态,直到以下事件发生。
(1)其他线程调用了该对象的notify方法。
(2)其他线程调用了该对象的notifyAll方法。
(3)其他线程调用了interrupt中断该线程。
(4)时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
8.notify方法
该方法唤醒在该对象上等待的某个线程。
9.notifyAll方法
该方法唤醒在该对象上等待的所有线程。
-
Io和nio
-
写一个单例模式的例子
-
Socket
-
Exception
-
有向图和无向图什么区别
-
Linux基本命令
-
数组和链表
-
深克隆,浅克隆
-
Java的引用类型有哪些,在垃圾回收的时候有什么表现
数据库
1.ACID
-
Group by
-
Distinct
-
Where条件的执行顺序是从前往后还是从后往前,还是其他什么顺序
网络
1.你知道什么网络协议,解释一下
2.post和get区别
3.OSI参考模型
4.get的参数是跟在url后面,那post的参数是加在什么地方
5.断点重传
6.PC端的网络连接和移动端有什么区别?
7.定位需要几颗卫星
8.Gps和agps定位有什么区别
Android
-
横竖屏切换的差别
-
Activity生命周期
-
什么时候会用到activity生命周期
-
Scroll中有listview,出现什么问题,如何解决
-
消息推送的方法
-
有一个比较大的图片,如果内存不够加载,怎么办