[Android] 面试题总结-猎趣-Java部分

前言

昨天,很意外的接到了猎趣的电话,直奔主题就开始面试了,我都不知道我投过这家公司,后来才知道,是朋友推荐的。面试官人很好,问的问题分了 Java,Android 两类,从简单到深入,一点一点来,事后,我觉得这是很难得的经历,打算记录下来,以备后用。

Java 问题

  • 简单说一说,Java 基本类型
  • 关于 String 的了解,是否可以被继承,以及 StringBuffer,StringBuilder 三者的关系
  • 说一说,对于 Collection 和 Collections 的理解
  • Map 继承自什么?以及 HashMap,HashTable 的区别
  • 接口和抽象类的区别
  • 说一说,线程同步的几种方法

下面我一个一个整理资料,为自己做一个总结。

1,Java 基本类型

这个很简单:byte,short,int,long,float,double,char,boolean;
关于这个点,没什么说的,只是要注意,回答的顺序,先整型,后浮点型,之后再特殊的,这样的好处,一是容易记,二是体现自己逻辑清晰,千万不要想起一个说一个 = =

2,String,StringBuffer,StringBuilder

我个人的使用频率 String > StringBuffer > StringBuilder,= =,还好前两天刷牛客网的题,有遇到过,简单总结一下:

  • String
    不可以被继承,原因是因为,String 类是被 final 修饰的;
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
        ...
}      

String 是只读字符串,也就意味着 String 引用的字符串内容是不能被改变的,有人说:

    String a = "a";
    a = "b"; 

这不就改变了吗?其实不然,变量 a 在栈中,"a","b" 则在常量池中,以上两行代码,只是把 String a 的引用指向了 "b",而非,将"a"直接改为"b"。
另外,String a = "a" 与 String a = new String("a") 也是不一样的,主要区别就是,后者在栈中创建了对象,看下面代码一目了然:

    String str = new String("hello");
    String str_1 = "hello";
    System.out.println(str == "hello");    // false
    System.out.println(str_1 == "hello");  // true
    System.out.println(str == str_1);      // false
    System.out.println(str.equals(str_1)); // true
  • StringBuffer 与 StringBuilder
    StringBuffer 和 StringBulder 类表示的字符串对象可以直接进行修改,
    例如以下几个方法,String 类是没有的。
    StringBuffer sb = new StringBuffer("Hello");
    sb.append('a');                     // Helloa
    sb.insert(0, 'b');                  // bHelloa
    sb.deleteCharAt(sb.length() - 3);   // bHeloa
    System.out.println(sb.toString());

StringBuilder 是 JDK1.5 引入的,它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被 synchronized 修饰,因此它的效率也比 StringBuffer 略高。

3,Collection,Collections

关于 Java 的集合类,牵扯比较广,我不多做拓展,只简单说一下,这 Collection,Collections 两个东西:

  • Collection
    java.util.Collection 是一个集合接口,是为各种具体的集合提供了最大化的统一操作方式,它下面有很多实现,比如常见的 List,Set 等;
  • Collections
    java.util.Collections 是一个包装类(工具类),它包含有各种有关集合操作的静态多态方法。该类不能实例化,详情见源码:
public class Collections {
    // Suppresses default constructor, ensuring non-instantiability.
    private Collections() {
    }
    ...
}

Collections 的常见/用方法有:sort(),swap(),reverse() 等。

4,Map,HashMap,HashTable
  • 直接看源码的话,Map 是没有显式的继承类的,但在 Java 中所有的类或接口都有共同的父类,即java.lang.Object 类,所以可以说,Map接口继承了 java.lang.Object 类,但没有实现任何接口;
  • Map 是和 Collection 同级别的接口 ;
  • HashMap 与 HashTable
    • 相同点

      1. 均基于哈希表实现的,每一个元素都是一个 key-value 对;
      2. 均实现了 Serializable 接口,因此支持序列化;
        相同点,我只了解到这里,下面的都是补充 = =)
        均实现了 Cloneable 接口,能被克隆;
      3. 其内部通过单链表解决冲突问题,容量不足(超过了阈值)时,会自动增长;
      4. 二者的存储结构和解决冲突的方法都是相同的。
    • 不同点

      1. Hashtable 中 key 和 value 都不允许为 null,而 HashMap 中 key 和 value 都允许为 null;
      2. HashMap 是非线程安全的,只是用于单线程环境下,Hashtable 则是线程安全的,能用于多线程环境中;
        不同点,我只了解到这里,下面的都是补充 = =)
        HashMap 若想在多线程环境下使用,可以采用 concurrent 并发包下的 concurrentHashMap,或者使用 Collections.synchronizedMap() 方法来获取一个线程安全的集合;
      3. 继承关系的不同;
        public class HashMap<K,V> 
          extends AbstractMap<K,V>
          implements Map<K,V>, Cloneable, Serializable {}
      
        public class Hashtable<K,V> 
          extends Dictionary<K,V> 
          implements Map<K,V>, Cloneable, Serializable {} 
      
      1. HashTable 在不指定容量的情况下的默认容量为 11,而 HashMap 为 16,Hashtable 不要求底层数组的容量一定要为 2 的整数次幂,而 HashMap 则要求一定为2的整数次幂;
      2. 关于 HashMap 中 key 和 value 都允许为 null,有更详细的解释和描述
        (key 只能有一个为 null,而 value 则可以有多个为 null),
        但是如果在 Hashtable 中有类似 put(null,null) 的操作,编译同样可以通过,因为 key 和 value 都是 Object 类型,但运行时会抛出 NullPointerException 异常,这是 JDK 的规范规定的;
      3. Hashtable 扩容时,将容量变为原来的 2 倍加 1,而 HashMap 扩容时,将容量变为原来的 2 倍;
      4. Hashtable 和 HashMap 都重新计算了 key 的 hash 值,Hashtable 在求 hash 值对应的位置索引时,用取模运算,而 HashMap 在求位置索引时,则用与运算,且这里一般先用 hash & 0x7FFFFFFF 后,再对 length 取模,& 0x7FFFFFFF 的目的是为了将负的 hash 值转化为正值,因为 hash 值有可能为负数,而 & 0x7FFFFFFF 后,只有符号外改变,而后面的位都不变。
5,接口和抽象类
  • 相同点
    1. 抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。
  • 不同点
    1. 抽象类中可以定义构造器,可以有抽象方法和具体方法;而接口中不能定义构造器而且其中的方法全部都是抽象方法;
    2. 抽象类中的成员可以是 Private、默认、Protected 、Public 的,而接口中的成员全都是 public 的;
    3. 抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。
  • 稍微总结和多说两句
    1. 一个类如果继承了某个抽象类或者实现了某个接口,需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类;
    2. 有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。
6,线程同步

这个问题,我第一反应就是,Android 里的 Handler 啊,runOnUiThread() 什么的,结果面试官强调,是 Java 中 线程同步的方法 = =
这个我了解的不多,找到一些资料,总结如下:

  • 利用 Synchronized 关键字:同步关键字,或者同步代码块,这个比较简单,基本都用到过;
  • 利用 Wait() 与 Notify(),只见过,没用过,更没有阅读过相关源码; = =
    • wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
    • sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
    • notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
    • notifyAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
  • 利用特殊域变量 (volatile) 实现线程同步, 这个更不知道,只在单例模式中见到过;
  • 利用 Lock 接口及其实现类 ReentrantLock(重入锁),实现线程同步。
  • 利用 ThreadLocal,它是一个方便解决多线程并发问题的工具类。

以上就是我整理出的,一些常见的方法,肯定不全,而且我自己都没用过几个,这几天,好好研究一下,觉得自己好菜 = = !!

后记

没想到,光是 Java 的问题,就总结了这么长,关于集合的知识点,知道的太少,看来得好好巩固了 ,不然实在是找不到工作啊 = =
额,Android 部分的估计就更长了,就此分篇,详见下一篇吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,572评论 18 399
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,066评论 0 62
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,573评论 1 114
  • 相关概念 面向对象的三个特征 封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象. 多态的好处 允许不同类对...
    东经315度阅读 1,917评论 0 8
  • 夏天解暑最好的水果当然是大大的西瓜了!天气炎热大部分孩子最喜欢的就是用勺子挖西瓜吃,用勺子挖着吃省事,简单方便快捷...
    常识菌阅读 527评论 0 2