logo资料库

cvte面试题里面包含了许多CVTE面试的真是题目,非常的有用.docx

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
Android 运行环境主要指的虚拟机技术——Dalvik。Android 中的所有 Java 程序都是运行 在 Dalvik VM 上的。Android 上的每个程序都有自己的线程,DVM 只执行.dex 的 Dalvik executable 文件。每个 Android 应用在底层都对应有一个独立的 DVM 实例并在其解释下执 行。 虽然 DVM 也是用 Java 编程语言,Dalvik 虚拟机和一般 JAVA 虚拟机(Java VM)并不兼容,他 们两个的区别是 JVM 标准执行的是.class 的字节码(bytecode ),而是 DVM 执行的是其专有 的(.dex)执行文件。在编译过程中,Java 把类编译成一个或多个.class byte code 文件, 然后打包到 jar 中,JVM 会从中 jar 文件中获得相应的.class 文件和 JRE 字节码。 Android VM 虽然也是是用 Java 语言进行编程, Java 程序通过编译后,还需要通过 SDK 中的 dex 工 具转化成.dex 格式,DVM 再从其中读取指令和数据。 每一个应用程序即一个进程(Linux 的一个 Process)。二者最大的区别在于 Java VM 是以基 于栈的虚拟机(Stack-based),而 Dalvik 是基于寄存器的虚拟机(Register-based)。显然, 后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。 DVM 非常适合在移动终端上使用,与 PC 相比,它不需要很快的 CPU 和大量的内存空间. Google 的测算显示,64MB 的内存已经能让系统正常运转了。其中 24MB 被用于底层系统的初始化和 启动。另外 20MB 被用于启动高层服务。DVM 有如下特征: •使用专有的.dex 格式。 •原因是 java 类文件在编译过后,会产生至少一个.class 文件包含大量陈余信息,dex 文件 格式会把所有的.class 文件内容整合到一个.dex 文件中。即减少了整体文件的尺寸和 IO 操作,也提高了类的查找速度。 •增加了对新的操作码的支持 •文件结构尽量简洁,使用等长的指令,借以提高解析速度。 •尽量扩大只读结构的大小,借以提高跨进程的数据共享。 •dex 的优化,dex 文件的结构是紧凑的,但是如果想提高运行时的性能,就需要对 dex 文件 进行进一步的优化,这些优化针对以下几个方面: •验证 dex 文件中的所有类 •对一些特定的类和方法里面的操作码进行优化 •调整所有的字节序(Little_endian)和对齐结构中的每一个域 •基于寄存器,基于寄存器的虚拟机虽然比基于堆栈的虚拟机在硬件,通用性上要差一些, 但是它的代码执行效率去更好 •每一个 Android 应用都运行在它自己的 DVM 实例中,每一个 DVM 实例都是一个独立的进程 空间。所有的 Android 应用的线程都对应一个 Linux 线程,DVM 因此可以更多地依赖操作系 统的线程调度和管理机制。不同的应用在不同的进程空间里运行,不同的应用都是用不同的 Linux 用 户 来 运 行 以 最 大 程 度 地 保 户 应 用 程 序 的 安 全 性 和 独 立 性 http://blog.csdn.net/virus026/archive/2010/12/19/6085779.aspx 6、 android 中的动画有哪几类,它们的特点和区别是什么? 两种,一种是 Tween 动画、还有一种是 Frame 动画。Tween 动画,这种实现方式可以使视图
组件移动、放大、缩小以及产生透明度的变化;另一种 Frame 动画,传统的动画方法,通过 顺序的播放排列好的图片来实现,类似电影。 7、handler 机制的原理 andriod 提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper 类用来管理特定线程内对象之间的消息交换(Message Exchange)。 1)Looper: 一个线程可以产生一个 Looper 对象,由它来管理此线程里的 Message Queue(消 息队列)。 2)Handler: 你可以构造 Handler 对象来与 Looper 沟通,以便 push 新消息到 Message Queue 里;或者接收 Looper 从 Message Queue 取出)所送来的消息。 3) Message Queue(消息队列):用来存放线程放入的消息。 4)线程:UI thread 通常就是 main thread,而 Android 启动程序时会替它建立一个 Message Queue 19. 请解释下在单线程模型中 Message、Handler、Message Queue、Looper 之间的关系。 简 单 的 说 , Handler 获 取 当 前 线 程 中 的 looper 对 象 , looper 用 来 从 存 放 Message 的 MessageQueue 中取出 Message,再有 Handler 进行 Message 的分发和处理 18. 注册广播有几种方式,这些方式有何优缺点?请谈谈 Android 引入广播机制的用意。 android 中,不同进程之间传递信息要用到广播,可以有两种方式来实现。 第一种方式:在 Manifest.xml 中注册广播,是一种比较推荐的方法,因为它不需要手动注 销广播(如果广播未注销,程序退出时可能会出错)。 具体实现在 Manifest 的 application 中添加: 上面两个 android:name 分别是广播名和广播的动作(这里的动作是表示系统启动完成),如 果要自己发送一个广播,在代码中为: Intent i = new Intent(“android.intent.action.BOOT_COMPLETED”); sendBroadcast(i); 这样,广播就发出去了,然后是接收。 接收可以新建一个类,继承至 BroadcastReceiver,也可以建一个 BroadcastReceiver 的 实例,然后得写 onReceive 方法,实现如下: protected BroadcastReceiver mEvtReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(“android.intent.action.BOOT_COMPLETED”)) { //Do something } } }; 第二种方式,直接在代码中实现,但需要手动注册注销,实现如下: IntentFilter filter = new IntentFilter(); filter.addAction(“android.intent.action.BOOT_COMPLETED”); registerReceiver(mEvtReceiver, filter); // 这 时 注 册 了 一 个 recevier , 名 为 mEvtReceiver,然后同样用上面的方法以重写 onReceiver,
最后在程序的 onDestroy 中要注销广播,实现如下: @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mPlayerEvtReceiver); } Android 系统中的广播是广泛用于应用程序之间通信的一种手段,它类似于事件处理机制, 不同的地方就是广播的处理是系统级别的事件处理过程(一般事件处理是控件级别的)。在 此过程中仍然是离不开 Intent 对象,理解广播事件的处理过程,灵活运用广播处理机制, 在关键之处往往能实现特别的效果, 在 Android 中如果要发送一个广播必须使用 sendBroadCast 向系统发送对其感兴趣的广 播接收器中。 使用广播必须要有一个 intent 对象必设置其 action 动作对象 使用广播必须在配置文件中显式的指明该广播对象 每次接收广播都会重新生成一个接收广播的对象 在 BroadCast 中 尽 量 不 要 处 理 太 多 逻 辑 问 题 , 建 议 复 杂 的 逻 辑 交 给 Activity 或 者 Service 去处理 34、android 中有哪几种解析 xml 的类?官方推荐哪种?以及它们的原理和区别。 XML 解析主要有三种方式,SAX、DOM、PULL。常规在 PC 上开发我们使用 Dom 相对轻松些, 但一些性能敏感的数据库或手机上还是主要采用 SAX 方 式,SAX 读取是单向的,优点:不占 内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。而 DOM 方 式会把整个 XML 文件加载到内存 中去,这里 Android 开发网提醒大家该方法在查找方面可 以和 XPath 很好的结合如果数据量不是很大推荐使用,而 PULL 常常用在 J2ME 对于节点处 理 比较好,类似 SAX 方式,同样很节省内存,在 J2ME 中我们经常使用的 KXML 库来解析。 android 中的动画有哪几类,它们的特点和区别是什么? 两种,一种是 Tween 动画、还有一种是 Frame 动画。Tween 动画,这种实现方式可以使视图 组件移动、放大、缩小以及产生透明度的变化;另一种 Frame 动画,传统的动画方法,通 过顺序的播放排列好的图片来实现,类似电影。 简单地说一下为什么是这样:我们手机在运行 一个应用程序的时候,有可能打进来电话发进来短信,或者没有电了,这时候程序都会被 中断,优先去服务电话的基本功能,另外系统也不允许你占用太多资源,至少要保证电话 功能吧,所以资源不足的时候也就有可能被干掉。言归正传,Activity 的基本生命周期如下 代码所示: Java 代码 ? 1 2 3 4
public class MyActivity extends Activity { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); } 你自己写的 Activity 会按需要 重 载这些方法,onCreate 是免不了的,在一个 Activity 正常启动的过程中,他们被调用 的顺序是 onCreate -> onStart ->onResume, 在 Activity 被干掉的时候顺序是 onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期,但是有人问了 ,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的一个 Activity 是全屏的那么:onPause->onStop ,恢复的时候 onStart->onResume ,如果打断 这个应用程序的是一个 Theme 为 Translucent 或者 Dialog 的 Activity 那么只是 onPause , 恢复 的时候 onResume 。 详细介绍一下这几个方法中系统在做什么以及我们应该做什么: onCreate: 在这里创建界面,做一些数据的初始化工作 onStart: 到这一步变成用户可见不可交互的 onResume: 变成和用户可交互的,(在 activity 栈系统通过栈的方式管理这些个 Activity 的最上面, 运行完弹出栈,则回到上一个 Activity) onPause: 到 这一步是可见但不可交互的,系统会停止动画等消耗 CPU 的事情从上文的描述已经知道, 应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。 在这里保存的数据,应该在 onResume 里读出来,注意:这个方法里做的事情时间要短,因 为下一个 activity 不会等到这个方法完成才启动 onstop: 变得不可见,被下一个 activity 覆盖了 onDestroy: 这是 activity 被干掉前最后一个被调用方法了,可能是外面类调用 finish 方 法或者是系统为了节省空间将它暂时性的干掉,可以用 isFinishing()来判断它,如果你 有一个 Progress Dialog 在线程中转动,请在 onDestroy 里把他 cancel 掉,不然等线程结 束的时候,调用 Dialog 的 cancel 方法会抛异常的。 onPause,onstop, onDestroy,三种状态下 activity 都有可能被系统干掉为了保证程序 的正确性,你要在 onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介 质上(一般 都是数据库)。实际工作中因为生命周期的变化而带来的问题也很多,比如你 的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀 掉 还是数据回滚,是吧?因为 Activity 可能被杀掉,所以线程中使用的变量和一些界面元素 就千万要注意了,一般我都是采用 Android 的消息机制 [Handler,Message]来处理多线程 和界面交互的问题。这个我后面会讲一些,最近因为这些东西头已经很大了,等我理清思 绪再跟大家分享 JAVA 1.GC 是什么? 为什么要有 GC? GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方, 忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自 动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配 内存的显示操作方法。
2.XML 包括哪些解释技术,区别是什么? DOM 和 SAX DOM 将文档解析成一颗文档树,可在节点上进行遍历、增加、修改和删除。一次性读入内存, 对内存消耗大。 SAX 至上而下解析文档,以事件进行驱动。不会一次性读入内存,对内存消耗小,不能任意 读取节点,并且不能对节点进行增加、修改和删除。 3.switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上? switch 能作用在 byte、char、short 和 int 上,JDK1.7 后可以作用在 String 上。 4."=="和 equals 方法究竟有什么区别? ==和 equals 都可以比较地址。==是运算符,equals 是方法,方法可以通过重写改变其行为, 如 String 的 equals 就是比较字符串内容。 5.构造方法能否被重写和重载? 构造方法不能被重写但是能被重载。 6.面向对象的特征有哪些? 封装、继承、多态和抽象。 7.抽象类和接口的区别? 1).抽象类是 abstract class 修饰,接口是 interface 修饰。 2).抽象类可以有任意类型的属性,接口只能有静态常量修饰的属性。
3).抽象类可以有普通方法和抽象法方法,接口的方法都是抽象方法。 4).抽象类和接口都不能实例化,但是抽象类有构造方法,接口没有构造方法。 5).抽象类只能单根继承,接口可以多重实现。 8.内部类可以引用它的包含类的成员吗?有没有什么限制? 可以引用。如果需要指定当前类时要用外部类.this 来引用。如果引用局部变量,需要将局 部变量指定为 final。 9.String s = new String("xyz");创建了几个 String Object? 二者之间有什么区别? 2 个对象。"xyz"创建在字符串常量池中,new String()创建在堆中。 10.try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会不会被 执行,什么时候被执行,在 return 前还是后? 会在 return 前执行。 11.Integer 与 int 的区别 Integer 为包装类,int 是基本数据类型。包装类拥有方法和属性,基本数据类型不具备。 包装类可以通过 intValue 来转换成基本数据类型,也可以通过 new Integer()将基本数据 类型转换为包装类。在 JDK1.5 后,包装类和基本数据类型可以实现自动转换。 12.sleep()和 wait()有什么区别? sleep 是 Thread 类的方法,wait 是 Object 类的方法。 sleep 是自动唤醒,wait 需要其他线程来唤醒。 sleep 不会释放同步锁,wait 会释放同步锁。
sleep 可以用在任意方法中,wait 只能用在同步方法或同步块中。 13.Sleep() 不会释放对象锁 到时自动恢复 wait()会释放对象锁 进入等待此对象的 等待锁定池 发出 notify()方法后 才进入等待锁定池准备对象锁的获取进入运行状态 14.同步和异步有何异同,在什么情况下分别使用他们? 同步指同一时间只能一个线程执行该方法,其他线程需要等待。异步指多个线程可以同时 执行某个方法,并共享同一资源。 同步可以让访问的资源具有安全性,因为同一时间只能一个线程对其进行访问。但是效率 不高。 异步对访问的资源会造成不稳定性,比如多个线程同时访问一个资源,一个在修改、一个 在删除、一个在读取,这样可能会造成资源的混乱。但是由于同时运行,执行效率得到提 高。 15.启动一个线程是用 run()还是 start()? start()方法启动线程,run 方法是线程执行的主方法。 16.java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出他们 分别是哪些类? java 中有三种流,分别是字节流(InputStream、OutputStream)、字符流(Reader、Writer)、 对象流(ObjectInputStream、ObjectOutputStream)。 17.字节流与字符流的区别? 字节流用于读取或写出二进制数据,比如图片、影像等数据。 字符流用于读取或写出字符数据,比如传输字符串。 所有的数据都可以通过字节流来进行处理,不过如果是字符数据,用字节流还需要进行转
换后传输,如果使用字符流可以方便数据的转换。 18.error 和 exception 有什么区别? error 是系统错误,代码不能处理的错误,比如内存溢出、堆栈溢出等。 exception 是程序异常,可以通过代码 try-catch 进行处理,比如空指针异常,数组越界等。 19.谈谈 final,finally,finalize 的区别? final 是修饰符,可以修饰类(不能被继承)、属性(常量)、和方法(不能被重写)。 finally 是异常处理块中的代码块,表示无论如何都会执行的代码块。 finalize 是 Object 类的方法,该方法在对象被垃圾回收之前执行的方法。 20.当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的 其它方法? 如果其他方法没有加 synchronized 的话是可以进入的。 21.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变 化后的结果,那么这里到底是值传递还是引用传递? java 中只有值传递,如果传递的对象,实际也是传递该对象的地址。 22.作用域 public,private,protected,以及不写时的区别 public 公共修饰符,表示任意类都可以访问。 protected 为受保护的修饰符,表示同类、同包以及不同包但是父子关系的是可以访问。 不写表示默认修饰符,或者称为 package 修饰符,该修饰符表示只有同类或同包下的类可 以访问,出了这个包就不能访问了。 private 为私有修饰符,表示只有同类中可以访问,出了这个类就不能访问了。 23.用最有效率的方法算出 2 乘以 8 等於几 2《 3 将 2 的二进制向左移 3 位。java 中用<<来移位。
分享到:
收藏