Android试题(二)
-
获取屏幕属性:
获取屏幕密度 getScreen 获取设备屏幕大小 getDisplay 获得屏幕的属性,从而取得屏幕的高度和宽度 getMetrics 获得window对象 getWindows
-
Activity的启动模式:
Android5.0之前,当启动一个Activity时,系统将首先检查Activity的launchMode,如果为A页面设置为SingleInstance或者B页面设置为singleTask或者singleInstance,则会在LaunchFlags中加入FLAG_ACTIVITY_NEW_TASK标志,而如果含有FLAG_ACTIVITY_NEW_TASK标志的话,onActivityResult将会立即接收到一个cancel的信息。 在Android5.0做出来修改,系统即便启动的页面设置launchMode为singleTask或singleInstance,onActivityResult依旧可以正常工作。
-
AlertDialog:
AlertDialog是protected声明的,所以不能使用new来创建新的对象,需要使用Builder方法来帮助创建
AlertDialog.Builder db= new Builder(this); db.create().show();
ProcessDialog是public声明的,所以可以直接用new来创建新的对象
ProgressDialog pDialog;//进度条对话框对象 pDialog = new ProgressDialog(Context);
-
java文件中,public声明的类必须要和文件名同名,而内部类和非public类可以是任意的名字
-
int + String = String
-
java中类是单继承(只能有一个父亲),但接口可以多继承
-
HashMap和HashTable的异同:
二者均是实现的Map接口,都以键值对的形式保存 HashTable不允许有null, HashMap允许出现null HashTable的方法是Synchronize的,HashMap则不是,在多线程访问时需要提供同步
-
Java程序初始化的执行顺序:
父类静态变量—>父类静态代码块—> 子类静态变量—>子类静态代码块—> 父类非静态变量—>父类非静态代码块—>父类构造方法—> 子类非静态变量—>子类非静态代码块—>子类构造方法 class A { public A() { System.out.println("class A"); } { System.out.println("I'm A class"); } static { System.out.println("class A static"); } } public class B extends A { public B() { System.out.println("class B"); } { System.out.println("I'm B class"); } static { System.out.println("class B static"); } public static void main(String[] args) { new B(); } class A static class B static I'm A class class A I'm B class class B
-
JVM内存堆溢出:
-
JVM堆内存氛围两块:PermanentSpace(持久区)和HeapSpace(堆),前者主要用来存放Java类定义信息,和垃圾收集器要收集的Java对象关系不大,后者内部也有两部分组成分别是:New Generation和Old generation即新生代和年老代。
-
new中分成三个区(Eden, Survivor, Survivor),新生的对象先进入Eden中,当Eden满了就把还存活的对象放入入第一个Survicor(from),当第一个Survivor满了则将此区还存活的对象放入第二个Survivor中(to),当第二个Survivor也满了的时候就将此区还存活的对象放入Old Generation中。
-
针对新生代的垃圾清理叫做YoungGC
针对年老代的垃圾清理叫做FullGC
所以年老代内存储的都是一些经历了许多次GC后仍然存活的对象,也就是生命周期都比较长 -
年老代溢出原因有 循环上万次的字符串处理、创建上千万个对象、在一段代码内申请上百M甚至上G的内存,
持久代溢出原因 动态加载了大量Java类而导致溢出 -
申请内存的过程:
JVM会试图为相关Java对象在年轻代的Eden区中初始化一块内存区域。
当Eden区空间足够时,内存申请结束。否则执行下一步。
JVM试图释放在Eden区中所有不活跃的对象(Young GC)。释放后若Eden空间仍然不足以放入新对象,JVM则试图将部分Eden区中活跃对象放入Survivor区。
Survivor区被用来作为Eden区及年老代的中间交换区域。当年老代空间足够时,Survivor区中存活了一定次数的对象会被移到年老代。
当年老代空间不够时,JVM会在年老代进行完全的垃圾回收(Full GC)。
FullGC后,若Survivor区及年老代仍然无法存放从Eden区复制过来的对象,则会导致JVM无法在Eden区为新生成的对象申请内存,即出现“Out of Memory”。
-