android-2016-常见面试题总结(二)

来源:互联网 发布:pdf拼接软件免费 编辑:程序博客网 时间:2024/05/22 18:56

2016-某里系-北京某德-面试题总结:

1.内部类可不可以调用外部变量?创建内部类对象的时候外部类会不会分配内存?
其实这个问题还是考察对static关键字的理解:
问题一分为三种情况:
(1)普通内部类可以调用外部静态变量和普通变量(即便是private权限的也可以调用,因为普通内部类持有外部类对象的引用)
(2)静态内部类只可以调用外部的静态变量
(3)匿名内部类只可以调用外部的静态变量
(4)局部内部类,即外部类成员方法中声明的类:局部内部类可以访问外部类的成员变量,但是访问所在方法中的局部变量必须是final类型
问题二其实也是关于static的:
(1)如果内部类是静态的:那么内部类和外部类对象没有关联,内部类的创建不需要外类先分配内存
(2)如果内部类是普通内部类:那么内部类是外部类的一部分,内部类的创建依赖于外部类对象的创建,必须先分配外部类内存空间才可以
(3)如果内部类是局部内部类:要想使用局部内部类时需要生成对象,对象调用方法,在方法中才能调用其局部内部类
以下举例说明怎么使用:
–Student类有个叫School的内部类(非静态)
Student stu = new Student();
stu.School sch = new stu.School();
sch就是School的一个对象。
–假如School是内部静态类:
Student.School sch = new Student.School();
知识点介绍参考:(下面的链接解析的很好很全面,多看才能理解全面)
http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html
http://blog.csdn.net/codestinity/article/details/6877788
http://blog.csdn.net/fgakjfd/article/details/5282646
http://zhidao.baidu.com/link?url=tKvkZlJ9Lfx6VuVQ_vLOlVT38xFjqRnB4U7s6n3sEKtTWM2og-LDFj0H-xxtJFRhM_-c19jHUEYV9MKnEQ5w4K

2.同步问题
class A{
synchronized f1(){};
synchronized f2(){};

线程T1调用f1,线程T2调用f2,f1和f2方法会不会同步执行?方法前面都加上static修饰之后呢?
–问题一解答:非静态同步方法是对方法所在类的实例对象加锁,也就是this或者new A()。
所以分为两种使用情况:
(1)多线程中多次调用同一个对象的同步方法:
A a1 = new A();
线程T1中调用f1:a1.f1();
线程T2中调用f2:a1.f2();
这种情况下f1和f2都是对对象a1加锁,所以当线程T1调用f1方法时候就会得到锁,而此时如果线程T2调用f2方法就需要等待这个锁直到f1释放。
(2)多线程中调用同一个对象的多个实例中的同步方法:
A a1 = new A(); A a2 = new A();
线程T1中调用f1:a1.f1();
线程T2中调用f2:a2.f2();
这种情况下a1对象中的方法是对实例对象a1加锁,a2对象中的方法是对实例对象a2加锁,所以f1调用的时候获取到a1对象并加锁,而f2调用的
时候需要获取的是a2锁所以可以直接获取到,这种情况下f1和f2方法并没有实现同步。
–问题二解答:方法前面都加上static修饰之后呢?
由于静态同步方法的加锁对象是方法所在类的类对象本身即A.class,所以尽管多线程同时调用A对象的多个实例对象中的同步方法,这些方法
扔然是同步的,因为他们都共用同一把锁–A.class。
–同步知识点补充:
注意:多線程編程中,多个原子性操作的组合,并不能构成原子性。
原子性就是逻辑上认为的事务的最小执行单位,整个事务的执行过程是不可分的。
比如,转账,包括取款和存款,取款是一个原子操作,存款是一个原子操作,
等于说一共有三个原子操作,转账、取款和存款。如果只有取款和存款的原子性,
並不能保證轉賬的原子性,也就是说如果只保证取款和存款是同步的,那么转账
操作并不能保证同步。
–同步加锁总结:
(1)静态同步(对类对象本身即.class文件加锁)
(2)非静态同步(对.this既类的实例对象加锁)
(3)静态代码块同步(可以对指定对象加锁)。
–举例说明下多线程原子性操作问题:
public class Bank {
//剩余金额
private volatile int x = 100;
//取款
public synchronized int getX(int m) {
x = x + m;
return x;
}
//存款
public synchronized int setX(int m) {
x = x + m;
return x;
}
}
上面的代码并不能保证转账操作的数据安全性,就不说不能保证转账的同步,转账包括取款-存款两个操作,
如果在线程A中先后执行取款和存款两个原子性操作方法,并不能保证转账这个过程的同步,因为转账操作
本身就是一个事物就是一个原子性操作,就是多个原子性操作的组合并不能构成原子性。
要想实现转账的同步需要增加如下方法的声明:
//转账
public synchronized void tansfer(int m) {
getX(m);
setX(m);
}
–参考:http://topmanopensource.iteye.com/blog/1738178

3.异常捕获
try
   throw ExceptionA;
catch
{...}
finally
 a=9;
会抛出异常,还是会执行a=9?
测试结果:即会抛出异常,又会执行a=9.

4.什么是volatile?
用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。
单独使用volatile修饰的变量并不能保证线程安全,必须结合 synchronized才能保证线程安全。
详见:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html
http://www.cnblogs.com/dolphin0520/p/3920373.html

5.aidl进程间通信有没有数据大小限制?binder原理?int、out、inout关键字?aidl服务端权限校验方法?
官方文档里有说明,最大通常限制为1M.也就是说如果大于1M数据的话,就应该分开传。
参考:http://blog.csdn.net/buaaroid/article/details/47754051

6.intent传递数据有没有大小限制?
看源码得知putExtra()方法内部其实还是Bundle存储的数据,而Bundle内部是用ArrayMap存储的数据,
所以单从数据存储方式来看,数据大小是没有限制的。但是实际开发中总是有人遇到大小的问题,网上
帖子有人指出实际测试结果是505k为上限。
参考:
http://blog.csdn.net/woxinyijiuw/article/details/39546045
http://m.blog.csdn.net/article/details?id=50679322

7.广播的两种注册方式和各自生命周期?
静态注册,代码注册。onReceive结束生命周期就结束。

8.dialog创建要传一个context,这个context怎么传?activity和application的示例是否都可以作为它的上下文用?
答:dialog所属的window类型是子window,子window必须依附于应用window而存在,而应用window就是acitivity的window,所以dialog的上
下文context必须是指定的activity实例,而不能用application的上下文。
相关总结:
1.和UI相关的操作都只能用activity的上下文context而不建议或者不能使用applicaton的,比如:显示Dialog、开启Activity和Layout Inflation
2.其它一些操作比如开启和绑定Service、发送和注册Broadcast Receiver、加载资源等,用Service、Activity和Application的实例都是可以的
3.Activity和Application从语法上来说他们的顶层父类都是Context,不同之处在于实际应用中的生命周期和上下文环境,显示Dialog、Acitvity
和Layout这些都是和具体Activity上下文相关的UI操作,所以只能用Activity的实例做上下文,而服务、广播和资源这些操作则可以根据具体情况
选择activity或application的实例做上下文都可以。

9.强、软、弱、虚四中引用的区别,系统gc时候会回收所有没有被指向的对象么?如果不会那么gc是怎么做的?有什么规律?
http://blog.csdn.net/jdsjlzx/article/details/49107183

10.内存优化工具?如何优化?
MAT,
参考:http://blog.csdn.net/jdsjlzx/article/details/49107183

(不直接面向概念,而是通过具体例子看对概念的理解,比较重视java基础。)

1 0
原创粉丝点击