什么是泛型?使用泛型有什么优点?泛型List和普通List有什么区别?
参考答案:
泛型是对Java语言的数据类型系统的一种扩展,以支持创建可以按类型进行参数化的类,可以把类型参数看做是使用参数化类型时指定的类型的一个占位符。
优点:提高Java程序的类型安全;消除强制类型转换;提高代码的重用率。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
泛型List可以实例化为只能存储某种特定类型的数据,普通List可以实例化为存储各种类型的数据。通过使用泛型List对象,可以规范集合对象中存储的数据类型,在获取集合元素时不用进行任何强制类型转换。HashMap和Hashtable的区别
参考答案:
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。Hashtable不允许将null作为一个entry的key或者value。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。-
Handler机制原理
andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。- Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue
- Message Queue(消息队列):用来存放线程放入的消息。
简述Activity生命周期及对应的回调方法
onCreate->onStart->onResume->onPause->on简述几种优化数据库的方法,并举例
Service与IntentService区别
答题点:同是服务组件,IntentService组件是能够长期在后台运行的异步处理组件,不容易阐述ANR-
提高界面启动速度有哪些需要注意的?
- 在非主线程做耗时操作(如文件加载、网络请求、数据库读取等)
- 布局嵌套层次不要太深
- 避免使用weight属性
- SharePreference的初始化不要放在主线程中操作
MVC架构的缺点
MVC的优点
大部分用过程语言比如ASP、PHP开发出来的Web应用,初始的开发模板就是混合层的数据编程。例如,直接向数据库发送请求并用HTML显示,开发速度往往比较快,但由于数据页面的分离不是很直接,因而很难体现出业务模型的样子或者模型的重用性。产品设计弹性力度很小,很难满足用户的变化性需求。MVC要求对应用分层,虽然要花费额外的工作,但产品的结构清晰,产品的应用通过模型可以得到更好地体现。
首先,最重要的是应该有多个视图对应一个模型的能力。在目前用户需求的快速变化下,可能有多种方式访问应用的要求。例如,订单模型可能有本系统的订单,也有网上订单,或者其他系统的订单,但对于订单的处理都是一样,也就是说订单的处理是一致的。按MVC设计模式,一个订单模型以及多个视图即可解决问题。这样减少了代码的复制,即减少了代码的维护量,一旦模型发生改变,也易于维护。 其次,由于模型返回的数据不带任何显示格式,因而这些模型也可直接应用于接口的使用。
再次,由于一个应用被分离为三层,因此有时改变其中的一层就能满足应用的改变。一个应用的业务流程或者业务规则的改变只需改动MVC的模型层。
控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起完成不同的请求,因此,控制层可以说是包含了用户请求权限的概念。
最后,它还有利于软件工程化管理。由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化产生管理程序代码。
MVC的不足
MVC的不足体现在以下几个方面:
(1)增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
(2)视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
(3)视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
(4) 目前,一般高级的界面工具或构造器不支持MVC架构。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成使用MVC的困难。
- 使用java socket编程,在本地实现客户端向服务端发送消息的功能,只需要实现能建立连接发送消息的功能即可,可不考虑服务端与客户端的连续通信。服务端通信端口请根据本地环境自行选择。
示例程序如下:
a. Server.java
import java.net.;
import java.io.;
import java.net.;
import java.io.;
public class Server {
private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Server() {
try {
ss = new ServerSocket(20000);
while (true) {
socket = ss.accept();
String RemoteIP = socket.getInetAddress().getHostAddress();
String RemotePort = ":" + socket.getLocalPort();
System.out.println("A client come in!IP:" + RemoteIP + RemotePort);
in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String line = in.readLine();
System.out.println("Cleint send is :" + line);
out = new PrintWriter(socket.getOutputStream(), true);
out.println("Your Message Received!");
out.close();
in.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
out.println("wrong");
}
finally
{
//close IO resource here
}
}
public static void main(String args[])
{
new Server();
}
}
b. Client.java
public class Client {
Socket socket;
BufferedReader in;
PrintWriter out;
public Client() {
try {
System.out.println("Try to Connect to 127.0.0.1:20000");
socket = new Socket("127.0.0.1", 20000);
System.out.println("The Server Connected!");
System.out.println("Please enter some Character:");
BufferedReader line = new BufferedReader(
new InputStreamReader(System.in));
out = new PrintWriter(socket.getOutputStream(), true);
out.println(line.readLine());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
out.close();
in.close();
socket.close();
} catch (IOException e) {
out.println("Wrong");
}
finally{
//close IO resource here.
}
}
public static void main(String args[])
{
new Client();
}
}
程序运行结果
Server端:
A client come in!IP:127.0.0.1:20000
Cleint send is :hello
Client端:
Try to Connect to 127.0.0.1:20000
The Server Connected!
Please enter some Character:
hello
Your Message Received!