我的 BAT 梦~1

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.  九种基本数据类型的大小,以及他们的封装类。

我的 BAT 梦~1_第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

你可能感兴趣的:(我的 BAT 梦~1)