用java 也有3年多,但总觉得用的不是那么熟练,会的不知道原理,不会的仍是不会。所以为了不让忘的快,就把自己的一些体会记在这儿了
1.String、StringBuffer、StringBuilder的区别
类 | 继承性 | 线程安全性 | 拼接效率 | 应用场景 |
String | final | 不安全 | +,concat每次生成一个新实例,但concat并不比append慢(可能是测试场景不对,或未理解原理),但+比append慢得多 | 字符串常量,小量拼接 |
StringBuilder | final | 不安全 | append 比StringBuffer的append快,没有加锁的影响 | 局部变量, 大量拼接,非多线程环境 |
StringBuffer | final | 安全 | append比String 的+快,但并不比String 的concat方法快 | 大量拼接,多线程环境 |
2.equals、==、hashCode
其实==不应该放到一起比较,因为它是一种运算符,而equals、hashCode是方法。但是由于equals与==总被纠缠在一起,也就比较一下了
对比项 | 说明 | 互推性 | 重载场景 |
== | 比较两个对象的引用或基本类型的值 | 两对象==,则hashCode一定相等 | |
equals | 根据具体子类重载的情况而定,在Ojbect根类中,默认是比较对象的引用是否相等, 在String中是先比较引用,若不相等再比较值(重载过) | 两对象equals,则hashCode一定相等 | 集合类 |
hashCode | 取对象的某一部,经运算后得到的一个int值,并不一定是正数 | 两对象hashCode相等,不能推出==,或equals; 但hashCode不相等,则equals一定不相等 | 集合类 |
3.override,overloade
先copy一个测试题放在上面,如果能做对,估计也理解了两者的区别了,下面的也就不用再看了
1) class Super{
2) public float getNum(){return 3.0f;}
3) }
4)
5) public class Sub extends Super{
6)
7) }
下面哪条语句放在第6行将出现编译报错?
A. public float getNum(){return 4.0f;}
B. public void getNum(){}
C. public void getNum(double d){}
D. public double getNum(float d){return 4.0d;}
下面的对比是网上借鉴的
对比项 | 含义 | 参数是否相同 | 返回值 | 存在位置 |
override | 重写,一个类中有多个同名函数,但至少参数顺序,参数类型或返回值三者中有一个不同 | 参数类型或个数或顺序至少有一项不同 | 可不同 | 同一个类中,或父类中 |
overload | 重载,子类覆盖父类的同名实例方法(static方法无法覆盖) | 与父类完全相同 | 相同 | 本类中,从父类继承而来 |
4.I/O
这块就只会些基本的的,网上讲的很多,我也就放几个地址了
对于更深入的了解,可以参阅以下地址
http://blog.youkuaiyun.com/historyasamirror/article/details/4270633
http://19880512.blog.51cto.com/936364/381722
http://blog.youkuaiyun.com/kexin_bo/article/details/6925351
5.java.util.*
java.util应该是我们平时用得最多的包了,当然util包下同还有子包,里面的东西太多了。但最重要的应该是java.util.concurent.*包下面的内容中,里面包含了java并发方面的精髓。其中的ConcurrentHashMap,AbstractQueuedSynchronizer两个类应该很值得学习研究了。
跟I/O一样吧,先放张图,再放几个地址了
更深入的学习请参考以下地址:
http://www.goldendoc.org/category/juc/
http://www.khotyn.com/2011/06/12/juc_aqs/
可能是最近有些不知道干什么了,竞写了这篇博客。