android 面试题(三)

 

JAVA相关基础知识

 

1、面向对象的特征有哪些方面  

1.抽象:

抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。

抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,

一是过程抽象,二是数据抽象。

 

2.继承:

继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。

对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,

新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基

类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

 

3.封装:

封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个

基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护

的接口访问其他对象。

 

4. 多态性:

多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。

多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

--------------------------------------------------------------------------------------------------------------------

2、String是最基本的数据类型吗?

基本数据类型包括byte、int、char、long、float、double、boolean和short。

java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节

省空间,我们应该用StringBuffer类

--------------------------------------------------------------------------------------------------------------------

3、int 和Integer 有什么区别

Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,

Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。

原始类型封装类

booleanBoolean

charCharacter

byteByte

shortShort

intInteger

longLong

floatFloat

doubleDouble

引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的

特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原

始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型

实例变量的缺省值与它们的类型有关。

4、String和StringBuffer的区别StringBuilder

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的

字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行

修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用

StringBuffers来动态构造字符数据。

--------------------------------------------------------------------------------------------------------------------

5、运行时异常与一般异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,

是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须

声明抛出未被捕获的运行时异常。

--------------------------------------------------------------------------------------------------------------------

6、说出Servlet的生命周期,并说出Servlet和CGI的区别。

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动

派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服

务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

--------------------------------------------------------------------------------------------------------------------

7、说出ArrayList,Vector, LinkedList的存储性能和特性

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,

它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入

数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList

使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前

后项即可,所以插入速度较快。

--------------------------------------------------------------------------------------------------------------------

8、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。

EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。

SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。

EntityBean被用来代表应用系统中用到的数据。

对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。

对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由

现有企业应用程序实现的实体。

Session Bean 还可以再细分为 Stateful Session Bean 与 StatelessSession Bean ,这两种的 Session Bean

都可以将系统逻辑放在 method之中执行,不同的是Stateful Session Bean 可以记录呼叫者的状态,因此通常

来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体。Stateless Session Bean 虽然也是逻辑

组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container

并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method。换言之,很可能数个使用者在执行某个

 Stateless Session Bean 的 methods 时,会是同一个 Bean的 Instance 在执行。从内存方面来看,

Stateful SessionBean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EEServer 较多的内存,

然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。

--------------------------------------------------------------------------------------------------------------------

9、Collection 和Collections的区别。

  Collection是集合类的上级接口,继承与他的接口主要有Set 和List.

Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

--------------------------------------------------------------------------------------------------------------------

10、&和&&的区别。

&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。

--------------------------------------------------------------------------------------------------------------------

11、HashMap和Hashtable的区别。

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。

Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

--------------------------------------------------------------------------------------------------------------------

12、final, finally, finalize的区别。

  final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

--------------------------------------------------------------------------------------------------------------------

13、sleep() 和wait() 有什么区别?

    sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

--------------------------------------------------------------------------------------------------------------------

14、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

--------------------------------------------------------------------------------------------------------------------

15、error和exception有什么区别?

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。

exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

--------------------------------------------------------------------------------------------------------------------

16、同步和异步有何异同,在什么情况下分别使用他们?举例说明。

如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。

当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

--------------------------------------------------------------------------------------------------------------------

17、abstract class和interface有什么区别?

声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

--------------------------------------------------------------------------------------------------------------------

18、heap和stack有什么区别。

栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。

堆是栈的一个组成元素

--------------------------------------------------------------------------------------------------------------------

19、forward 和redirect的区别

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,

浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。

redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有

参数重新请求,所以session,request参数都可以获取。

--------------------------------------------------------------------------------------------------------------------

20、EJB与JAVABEAN的区别?

Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。

但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,

通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件,

它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,

所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,

EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。

客户通过容器来访问真正的EJB组件。

--------------------------------------------------------------------------------------------------------------------

21、Static Nested Class 和Inner Class的不同。

    Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。

而通常的内部类需要在外部类实例化后才能实例化。

--------------------------------------------------------------------------------------------------------------------

22、JSP中动态INCLUDE与静态INCLUDE的区别?

动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp"flush="true" />它总是会检查所含文件中的变化,

适合用于包含动态页面,并且可以带参数。

静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面<%@ include file="included.htm"%>

--------------------------------------------------------------------------------------------------------------------

23、什么时候用assert。

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,

assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;

如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。

一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,

在软件发布后,assertion检查通常是关闭的。

--------------------------------------------------------------------------------------------------------------------

24、GC是什么? 为什么要有GC?

  GC是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会

导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,

Java语言没有提供释放已分配内存的显示操作方法。

--------------------------------------------------------------------------------------------------------------------

25、short s1 = 1; s1 = s1 + 1;有什么错?short s1 = 1; s1 += 1;有什么错?

    short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)

short s1 = 1; s1 +=1;(可以正确编译)

--------------------------------------------------------------------------------------------------------------------

26、Math.round(11.5)等於多少?Math.round(-11.5)等於多少?

   Math.round(11.5)==12

Math.round(-11.5)==-11

round方法返回与参数最接近的长整数,参数加1/2后求其floor.

--------------------------------------------------------------------------------------------------------------------

27、String s = newString("xyz");创建了几个String Object?

两个

--------------------------------------------------------------------------------------------------------------------

28、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。

以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。

public classThreadTest1{

  private int j;

  public static void main(String args[]){

ThreadTest1 tt=newThreadTest1();

Inc inc=tt.newInc();

Dec dec=tt.newDec();

for(inti=0;i<2;i++){

Thread t=newThread(inc);

t.start();

t=new Thread(dec);

t.start();

}

}

  private synchronized void inc(){

j++;

System.out.println(Thread.currentThread().getName()+"-inc:"+j);

  }

  private synchronized void dec(){

j--;

System.out.println(Thread.currentThread().getName()+"-dec:"+j);

  }

  class Inc implements Runnable{

public void run(){

for(inti=0;i<100;i++){

inc();

}

}

  }

  class Dec implements Runnable{

public void run(){

for(inti=0;i<100;i++){

dec();

}

 }

  }

}

--------------------------------------------------------------------------------------------------------------------

29、Java有没有goto?const

java中的保留字,现在没有在java中使用。

--------------------------------------------------------------------------------------------------------------------

30、启动一个线程是用run()还是start()?

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

--------------------------------------------------------------------------------------------------------------------

31、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?

SessionBean:Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个Bean的实例时,

EJB容器不一定要创建一个新的Bean的实例供客户机调用,而是随便找一个现有的实例提供给客户机。

当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,

并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例。

EntityBean:Entity Beans能存活相对较长的时间,并且状态是持续的。只要数据库中的数据存在,Entity beans就一直存活。

而不是按照应用程序或者服务进程来说的。即使EJB容器崩溃了,Entitybeans也是存活的。

Entity Beans生命周期能够被容器或者 Beans自己管理。

EJB通过以下技术管理实务:对象管理组织(OMG)的对象实务服务(OTS),Sun Microsystems的TransactionService(JTS)、

Java TransactionAPI(JTA),开发组(X/Open)的XA接口。

--------------------------------------------------------------------------------------------------------------------

32、应用服务器有那些?

BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application Server,jBoss,Tomcat

--------------------------------------------------------------------------------------------------------------------

33、给我一个你最常见到的runtimeexception。

ArithmeticException,ArrayStoreException, BufferOverflowException, BufferUnderflowException,CannotRedoException, CannotUndoException, ClassCastException, CMMException,ConcurrentModificationException, DOMException, EmptyStackException,IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException,IllegalStateException, ImagingOpException, IndexOutOfBoundsException,MissingResourceException, NegativeArraySizeException, NoSuchElementException,NullPointerException, ProfileDataException, ProviderException,RasterFormatException, SecurityException, SystemException,UndeclaredThrowableException, UnmodifiableSetException,UnsupportedOperationException

--------------------------------------------------------------------------------------------------------------------

34、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concreteclass)?

接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。

--------------------------------------------------------------------------------------------------------------------

35、List, Set, Map是否继承自Collection接口?

List,Set是,Map不是

--------------------------------------------------------------------------------------------------------------------

36、说出数据连接池的工作机制是什么?

J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

--------------------------------------------------------------------------------------------------------------------

37、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

    都不能

--------------------------------------------------------------------------------------------------------------------

38、数组有没有length()这个方法?String有没有length()这个方法?

数组没有length()这个方法,有length的属性。String有有length()这个方法。

--------------------------------------------------------------------------------------------------------------------

39、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()?它们有何区别?

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。

equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

--------------------------------------------------------------------------------------------------------------------

40、构造器Constructor是否可被override?

构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

--------------------------------------------------------------------------------------------------------------------

41、是否可以继承String类?

String类是final类故不可以继承。

--------------------------------------------------------------------------------------------------------------------

42、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

switch(expr1)中,expr1是一个整数表达式。因此传递给switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。

--------------------------------------------------------------------------------------------------------------------

43、try {}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?

会执行,在return前执行。

--------------------------------------------------------------------------------------------------------------------

44、编程题: 用最有效率的方法算出2乘以8等於几?

2 << 3

--------------------------------------------------------------------------------------------------------------------

45、两个对象值相同(x.equals(y)== true),但却可有不同的hashcode,这句话对不对?

不对,有相同的hash code。

--------------------------------------------------------------------------------------------------------------------

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

是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

--------------------------------------------------------------------------------------------------------------------

47、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

不能,一个对象的一个synchronized方法只能由一个线程访问。

--------------------------------------------------------------------------------------------------------------------

48、编程题: 写一个Singleton出来。

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

一般Singleton模式通常有几种种形式:

第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

public classSingleton {

privateSingleton(){}

      //在自己内部定义自己一个实例,是不是很奇怪?

      //注意这是private 只供内部调用

     private static Singleton instance = new Singleton();

      //这里提供了一个供外部访问本class的静态方法,可以直接访问  

     public static Singleton getInstance() {

       return instance;   

      }

    }

    第二种形式:

public classSingleton {

  private static Singleton instance = null;

  public static synchronized SingletongetInstance() {

  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次     

  //使用时生成实例,提高了效率!

  if (instance==null)

    instance=newSingleton();

return instance;   }

}

其他形式:

定义一个类,它的构造函数为private的,所有方法为static的。

一般认为第一种形式要更加安全些

 --------------------------------------------------------------------------------------------------------------------

49、Java的接口和C++的虚类的相同和不同处。

由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口。

--------------------------------------------------------------------------------------------------------------------

50、Java中的异常处理机制的简单原理和应用。

当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。

--------------------------------------------------------------------------------------------------------------------

51、垃圾回收的优点和原理。并考虑2种回收机制。

Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

--------------------------------------------------------------------------------------------------------------------

52、请说出你所知道的线程同步的方法。

wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

--------------------------------------------------------------------------------------------------------------------

53、你所知道的集合类都有哪些?主要方法?

最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。

Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值。

--------------------------------------------------------------------------------------------------------------------

54、描述一下JVM加载class文件的原理机制?

JVM中类的装载是由ClassLoader和它的子类来实现的,JavaClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。

--------------------------------------------------------------------------------------------------------------------

55、char型变量中能不能存贮一个中文汉字?为什么?

能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的

--------------------------------------------------------------------------------------------------------------------

56、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

多线程有两种实现方法,分别是继承Thread类与实现Runnable接口

同步的实现方面有两种,分别是synchronized,wait与notify

--------------------------------------------------------------------------------------------------------------------

57、JSP的内置对象及方法。

request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。

    response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)

    out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。

    pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。

    session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息

    applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息

    config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。

page表示从该页面产生的一个servlet实例

--------------------------------------------------------------------------------------------------------------------

58、线程的基本概念、线程的基本状态以及状态之间的关系

线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。

Java中的线程有四种状态分别是:运行、就绪、挂起、结束。

--------------------------------------------------------------------------------------------------------------------

59、JSP的常用指令

<%@pagelanguage="java" contenType="text/html;charset=gb2312"session="true" buffer="64kb" autoFlush="true"isThreadSafe="true" info="text"errorPage="error.jsp" isErrorPage="true"isELIgnored="true" pageEncoding="gb2312"import="java.sql.*"%>

isErrorPage(是否能使用Exception对象),isELIgnored(是否忽略表达式)

<%@includefile="filename"%>

<%@taglibprefix="c"uri=" http://......"%>

--------------------------------------------------------------------------------------------------------------------

60、什么情况下调用doGet()和doPost()?

Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。

61、servlet的生命周期

web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。

--------------------------------------------------------------------------------------------------------------------

62、如何现实servlet的单线程模式

<%@ page isThreadSafe="false"%>

--------------------------------------------------------------------------------------------------------------------

63、页面间对象传递的方法

request,session,application,cookie等

--------------------------------------------------------------------------------------------------------------------

64、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?

JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。

--------------------------------------------------------------------------------------------------------------------

65、四种会话跟踪技术

会话作用域ServletsJSP 页面描述

page否是代表与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类(可以带有任何的include 指令,但是没有 include 动作)表示。这既包括servlet 又包括被编译成 servlet 的 JSP 页面

request是是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于forward 指令和 include 动作的关系)

session是是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求

application是是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域

--------------------------------------------------------------------------------------------------------------------

66、Request对象的主要方法:

setAttribute(Stringname,Object):设置名字为name的request的参数值

getAttribute(Stringname):返回由name指定的属性值

getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例

getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组

getCharacterEncoding():返回请求中的字符编码方式

getContentLength():返回请求的Body的长度

getHeader(Stringname):获得HTTP协议定义的文件头信息

getHeaders(Stringname):返回指定名字的request Header的所有值,结果是一个枚举的实例

getHeaderNames():返回所以request Header的名字,结果是一个枚举的实例

getInputStream():返回请求的输入流,用于获得请求中的数据

getMethod():获得客户端向服务器端传送数据的方法

getParameter(Stringname):获得客户端传送给服务器端的有name指定的参数值

getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例

getParameterValues(Stringname):获得有name指定的参数的所有值

getProtocol():获取客户端向服务器端传送数据所依据的协议名称

getQueryString():获得查询字符串

getRequestURI():获取发出请求字符串的客户端地址

getRemoteAddr():获取客户端的IP地址

getRemoteHost():获取客户端的名字

getSession([Booleancreate]):返回和请求相关Session

getServerName():获取服务器的名字

getServletPath():获取客户端所请求的脚本文件的路径

getServerPort():获取服务器的端口号

removeAttribute(Stringname):删除请求中的一个属性

--------------------------------------------------------------------------------------------------------------------

67、J2EE是技术还是平台还是框架?

    J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。

J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。

 

JNDI:JNDI(Java Naming and Directory Interface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。

JMS: JMS(Java Message Service)是访问企业消息系统的标准API,它便于消息系
统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。

JTA:JTA(JavaTransaction API)提供了J2EE中处理事务的标准接口,它支持事务的开始、回滚和提交。同时在一般的J2EE平台上,总提供一个JTS(JavaTransaction Service)作为标准的事务处理服务,开发人员可以使用JTA来使用JTS。

--------------------------------------------------------------------------------------------------------------------

68、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?

  Public String translate (String str) {

    String tempStr = "";

    try {

      tempStr = new String(str.getBytes("ISO-8859-1"),"GBK");

      tempStr = tempStr.trim();

    }

    catch (Exception e) {

      System.err.println(e.getMessage());

    }

    return tempStr;

  }

--------------------------------------------------------------------------------------------------------------------

69、简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。

区别主要答两点:a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型

b.逻辑操作不会产生短路

--------------------------------------------------------------------------------------------------------------------

70、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?

a: 两种形式 dtd  schema,b: 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的),c:有DOM,SAX,STAX等

    DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问

SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问

STAX:Streaming API for XML (StAX)

--------------------------------------------------------------------------------------------------------------------

71、简述synchronized和java.util.concurrent.locks.Lock的异同 ?

主要相同点:Lock能完成synchronized所实现的所有功能

主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

--------------------------------------------------------------------------------------------------------------------

72、EJB的角色和三个对象

一个完整的基于EJB的分布式计算结构由六个角色组成,这六个角色可以由不同的开发商提供,

每个角色所作的工作必须遵循Sun公司提供的EJB规范,以保证彼此之间的兼容性。

这六个角色分别是EJB组件开发者(EnterpriseBean Provider) 、应用组合者(Application Assembler)、

部署者(Deployer)、EJB 服务器提供者(EJB Server Provider)、EJB 容器提供者(EJB Container Provider)、

系统管理员(System Administrator)

三个对象是Remote(Local)接口、Home(LocalHome)接口,Bean类

--------------------------------------------------------------------------------------------------------------------

73、EJB容器提供的服务

主要提供声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务。

--------------------------------------------------------------------------------------------------------------------

74、EJB规范规定EJB中禁止的操作有哪些?

1.不能操作线程和线程API(线程API指非线程对象的方法如notify,wait等),2.不能操作awt,3.不能实现服务器功能,4.不能对静态属生存取,5.不能使用IO操作直接存取文件系统,6.不能加载本地库.,7.不能将this作为变量和返回,8.不能循环调用。

--------------------------------------------------------------------------------------------------------------------

75、remote接口和home接口主要作用

remote接口定义了业务方法,用于EJB客户端调用业务方法。

home接口是EJB工厂用于创建和移除查找EJB实例

--------------------------------------------------------------------------------------------------------------------

76、bean 实例的生命周期

对于Stateless Session Bean、Entity Bean、MessageDriven Bean一般存在缓冲池管理,而对于Entity Bean和StatefullSession Bean存在Cache管理,通常包含创建实例,设置上下文、创建EJB Object(create)、业务方法调用、remove等过程,对于存在缓冲池管理的Bean,在create之后实例并不从内存清除,而是采用缓冲池调度机制不断重用实例,而对于存在Cache管理的Bean则通过激活和去激活机制保持Bean的状态并限制内存中实例数量。

--------------------------------------------------------------------------------------------------------------------

77、EJB的激活机制

以Stateful Session Bean 为例:其Cache大小决定了内存中可以同时存在的Bean实例的数量,根据MRU或NRU算法,实例在激活和去激活状态之间迁移,激活机制是当客户端调用某个EJB实例业务方法时,如果对应EJBObject发现自己没有绑定对应的Bean实例则从其去激活Bean存储中(通过序列化机制存储实例)回复(激活)此实例。状态变迁前会调用对应的ejbActive和ejbPassivate方法。

--------------------------------------------------------------------------------------------------------------------

78、EJB的几种类型

会话(Session)Bean ,实体(Entity)Bean 消息驱动的(MessageDriven)Bean

会话Bean又可分为有状态(Stateful)和无状态(Stateless)两种

实体Bean可分为Bean管理的持续性(BMP)和容器管理的持续性(CMP)两种

--------------------------------------------------------------------------------------------------------------------

79、客服端调用EJB对象的几个基本步骤

设置JNDI服务工厂以及JNDI服务地址系统属性,查找Home接口,从Home接口调用Create方法创建Remote接口,通过Remote接口调用其业务方法。

--------------------------------------------------------------------------------------------------------------------

80、如何给weblogic指定大小的内存?

在启动Weblogic的脚本中(位于所在Domian对应服务器目录下的startServerName),增加setMEM_ARGS=-Xms32m -Xmx200m,可以调整最小内存为32M,最大200M

--------------------------------------------------------------------------------------------------------------------

81、如何设定的weblogic的热启动模式(开发模式)与产品发布模式?

可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一。或者修改服务的启动文件或者commenv文件,增加setPRODUCTION_MODE=true。

--------------------------------------------------------------------------------------------------------------------

82、如何启动时不需输入用户名与密码?

修改服务启动文件,增加 WLS_USER和WLS_PW项。也可以在boot.properties文件中增加加密过的用户名和密码.

 

83、在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中?

保存在此Domain的config.xml文件中,它是服务器的核心配置文件。

--------------------------------------------------------------------------------------------------------------------

84、说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp放入何目录下,然的在浏览器上就可打入http://主机:端口号//helloword.jsp就可以看到运行结果了?  又比如这其中用到了一个自己写的javaBean该如何办?

Domain目录服务器目录applications,将应用目录放在此目录下将可以作为应用访问,如果是Web应用,应用目录需要满足Web应用目录要求,jsp文件可以直接放在应用目录中,Javabean需要放在应用目录的WEB-INF目录的classes目录中,设置服务器的缺省应用将可以实现在浏览器上无需输入应用名。

--------------------------------------------------------------------------------------------------------------------

85、在weblogic中发布ejb需涉及到哪些配置文件

不同类型的EJB涉及的配置文件不同,都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xmlCMP实体Bean一般还需要weblogic-cmp-rdbms-jar.xml

86、如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置

缺省安装中使用DemoIdentity.jks和DemoTrust.jks KeyStore实现SSL,需要配置服务器使用EnableSSL,配置其端口,在产品模式下需要从CA获取私有密钥和数字证书,创建identity和trust keystore,装载获得的密钥和数字证书。可以配置此SSL连接是单向还是双向的。

--------------------------------------------------------------------------------------------------------------------

87、如何查看在weblogic中已经发布的EJB?

可以使用管理控制台,在它的Deployment中可以查看所有已发布的EJB

--------------------------------------------------------------------------------------------------------------------

88、CORBA是什么?用途是什么?

CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture),由对象管理组织 (Object Management Group,缩写为 OMG)标准化。它的组成是接口定义语言(IDL), 语言绑定(binding:也译为联编)和允许应用程序间互操作的协议。 其目的为:用不同的程序设计语言书写在不同的进程中运行,为不同的操作系统开发。

--------------------------------------------------------------------------------------------------------------------

89、说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法

  Session FacadePattern:使用SessionBean访问EntityBean

Message FacadePattern:实现异步调用

EJB Command Pattern:使用CommandJavaBeans取代SessionBean,实现轻量级访问

Data TransferObject Factory:通过DTO Factory简化EntityBean数据提供特性

Generic Attribute Access:通过AttibuteAccess接口简化EntityBean数据提供特性

Business Interface:通过远程(本地)接口和Bean类实现相同接口规范业务逻辑一致性

EJB架构的设计好坏将直接影响系统的性能、可扩展性、可维护性、组件可重用性及开发效率。项目越复杂,项目队伍越庞大则越能体现良好设计的重要性。

--------------------------------------------------------------------------------------------------------------------

90、说说在weblogic中开发消息Bean时的persistent与non-persisten的差别

persistent方式的MDB可以保证消息传递的可靠性,也就是如果EJB容器出现问题而JMS服务器依然会将消息在此MDB可用的时候发送过来,而non-persistent方式的消息将被丢弃。

--------------------------------------------------------------------------------------------------------------------

91、Servlet执行时一般实现哪几个方法?

public voidinit(ServletConfig config)

publicServletConfig getServletConfig()

public StringgetServletInfo()

public voidservice(ServletRequest request,ServletResponse response)

public voiddestroy()

--------------------------------------------------------------------------------------------------------------------

92、j2ee常用的设计模式?说明工厂模式。

    Java中的23种设计模式:

Factory(工厂模式),      Builder(建造模式),       FactoryMethod(工厂方法模式),

Prototype(原始模型模式),Singleton(单例模式),    Facade(门面模式),

Adapter(适配器模式),    Bridge(桥梁模式),        Composite(合成模式),

Decorator(装饰模式),    Flyweight(享元模式),     Proxy(代理模式),

Command(命令模式),      Interpreter(解释器模式), Visitor(访问者模式),

Iterator(迭代子模式),   Mediator(调停者模式),    Memento(备忘录模式),

Observer(观察者模式),   State(状态模式),         Strategy(策略模式),

Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)

工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,

通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。

首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件

生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。

--------------------------------------------------------------------------------------------------------------------

93、EJB需直接实现它的业务接口或Home接口吗,请简述理由。

远程接口和Home接口不需要直接实现,他们的实现代码是由服务器产生的,程序运行中对应实现类会作为对应接口类型的实例被使用。

--------------------------------------------------------------------------------------------------------------------

94、排序都有哪几种方法?请列举。用JAVA实现一个快速排序。

    排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)

快速排序的伪代码。

/ /使用快速排序方法对a[ 0 :n- 1 ]排序

从a[ 0 :n- 1 ]中选择一个元素作为m id d l e,该元素为支点

把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点

递归地使用快速排序方法对left 进行排序

递归地使用快速排序方法对right 进行排序

所得结果为l e f t + m i d d l e + r i g h t

--------------------------------------------------------------------------------------------------------------------

95、请对以下在J2EE中常用的名词进行解释(或简单描述)

web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接**互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。

EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。

JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。

JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。

JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。

JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。

RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。

--------------------------------------------------------------------------------------------------------------------

96、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。

用try来指定一块预防所有"异常"的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的"异常"的类型。

throw语句用来明确地抛出一个"异常"。

throws用来标明一个成员函数可能抛出的各种"异常"。

Finally为确保一段代码不管发生什么"异常"都被执行一段代码。

可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,"异常"的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种"异常"进行处理,堆栈就会展开,直到遇到有处理这种"异常"的try语句。

 

java面试笔试题大汇总(2)[转]

--------------------------------------------------------------------------------------------------------------------

97、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

可以。必须只有一个类名与文件名相同。

--------------------------------------------------------------------------------------------------------------------

98、MVC的各个部分都有那些技术来实现?如何实现?

MVC是Model-View-Controller的简写。

"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),"View" 是应用的表示面(由JSP页面产生),

"Controller"是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示

逻辑分成不同的组件实现。这些组件可以进行交互和重用。

--------------------------------------------------------------------------------------------------------------------

99、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?

有两种实现方法,分别是继承Thread类与实现Runnable接口

用synchronized关键字修饰同步方法

反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。

--------------------------------------------------------------------------------------------------------------------

100、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

字节流,字符流。字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。

--------------------------------------------------------------------------------------------------------------------

101、java中会存在内存泄漏吗,请简单描述。

会。如:int i,i2; return (i-i2);   //when i为足够大的正数,i2为足够大的负数。结果会造成溢位,导致错误。

--------------------------------------------------------------------------------------------------------------------

102、java中实现多态的机制是什么?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。

--------------------------------------------------------------------------------------------------------------------

103、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

--------------------------------------------------------------------------------------------------------------------

104、静态变量和实例变量的区别?

static i = 10; //常量

   class A a; a.i =10;//可变

--------------------------------------------------------------------------------------------------------------------

105、什么是java序列化,如何实现java序列化?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,

也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Objectobj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

--------------------------------------------------------------------------------------------------------------------

106、是否可以从一个static方法内部发出对非static方法的调用?

不可以,如果其中包含对象的method();不能保证对象初始化.

--------------------------------------------------------------------------------------------------------------------

107、写clone()方法时,通常都有一行代码,是什么?

Clone 有缺省行为,super.clone();他负责产生正确大小的空间,并逐位复制。

--------------------------------------------------------------------------------------------------------------------

108、在JAVA中,如何跳出当前的多重嵌套循环?

用break; return 方法。

--------------------------------------------------------------------------------------------------------------------

109、List、Map、Set三个接口,存取元素时,各有什么特点?

List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。

--------------------------------------------------------------------------------------------------------------------

110、J2EE是什么?

J2EE是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型

(enterprieseapplication model).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,

并且处于相应的层次(tier)中。所属层次包括客户层(clietntier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。

--------------------------------------------------------------------------------------------------------------------

111、UML方面

标准建模语言UML。用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图。

--------------------------------------------------------------------------------------------------------------------

112、说出一些常用的类,包,接口,请各举5个

常用的类:BufferedReader  BufferedWriter  FileReader FileWirter  String  Integer

常用的包:java.lang java.awt  java.io  java.util java.sql

常用的接口:Remote List  Map  Document NodeList

--------------------------------------------------------------------------------------------------------------------

113、开发中都用到了那些设计模式?用在什么场合?

每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。主要用到了MVC的设计模式。用来开发JSP/Servlet或者J2EE的相关应用。简单工厂模式等。

--------------------------------------------------------------------------------------------------------------------

114、jsp有哪些动作?作用分别是什么?

JSP共有以下6种基本动作 jsp:include:在页面被请求的时候引入一个文件。 jsp:useBean:寻找或者实例化一个JavaBean。jsp:setProperty:设置JavaBean的属性。jsp:getProperty:输出某个JavaBean的属性。 jsp:forward:把请求转到一个新的页面。 jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。

--------------------------------------------------------------------------------------------------------------------

115、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

可以继承其他类或完成其他接口,在swing编程中常用此方式。

--------------------------------------------------------------------------------------------------------------------

116、应用服务器与WEB SERVER的区别?

应用服务器:Weblogic、Tomcat、Jboss

 

WEB SERVER:IIS、 Apache

--------------------------------------------------------------------------------------------------------------------

117、BS与CS的联系与区别。

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或 SQL Server。客户端需要安装专用的客户端软件。

B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或 SQL Server等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。

C/S 与 B/S 区别:

1.硬件环境不同:

  C/S 一般建立在专用的网络上,小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务.

  B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行

2.对安全要求不同

  C/S 一般面向相对固定的用户群,对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息.

  B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。

3.对程序架构不同

  C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑.

  B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟.

4.软件重用不同

  C/S 程序可以不可避免的整体性考虑,构件的重用性不如在B/S要求下的构件的重用性好.

  B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子

5.系统维护不同 

  C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统

  B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.

6.处理问题不同

  C/S 程序可以处理用户面固定,并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统

  B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.

7.用户接口不同

  C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高

  B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.

8.信息流不同

  C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低

  B/S 信息流向可变化, B-BB-C B-G等信息、流向的变化, 更像交易中心。

--------------------------------------------------------------------------------------------------------------------

118、LINUX下线程,GDI类的解释。

LINUX实现的就是基于核心轻量级进程的"一对一"线程模型,一个线程实体对应一个核心轻量级进程,而线程之间的管理在核外函数库中实现。

GDI类为图像设备编程接口类库。

--------------------------------------------------------------------------------------------------------------------

119、STRUTS的应用(如STRUTS架构)

Struts是采用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。

采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。

Struts有如下的主要功能: 一.包含一个controllerservlet,能将用户的请求发送到相应的Action对象。

二.JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。

三.提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息。

--------------------------------------------------------------------------------------------------------------------

120、Jdo是什么?

JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。

JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。

这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。

另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,

比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。

--------------------------------------------------------------------------------------------------------------------

121、内部类可以引用他包含类的成员吗?有没有什么限制?

一个内部类对象可以访问创建它的外部类对象的内容

--------------------------------------------------------------------------------------------------------------------

122、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。

Web ServiceWebService是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。

JAXP(Java API forXML Parsing) 定义了在Java中使用DOM, SAX,XSLT的通用的接口。这样在你的程序中你只要使用这些通用的接口,当你需要改变具体的实现时候也不需要修改代码。

JAXM(Java API forXML Messaging) 是为SOAP通信提供访问方法和传输机制的API。

WSDL是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操作。这种格式首先对操作和消息进行抽象描述,然后将其绑定到具体的网络协议和消息格式上以定义端点。相关的具体端点即组合成为抽象端点(服务)。

SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。

UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为WebService提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。

 

在开发人员的圈子中,大家通过相互交流在开发过程中所遇到的问题以及解决方法来丰富整个圈子的经验。而设计模式就是在这样的情况下产生的。一个设计模式必然是针对某个特定的问题的,这个问题的解决方案以及这样解决问题产生的后果。在解决利用J2EE进行程序开发中出现的问题的过程中,人们把设计模式分为两类,一种是通用开发模式,一种是为了解决特定的J2EE问题的模式。下面让我们来看一看每一种类型的开发模式都包含了哪些内容。

 架构模式

通常说的MVC就是一种架构模式,我们不要把MVC当为一种设计模式。


J2EE设计模式

J2EE设计模式在过去几年中随着Java开发人员经验的不断成长而发展。这些设计模式是针对使用各种J2EE技术时可能出现的问题提出的,它们能够帮助开发人员构造出应用程序框架的要求。例如,Front Controller(前端控件)模式将servlet代码的开发转化为在图形用户界面下的开发。但是需要记住J2EE设计模型解决了那些在J2EE项目中最可能出现的问题。如果你在J2EE遇到的问题很特殊,很有可能没有相应的设计模型来解决它。

软件开发设计模式

软件开发设计模式又被分为两种,一种是通用的面向对象设计模式。例如工厂(Factory)模式是一种面向对象的设计模式,它将对象的创建封装起来,使对象能够重用,这样就可以减少程序占用的系统资源。而另一种是基于Java的设计模式,这些设计模式要么是和Java的语言特性结合得很紧,要么是面向对象技术在Java中的深化。不要以为软件设计模式相对独立于J2EE就认为它们不重要,通常它们比J2EE设计模式更重要。这是因为:

1)J2EE设计模式是近几年才出现的,并且在不断变化,而软件开发设计模式经过了长时间的考验,比前者更加成熟和完善;

2)有些J2EE设计模式是建立在某些软件开发设计模式之上的;

3)软件开发模式为J2EE设计模式提供了坚实的基础。它的应用将影响到整个结构的稳定性和可扩充性。

在实际应用中,设计模式并不是一段具体的代码。设计模式通常是在设计说明书中描述。将设计模式应用到系统中的真正挑战在于如何在系统中应用模式中的思想。这些思想必须被应用到恰当的环境中。

根据设计模式的所解决的问题,又可以分为以下几个类型:

· 创建类型:创建类型的模式都是用于创建类的实例。但是和通过new来创建实例不同,这些模式提供了更加灵活的方式,是程序能够根据特定的情况创建特定的类。

· 结构类型:结构类型的模式帮助开发人员将简单对象组合在一起以后的更加复杂的结构。

· 行为类型:行为类型的模式帮助开发人员控制类之间的通讯。

创建类型的模式

所有创建类型的模式都和如何有效地创建类的实例相关。在Java中,如果开发人员要生成一个类的实例,最简单的方法是使用new关键字:

MyFoo = new Foo();  // 生成一个Foo的实例



这种方法只能够在程序中生成固定的类。但是在很多情况下,程序需要根据不同的情况生成不同的类的实例,这就需要将实例的生成过程抽象到一个特殊的创建类中,由该类在运行时决定生成哪种类的实例。这样使得程序有更好的灵活性和通用性。

创建类型的模式包括:

· 工厂模式(Factory Pattern):根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,而这一组类有一个公共的抽象父类。

· 抽象工厂模式(Abstract Factory Pattern):抽象工厂模式也可以根据提供的数据生成一组类中某一个类的实例,而这一组类有一个公共的抽象父类。只不过它定义的是一个接口。

· 构造者模式(Builder Pattern):构造者模式将一个复杂对象的构造过程和它的表现层分离开来,这样类就可以根据不同情况展现出不同的表现方式。

· 原型模式(Prototype Pattern):原型模式通过对类的实例进行拷贝来创建新的实例。

· 单例模式(Singleton Pattern):根据单一模式实现的类只允许有一个是类,并且提供了一个全局指针来引用该实例。

结构类型的模式

结构类型的模式将类和对象组合起来,以构成更加复杂的结构。它又被划分为类模式和对象模式。类模式和对象模式之间的区别在于类模式通过继承关系来提供有效的接口;而类模式通过对象合成或将对象包含在其它对象中的方式构成更加复杂的结构。

结构类型的模式包括了以下模式:

· 适配器模式(Adapter Pattern):适配器模式可以将一个类的接口和另一个类的接口匹配起来。

· 桥梁模式(Bridge Pattern):桥梁模式对客户端程序提供一个固定的接口,但是允许开发人员变化实际的实现类。这样开发人员就可以将接口是具体的实现类分离开来。

· 组合模式(Composite Pattern):复合模式可以将多个对象进行复合,其中的每个对象可以是简单对象,也可以是复合对象。

· 代理模式(Proxy Pattern):代理模式利用一个简单的对象替代一个复杂的对象,当复杂对象在需要的时候才会被加载到系统中,这样可以节约系统资源,提高系统的响应速度。在网络环境中这种模式很有用处。

· 装饰者模式(Decorator Pattern):通过修饰模式,开发人员可以在运行时将特定的功能绑定在对象上。

· 享元模式(Flyweight Pattern):轻量模式通过将对象中的一部分数据保存在对象外,在调用对象中的方法时再将这些数据传回对象。这样做可以减少大量比较简单的对象占用的空间。

· 门面模式(Facade Pattern):正面模式将复杂的类层次结构组织起来,通过一个简单的接口来获得层次结构中的数据。

行为类型的模式

行为类型的模式主要是那些处理对象之间通讯的模式,该类型的包括以下模式:

· 观察者模式(Observer Pattern):观测者模式可以在发生变化时将变化通知多个类。

· 调停者模式(Mediator Pattern):中介模式可以通过一个中间类来控制若干个类之间的通讯,并且这些类相互之间不需要了解对方的信息。

· 备忘录模式(Memento Pattern):回忆模式可以在不破坏对象封装性的前提下保存和恢复对象的内部状态。

· 责任链模式(Chain of Responsibility):职责链模式将请求传递给一组对象,只有特定的对象才会处理该请求。这样就进一步削弱类之间的联系。

· 命令模式(Command Pattern):命令模式将请求传递给特定的对象,这样客户端即使在不知道服务器端如何处理请求的情况下也可以发送请求。

· 模板方法模式(Template Method Pattern):模板模式提供了对算法的抽象定义。

· 策略模式(Strategy Pattern): 策略模式定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。

· 访问者模式(Visitor Pattern):访问者模式通过一个访问类来访问其他类中的数据。

· 状态模式(State Pattern):状态模式将一个类实例的变量保存在独立的内存空间中。

· 迭代子模式(Iterator Pattern):迭代模式在不知道数据的内部表现形式的前提下,通过标准的接口来遍历数据集合中的数据。

-----------------------------------------------------------------------------

J2EE开发中大量的专业缩略语很是让人迷惑,尤其是跟一些高手讨论问题的时候,三分钟就被人家满口的专业术语喷晕了,PO VO BO DTO POJO DAO,一大堆的就来了(听过老罗对这种现象的批判的朋友会会心一笑)。

    首先声明偶也不是什么高手,以下总结都是自己的体会。不对之处请您多指教。

 

PO:

persistant object持久对象

最形象的理解就是一个PO就是数据库中的一条记录。

好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。

--------------------------------------------------------------------------------

BO:

business object业务对象

主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。

比如一个简历,有教育经历、工作经历、社会关系等等。

我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。

建立一个对应简历的BO对象处理简历,每个BO包含这些PO。

这样处理业务逻辑时,我们就可以针对BO去处理。

--------------------------------------------------------------------------------

VO :

value object值对象

ViewObject表现层对象

 

主要对应界面显示的数据对象。对于一个WEB页面,或者SWT、SWING的一个界面,用一个VO对象对应整个界面的值。

--------------------------------------------------------------------------------

DTO :

Data TransferObject数据传输对象

主要用于远程调用等需要大量传输对象的地方。

比如我们一张表有100个字段,那么对应的PO就有100个属性。

但是我们界面上只要显示10个字段,

客户端用WEBservice来获取数据,没有必要把整个PO对象传递到客户端,

这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO

--------------------------------------------------------------------------------

POJO :

plain ordinary java object 简单java对象

个人感觉POJO是最常见最多变的对象,是一个中间对象,也是我们最常打交道的对象。

一个POJO持久化以后就是PO

直接用它传递、传递过程中就是DTO

直接用来对应表示层就是VO

--------------------------------------------------------------------------------

 

DAO:

data access object数据访问对象

这个大家最熟悉,和上面几个O区别最大,基本没有互相转化的可能性和必要.

主要用来封装对数据库的访问。通过它可以把POJO持久化为PO,用PO组装出来VO、DTO

     总结下我认为一个对象究竟是什么O要看具体环境,在不同的层、不同的应用场合,对象的身份也不一样,而且对象身份的转化也是很自然的。就像你对老婆来说就是老公,对父母来说就是子女。设计这些概念的初衷不是为了唬人而是为了更好的理解和处理各种逻辑,让大家能更好的去用面向对象的方式处理问题.

     大家千万不要陷入过度设计,大可不必为了设计而设计一定要在代码中区分各个对象。一句话技术是为应用服务的。

欢迎指正。

 

 

安卓面试题

1、什么是ANR 如何避免它?

ANR定义

     在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户

显示一个对话框,这个对话框称作应用程序无响应(ANR:ApplicationNot

Responding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应

用程序时,并不希望每次都要处理这个对话框。因此,在程序里对响应性能的设

计很重要,这样,系统不会显示ANR给用户。

    如何来避免:

考虑上面的ANR定义,让我们来研究一下为什么它会在Android应用程序里发生和

如何最佳构建应用程序来避免ANR。

Android应用程序通常是运行在一个单独的线程(例如,main)里。这意味着你

的应用程序所做的事情如果在主线程里占用了太长的时间的话,就会引发ANR对

话框,因为你的应用程序并没有给自己机会来处理输入事件或者Intent广播。

因此,运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在

它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操

作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺

寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。

然而,不是说你的主线程阻塞在那里等待子线程的完成——也不是调用

Thread.wait()或是Thread.sleep()。替代的方法是,主线程应该为子线程提供

一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,

将能保证你的主线程保持对输入的响应性并能避免由于5秒输入事件的超时引发

的ANR对话框。这种做法应该在其它显示UI的线程里效仿,因为它们都受相同的

超时影响。

IntentReceiver执行时间的特殊限制意味着它应该做:在后台里做小的、琐碎的

工作如保存设定或者注册一个Notification。和在主线程里调用的其它方法一样

,应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在

子线程里做这些任务(因为BroadcastReceiver的生命周期短),替代的是,如

果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个

Service。顺便提及一句,你也应该避免在Intent Receiver里启动一个Activity

,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果

你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用

Notification Manager来实现。

一般来说,在应用程序里,100到200ms是用户能感知阻滞的时间阈值。因此,这

里有一些额外的技巧来避免ANR,并有助于让你的应用程序看起来有响应性。

如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度

(ProgressBar和ProgressDialog对这种情况来说很有用)。

特别是游戏,在子线程里做移动的计算。

如果你的应用程序有一个耗时的初始化过程的话,考虑可以显示一个Splash

Screen或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该

显示正在进行的进度,以免用户认为应用程序被冻结了。

本文来自CSDN博客,转载请标明出处:

http://blog.csdn.net/Zengyangtech/archive/2010/11/21/6025671.aspx

2、什么情况会导致Force Close ?如何避免?能否捕获导致其的异常?

3、Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime

异常,你遇到过吗?诺有的话会导致什么问题?如何解决?

4、简要解释一下activity、 intent 、intent filter、service、Broadcast、

BroadcaseReceiver

Activity

Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之

中,Activity具有自己的生命周期(由系统控制生命周期,程序无法改变,但可

以用onSaveInstanceState保存其状态)。

对于Activity,关键是其生命周期的把握(如那张经典的生命周期图=.=),其

次就是状态的保存和恢复(onSaveInstanceStateonRestoreInstanceState),

以及Activity之间的跳转和数据传输(intent)。

Activity中常用的函数有SetContentView()  findViewById()    finish()  

startActivity(),其生命周期涉及的函数有:

void onCreate(Bundle savedInstanceState)

void onStart()

void onRestart()

void onResume()

void onPause()

void onStop()

void onDestroy()

注意的是,Activity的使用需要在Manifest文件中添加相应的<Activity>,并设

置其属性和intent-filter。

Intent

Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中

一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent

的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调

用。Intent不仅可用于应用程序之间,也可用于应用程序内部的

Activity/Service之间的交互。因此,Intent在这里起着一个媒体中介的作用,

专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。在SDK

中给出了Intent作用的表现形式为:

· 通过Context.startActivity() orActivity.startActivityForResult() 启

动一个Activity;

· 通过 Context.startService() 启动一个服务,或者通过

Context.bindService() 和后台服务交互;

· 通过广播方法(比如Context.sendBroadcast

(),Context.sendOrderedBroadcast(),  Context.sendStickyBroadcast()) 发

给broadcastreceivers。

Intent属性的设置,包括以下几点:(以下为XML中定义,当然也可以通过

Intent类的方法来获取和设置)

(1)Action,也就是要执行的动作

SDk中定义了一些标准的动作,包括

onstant

 Target component

 Action

ACTION_CALL

 activity

 Initiate a phone call.

ACTION_EDIT

 activity

 Display data for the user to edit.

ACTION_MAIN

 activity

 Start up as the initial activity of a task,with no data input and no

returned output.

ACTION_SYNC

 activity

 Synchronize data on a server with data on themobile device.

ACTION_BATTERY_LOW

 broadcast receiver

 Awarning that the battery is low.

ACTION_HEADSET_PLUG

 broadcast receiver

 Aheadset has been plugged into the device, or unplugged from it.

ACTION_SCREEN_ON

 broadcast receiver

 Thescreen has been turned on.

ACTION_TIMEZONE_CHANGED

 broadcast receiver

 Thesetting for the time zone has changed.

当然,也可以自定义动作(自定义的动作在使用时,需要加上包名作为前缀,如

"com.example.project.SHOW_COLOR”),并可定义相应的Activity来处理我们

的自定义动作。

(2)Data,也就是执行动作要操作的数据

Android中采用指向数据的一个URI来表示,如在联系人应用中,一个指向某联系

人的URI可能为:content://contacts/1。对于不同的动作,其URI数据的类型是

不同的(可以设置type属性指定特定类型数据),如ACTION_EDIT指定Data为文

件URI,打电话为tel:URI,访问网络为http:URI,而由content provider提供的

数据则为content:URIs。

(3)type(数据类型),显式指定Intent的数据类型(MIME)。一般Intent的

数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显

式指定的类型而不再进行推导。

(4)category(类别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY表

示Intent 的接受者应该在Launcher中作为顶级应用出现;而

ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动

作可以在同一块数据上执行。还有其他的为

Constant

 Meaning

CATEGORY_BROWSABLE

 Thetarget activity can be safely invoked by the browser to display

data referenced by a link — for example, animage or an e-mail

message.

CATEGORY_GADGET

 Theactivity can be embedded inside of another activity that hosts

gadgets.

CATEGORY_HOME

 Theactivity displays the home screen, the first screen the user sees

when the device is turned on or when theHOME key is pressed.

CATEGORY_LAUNCHER

 Theactivity can be the initial activity of a task and is listed in

the top-level application launcher.

CATEGORY_PREFERENCE

 Thetarget activity is a preference panel.

(5)component(组件),指定Intent的的目标组件的类名称。通常 Android会

根据Intent 中包含的其它属性的信息,比如action、data/type、category进行

查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指

定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性

以后,Intent的其它所有属性都是可选的。

(6)extras(附加信息),是其它所有附加信息的集合。使用extras可以为组

件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮

件的标题、正文等保存在extras里,传给电子邮件发送组件。

理解Intent的关键之一是理解清楚Intent的两种基本用法:一种是显式的Intent

,即在构造Intent对象时就指定接收者;另一种是隐式的Intent,即Intent的发

送者在构造Intent对象时,并不知道也不关心接收者是谁,有利于降低发送者和

接收者之间的耦合。

对于显式Intent,Android不需要去做解析,因为目标组件已经很明确,Android

需要解析的是那些隐式Intent,通过解析,将 Intent映射给可以处理此Intent

的Activity、IntentReceiver或Service。       

Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有

IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中

,Android是通过Intent的action、type、category这三个属性来进行判断的,

判断方法如下:

· 如果Intent指明定了action,则目标组件的IntentFilter的action列表中就

必须包含有这个action,否则不能匹配;

· 如果Intent没有提供type,系统将从data中得到数据类型。和action一样,

目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。

· 如果Intent中的数据不是content:类型的URI,而且Intent也没有明确指定

它的type,将根据Intent中数据的scheme (比如 http: 或者mailto:) 进行匹

配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。

· 如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类

别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY 和

ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。

Intent-Filter的定义

一些属性设置的例子:

  <action android:name="com.example.project.SHOW_CURRENT"/>

  <category android:name="android.intent.category.DEFAULT"/>

  <data android:mimeType="video/mpeg"android:scheme="http" . . . />

  <data android:mimeType="image/*" />

  <data android:scheme="http"android:type="video/*" />

完整的实例

<activityandroid:name="NotesList"

android:label="@string/title_notes_list">

                <intent-filter>

                      <action

android:name="android.intent.action.MAIN"/>

                <category

android:name="android.intent.category.LAUNCHER"/>

                </intent-filter>

                <intent-filter>

                      <action

android:name="android.intent.action.VIEW"/>

                      <action

android:name="android.intent.action.EDIT"/>

                      <action

android:name="android.intent.action.PICK"/>

                <category

android:name="android.intent.category.DEFAULT"/>

                      <data

android:mimeType="vnd.android.cursor.dir/vnd.google.note"/>

                </intent-filter>

                <intent-filter>

                      <action

android:name="android.intent.action.GET_CONTENT"/>

                <category

android:name="android.intent.category.DEFAULT"/>

                       <data

android:mimeType="vnd.android.cursor.item/vnd.google.note"/>

                </intent-filter>

</activity>

Intent用法实例

1.无参数Activity跳转

 Intent it = new Intent(Activity.Main.this, Activity2.class);

 startActivity(it);  

2.向下一个Activity传递数据(使用Bundle和Intent.putExtras)

    Intent it = new Intent(Activity.Main.this, Activity2.class);

   Bundle bundle=new Bundle();

   bundle.putString("name", "This is fromMainActivity!");

   it.putExtras(bundle);       //it.putExtra(“test”, "shuju”);

   startActivity(it);            //startActivityForResult

(it,REQUEST_CODE);

对于数据的获取可以采用:

     Bundle bundle=getIntent().getExtras();String

name=bundle.getString("name");

3.向上一个Activity返回结果(使用setResult,针对startActivityForResult

(it,REQUEST_CODE)启动的Activity)

     Intent intent=getIntent();     

     Bundle bundle2=new Bundle();      

     bundle2.putString("name", "This is fromShowMsg!");     

     intent.putExtras(bundle2);      

     setResult(RESULT_OK, intent);

4.回调上一个Activity的结果处理函数(onActivityResult)

@Override   protected void onActivityResult(int requestCode, int

resultCode, Intent data) {     

          // TODO Auto-generated method stub    

    super.onActivityResult(requestCode, resultCode, data);  

    if (requestCode==REQUEST_CODE){        

            if(resultCode==RESULT_CANCELED)      

                 setTitle("cancle");         

            else if (resultCode==RESULT_OK) {           

                      String temp=null;             

                       Bundlebundle=data.getExtras();           

     if(bundle!=null)  temp=bundle.getString("name");     

          setTitle(temp);    

      }   

   } 

}

下面是转载来的其他的一些Intent用法实例(转自javaeye)

显示网页

   1.Uri uri = Uri.parse("http://google.com"); 

   2.Intent it = new Intent(Intent.ACTION_VIEW, uri); 

   3.startActivity(it);

显示地图

   1.Uri uri = Uri.parse("geo:38.899533,-77.036476"); 

   2.Intent it = new Intent(Intent.ACTION_VIEW, uri);  

   3.startActivity(it);  

   4.//其他 geo URI 範例 

   5.//geo:latitude,longitude 

   6.//geo:latitude,longitude?z=zoom 

   7.//geo:0,0?q=my+street+address 

   8.//geo:0,0?q=business+near+city 

   9.

//google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz=mapZoom

路径规划

   1.Uri uri = Uri.parse("http://maps.google.com/maps?

f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en"); 

   2.Intent it = new Intent(Intent.ACTION_VIEW, uri); 

   3.startActivity(it); 

   4.//where startLat, startLng, endLat, endLng are a long with 6

decimals like: 50.123456

打电话

   1.//叫出拨号程序

   2.Uri uri = Uri.parse("tel:0800000123"); 

   3.Intent it = new Intent(Intent.ACTION_DIAL, uri); 

   4.startActivity(it); 

   1.//直接打电话出去 

   2.Uri uri = Uri.parse("tel:0800000123"); 

   3.Intent it = new Intent(Intent.ACTION_CALL, uri); 

   4.startActivity(it); 

   5.//用這個,要在AndroidManifest.xml 中,加上 

   6.//<uses-permission id="android.permission.CALL_PHONE" />

传送SMS/MMS

   1.//调用短信程序

   2.Intent it = new Intent(Intent.ACTION_VIEW, uri); 

   3.it.putExtra("sms_body", "The SMS text");  

   4.it.setType("vnd.android-dir/mms-sms"); 

   5.startActivity(it);

   1.//传送消息

   2.Uri uri = Uri.parse("smsto://0800000123"); 

   3.Intent it = new Intent(Intent.ACTION_SENDTO, uri); 

   4.it.putExtra("sms_body", "The SMS text"); 

   5.startActivity(it);

   1.//传送 MMS 

   2.Uri uri = Uri.parse("content://media/external/images/media/23");

 

   3.Intent it = new Intent(Intent.ACTION_SEND);  

   4.it.putExtra("sms_body", "some text");  

   5.it.putExtra(Intent.EXTRA_STREAM, uri); 

   6.it.setType("image/png");  

   7.startActivity(it);

传送 Email

   1.Uri uri = Uri.parse("mailto:xxx@abc.com"); 

   2.Intent it = new Intent(Intent.ACTION_SENDTO, uri); 

   3.startActivity(it);

   1.Intent it = new Intent(Intent.ACTION_SEND); 

   2.it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com"); 

   3.it.putExtra(Intent.EXTRA_TEXT, "The email body text"); 

   4.it.setType("text/plain"); 

   5.startActivity(Intent.createChooser(it, "Choose Email Client"));

   1.Intent it=new Intent(Intent.ACTION_SEND);   

   2.String[] tos={"me@abc.com"};   

   3.String[] ccs={"you@abc.com"};   

   4.it.putExtra(Intent.EXTRA_EMAIL, tos);    

   5.it.putExtra(Intent.EXTRA_CC, ccs);   

   6.it.putExtra(Intent.EXTRA_TEXT, "The email body text");   

   7.it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");   

   8.it.setType("message/rfc822");   

   9.startActivity(Intent.createChooser(it, "Choose Email Client"));

   1.//传送附件

   2.Intent it = new Intent(Intent.ACTION_SEND); 

   3.it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); 

   4.it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3"); 

   5.sendIntent.setType("audio/mp3"); 

   6.startActivity(Intent.createChooser(it, "Choose Email Client"));

播放多媒体

      Uri uri = Uri.parse("file:///sdcard/song.mp3"); 

      Intent it = new Intent(Intent.ACTION_VIEW, uri); 

      it.setType("audio/mp3"); 

       startActivity(it);

      Uri uri = Uri.withAppendedPath

(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,"1"); 

      Intent it = new Intent(Intent.ACTION_VIEW, uri); 

      startActivity(it);

Market 相关

1.       //寻找某个应用

2.       Uri uri = Uri.parse("market://search?q=pname:pkg_name");

3.       Intent it = new Intent(Intent.ACTION_VIEW, uri); 

4.       startActivity(it); 

5.       //where pkg_name is the full package path for an application

1.       //显示某个应用的相关信息

2.       Uri uri = Uri.parse("market://details?id=app_id"); 

3.       Intent it = new Intent(Intent.ACTION_VIEW, uri);

4.       startActivity(it); 

5.       //where app_id is the application ID, find the ID  

6.       //by clicking on your application on Market home  

7.       //page, and notice the ID from the address bar

Uninstall 应用程序

1.       Uri uri = Uri.fromParts("package", strPackageName, null);

2.       Intent it = new Intent(Intent.ACTION_DELETE, uri);  

3.       startActivity(it);

service

service是没有界面的长生命周期的代码。一个很好的例子是媒体播放器从列表

中播放歌曲。在一个媒体播放器程序中,大概要有一个或多个活动(activity)

来供用户选择歌曲并播放它。然而,音乐的回放就不能使用活动(activity)了

,因为用户希望他导航到其他界面时音乐继续播放。这种情况下,媒体播放器活

动(activity)要用Context.startService()启动一个服务来在后台运行保持音

乐的播放。系统将保持这个音乐回放服务的运行直到它结束。注意一下,你要用

Context.bindService()方法连接服务(如果它没有运行,要先启动它)。当连

接到服务后,你可以通过服务暴露的一个接口和它通信。对于音乐服务,它允许

你暂停、倒带,等等。

Broadcast和BroadcaseReceiver

Android BroadcastReceiver 简介

在 Android 中使用 Activity, Service, Broadcast,BroadcastReceiver

   活动(Activity) - 用于表现功能 

   服务(Service) - 相当于后台运行的 Activity

   广播(Broadcast) - 用于发送广播 

   广播接收器(BroadcastReceiver) - 用于接收广播

  Intent - 用于连接以上各个组件,并在其间传递消息

BroadcastReceiver

    在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制

。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类

组件。下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过

滤接收的过程:

    首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action

、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()、

sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方

式发送出去。

    当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的

IntentFilter是否与发送的Intent相匹配,若 匹配则就会调用

BroadcastReceiver的onReceive()方法。所以当我们定义一个

BroadcastReceiver的时候,都需要 实现onReceive()方法。

注册BroadcastReceiver有两种方式:

    一种方式是,静态的在AndroidManifest.xml中用<receiver>标签生命注册

,并在标签内用<intent-filter>标签设置过滤器。

    另一种方式是,动态的在代码中先定义并设置好一个 IntentFilter对象,

然后在需要注册的地方调Context.registerReceiver()方法,如果取消时就调

用Context.unregisterReceiver()方法。

不管是用xml注册的还是用代码注册的,在程序退出的时候没有特殊需要都得注销

,否则下次启动程序可能会有多个 BroadcastReceiver

    另外,若在使用sendBroadcast()的方法是指定了接收权限,则只有在

AndroidManifest.xml中用<uses- permission>标签声明了拥有此权限的

BroascastReceiver才会有可能接收到发送来的Broadcast。

    同样,若在注册BroadcastReceiver时指定了可接收的Broadcast的权限,则

只有在包内的AndroidManifest.xml中 用<uses-permission>标签声明了,拥有

此权限的Context对象所发送的Broadcast才能被这个 BroadcastReceiver所接收

动态注册:

   IntentFilter intentFilter = new IntentFilter();

   intentFilter.addAction(String);--为 BroadcastReceiver指定action,

使之用于接收同action的广播 registerReceiver

(BroadcastReceiver,intentFilter);

    一般:在onStart中注册,onStop中取消unregisterReceiver

发送广播消息:extendsService

    指定广播目标Action:Intent Intent = newIntent(action-String)

   --指定了此action的receiver会接收此广播

    需传递参数(可选) putExtra();

    发送:sendBroadcast(Intent);

本文来自CSDN博客,转载请标明出处:

http://blog.csdn.net/Zengyangtech/archive/2010/11/21/6025676.aspx

5、IntentService有何优点?

IntentService is a base class for Servicesthat handle asynchronous

requests (expressed as Intents) on demand.Clients send requests 

through startService(Intent) calls; theservice is started as needed,

handles each Intent in turn using a workerthread, and stops itself 

when it runs out of work.

This ‘work queue processor’ pattern iscommonly used to offload

tasks from an application’s main thread.The IntentService class

exists to simplify this pattern and take care of the mechanics. To

use it, extend IntentService and implementonHandleIntent(Intent).

IntentService  will receive the Intents, launch a workerthread, and

stop the service as appropriate.

All requests are handled on a single workerthread — they may take as

long as necessary (and will not block theapplication’s main loop),

but only one request will be processed at a time.”

IntentService 的好处

Acitivity的进程,当处理Intent的时候,会产生一个对应的Service

Android的进程处理器现在会尽可能的不kill掉你

非常容易使用

日历中IntentService的应用

public class DismissAllAlarmsServiceextends IntentService {

@Override public void onHandleIntent(IntentunusedIntent) {

ContentResolver resolver =getContentResolver();

...

resolver.update(uri, values, selection,null);

}

}

in AlertReceiver extends BroadcastReceiver,onReceive():  (main

thread)

   Intent intent = new Intent(context,

DismissAllAlarmsService.class);

   context.startService(intent);

6.根据自己的理解描述下Android数字签名

Android 数字签名

      在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此

数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个

permission的protectionLevel为signature,那么就只有那些跟该permission所

在的程序拥有同一个数字证书的应用程序才能取得该权限。Android使用Java的

数字证书相关的机制来给apk加盖数字证书,要理解android的数字证书,需要先

了解以下数字证书的概念和java的数字证书机制。Android系统要求每一个安装

进系统的应用程序都是经过数字证书签名的,数字证书的私钥则保存在程序开发

者的手中。Android将数字证书用来标识应用程序的作者和在应用程序之间建立

信任关系,不是用来决定最终用户可以安装哪些应用程序。这个数字证书并不需

要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。

同一个开发者的多个程序尽可能使用同一个数字证书,这可以带来以下好处。

(1)有利于程序升级,当新版程序和旧版程序的数字证书相同时,Android系统才

会认为这两个程序是同一个程序的不同版本。如果新版程序和旧版程序的数字证

书不相同,则Android系统认为他们是不同的程序,并产生冲突,会要求新程序

更改包名。

(2)有利于程序的模块化设计和开发。Android系统允许拥有同一个数字签名的程

序运行在一个进程中,Android程序会将他们视为同一个程序。所以开发者可以

将自己的程序分模块开发,而用户只需要在需要的时候下载适当的模块。

(3)可以通过权限(permission)的方式在多个程序间共享数据和代码。Android提

供了基于数字证书的权限赋予机制,应用程序可以和其他的程序共享概功能或者

数据给那那些与自己拥有相同数字证书的程序。如果某个权限(permission)的

protectionLevel是signature,则这个权限就只能授予那些跟该权限所在的包拥

有同一个数字证书的程序。

在签名时,需要考虑数字证书的有效期:

(1)数字证书的有效期要包含程序的预计生命周期,一旦数字证书失效,持有改

数字证书的程序将不能正常升级。

(2)如果多个程序使用同一个数字证书,则该数字证书的有效期要包含所有程序

的预计生命周期。

(3)Android Market强制要求所有应用程序数字证书的有效期要持续到2033年10

月22日以后。

Android数字证书包含以下几个要点:

              (1)所有的应用程序都必须有数字证书,Android系统不会安装一

个没有数字证书的应用程序

              (2)Android程序包使用的数字证书可以是自签名的,不需要一个

权威的数字证书机构签名认证

              (3)如果要正式发布一个Android ,必须使用一个合适的私钥生

成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来

发布。

              (4)数字证书都是有有效期的,Android只是在应用程序安装的时

候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影

响程序的正常功能。

Android面试题

1. 请描述下Activity的生命周期。

oncreate()

onstart()

onresume()

onpause()

onstop()

onrestart()

ondestroy()

2. 如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存

当前状态?

重写onDestroy方法,在方法中保存

3. 如何将一个Activity设置成窗口的样式。(Edited by Sodino)

可以直接添加您对应需要展示为Dialogstyle的Activity的android:theme属性

值为android:theme="@android:style/Theme.Dialog"。

4. 如何退出Activity?如何安全退出已调用多个Activity的Application?

1、抛异常强制退出:

该方法通过抛异常,使程序ForceClose。

验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force

Close的窗口。

2、记录打开的Activity:

每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

3、发送特定广播:

在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可

4、递归退出

在打开新的Activity时使用startActivityForResult,然后自己加标志,在

onActivityResult中处理,递归关闭。

5. 请介绍下Android中常用的五种布局。

线性布局(LinearLayout)

 表格布局(TableLayout)

 单帧布局(FrameLayout)

最简单的布局格式,他可以防止任何空件,但是都只能罗列到左上角,不能进行

复杂的布局

 相对布局(RelativeLayout)

坐标布局(AbsoluteLayout)

6. 请介绍下Android的数据存储方式。(Edited by Sodino)

Android提供了5种方式存储数据:

--使用SharedPreferences存储数据;

--文件存储数据;

--SQLite数据库存储数据;

--使用ContentProvider存储数据;

--网络存储数据(参考java.net.*和android.net.*包)

一:使用SharedPreferences存储数据

首先说明SharedPreferences存储方式,它是Android提供的用来存储一些简单配

置信息的一种机制,例如:登录用户的用户名与密码。其采用了Map数据结构来

存储数据,以键值的方式存储,可以简单的读取与写入,具体实例如下:

void ReadSharedPreferences(){

String strName,strPassword;

SharedPreferences   user = getSharedPreferences(“user_info”,0);

strName = user.getString(“NAME”,””);

strPassword = usergetString(“PASSWORD”,””);

}

void WriteSharedPreferences(StringstrName,String strPassword){

SharedPreferences   user = getSharedPreferences(“user_info”,0);

uer.edit();

user.putString(“NAME”, strName);

user.putString(“PASSWORD” ,strPassword);

user.commit();

}

数据读取与写入的方法都非常简单,只是在写入的时候有些区别:先调用edit()

使其处于编辑状态,然后才能修改数据,最后使用commit()提交修改的数据。实

际上SharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File

Explorer中的/data/data/<package name>/shares_prefs下。以上面的数据存储

结果为例,打开后可以看到一个user_info.xml的文件,打开后可以看到:

<?xml version=”1.0″ encoding=”UTF-8″?>

<map>

<string name=”NAME”>moandroid</string>

<string name=”PASSWORD”>SharedPreferences</string>

</map>

使用SharedPreferences是有些限制的:只能在同一个包内使用,不能在不同的

包之间使用。

二:文件存储数据

文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java

中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方

法来读取设备上的文件。FilterInputStream, FilterOutputStream等可以到

Java io package说明中去详细学习,不再此详细说明,具体实例如下:

String fn = “moandroid.log”;

FileInputStream fis = openFileInput(fn);

FileOutputStream fos =openFileOutput(fn,Context.MODE_PRIVATE);

除此之外,Android还提供了其他函数来操作文件,详细说明请阅读Android SDK

7. 请介绍下ContentProvider是如何实现数据共享的。

在Android 应用程序之间数据共享—-ContentResolver中,已经说明了Android

是如何实现应用程序之间数据共享的,并详细解析了如何获取其他应用程序共享

的数据。ContentProviders存储和检索数据,通过它可以让所有的应用程序访问

到,这也是应用程序之间唯一共享数据的方法。那么如何将应用程序的数据暴露

出去?

通过以前文章的学习,知道ContentResolver是通过ContentProvider来获取其他

与应用程序共享的数据,那么ContentResolver与ContentProvider的接口应该差

不多的。

其中ContentProvider负责

•组织应用程序的数据;

•向其他应用程序提供数据;

ContentResolver则负责

•获取ContentProvider提供的数据;

•修改/添加/删除更新数据等;

ContentProvider 是如何向外界提供数据的?

Android提供了ContentProvider,一个程序可以通过实现一个ContentProvider

的抽象接口将自己的数据完全暴露出去,而且ContentProviders是以类似数据库

中表的方式将数据暴露,也就是说ContentProvider就像一个“数据库”。那么

外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不

过是采用URI来表示外界需要访问的“数据库”。至于如何从URI中识别出外界需

要的是哪个“数据库”,这就是Android底层需要做的事情了,不在此详细说。

简要分析下ContentProvider向外界提供数据操作的接口:

query(Uri, String[], String, String[],String)

insert(Uri, ContentValues)

update(Uri, ContentValues, String,String[])

delete(Uri, String, String[])

这些操作与数据库的操作基本上完全一样,在此不详细说,具体的解析可以参考

Android Sqlite解析篇中的详细说明。需要特殊说明的地方是URI:

在URI的D部分可能包含一个_ID ,这个应该出现在SQL语句中的,可以以种特殊

的方式出现,这就要求我们在提供数据的时候,需要来额外关注这个特殊的信息

。Android SDK推荐的方法是:在提供数据表字段中包含一个ID,在创建表时

INTEGER PRIMARY KEY AUTOINCREMENT标识此ID字段。

ContentProvider 是如何组织数据的?

组织数据主要包括:存储数据,读取数据,以数据库的方式暴露数据。数据的存

储需要根据设计的需求,选择合适的存储结构,首选数据库,当然也可以选择本

地其他文件,甚至可以是网络上的数据。数据的读取,以数据库的方式暴露数据

这就要求,无论数据是如何存储的,数据最后必须以数据的方式访问。

可能还有2个问题,是需要关注的。

1.ContentProvider是什么时候创建的,是谁创建的?访问某个应用程序共享的

数据,是否需要启动这个应用程序?这个问题在 Android SDK中没有明确说明,

但是从数据共享的角度出发,ContentProvider应该是Android在系统启动时就创

建了,否则就谈不上数据共享了。这就要求在AndroidManifest.XML中使用

<provider>元素明确定义。

2.可能会有多个程序同时通过ContentResolver访问一个ContentProvider,会不

会导致像数据库那样的“脏数据”?这个问题一方面需要数据库访问的同步,尤

其是数据写入的同步,在AndroidManifest.XML中定义ContentProvider的时候,

需要考虑是<provider>元素multiprocess属性的值;另外一方面Android在

ContentResolver中提供了 notifyChange()接口,在数据改变时会通知其他

ContentObserver,这个地方应该使用了观察者模式,在 ContentResolver中应

该有一些类似register,unregister的接口。

至此,已经对ContentProvider提供了比较全面的分析,至于如何创建

ContentProvider,可通过2种方法:创建一个属于你自己的ContentProvider或

者将你的数据添加到一个已经存在的ContentProvider中,当然前提是有相同数

据类型并且有写入Content provider的权限。在AndroidSDK的sample中提供的

Notepad具体实例中去看源代码!

8. 如何启用Service,如何停用Service。(Edited by Sodino)

9. 注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的

用意。

10. 请解释下在单线程模型中Message、Handler、Message Queue、Looper之间

的关系。

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

12. 请解释下Android程序运行时权限与文件系统权限的区别。(Edited by

Sodino)

13. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。

14. 有一个一维整型数组int[]data保存的是一张宽为width,高为height的图片

像素值信息。请写一个算法,将该图片所有的白色不透明(0xffffffff)像素点的

透明度调整为50%。

15. 你如何评价Android系统?优缺点。

1.activity的生命周期。 

2.横竖屏切换时候activity的生命周期 

总结:

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期

,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新

调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges="orientation|keyboardHidden"时

,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

3.android中的动画有哪几类,它们的特点和区别是什么 

4.handler机制的原理 

5.说说activity,intent,service是什么关系 

6.android中线程与线程,进程与进程之间如何通信 

7.widget相对位置的完成在antivity的哪个生命周期阶段实现 

8.说说mvc模式的原理,它在android中的运用 

9.说说在android中有哪几种数据存储方式 

10.android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别

本文来自CSDN博客,转载请标明出处:

http://blog.csdn.net/Zengyangtech/archive/2010/11/21/6025680.aspx

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值