经典的面试问答(转自黑马培训营论坛)

来源:互联网 发布:mac怎样删除文件 编辑:程序博客网 时间:2024/05/17 08:04

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——

Q:①在Listview的优化中,我们为何使用ConvertView?②为何使用ViewHolder?③你认为哪个更能解决问题?④你认为view.inflate和view.findviewById哪个更耗时,为什么?⑤如果这两个AP让你重新写,你怎么写?

A:①使用ConvertView可以实现对view的复用,这样大大节约了每次创建对象的时间,提升了ListView的显示效率。②使用ViewHolder作为内部类,可以将view的子控件封装在ViewHolder类中,然后通过View.setTag(ViewHolder)将view和ViewHolder进行绑定,这样我们就不用每次都调用view的findViewById(id)方法来查找控件。③使用ConvertView解决了一大部分问题,使用ViewHolder实现了控件换时间的问题,因为给View对象设置一个Tag本身就是占用内存的,因此ViewHolder的使用还是需要区分不同的应用场景的, 没有绝对的好与不好。如果内存足够需要高效则ViewHolder建议使用,否则不建议使用。④当然是view.inflate耗时,这个函数完成的功能是把xml布局文件通过pullParser的形式给解析到内存中,需要io,需要递归子节点。⑤我其实还不太相信我写出来的代码比Google官方写的好,如果让我写的话我可能会这样考虑,当用户在使用view.inflate的时候将多个id作为数组添加到形参中,这样在初始化view的使用我就可以给这个view直接调用setTag方法绑定需要的子控件。不过这个原生方法其实也应该保留共不同的需求使用。

Q:静态成员类、非静态成员类有什么区别?什么是匿名内部类?

A:静态成员类相当于外部类的静态成员,是外部类在加载的时候进行初始化,非静态成员类相当于外部类的普通成员,当外部类创建对象的时候才会初始化。匿名内部一般都是在方法里面直接通过new ClassName(){};形式的类。比如我们new Thread(new Runnable(){}).start();就用到了匿名内部类。

Q:ArrayList是不是线程安全的?如果不是,如何是ArrayList成为线程安全的?

A:不安全的。可以使用Collections.synchronizedList(list)将list变为线程安全的。

Q:当一个对象被当做参数传递到一个方法后,此方法可以改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

A:java中只有值传递,没有引用传递。这里的引用本身就是值,传递的是引用这个值。

Q:heap和stack有什么区别?

A:堆和栈。栈存放对象的引用,堆存放对象实体。堆中的对象是有jvm的垃圾回收器负责回收。

Q:请描述下JVM加载class文件的原理机制。

A:JVM加载class是动态性的,也就是当“需要”的时候才会加载,这是也是为节约JVM内存来考虑的。同时JVM的类加载是父类委托机制,这个机制简单来讲,就是“类装载器有载入类的需求时,会先请示其Parent使用其搜索路径帮忙载入,如果Parent 找不到,那么才由自己依照自己的搜索路径搜索类”

Q:App在什么情况下会出现内存泄露?如何避免这些情况?

A:造成内存泄露的可能性有很多 1)资源未及时释放,比如引用的io流资源、网络资源、数据库游标Cursor等没有释放2)注册的监听器、广播等未及时取消3)集合对象没有及时清理4)不良代码

避免上述问题,主要还看程序员知识掌握的程度和编码经验的多少,但是从技术角度考虑我们需要注意一些细节,比如,重复使用的资源可以考虑使用缓存技术、池技术。使用的任何资源都记得关闭或者异常处理,保证在最恶劣的情况下也能使资源得到释放。对于图片的操作要注意缓存的使用,同时要记住对图片对象进行及时的回收。使用ListView的时候,尽量让ConvertView得到复用。

Q:AIDL的全称是什么?如何工作?能处理哪些类型的数据?

A:

① Android Interface Definition Language

② AIDL一般用于远程服务,也就是进程间通信。我们可以分服务端和客户端,服务端声明AIDL文件,该文件命名为xxx.aidl,ADT会自动将xxx.aidl生成代码文件,代码文件提供了aidl中接口的实现。客户端如果要使用服务端提供的服务需要将xxx.aidl文件放到客户端源代码目录下,然后生成xxx.java类,客户端通过bindService的形参ServiceConnection的onServiceConnected获取到Service对象,这个对象通过Stub.asInterface(service)返回aidl的实现类。之后我们就可用调用这个aidl的实现类。

③ 基本数据类型都可以,复杂对象也可以,只不过需要实现Parcelable接口

0 0