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