美文网首页
无标题文章

无标题文章

作者: 谢凯 | 来源:发表于2016-08-03 16:23 被阅读0次
    1. 什么是泛型?使用泛型有什么优点?泛型List和普通List有什么区别?
      参考答案:
      泛型是对Java语言的数据类型系统的一种扩展,以支持创建可以按类型进行参数化的类,可以把类型参数看做是使用参数化类型时指定的类型的一个占位符。
      优点:提高Java程序的类型安全;消除强制类型转换;提高代码的重用率。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
      泛型List可以实例化为只能存储某种特定类型的数据,普通List可以实例化为存储各种类型的数据。通过使用泛型List对象,可以规范集合对象中存储的数据类型,在获取集合元素时不用进行任何强制类型转换。

    2. 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算法都大概一样,所以性能不会有很大的差异。

    3. Handler机制原理
      andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。
      1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
      2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。

      1. Message Queue(消息队列):用来存放线程放入的消息。
        4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue
    4. 简述Activity生命周期及对应的回调方法
      onCreate->onStart->onResume->onPause->on

    5. 简述几种优化数据库的方法,并举例

    6. Service与IntentService区别
      答题点:同是服务组件,IntentService组件是能够长期在后台运行的异步处理组件,不容易阐述ANR

    7. 提高界面启动速度有哪些需要注意的?

      1. 在非主线程做耗时操作(如文件加载、网络请求、数据库读取等)
      2. 布局嵌套层次不要太深
      3. 避免使用weight属性
      4. SharePreference的初始化不要放在主线程中操作
    8. MVC架构的缺点

    MVC的优点
      大部分用过程语言比如ASP、PHP开发出来的Web应用,初始的开发模板就是混合层的数据编程。例如,直接向数据库发送请求并用HTML显示,开发速度往往比较快,但由于数据页面的分离不是很直接,因而很难体现出业务模型的样子或者模型的重用性。产品设计弹性力度很小,很难满足用户的变化性需求。MVC要求对应用分层,虽然要花费额外的工作,但产品的结构清晰,产品的应用通过模型可以得到更好地体现。
      首先,最重要的是应该有多个视图对应一个模型的能力。在目前用户需求的快速变化下,可能有多种方式访问应用的要求。例如,订单模型可能有本系统的订单,也有网上订单,或者其他系统的订单,但对于订单的处理都是一样,也就是说订单的处理是一致的。按MVC设计模式,一个订单模型以及多个视图即可解决问题。这样减少了代码的复制,即减少了代码的维护量,一旦模型发生改变,也易于维护。 其次,由于模型返回的数据不带任何显示格式,因而这些模型也可直接应用于接口的使用。
      再次,由于一个应用被分离为三层,因此有时改变其中的一层就能满足应用的改变。一个应用的业务流程或者业务规则的改变只需改动MVC的模型层。
      控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起完成不同的请求,因此,控制层可以说是包含了用户请求权限的概念。
       最后,它还有利于软件工程化管理。由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化产生管理程序代码。
    MVC的不足
      MVC的不足体现在以下几个方面:
      (1)增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
      (2)视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
      (3)视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
      (4) 目前,一般高级的界面工具或构造器不支持MVC架构。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成使用MVC的困难。

    1. 使用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!

    相关文章

      网友评论

          本文标题:无标题文章

          本文链接:https://www.haomeiwen.com/subject/obgqsttx.html