New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Java核心技术笔记 #26

Open
thinkerou opened this Issue Dec 12, 2018 · 0 comments

Comments

Projects
None yet
1 participant
@thinkerou
Copy link
Owner

thinkerou commented Dec 12, 2018

final, finally, finalize

  • final 可以用来修饰类、方法和变量:修饰的类表示不可扩展继承,修饰的变量不可修改,修饰的方法不可重写(override)。
  • finally 用来保证重点代码一定要被执行的机制,如使用 try-finallytry-catch-finally 来进行类似关闭 JDBC 连接、保证 unlock 锁等动作。
  • finalize 在 Java9 中已被标记位 Deprecated,不关注。

String, StringBuffer, StringBuilder

  • StringImmutable 类,被声明为 final class,所有属性也被声明为 final,正因为它的不可变性,类似拼接、裁剪等字符串操作都会产生新的 String 对象。
  • StringBuffer 是为解决 String 产生太多中间对象的问题而提供的,可以使用 appendadd 方法把字符串添加到已有序列的末尾或指定的位置;StringBuffer 是线程安全的,所以会有额外的性能开销,除非有线程安全的需要,否则就使用 StringBuilder;它的线程安全是在各种修改数据的方法上增加关键字 synchronized 来实现的。
  • StringBuilderStringBuffer 没有本质区别,只是去掉了线程安全,有效减少了开销;它们底层都是利用可修改的(char,JDK9后是byte,在Java中char是两个byte)数组,都继承自 AbstractStringBuilder

int, Integer

  • int 是Java里8个原始数据类型(boolean, byte, char, short, int, long, float, double)之一,Java虽号称一切都是对象,但原始数据类型除外。
  • Integerint 对应的包装类,它有一个 int 类型的字段存储数据,并提供基本操作,如数学运算、类型转换等;引入自动装箱和自动拆箱后,Java可以根据上下文自动进行转换。
  • Integer的值缓存是 -128 到 127 之间。
  • 原始数据类型的变量需要线程安全,则建议使用类似 AtomicInteger, AtomicLong 这样的线程安全类。

Vector, ArrayList, LinkedList

  • Vector 是Java早期提供的线程安全的动态数组,它的内部是使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组并拷贝原有数组数据。
  • ArrayList 也是动态数组,但不是线程安全的,所以性能更好,它也可以根据需要调整容量,但 Vector 在扩容时会提高1倍,而 ArrayList 只增加 50% 而已。
  • LinkedList 是非线程安全的双向链表,所以不需要动态调整容量。

Hashtable, HashMap, TreeMap

  • Hashtable 是Java早期提供的哈希表实现,线程安全的,不支持null键和值。
  • HashMaphashtable 本质上没什么区别,但它是非线程安全的且支持null键和值。
  • TreeMap 是基于红黑树提供的顺序访问的Map,和HashMap不同,它的get、put和remove操作都是O(log(n))时间,具体顺序可以由指定的Comparator来决定或根据键的自然顺序来判断。
  • HashMap的性能表现非常依赖哈希码的有效性,务必掌握hashCode和equals的一些基本约定:
    • equals相等,hashCode一定相等
    • 重写了hashCode也要重写equals
    • hashCode需要保持一致性,状态改变返回的哈希值仍然要一致
    • equals的对称、反射、传递等特性
  • HashMap源码实现关键点:
    • HashMap内部结构由数组和链表组成,通过哈希值决定键值对在这个数组但寻址,哈希值相同的键值对则以链表形式存储,如果链表大小超过阈值,链表就会被改造为树形结构。
    • 负载因子等于元素数量除以容量。

ConcurrentHashMap

  • 实现线程安全不再使用 synchronized,而是使用分离锁机制。

IO, NIO, AIO

  • java.io包基于流模型实现,提供了我们最熟悉的一些IO功能,如File抽象、输入输出流等,交互方式是同步、阻塞的方式。
  • java.nio包提供了Channel、Selector、Buffer等新的抽象,可以构建多路复用的、同步非阻塞IO程序,同时提供了更接近操作系统底层的高性能数据操作方式。
  • Asynchronours IO,异步非阻塞IO方式,基于事件和回调机制,简单理解为:应用操作直接返回而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作。
  • 同步与异步:同步是一种可靠的有序运行机制,当进行同步操作时,后续任务需要等待当前调用返回后才会进行下一步;而异步则相反,其他任务不需要等待当前调用返回,通常依靠事件、回调等机制来实现任务间次序关系。
  • 阻塞与非阻塞:在进行阻塞操作时,当前线程会处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续;而非阻塞则是不管IO操作是否结束,直接返回,相应操作证后台继续处理。

@thinkerou thinkerou added the Java label Dec 12, 2018

@thinkerou thinkerou self-assigned this Dec 12, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment