zoukankan      html  css  js  c++  java
  • 2017.8计划

    最近博客:

    最近放了很多只有链接的文章,基本上我都认真看了,但觉得看完还是要实践一下。

    陆续会小总结下各个文章里的内容,在个人学习项目里给出个demo

    个人学习项目:LLab

    计划:

    • 学习RxJava和缓存方面的内容
    • 深一层地理解retrofit2,okhttp3,dagger2,Glide的源码
    • 浏览目前主流开源view的实现

     

    待看文章:

    可能是讲解Android事件分发最好的文章

    JVM之字节码——Class文件格式

    Android MVP 详解(上)

    android阿里面试题锦集

    2017年本博客知识体系引导(更新至2017.7.31)

    Android面试一天一题(4 Day)

    从Android代码中来记忆23种设计模式

    近5年133个Java面试问题列表

    各种排序算法总结

    常见数据结构与算法整理总结(上)

    40)解释 Java 堆空间及 GC?(答案)
    当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配。

    43)Java 中堆和栈有什么区别?(答案)
    JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。

    Java 基本概念面试题

    44)“a==b”和”a.equals(b)”有什么区别?(答案)
    如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于两个不同对象,但是包含的字母相同的比较。

    45)a.hashCode() 有什么用?与 a.equals(b) 有什么关系?(答案)
    hashCode() 方法是相应对象整型的 hash 值。它常用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,两个使用 equal() 方法来判断相等的对象,必须具有相同的 hash code。

    46)final、finalize 和 finally 的不同之处?(答案)
    final 是一个修饰符,可以修饰变量、方法和类。如果 final 修饰变量,意味着该变量的值在初始化后不能被改变。finalize 方法是在对象被回收之前调用的方法,给对象自己最后一个复活的机会,但是什么时候调用 finalize 没有保证。finally 是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常。

    47)Java 中的编译期常量是什么?使用它又什么风险?
    公共静态不可变(public static final )变量也就是我们所说的编译期常量,这里的 public 可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的jar。为了避免这种情况,当你在更新依赖 JAR 文件时,确保重新编译你的程序。


    48) List、Set、Map 和 Queue 之间的区别(答案)
    List 是一个有序集合,允许元素重复。它的某些实现可以提供基于下标值的常量访问时间,但是这不是 List 接口保证的。Set 是一个无序集合。

    49)poll() 方法和 remove() 方法的区别?
    poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

    50)Java 中 LinkedHashMap 和 PriorityQueue 的区别是什么?(答案)
    PriorityQueue 保证最高或者最低优先级的的元素总是在队列头部,但是 LinkedHashMap 维持的顺序是元素插入的顺序。当遍历一个 PriorityQueue 时,没有任何顺序保证,但是 LinkedHashMap 课保证遍历顺序是元素插入的顺序。

    51)ArrayList 与 LinkedList 的不区别?(答案)
    最明显的区别是 ArrrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构书链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。更多细节的讨论参见答案。

    52)用哪两种方式来实现集合的排序?(答案)
    你可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有顺序的的集合,如 list,然后通过 Collections.sort() 来排序。

    53)Java 中怎么打印数组?(answer答案)
    你可以使用 Arrays.toString() 和 Arrays.deepToString() 方法来打印数组。由于数组没有实现 toString() 方法,所以如果将数组传递给 System.out.println() 方法,将无法打印出数组的内容,但是 Arrays.toString() 可以打印每个元素。

    54)Java 中的 LinkedList 是单向链表还是双向链表?(答案)
    是双向链表,你可以检查 JDK 的源码。在 Eclipse,你可以使用快捷键 Ctrl + T,直接在编辑器中打开该类。

    55)Java 中的 TreeMap 是采用什么树实现的?(答案)
    Java 中的 TreeMap 是使用红黑树实现的。

    56) Hashtable 与 HashMap 有什么不同之处?(答案)
    这两个类有许多不同的地方,下面列出了一部分:
    a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增加的。
    b)Hashtable 是同步的,比较慢,但 HashMap 没有同步策略,所以会更快。
    c)Hashtable 不允许有个空的 key,但是 HashMap 允许出现一个 null key。
    更多的不同之处参见答案。

    57)Java 中的 HashSet,内部是如何工作的?(answer答案)
    HashSet 的内部采用 HashMap来实现。由于 Map 需要 key 和 value,所以所有 key 的都有一个默认 value。类似于 HashMap,HashSet 不允许重复的 key,只允许有一个null key,意思就是 HashSet 中只允许存储一个 null 对象。

    58)写一段代码在遍历 ArrayList 时移除一个元素?(答案)
    该问题的关键在于面试者使用的是 ArrayList 的 remove() 还是 Iterator 的 remove()方法。这有一段示例代码,是使用正确的方式来实现在遍历的过程中移除元素,而不会出现 ConcurrentModificationException 异常的示例代码。

    59)我们能自己写一个容器类,然后使用 for-each 循环码?
    可以,你可以写一个自己的容器类。如果你想使用 Java 中增强的循环来遍历,你只需要实现 Iterable 接口。如果你实现 Collection 接口,默认就具有该属性。

    61)有没有可能两个不相等的对象有有相同的 hashcode?
    有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突。相等 hashcode 值的规定只是说如果两个对象相等,必须有相同的hashcode 值,但是没有关于不相等对象的任何规定。

    62)两个相同的对象会有不同的的 hash code 吗?
    不能,根据 hash code 的规定,这是不可能的。

    63)我们可以在 hashcode() 中使用随机数字吗?(答案)
    不行,因为对象的 hashcode 值必须是相同的。参见答案获取更多关于 Java 中重写 hashCode() 方法的知识。

    103)接口是什么?为什么要使用接口而不是直接使用具体类?
    接口用于定义 API。它定义了类必须得遵循的规则。同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使用可随机访问的 ArrayList,也可以使用方便插入和删除的 LinkedList。接口中不允许写代码,以此来保证抽象,但是 Java 8 中你可以在接口声明静态的默认方法,这种方法是具体的。

    104)Java 中,抽象类与接口之间有什么不同?(答案)
    Java 中,抽象类和接口有很多不同之处,但是最重要的一个是 Java 中限制一个类只能继承一个类,但是可以实现多个接口。抽象类可以很好的定义一个家族类的默认行为,而接口能更好的定义类型,有助于后面实现多态机制。关于这个问题的讨论请查看答案。

    112)依赖注入和工程模式之间有什么不同?(答案)
    虽然两种模式都是将对象的创建从应用的逻辑中分离,但是依赖注入比工程模式更清晰。通过依赖注入,你的类就是 POJO,它只知道依赖而不关心它们怎么获取。使用工厂模式,你的类需要通过工厂来获取依赖。因此,使用 DI 会比使用工厂模式更容易测试。关于这个话题的更详细讨论请参见答案。

    113)适配器模式和装饰器模式有什么区别?(答案)
    虽然适配器模式和装饰器模式的结构类似,但是每种模式的出现意图不同。适配器模式被用于桥接两个接口,而装饰模式的目的是在不修改类的情况下给类增加新的功能。

    114)适配器模式和代理模式之前有什么不同?(答案)
    这个问题与前面的类似,适配器模式和代理模式的区别在于他们的意图不同。由于适配器模式和代理模式都是封装真正执行动作的类,因此结构是一致的,但是适配器模式用于接口之间的转换,而代理模式则是增加一个额外的中间层,以便支持分配、控制或智能访问。

    115)什么是模板方法模式?(答案)
    模板方法提供算法的框架,你可以自己去配置或定义步骤。例如,你可以将排序算法看做是一个模板。它定义了排序的步骤,但是具体的比较,可以使用 Comparable 或者其语言中类似东西,具体策略由你去配置。列出算法概要的方法就是众所周知的模板方法。

    116)什么时候使用访问者模式?(答案)
    访问者模式用于解决在类的继承层次上增加操作,但是不直接与之关联。这种模式采用双派发的形式来增加中间层。

    117)什么时候使用组合模式?(答案)
    组合模式使用树结构来展示部分与整体继承关系。它允许客户端采用统一的形式来对待单个对象和对象容器。当你想要展示对象这种部分与整体的继承关系时采用组合模式。

    118)继承和组合之间有什么不同?(答案)
    虽然两种都可以实现代码复用,但是组合比继承共灵活,因为组合允许你在运行时选择不同的实现。用组合实现的代码也比继承测试起来更加简单。

    119)描述 Java 中的重载和重写?(答案)
    重载和重写都允许你用相同的名称来实现不同的功能,但是重载是编译时活动,而重写是运行时活动。你可以在同一个类中重载方法,但是只能在子类中重写方法。重写必须要有继承。

    • 气氛就这么轻松下来了,他问:那我们开始吧,先来个简单的,说一下String、StringBuffer和StringBuilder的用法和区别吧。我回答:String的内部实现为final char[],所以每次对现有的字符串修改的话都会新实例化一个String,所以频繁的字符串修改和拼接要用StringBuffer,在单线程环境下用StringBuilder,性能更好,因为可以避免加锁带来的性能损耗。

    • 他问:JDK里面的容器用过吧,把你所熟知的集合列举出来并说一下他们的用处。(不得不说这个问题很考基础,还好我都研究一遍了。。。= =)我回答:ArrayList,LinkedList,Vector,Set,TreeSet,HashMap,TreeMap,LinkedHashMap,HashTable,然后我把他们内部的实现和常用操作的时间复杂度给说了一遍,甚至还把OpenJDK、OracleJDK和Apache Harmony Project JDK内部的实现的差异给说了一下。这个问题的回答有很多细节答错了,比如我把Collection接口和Set接口给弄混了,但是答得很多还到处拓展地讲了一下,面试官好像还比较满意。

    • 他问:HashMap的内部结构?这也是老套路了,我就画了个图给他看。他就没说什么,继续下一题。

    • 他问:解释一下红黑树吧。我当时有些记不得了,就说:1、平衡二叉树。2、插入、删除、查询复杂度O(nlgn)。(这里答错了,当时头有点晕)3、根节点和叶结点是黑节点,从根节点到叶结点经过的黑节点数目相同。(这个也不知道有没有答错,面试官当时也是面无表情。)

    • 他问我对深拷贝和浅拷贝的理解。我就很抖机灵地拿前面那个链表那一题举例,说只拷贝链表地头节点就是浅拷贝,拷贝整个链表就是深拷贝。他笑了笑,没好气地叫我说好一点。我就说:一个对象实际在堆空间中存在,如果只拷贝一个对象的引用,使得多个引用指向同一个堆空间内的对象,这就是浅拷贝。如果拷贝了实际的对象,使得堆空间内有两个对象,就是深拷贝。

    • 他继续追问:怎样实现一个类的深拷贝呢? 这个问题我有点没底气,就说了两个方法。1、定义一个拷贝构造函数,对传入的对象的每个成员进行拷贝。2、实现Cloneable接口。也不知道答得对不对,面试官也没有太多反应。

    • 他问:项目如何实现用户个人信息的安全性?我回答说用https,他又追问我对Https的理解。我就说会多几次握手,有一定性能消耗,加密原理上应该是利用了大整数的因式难分解,在传输层和应用层加了一个加密层。
    • 他问:Android里面的binder了解吗,说一下对它的理解? 我说:binder用于跨进程通信,AIDL的底层实现就是基于binder的。然后说了Binder通信机制主要有Binder Client、Binder Server、ServerManager这几个模块起作用,ServerManager起到一个类似路由的作用。当时也只是草草讲了讲,面试官好像难得点了点头。
    • 他问了一个大数据处理的题,他问了从10亿个数据中如何取出最大的1000个。面试官人挺好的,特意提醒内存装不下。我就回答:10亿条数据分成N个内存刚好能装下的部分,然后用堆排序。他问能不能进一步优化?我一下子没想出来,就换到了下一题。

    网络 
    1.TCP协议栈是什么 
    2.TCP滑动窗口协议,画图解释 
    3.TCP的ack是怎么样的,怎么确定有没有收到 
    4.重传等待时间是多少 
    5.socket读写 
    6.向socket流里写,怎么判断是否可写

    hashmap的数据结构

    linkedlist、arraylist区别

    相对布局、线性布局区别

    手写一种线程安全的单例模式

    http和https区别(https用了什么证书,怎样在网络传输中实现,我当时回答了osi七层,TCP udp ,三次握手,四次断开)

    tcp和http区别

    静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它?

    静态内部类:使用static修饰的内部类

    内部类:就是在某个类的内部又定义了一个类,内部类所嵌入的类称为外部类

    匿名内部类:使用new生成的内部类

    因为内部类的产生依赖于外部类,持有的引用是类名.this

    ArrayList和Vector的主要区别是什么?

    ArrayList在Java1.2引入,用于替换Vector

    Vector:

    线程同步

    当Vector中的元素超过它的初始大小时,Vector会将它的容量翻倍

    ArrayList:

    线程不同步,但性能很好

    当ArrayList中的元素超过它的初始大小时,ArrayList只增加50%的大小

    JNI开发流程
    自定义View相关方法
    java多态你了解多少??
    你说说重写和重载区别,然后拿了纸笔,手写一个能体现多态的例子
    说说java在运行main函数之前做了哪些工作?? 这个我居然从启动虚拟机——>加载类——>初始化类一直说到执行Main

    你对大尾小尾了解多少? 我反问:您说的是大小端么? 他说对,然后我正准备给他解释的时候,他又拿了一张纸:用java写一个判断大小尾的程序==

    java静态方法能不能被重写? 答:不能。 问:为什么?

    为什么java静态方法不能调用普通方法?普通方法能调用静态方法?(其实还是实例引用问题)

    Hashmap原理
    用hashmap实现hashset。。我之前看过的,忘记了。然后按照我的想法回答了。(最后面试官告诉了我该怎样实现==)
     
    算法:几百万个QQ号 ,找出前100个消费最高的QQ号。直接小顶堆什么的
     
    java可重入锁
    类的加载过程?五步
     
    • 10万个整数中找出排序后的前10个数(Top N 问题),及其对应算法复杂度

    • 10万个整数中,每个整数取值[0,99],找出排序后的中间位置的数(中位数)

    • 堆排序的算法复杂度

    • TCP拥塞机制
    • 如何做到多个线程访问同一个数组,既要线程安全,同时提高读写效率(我是通过分段锁的思想,说了一下自己的想法),后面还让我手写代码实现。
    • 如何逆转字符串?如何实现“ I am Student”转为“Student am I”?两道题都很简单,剑指offer里面都有
      • 操作系统:
        进程冲突,生产者消费者问题,设逻辑分页和物理分页好处是什么,什么是脏内存。

    简单明了,彻底地理解Binder 

    • java:
      public等四个权限关键字的区别,synchronized的用法区别,可否嵌套。
      hashmap底层实现,扩容策略,初始化。
      arraylist和linkedlist的实现和区别。
      classloader的作用,双亲委托。
      gc算法(优缺点),为什么叫新生代老年代(晋升机制),强软弱虚四种引用的区别。
    • 自定义view有几个构造方法,第三个参数作用。
      listview的convert view作用,用viewholder为什么可以优化他。
    • 元空间有哪些东西
    • wait和sleep的区别,应用场景。
      gc发生在什么时候。
    • Java实现线程安全有哪些方式
    • https相关,如何验证证书的合法性,https中哪里用了对称加密,哪里用了非对称加密,对加密算法(如RSA)等是否有了解
    • GC算法
  • 相关阅读:
    Mysql5.7主主互备安装配置
    一个简单有效的kubernetes部署案例
    kubernetes应用部署原理
    在线电路编程 (ICP)
    N76E003系统时钟
    说说UART(转)
    串行通信中 同步通信和异步通信的区别及使用情况(转)
    串行通讯与并行通讯区别
    定时器2及输入捕获
    N76E003之定时器3
  • 原文地址:https://www.cnblogs.com/qlky/p/7284732.html
Copyright © 2011-2022 走看看