Android面试题及其答案
程序员文章站
2022-05-06 16:51:00
...
1.Java中基本数据类型及其封装类
八种基本数据类型分别是:int、short、float、double、long、
boolean、byte、char;它们的封装类分别是:Integer、Short、
Float、Double、Long、Boolean、Byte、Character。
2.Switch能否用string做参数
java 1.6(包括)以前,只是支持等价成int 基本类型的数据:byte ,short,char,int(其他的都不可以)。
1.7加入的新特性可以支持String类型的数据。
3.equals与==的区别
java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 他们之间的比
较,应用双等号(==),比较的是他们的值。 2.复合数据类型(类) 当
他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是
同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object
中的基类中定义了一个equals的方法,这个方法的初始行为是比较对
象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,
Date在这些类当中equals有其自身的实现,而不再是比较类在堆内
存中的存放地址了。 对于复合数据类型之间进行equals比较,在没
有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中
的存放位置的地址值的,因为Object的equals方法也是用双等号
(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。
4.Object有哪些公用方法?
public boolean equals
public int hashCode()
public String toString()
5.Java的四种引用,强弱软虚,用到的场景
1.强引用
强引用不会被GC回收,并且在java.lang.ref里也没有实际的对应类型,
平时工作接触的最多的就是强引用。 Object obj = new Object();这
里的obj引用便是一个强引用。如果一个对象具有强引用,那就类似于必
不可少的生活用品,**垃圾回收器绝不会回收它**。当内存空 间不足,
Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会
靠随意回收具有强引用的对象来解决内存不足问题。
2、软引用
如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果**内
存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收
这些对象的内存**。只 要垃圾回收器没有回收它,该对象就可以被程序
使用。软引用可用来实现内存敏感的高速缓存。 软引用可以和一个引用队
列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回
收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
3.弱引用
如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与
软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾
回收器线程扫描它所管辖的内存区域的过程中,**一旦发现了只具有弱引
用的对象,不管当前内存空间足够与否,都会回收它的内存**。不过,由
于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具
有弱引用的对象。 弱引用可以和一个引用队列(ReferenceQueue)联合
使用,如果弱引用所引用的对象被垃圾回 收,Java虚拟机就会把这个弱引
用加入到与之关联的引用队列中。
/** * 弱引用: 当发生GC的时候,Weak引用对象总是会内回收回收。因
此Weak引用对象会更容易、更快被GC回收。 * Weak引用对象常常用
于Map数据结构中,引用占用内存空间较大的对象 * *
4.虚引用
虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱
引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合
使用。当垃圾回收器准备回收一个对象时,如果**发现它还有虚引用,就
会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列**中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对
象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,
那么就可以在所引用的对象的内存被回收之前采取必要的行动。由于
Object.finalize()方法的不安全性、低效性,常常使用虚引用完成对象
回收前的资源释放工作
- Hashcode的作用
参见文章
http://www.cnblogs.com/dolphin0520/p/3681042.html
6.ArrayList、LinkedList、Vector的区别
一、同步性 ArrayList,LinkedList是不同步的,而Vestor是同步的。所以如
果不要求线程安全的话,可以使用ArrayList或LinkedList,可以节省为同步
而耗费的开销。但在多线程的情况下,有时候就不得不使用Vector了。当
然,也可以通过一些办法包装ArrayList,LinkedList,使他们也达到同步,但
效率可能会有所降低。 二、数据增长 从内部实现机制来讲ArrayList和
Vector都是使用Objec的数组形式来存储的。当你向这两种类型中增加元素
的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数
组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原
来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。
所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你
可以通过设置集合的初始化大小来避免不必要的资源开销。
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数
据结构。 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因
为LinkedList要移动指针。 3.对于新增和删除操作add和remove,
LinedList比较占优势,因为ArrayList要移动数据。
7.String、StringBuffer与StringBuilder的区别。
String 类型和StringBuffer的主要性能区别:String是不可变的对象, 因此在
每次对String 类型进行改变的时候,都会生成一个新的 String 对象,然
后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用
String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用
对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。
使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操
作,而**不是**生成新的对象并改变对象引用。所以多数情况下推荐使用
StringBuffer ,特别是字符串对象经常改变的情况下。
StringBuilder是线程安全的,效率低,StringBuffer线程不安全,效率高
8.sychronized、lock、reentrantLock等
synchronized: 在资源竞争不是很激烈的情况下,偶尔会有同步的情形下,
synchronized是很合适的。原因在于,编译程序通常会尽可能的进行优化
synchronize,另外可读性非常好,不管用没用过5.0多线程包的程序员都能
理解。 ReentrantLock: ReentrantLock提供了多样化的同步,比如有时间
限制的同步,可以被Interrupt的同步(synchronized的同步是不能
Interrupt的)等。在资源竞争不激烈的情形下,性能稍微比synchronized差
点点。但是当同步非常激烈的时候,synchronized的性能一下子能下降好几
十倍。而ReentrantLock确还能维持常态。
9.锁的等级:方法锁、对象锁、类锁
同步代码块使用的锁是任意的对象
同步方法使用的锁是this
静态同步方法使用的锁是类名.class
10.线程池的优势
1.重用线程池中的线程,避免因为线程的创建和销毁带来的性能开销
2.能有效控制线程池的最大并发数,避免大量线程抢占资源导致的阻塞
3.能够对线程进行简单的管理,并提供定时执行以及指定间隔循环执行等功能。
11.C/S模式下使用socket通信,几个关键函数。
12.软引用和弱引用在Android中的引用
软引用可以用在防止OOM上,比如LruCache
弱引用用在防止内存泄漏上,比如Handler
转载于:https://www.jianshu.com/p/48831663c3ee
下一篇: Java笔试面试总结——基础篇