面试题整理

前几天我老大让我弄一套半个小时内能昨晚的Android笔试题,有点慌啊,自己还是小菜菜呢,怎么出题?但还是出了15道题..感觉还是不是很难.我整理一下 写到博客中来

*面向对象的特征有哪些?

答:1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。
2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一 种明确表述共性的方法。
3.封装:封装是面向对象的特征之一,是对象和类概念的主要特性。封装是把过 程和数据包围起来,对数据的访问只能通过已定义的界面。
4. 多态性:多态性是指允许不同类的对象对同一消息作出响应   

 *简述StringStringBuilderStringBuffer的区别?

答:1.String的两个最重要的特点①String是值不可变(immutable)的常量,是线程安全的(can be shared)。② String类使用了final修饰符,String类是不可继承的。

2.String与StringBuffer区别

(1) String在修改时不会改变对象自身 
在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String 。

(2) StringBuffer在修改时会改变对象自身 
每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。StringBuffer 上的主要操作是 append 和 insert 方法.

3. 线程是否安全

1)String值不可变,所以线程不安全; 
2)StringBuffer是线程安全的,但是执行效率稍微慢些。

3StringBuilder:线程非安全的。

三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String

总之 1)如果要操作少量的数据用 String; 
2)多线程操作字符串缓冲区下操作大量数据 StringBuffer; 
3)单线程操作字符串缓冲区下操作大量数据 StringBuilder。

==equals的区别?

答:==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符

equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。

HttpHttps有什么不同?

答:HTTPS (基于安全套接字层的超文本传输协议 或者是 HTTP over SSL) 是一个 Netscape 开发的 Web 协议。

你也可以说:HTTPS = HTTP + SSL

HTTPS 在 HTTP 应用层的基础上使用安全套接字层作为子层。

HTTP 和 HTTPS 的不同之处

1. HTTP 的 URL 以 http:// 开头,而 HTTPS 的 URL 以 https:// 开头

2. HTTP 是不安全的,而 HTTPS 是安全的

3. HTTP 标准端口是 80 ,而 HTTPS 的标准端口是 443

4.  OSI 网络模型中,HTTP 工作于应用层,而 HTTPS 工作在传输层

5. HTTP 无需加密,而 HTTPS 对传输的数据进行加密

6. HTTP 无需证书,而 HTTPS 需要认证证书

*LinkedListArrayList的区别?

答:ArrayList和LinkedList都实现了List接口,它们有以下的不同点: 
ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。 
相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。 
LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。 

*造成内存泄漏的原因有哪些及解决办法?

答:

1.Handler 引起的内存泄漏。

2.单例模式引起的内存泄漏

3.非静态内部类创建静态实例引起的内存泄漏

4.非静态匿名内部类引起的内存泄漏

5.注册/反注册未成对使用引起的内存泄漏

6.资源对象没有关闭引起的内存泄漏

7.集合对象没有及时清理引起的内存泄漏

总结:

1、Handler持有的引用最好使用弱引用,在Activity被释放的时候要记得清空Message,取消Handler对象的Runnable;

2、非静态内部类、非静态匿名内部类会自动持有外部类的引用,为避免内存泄露,可以考虑把内部类声明为静态的;

3、对于生命周期比Activity长的对象,要避免直接引用Activity的context,可以考虑使用ApplicationContext;

4、广播接收器、EventBus等的使用过程中,注册/反注册应该成对使用;

5、不再使用的资源对象Cursor、File、Bitmap等要记住正确关闭;

6、集合里面的东西、有加入就应该对应有相应的删除。

*利用冒泡排序对int score[] = {25, 101, 56, 98, 55, 77, 52, 67, 69, 75, 87, 89, 90, 99, 100}进行排序。

public class BubbleSort{
       public static void main(String[] args){
           int score[] = {25, 101, 56, 98, 55, 77, 52, 67, 69, 75, 87, 89, 90, 99, 100};
          for (int i = 0; i < score.length -1; i++){    //最多做n-1趟排序
               for(int j = 0 ;j < score.length - i - 1; j++){    //对当前无序区间score[0......length-i-1]进行排序(j的范围很关键,这个范围是在逐步缩小的)
                  if(score[j] < score[j + 1]){    //把小的值交换到后面
                       int temp = score[j];
                       score[j] = score[j + 1];
                       score[j + 1] = temp;
                  }
              }            
              System.out.print("第" + (i + 1) + "次排序结果:");
              for(int a = 0; a < score.length; a++){
                  System.out.print(score[a] + "\t");
             }
              System.out.println("");
          }
              System.out.print("最终排序结果:");
              for(int a = 0; a < score.length; a++){
                 System.out.print(score[a] + "\t");
        }
     }
  }

简述Activity的启动模式。

答:standard:这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。
singleTop: 如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。
singleTask:如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
singleInstance:在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。

解释下在单线程模型中Message,Handler,Message Queue,Looper之间的关系。

答:拿主线程来说,主线程启动时会调用Looper.prepare()方法,会初始化一个Looper,放入Threadlocal中,接着调用Looper.loop()不断遍历Message Queue,Handler的创建依赖与当前线程中的Looper,如果当前线程没有Looper则必须调用Looper.prepare()。Handler , sendMessage到MessageQueue,Looper不断从MessageQueue中取出消息,回调handleMessage方法。

*请介绍下Android的数据存储方式

答:① 使用SharedPreferences存储数据 

② 文件存储数据

③  SQLite数据库存储数据

④ 使用ContentProvider存储数据

⑤ 网络存储数据

*什么是ANR?如何避免?

答:ANR:Application Not Responding。在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应,当用户操作的在5s内应用程序没能做出反应,BroadcastReceiver在10秒内没有执行完毕,就会出现应用程序无响应对话框,这ANR。

避免方法:Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者异步方式)来完成。主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。

*如何避免OOM

答:当程序需要申请一段大内存,但是虚拟机没有办法及时的给到,即使做了GC操作这样就是抛出OutOfMemoryException 

1. 减少内存对象的占用

I.ArrayMap/SparseArray代替hashmap

II.避免在android里面使用Enum

III.减少bitmap的内存占用

· inSampleSize:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。

· decode format:解码格式,选择ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差异。

IV.减少资源图片的大小,过大的图片可以考虑分段加载

2. 内存对象的重复利用

大多数对象的复用,都是利用对象池的技术。

I.listview/gridview/recycleview contentview的复用

II.inBitmap 属性对于内存对象的复用ARGB_8888/RBG_565/ARGB_4444/ALPHA_8

这个方法在某些条件下非常有用,比如要加载上千张图片的时候。

III.避免在ondraw方法里面new对象

IV.StringBuilder 代替+

*Android中广播的注册方式和区别?

答:常驻型广播,当应用程序关闭了,如果有广播信息来,写的广播接收器同样的能接收到,它的注册方式就是在应用程序的AndroidManifast.xml 中进行注册,这种注册方式通常又被称作静态注册。这种方式可以理解为通过清单文件注册的广播是交给操作系统去处理的。

非常驻型广播,当应用程序结束了,广播自然就没有了,比如在 Activity 中的 onCreate 或者 onResume 中注册广播接收者,在 onDestory 中注销广播接收者。这样广播接收者就一个非常驻型的了,这种注册方式也叫动态注册。这种方式可以理解为通过代码注册的广播是和注册者关联在一起的。

*ListView如何优化性能?

答:1.在adapter中的getView方法中尽量少使用逻辑

2.尽最大可能避免GC

3.滑动的时候不加载图片

4.将ListView的scrollingCache和animateCache设置为false

5.item的布局层级越烧越好

6.使用ViewHolder

*谈谈对MVC框架的理解。

答:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,主要提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。主要使用的技术:数据模型:实体类(JavaBean),数据访问:JDBC,Hibernate等。

View(视图):负责进行模型的展示,一般就是我们见到的用户界面,比如JSP,Html等

Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。主要使用的技术:servlet,Struts中的Action类等。


好了 这些问题都是基础的,面试经常会问到的一些问题,.希望可以帮到小伙伴们~~拜拜...

等着过年.......


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值