我的BAT梦~1

作者: Android_YangKe | 来源:发表于2016-12-22 14:22 被阅读369次

    J2SE基础~1

    开心一刻:一辆面包车载了14个人。后面一乘客对司机说:你这是超载,被逮着要扣不少分呢!司机回头淡定一笑:扣分,那得有驾照!顿时,无数倒吸凉气的声音弥漫在车厢里...乘客问:没有驾照你也敢开啊?司机说:没事,酒壮人胆,中午喝了一斤二锅头,老子怕啥!大伙紧张的直冒冷汗。然后又有一乘客说:为啥不考驾照呢?司机:两千多度的近视眼,右腿还是假肢,怎么考!乘客问道:你不怕无证驾驶会判刑吗?司机:老子有精神病怕什么?全车人鸦雀无声!一位乘客胆颤心惊地说:我要下车!司机:下什么车!刹车早坏了!抓稳,下坡了!

    下面正式进入干货区,喜欢的话、双击、评论、转发,动一动你的小手让更多的人知道!

    1. 九种基本数据类型的大小,以及他们的封装类。

    2. Switch能否用string做参数?

    3. equals与==的区别。

    4. Object有哪些公用方法?

    5. Java的四种引用,强弱软虚,用到的场景。

    6. Hashcode的作用。

    7. ArrayList、LinkedList、Vector的区别。

    8. String、StringBuffer与StringBuilder的区别。

    9. Map、Set、List、Queue、Stack的特点与用法。

    10. HashMap和HashTable的区别。

    11. HashMap和ConcurrentHashMap的区别,HashMap的底层源码。

    12. TreeMap、HashMap、LindedHashMap的区别。

    13. Collection包结构,与Collections的区别。

    14. try catch finally,try里有return,finally还执行么?

    15. Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。

    16. Java面向对象的三个特征与含义。

    17. Override和Overload的含义及区别。

    18. Interface与abstract类的区别。

    19. Static class 与non static class的区别。

    20. java多态的实现原理。

    21. 实现多线程的两种方法:Thread与Runable。

    22. 线程同步的方法:sychronized、lock、reentrantLock等。

    23. 锁的等级:方法锁、对象锁、类锁。

    24. 写出生产者消费者模式。

    25. ThreadLocal的设计理念与作用。

    26. ThreadPool用法与优势。

    27. Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。

    28. wait()和sleep()的区别。

    29. foreach与正常for循环效率对比。

    30. Java IO与NIO。

    31. 反射的作用与原理。

    32. 泛型常用特点,List能否转为List。

    33. 解析XML的几种方式的原理与特点:DOM、SAX、PULL。

    34. Java与C++对比。

    35. Java1.7与1.8新特性。

    36. 设计模式:单例、工厂、适配器、责任链、观察者等等。

    37. JNI的使用。

    基础解释及说明:

    1.  九种基本数据类型的大小,以及他们的封装类。

    yangke.jpg

    注:基本数据类型占用的空间是不变的,这种不变性也是java具有可移植性的原因之一。它是放在栈中直接存储值,声明时系统会自动给它分配存储空间,所有的数值类型都有正负号,而引用类型声明时只是分配了引用空间,必须通过实例化开辟数据空间之后才可以赋值。例:数组对象是一个引用对象,我们将一个数组赋值给另一个数组只是复制了一个引用,所以通过某一个数组所做的修改在另一个数组中也看的见。

    引用变量测试:

    String array1[] = {"1","2","3"};

    String array2[] = array1;

    // array2[1] = "3"; 测试放开我就行

    System.out.println(array1[1]);


    2. Switch能否用string做参数?

    java7之前,switch只能支持byte、short、char、int或者其对应的封装类以及 Enum类型。在Java7中,String支持被加上了。如在jdk7之前的版本使用, 会提示如下错误:

    Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted 意为jdk版本太低,不支持。

    java8测试:

    String string = "02";

    switch (string) {

    case "01":

    System.out.println("01");

    break;

    case "02":

    System.out.println("02");

    break;

    }


    3. equals与==的区别。

    /**

    * ==:

    *    1. 基本类型:比较变量对应的值是否相等

    *     2. 对象/引用类型:比较变量内存地址是否相等!?

    * 例:String s = new String("string");

    * s变量存储在栈中,其对应的值就存储在堆中

    *

    * equals:

    *     1. 基本类型:无此方法

    *    2. 对象/引用类型:比较两个对象的内存地址否相等,请继续往下看!

    *

    * 作者理解~如有问题,欢迎拍砖~~

    * 默认的equals方法比较栈中的内存地址是否相等,也可以狭义的认为比较内容是否相等(String除外)ps: 内存地址存储在栈中、对象本身存储在堆中 。内存地址相同对象内容一定相同,但内容相同内存地址并不一定相同!?

    下面是Object类中“equals”方法中的源码,英语好的建议阅读下文档。

    */

    public boolean equals(Object obj) {

    return (this == obj);

    }

    此代码中的“==”可以参考上面的“==”理解说明,如有问题,欢迎私我...

    “==”特殊情况看代码

    String s = new String("");

    String s1 = new String("");

    System.out.println(s==s1);

    String s3 = "";

    String s4 = "";

    System.out.println(s3==s4);

    运行结果你会发现: 

    true=s3==s4;

    false=s==s1;

    此时你要知道String默认是有一个常量池的,它是一个比较特殊的对象管理区域;所以从常量池中直接取出来的字符串引用内存地址是相同的,所以true=s3==s4;而s和s1都是使用new关键字新建的对象,他们占用着不同的内存,是两个引用内存地址不一样的对象所以false=s==s1;


    4. Object有哪些公用方法?

    1. toString方法

    该方法用得比较多,一般子类都有覆盖,懂java的应该不用多说

    2. equals方法

    该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法,上面已经提及到两者的区别这里不再阐述

    3. hashCode方法

    该方法用于哈希查找,可以减少在查找中使用equals的次数,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。

    例如:HashSet、HashMap以及HashTable

    4. wait方法

    wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。

    调用该方法后当前线程进入睡眠状态,直到以下事件发生。

    (1)其他线程调用了该对象的notify方法。

    (2)其他线程调用了该对象的notifyAll方法。

    (3)其他线程调用了interrupt中断该线程。

    (4)时间间隔到了。

    此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

    5. notify方法

    该方法唤醒在该对象上等待的某个线程。

    6. notifyAll方法

    该方法唤醒在该对象上等待的所有线程

    5. Java的四种引用,强弱软虚,用到的场景。

    ⑴强引用(StrongReference)

    强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。  

    ps:强引用:String s = new String(); s代表的对象其实就是强引用;

    ⑵软引用(SoftReference)

    如果一个对象具有软引用且内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。

    软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

    ⑶弱引用(WeakReference)

    弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

    弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

    ⑷虚引用(PhantomReference)

    “虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

    具体的用法和场景可以参考这篇文章:http://blog.csdn.net/aitangyong/article/details/39453365

    6. Hashcode的作用。

    hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。

    hashCode 的常规协定是:

    1.在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

    2.如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。

    3.以下情况不是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。

    4.实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

    5.当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

    7. ArrayList、LinkedList、Vector的区别。

    ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快

    8. String、StringBuffer与StringBuilder的区别。

    特性:都是final类,没有子类即不能被继承。

    String

    字符串常量,为不可变对象,一旦被创建就不能修改它的值。对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去(比较占内存)。

    StringBuffer/StringBuilder

    对象构建:只能通过构造函数进行构建。

    例:StringBuilder stringBuilder = new StringBuilder();

            StringBuffer stringBuffer = new StringBuffer();

    都是一个可变对象,当对它们进行修改的时候不会像String那样重新建立对象,性能区别在于String是不可变的,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字符串最好不要用String,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM的GC就会开始工作,那速度是一定会相当慢的。而如果是使用StringBuffer/StringBuilder每次结果都会对其对象本身进行操作,而不是生成新的对象。所以在字符串对象经常改变的情况下推荐使用StringBuffer/StringBuilder。

    StringBuffer和StringBuilder的区别主要在于StringBuilder线程不安全StringBuffer线程安全,排除线程问题项目中应用建议使用StringBuilder,因为其性能会更高(因为没有使用同步锁)。

    9. Map、Set、List、Queue、Stack的特点与用法。

    /**

    * Map

    *

    * 1> Map是键值对,键Key是唯一不能重复的,一个键对应一个值,值可以重复。

    * 实现类:TreeMap有序,键不可以为null值允许,内部实现使用红黑树实现的;HashMap无序,键、值 都可以为null,内部实现使用

    */

    /**

    * Set

    *

    * 1> 不包含重复元素的集合,Set中最多包含一个null元素,支持Iterator/for-earch遍历

    * 实现类:TreeSet有序,数据不允许重复,不允许null值; HashSet无序,数据不允许重复,允许null值

    */

    /**

    * List

    *

    *1> 有序的可重复集合。 可以在任意位置增加删除元素。用Iterator实现单向遍历,

    * 也可用ListIterator实现双向遍历;

    * 实现类:ArrayList基于数组实现,内部值无序、允许null值,访问数据性能比较高;LinkedList

    * 的储结构是链式的,非连续存储,插入删除的效率比较高;

    */

    /**

    * Queue

    *

    * 1> Queue遵从先进先出原则。使用时尽量避免add()和remove()方法,而是使用offer()来

    * 添加元素,使用poll()来移除元素,它的优点是可以通过返回值来判断是否成功。

    * LinkedList实现了Queue接口。Queue通常不允许插入null元素。

    */

    /**

    * Stack

    *

    * 1> Stack遵从后进先出原则。Stack继承自Vector。它通过五个操作对类Vector进行扩

    * 展,允许将向量视为堆栈,它提供了通常的push和pop操作,以及取堆栈顶点的peek()

    * 方法、测试堆栈是否为空的empty方法等

    */

    实现类总结:如果涉及堆栈,队列等操作,建议使用List(例:ArrayList、LinkedList)。对于快速插入和删除元素的,建议使用LinkedList,如果需要快速随机访问元素的,建议使用

    ArrayList。

    10. HashMap和HashTable的区别。

    1> Hashtable默认方法是同步的,HashMap默认方法是非同步的。在多线程并发的环境下

    ,可以直接使用Hashtable,而HashMap则需要自己增加同步处理。

    2> Hashtable键值不允许为null,否则抛出空指针异常,HashMap键值允许为null。

    3> HashTable中的hash数组初始大小是11,增加的方式是 old*2+1。HashMap中hash

    数组的默认大小是16,而且一定是2的指数。


    由于篇幅问题此文章暂时更新到这里,后期我会持续更新!喜欢的话、双击、评论、转发,加关注!动一动你的小手让更多的人知道!喜欢就关注 帅比-Yang

    相关文章

      网友评论

      • world_6:* 理解:对象/引用类型“equals”比较的是堆中的内容是否相等, 感觉不太对,
        在String这个类中比较的是内容,对象中的equals方法一般是我们自己动手重写的,想比较啥就比较啥;比如hashmap中我们常常就要重写equals和hashcode方法,你想咋写就咋写,对不对
        Android_YangKe:@H_JR 问题现在进行了修正,请参考!谢谢
      • Android_YangKe:恩 比较时使用的的确是是equals,动手能力很强!喜欢的话可以关注我,时不时的与您分享最优质的资源!
      • Artfox丶艺狸:好想知道switch String 时,这时候case比较是使用的equals还是 == ,测试好像是equals
      • Android_YangKe:发现这样的排版使用手机去看还是不错的,谢谢您的宝贵意见,我会的!喜欢就关注啊 :blush:
        Android_YangKe:谢谢 我研究一下
        Albert_Larry:@Android_YangKe 好吧我的问题

      本文标题:我的BAT梦~1

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