理解Java最重要的8张图
2016-05-21 02:33
633 查看
一图胜千言,下面图解均来自Program Creek 网站的Java教程
s持有字符串abcd的引用
2. 用一个字符串变量赋值另一个字符串变量
s2和s持有同一个对象的引用
3. 合并字符串
这两个方法是在Java super class “java.lang.Object”中定义的重要方法,
如果两个对象相等 那么她们hashCode一定相等
如果两个对象hashCode相等,她们两个对象不一定相等
##一个常见的错误
对象green Apple明明已经被加入到Map中,但是检索Map的时候查找green Apple对象却返回空
解决上面问题只需要实现他的hashCode方法即可
红色的为受检查异常,任何受检测异常可以在方法体或者方法定义中抛出。必须在编译期完成。绿色的是不可测异常
Collection的继承关系
Map的继承关系
a、b都指向内存区域,到运行时再确定实际要调用的是谁
这段代码如果运行将会报错
需要修改
因为
是强类型语言
对应的堆栈存储图为
各个线程栈区数据不共享,堆区、方法区、运行时常量区数据共享。
栈数据包括
局部变量数据组、操作栈、常量池数据引用
字符串的不变性
定义字符串String s = "abcd";
s持有字符串abcd的引用
2. 用一个字符串变量赋值另一个字符串变量
String s2 = s;
s2和s持有同一个对象的引用
3. 合并字符串
s = s.concat("ef");
总结
一旦在堆内存中创建了字符串,字符串本身是不能改变的,如果要改变通过返回新的字符串对象实现。因此为了避免产生更多的临时变量,消耗垃圾回收机制资源,改变String,尽量使用StringBuilder和StringBuffer类代替String。Java equals()方法和hashCode()方法的联系
public boolean equals(Object obj) public int hashCode()
这两个方法是在Java super class “java.lang.Object”中定义的重要方法,
如果两个对象相等 那么她们hashCode一定相等
如果两个对象hashCode相等,她们两个对象不一定相等
##一个常见的错误
import java.util.HashMap; public class Apple { private String color; public Apple(String color) { this.color = color; } public boolean equals(Object obj) { if(obj==null) return false; if (!(obj instanceof Apple)) return false; if (obj == this) return true; return this.color.equals(((Apple) obj).color); } public static void main(String[] args) { Apple a1 = new Apple("green"); Apple a2 = new Apple("red"); //hashMap stores apple type and its quantity HashMap<Apple, Integer> m = new HashMap<Apple, Integer>(); m.put(a1, 10); m.put(a2, 20); System.out.println(m.get(new Apple("green"))); } }
对象green Apple明明已经被加入到Map中,但是检索Map的时候查找green Apple对象却返回空
问题由于hashCode()引起
因为Apple对象没有实现hashCode方法,在Map中为了去查找一个对象比线性查找更快,通过两个验证的方式查找,如果两个对象的hashCode不相等,就不用再执行它们的equals方法了。解决上面问题只需要实现他的hashCode方法即可
public int hashCode(){ return this.color.hashCode(); }
Java异常类的继承关系
Java中的异常分为可检测异常和不可预知异常,她们的关系在下表中红色的为受检查异常,任何受检测异常可以在方法体或者方法定义中抛出。必须在编译期完成。绿色的是不可测异常
Collection和Collections
这是两个完全不同的东西。Collection是Collection接口继承关系中的根接口,而Collections是一个包含很多操作集合元素静态方法的类。Collection的继承关系
Map的继承关系
Java同步机制
别名
别名意味着可以为同一块内存区域给予不同的名称,这些名称可以是不同的类型。B[] b = new B[10]; A[] a = b; a[0] = new A(); b[0].methodParent();
a、b都指向内存区域,到运行时再确定实际要调用的是谁
class A {
public void methodParent() {
System.out.println("method in Parent");
}
}
class B extends A {
public void methodParent() {
System.out.println("override method in Child");
}
public void methodChild() {
System.out.println("method in Child");
}
}
public class Main {
public static void main(String[] args) {
B[] b = new B[10]; A[] a = b; a[0] = new A(); b[0].methodParent();
}
}
这段代码如果运行将会报错
Exception in thread "main" java.lang.ArrayStoreException: aliasingtest.A at aliasingtest.Main.main(Main.java:26)
需要修改
B[] b = new B[10]; A[] a = b; a[0] = new B(); b[0].methodParent();
因为
B[] b = new B[10];已经定义了数据类型为B,Java
是强类型语言
堆与栈
class A { int x; int y; } ... public void m1() { int i = 0; m2(); } public void m2() { A a = new A(); }
对应的堆栈存储图为
Java运行时数据区域
下图显示了整个JVM运行时数据区。各个线程栈区数据不共享,堆区、方法区、运行时常量区数据共享。
栈数据包括
局部变量数据组、操作栈、常量池数据引用
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树