Skip to content

Commit

Permalink
2016年9月22日14:08:59
Browse files Browse the repository at this point in the history
  • Loading branch information
HaoyangShi committed Sep 22, 2016
1 parent 936ab35 commit d3039e9
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 1 deletion.
4 changes: 4 additions & 0 deletions android/optimize.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,11 @@ Android系统会监控程序的响应状况,一旦出现下面两种情况,
- `避免使用Enum`:在Android中应该尽量使用`int`来代替`Enum`,因为使用`Enum`会导致编译后的dex文件大小增大,并且使用`Enum`时,其运行时还会产生额外的内存占用。

- `减小`Bitmap`对象的内存占用`

- `inBitmap`:如果设置了这个字段,Bitmap在加载数据时可以复用这个字段所指向的bitmap的内存空间。**但是,内存能够复用也是有条件的。比如,在`Android 4.4(API level 19)`之前,只有新旧两个Bitmap的尺寸一样才能复用内存空间。`Android 4.4`开始只要旧 Bitmap 的尺寸大于等于新的 Bitmap 就可以复用了**

- `inSampleSize`:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。

- `decode format`:解码格式,选择`ARGB_8888` `RBG_565` `ARGB_4444` `ALPHA_8`,存在很大差异。
> ARGB_4444:每个像素占四位,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位
> ARGB_8888:每个像素占四位,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位
Expand Down
2 changes: 1 addition & 1 deletion java/jvm-class-loader.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ Java类加载器是Java运行时环境(Java Runtime Environment)的一部分

>注意:JVM加载类A,并使用A的ClassLoader去加载B,但B的类加载器并不一定和A的类加载器一致,这是因为有双亲委托机制的存在。
一般的类加载器在尝试自己去加载某个Java类之前,会 **首先代理给其父类加载器**。当父类加载器找不到的时候,才会尝试自己加载。这个逻辑是封装在java.lang.ClassLoader类的loadClass()方法中的。一般来说,父类优先的策略就足够好了。在某些情况下,**可能需要采取相反的策略,即先尝试自己加载,找不到的时候再代理给父类加载器。这种做法在Java的Web容器中比较常见,也是Servlet规范推荐的做法。** 比如,Apache Tomcat为每个Web应用都提供一个独立的类加载器,使用的就是自己优先加载的策略。IBM WebSphere Application Server则允许Web应用选择类加载器使用的策略。
一般的类加载器在尝试自己去加载某个Java类之前,会 **首先代理给其父类加载器**。当父类加载器找不到的时候,才会尝试自己加载。这个逻辑是封装在`java.lang.ClassLoader`类的`loadClass()`方法中的。一般来说,父类优先的策略就足够好了。在某些情况下,**可能需要采取相反的策略,即先尝试自己加载,找不到的时候再代理给父类加载器。这种做法在Java的Web容器中比较常见,也是Servlet规范推荐的做法。** 比如,Apache Tomcat为每个Web应用都提供一个独立的类加载器,使用的就是自己优先加载的策略。IBM WebSphere Application Server则允许Web应用选择类加载器使用的策略。

![](class-loader-proxy-partten.png)

Expand Down
22 changes: 22 additions & 0 deletions java/questions.md
Original file line number Diff line number Diff line change
Expand Up @@ -303,3 +303,25 @@ CAS作为知名无锁算法,那ConcurrentHashMap就没用锁了么?当然不
***

### 如何打破 ClassLoader 双亲委托?

重写`loadClass()`方法。

***

### hashCode() && equals()

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

在 Java 应用程序执行期间,在同一对象上多次调用 `hashCode` 方法时,必须一致地返回相同的整数,前提是对象上 `equals` 比较中所用的信息没有被修改(`equals`默认返回对象地址是否相等)。如果根据 `equals(Object) `方法,两个对象是相等的,那么在两个对象中的每个对象上调用 `hashCode` 方法都必须生成相同的整数结果。

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

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

- **hashCode的存在主要是用于查找的快捷性**,如 Hashtable,HashMap等,hashCode 是用来在散列存储结构中确定对象的存储地址的;

- 如果两个对象相同,就是适用于 `equals(java.lang.Object)` 方法,那么这两个对象的 `hashCode` 一定要相同;

- 如果对象的 `equals` 方法被重写,那么对象的 `hashCode` 也尽量重写,并且产生 `hashCode` 使用的对象,一定要和 `equals` 方法中使用的一致,否则就会违反上面提到的第2点;

- **两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”**

0 comments on commit d3039e9

Please sign in to comment.