失效链接处理 |
Android 520道高薪面试题集 PDF 下载
本站整理下载:
提取码:ankb
相关截图:
主要内容:
一、 面试题_Android
1. Overload 和 Override 的区别
Overloaded 的方法是否可以改变返回值的类型?
方法的重写 Overriding 和重载 Overloading 是 Java 多态性的不同表现。重写 Overriding 是父类与
子类之间多态性的一种表现,重载 Overloading 是一个类中多态性的一种表现。如果在子类中定
义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这
个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定
义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载
(Overloading)。Overloaded 的方法是可以改变返回值的类型。
2. String 和 StringBuffer 的区别
答: STRING 的长度是不可变的,STRINGBUFFER 的长度是可变的。如果你对字符串中的内
容经常进行操作,特别是内容要修改时,那么使用 StringBuffer,如果最后需要 String,那么
使用 StringBuffer(缓存)的 toString()方法。
StringBuilder:节约内存,创建字符串;
3. 实现一个字符串倒序
字符串“abcde”通过写一个函数不让调用第三方的字符串,实现一个字符串倒序,比如字符串
“abcde” 变成“edcba”
答: String src = "ABCDEF ";
String dst = new StringBuffer(src).reverse().toString();
4. 抽象类与接口的区别(abstract 与 interface 的区别)
答:abstract 可以修饰抽象方法,而一个类只要有一个抽象方法,就必须用 abstract 定义该类,
即抽象类。抽象类,被继承,实现它里面的方法,可以只有普通方法
用 interface 修饰的类,里面的方法都是抽象方法(不能实例化),因此在定义接口的时候,可以
直接不加那些修饰,系统会默认的添上去。接口里面的字段都是公有常量,即 public static final
修饰的字段。可以没有函数原型,里面可以是空的
5. 集合的实现类与区别
答:Collection 接口,集合结构总的父接口,有两个子接口 list 和 set
List 接口 元素有序可重复.
实现类有:ArrayList 数组实现轻量级,运行快,线程不安全。JDK1.2 查询快
Vector 数组实现重量级,运行慢,线程安全。JDK1.0
LinkedList 链表实现 常用语堆栈与队列的实现 增删操作快
Set 接口 元素无序不可重复
实现类有:HashSet,底层用 hashCode()算法实现,保证元素的无序唯一,自定义对象存进 HashSet
为了保证元素内容不重复需要覆盖 hashCode()与 equals()方法。
SortedSet(不重要) 元素有序(Unicode 升序)唯一
TreeSet 要求元素有序,自定义的对象需要实现 Comparable 接口的 compareTo(object o)方法
Map(接口): 与 Collection 接口无关,有一个子接口 SortedMap 特点: 元素是 key-value, key
唯一,无序; value 可重复
实现类: HashMap 轻量级 线程不安全的,允许 key 或 value 为 null JDK1.2
HashTable 重量级 线程安全的 不允许 key 或 value 为 null JDK1.0
Properties 是 HashTable 的子类,主键和值都是字符串
SortedMap:(不重要)
2
特点: key 唯一,有序(Unicode 升序)
实现类:TreeMap
6. 线程有几种状态,分别是哪些(调用 run()和调用 start()的区别)
答:1)新建状态(New):新创建了一个线程对象。
2)就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的 start()方法。该状态的
线程位于可运行线程池中,变得可运行,等待获取 CPU 的使用权。
3)运行状态(Running):就绪状态的线程获取了 CPU,执行 run()方法。
4)阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃 CPU 使用权,暂时停止运行。直
到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
①等待阻塞:运行的线程执行 wait()方法,JVM 会把该线程放入等待池中。
②同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则 JVM 会把该
线程放入锁池中。
③其他阻塞:运行的线程执行 sleep()或 join()方法,或者发出了 I/O 请求时,JVM 会把该线程置
为阻塞状态。当 sleep()状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重
新转入就绪状态。
5)死亡状态(Dead):线程执行完了或者因异常退出了 run()方法,该线程结束生命周期。
当调用 start 方法的时候,该线程就进入就绪状态。等待 CPU 进行调度执行,此时还没有真正执
行线程。
当调用 run 方法的时候,是已经被 CP U 进行调度,执行线程的主要任务。
1. 线程的实现方式
答:线程的实现有两种方式,一是继承 Thread 类,二是实现 Runnable 接口
2. sleep() 与 wait()的区别
答:①这两个方法来自不同的类分别是,sleep 来自 Thread 类,和 wait 来自 Object
类。
②最主要是 sleep 方法没有释放锁,而 wait 方法释放了锁,使得其他线程可
以使用同步控制块或者方法。sleep 不出让系统资源;wait 是进入线程等待池
等待,出让系统资源,其他线程可以占用 CPU。一般 wait 不会加时间限制,
因为如果 wait 线程的运行资源不够,再出来也没用,要等待其他线程调用
notify/notifyAll 唤醒等待池中的所有线程,才会进入就绪队列等待 OS 分配系
统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到
只能调用 interrupt()强行打断。
3.wait,notify 和 notifyAll 只能在同步控制方法或者同步控制块里面使用,而
sleep 可以在任何地方使用
4. Sleep 需要捕获异常,而 wait 不需要
3. 线程中 wait,join,sleep,yield, notify,notifyall,synchronized,区别及联系
答:1).sleep()方法
在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。sleep()使当
前线程进入阻塞状态,在指定时间内不会执行。
2).wait()方法
在其他线程调用对象的 notify 或 notifyAll 方法前,导致当前线程等待。线程会释放掉它所占有的
“锁标志”,从而使别的线程有机会抢占该锁。
唤醒当前对象锁的等待线程使用 notify 或 notifyAll 方法,waite() 和 notify()必须在 synchronized 函
数或 synchronized block 中进行调用。3.yield 方法
暂停当前正在执行的线程对象。yield()只是使当前线程重新回到可执行状态,所以执行 3)yield()
的线程有可能在进入到可执行状态后马上又被执行。yield()只能使同优先级或更高优先级的线程
有执行的机会。
4).join 方法
等待该线程终止。等待调用 join 方法的线程结束,再继续执行。如:t.join();//主要用于等待 t 线
程运行结束,若无此句,main 则会执行完毕,导致结果不可预测。
7. Final、finally、finanlize()的区别
答:final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally 是异常处理语句结构的一部分,表示总是执行。
finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆
盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
8. J2EE 是什么?请对以下在 J2EE 中常用的名词进行解释(或简单描述)
J2EE 是 Sun 公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)
的企业级应用模型(enterprieseapplicationmodel).在这样的一个应用系统中,可按照功能划分
为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客
户层(clietntier)组件,web 层和组件,Business 层和组件,企业信息系统(EIS)层
|