欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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()方法的不安全性、低效性,常常使用虚引用完成对象
回收前的资源释放工作

  1. 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