Java、javax、org、sun包都是jdk提供的类包,且都是在rt.jar中。rt.jar是JAVA基础类库(java核心框架中很重要的包),包含lang在内的大部分功能,而且rt.jar默认就在根classloader的加载路径里面,所以放在classpath是多此一举 。他们之间的区别具体如下:
1. java.*
Java SE的标准库,是java标准的一部分,是对外承诺的java开发接口,通常要保持向后兼容,一般不会轻易修改。包括其他厂家(IBMJDK/HPJDK/OpenJDK)在内,所有jdk的实现,在java.*上都是一样的。
2. javax.*
也是java标准的一部分,但是没有包含在标准库中,一般属于标准库的扩展。通常属于某个特定领域,不是一般性的api。
所以以扩展的方式提供api,以避免jdk的标准库过大。当然某些早期的javax,后来被并入到标准库中,所有也应该属于新版本JDK的标准库。比如jmx,java 5以前是以扩展方式提供,但是jdk5以后就做为标准库的一部分了,所有javax.management也是jdk5的标准库的一部分。
3. com.sun.*
是sun的hotspot虚拟机中java.* 和javax.*的实现类。因为包含在rt中,所以我们也可以调用。但是因为不是sun对外公开承诺的接口,所以根据根据实现的需要随时增减,因此在不同版本的hotspot中可能是不同的,而且在其他的jdk实现中是没有的,调用这些类,可能不会向后兼容,所以一般不推荐使用。
4. org.*
是由企业或者组织提供的java类库,大部分不是sun公司提供的,同com.sun.*,不具备向后兼容性,会根据需要随时增减。其中比较常用的是w3c提供的对XML、网页、服务器的类和接口
具体如下表:
包名 | 说明 |
---|---|
java.lang | 该包提供了Java编程的基础类,例如 Object、Math、String、StringBuffer、System、Thread等,不使用该包就很难编写Java代码了。 |
java.util | 该包提供了包含集合框架、遗留的集合类、事件模型、日期和时间实施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 |
java.io | 该包通过文件系统、数据流和序列化提供系统的输入与输出。 |
java.net | 该包提供实现网络应用与开发的类。 |
java.sql | 该包提供了使用Java语言访问并处理存储在数据源(通常是一个关系型数据库)中的数据API。 |
java.awt | 这两个包提供了GUI设计与开发的类。java.awt包提供了创建界面和绘制图形图像的所有类,而javax.swing包提供了一组“轻量级”的组件,尽量让这些组件在所有平台上的工作方式相同。 |
javax.swing | |
java.text |
提供了与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 |
java.lang 详解: http://beyond429.iteye.com/blog/344024
java.util 详解: http://blog.csdn.net/abeetle/article/details/1497706
java.io 详解: http://blog.csdn.net/yczz/article/details/38761237
java.net 详解:https://zhidao.baidu.com/question/87061018.html
java.sql 详解:http://www.360doc.com/content/12/0329/09/1200324_198823027.shtml
java.awt 详解:http://blog.csdn.net/u013147587/article/details/49815031
javax.swing 详解:http://blog.sina.com.cn/s/blog_4a7979120100087g.html
java.text 详解:http://www.cnblogs.com/beibeibao/p/3411750.html
很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起。以下为小编整理的通常所需阅读的源码范围。
标题为包名,后面序号为优先级1-4,优先级递减
1、java.lang
1) Object 1
2) String 1
3) AbstractStringBuilder 1
4) StringBuffer 1
5) StringBuilder 1
6) Boolean 2
7) Byte 2
8) Double 2
9) Float 2
10) Integer 2
11) Long 2
12) Short 2
13) Thread 2
14) ThreadLocal 2
15) Enum 3
16) Throwable 3
17) Error 3
18) Exception 3
19) Class 4
20) ClassLoader 4
21) Compiler 4
22) System 4
23) Package 4
24) Void 4
2、java.util
1) AbstractList 1
2) AbstractMap 1
3) AbstractSet 1
4) ArrayList 1
5) LinkedList 1
6) HashMap 1
7) Hashtable 1
8) HashSet 1
9) LinkedHashMap 1
10) LinkedHashSet 1
11) TreeMap 1
12) TreeSet 1
13) Vector 2
14) Queue 2
15) Stack 2
16) SortedMap 2
17) SortedSet 2
18) Collections 3
19) Arrays 3
20) Comparator 3
21) Iterator 3
22) Base64 4
23) Date 4
24) EventListener 4
25) Random 4
26) SubList 4
27) Timer 4
28) UUID 4
29) WeakHashMap 4
3、java.util.concurrent
1) ConcurrentHashMap 1
2) Executor 2
3) AbstractExecutorService 2
4) ExecutorService 2
5) ThreadPoolExecutor 2
6) BlockingQueue 2
7)AbstractQueuedSynchronizer 2
8)CountDownLatch 2
9) FutureTask 2
10)Semaphore 2
11)CyclicBarrier 2
13)CopyOnWriteArrayList 3
14)SynchronousQueue 3
15)BlockingDeque 3
16) Callable 4
4、java.util.concurrent.atomic
1) AtomicBoolean 2
2) AtomicInteger 2
3) AtomicLong 2
4) AtomicReference 3
5、java.lang.reflect
1) Field 2
2) Method 2
6、java.lang.annotation
1) Annotation 3
2) Target 3
3) Inherited 3
4) Retention 3
5) Documented 4
6) ElementType 4
7) Native 4
8) Repeatable 4
7、java.util.concurrent.locks
1) Lock 2
2) Condition 2
3) ReentrantLock 2
4) ReentrantReadWriteLock 2
8、java.io
1) File 3
2) InputStream 3
3) OutputStream 3
4) Reader 4
5) Writer 4
9、java.nio
1) Buffer 3
2) ByteBuffer 4
3) CharBuffer 4
4) DoubleBuffer 4
5) FloatBuffer 4
6) IntBuffer 4
7) LongBuffer 4
8) ShortBuffer 4
10、java.sql
1) Connection 3
2) Driver 3
3) DriverManager 3
4) JDBCType 3
5) ResultSet 4
6) Statement 4
11、java.net
1) Socket 3
2) ServerSocket 3
3) URI 4
4) URL 4
5) URLEncoder 4
阅读笔记简版
1、Object
1) wait(), notify(), notifyAll(), wait(timeout)
2) hashCode(), equals()
3) clone()
2、String
1) char[] value
2) int hash
3) equals(), startWith(), endWith(), replace
3、AbstractStringBuilder
1) char[] value
2) int count
3) 扩容:翻倍,不够取所需最小
4、StringBuffer
1) 继承AbstractStringBuilder
2) synchronized方法保证线程安全
3) char[] toStringCache
5、StringBuilder 继承AbstractStringBuilder
6、ArrayList
1) Object[] elementData
2) int size
3) 默认大小10
4) 扩容:翻倍,不够取所需最小
7、LinkedList
1) Node {E item, Node prev, Node next}
2) int size
3) Node first
4) Node last
5) linkFirst(), linkLast(), linkBefore(), unLinkFirst(), unLinkLast(), unLink(), indexOf()
8、HashMap
1) Node{int hash, K key, V value, Node next}
2) 默认容量16,负载因子0.75f
3) int size, modCount, threshold, float loadFactor
4) Node[] table
5) Set entrySet
6) put():根据key算hash,根据容量和hash算index,table[index]没有直接添加到数组中,table[index]有,若index位置同一个key则更新,否则遍历next是否有,有则更新,无则新增,最后根据thread与size判断是否扩容。注:扩容时容量翻倍,重新算hash复制到新数组
7)get()类似
注:先比较hash,若相等在比较equals
9、Hashtable
1) 结构实现与HashMap基本一致
2)通过synchronized方法保证线程安全
10、HashSet:委托给HashMap,其Value是同一个默认对象
11、LinkedHashMap继承HashMap
1) Entry{HashMap.Node, Entry before, after}
2) Entry head, tail
3) 重写newNode()添加节点时,除像HashMap中添加外,保存before、after信息
12、LinkedHashSet继承HashSet:不知道如何实现的顺序?
13、AbstractMap维护EntrySet,AbstractSet维护Iterator,AbstractList维护Iterator
14、ConcurrentHashMap
1) JDK1.7及以前:
a、Segment[] ,HashEntry[] , HashEntry{hash, k, v, next}
b、根据key算hash,根据hash和Segment的大小算位置,每个segment拥有一个自己的HashEntry[]
c、get():不加锁,volatile类型
d、put(): 对相应segment加锁
e、size():各HashEntry[] 之和,先不加锁算两遍,若一致则返回,若不一致则加锁重新计算
2)JDK1.8
a、Node{hash, key, value, next}
b、Node[] table
c、大多数操作类似于HashMap,不同CAS方式设置,根据key算hash,在根据hash和容量算index,对table[index]加锁,从而达到更大的并发量
d、get(): 同HashMap
e、put(): 对table[index]加锁
15、TreeMap
1)红黑树,即自平衡二叉查找树,时间复杂度O(logn)
2)Entry{K k, V v, Entry parent, left, right, boolean color}
3)Entry root,int size, int modeCount
16、TreeSet:委托TreeMap实现