{"action":"opened","issue":{"url":"https://api.github.com/repos/LeeMinKyu/LeeMinKyu.github.io/issues/1","labels_url":"https://api.github.com/repos/LeeMinKyu/LeeMinKyu.github.io/issues/1/labels{/name}","comments_url":"https://api.github.com/repos/LeeMinKyu/LeeMinKyu.github.io/issues/1/comments","events_url":"https://api.github.com/repos/LeeMinKyu/LeeMinKyu.github.io/issues/1/events","html_url":"https://github.com/LeeMinKyu/LeeMinKyu.github.io/issues/1","id":57597305,"number":1,"title":"JDK 1.1 HashMap . 수정중","user":{"login":"LeeMinKyu","id":8723117,"avatar_url":"https://avatars.githubusercontent.com/u/8723117?v=3","gravatar_id":"","url":"https://api.github.com/users/LeeMinKyu","html_url":"https://github.com/LeeMinKyu","followers_url":"https://api.github.com/users/LeeMinKyu/followers","following_url":"https://api.github.com/users/LeeMinKyu/following{/other_user}","gists_url":"https://api.github.com/users/LeeMinKyu/gists{/gist_id}","starred_url":"https://api.github.com/users/LeeMinKyu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LeeMinKyu/subscriptions","organizations_url":"https://api.github.com/users/LeeMinKyu/orgs","repos_url":"https://api.github.com/users/LeeMinKyu/repos","events_url":"https://api.github.com/users/LeeMinKyu/events{/privacy}","received_events_url":"https://api.github.com/users/LeeMinKyu/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":0,"created_at":"2015-02-13T13:16:13Z","updated_at":"2015-02-13T13:16:13Z","closed_at":null,"body":"# HashMap\r\n- HashTable은 JDK1.0부터 있던 JAVA API.\r\n- HashMap은 Java 2에서 Java Collections Framework에 속한 API.\r\n- HashMap과 HashTable은 같은 Map 인터페이스를 구현.\r\n  따라서 제공하는 기능은 같다.\r\n- HashMap은 Additional Hash Function 사용, 지속적 개선.\r\n  HashTable은 이전 버전과의 호환을 위해 남아 있는 것.\r\n- HashTable은 동기화처리. 여러 Thread에서 데이터 공유가 가능하다고 한다.\r\n  HashMap은 비동기 처리이기때문에 단일 Thread에서 처리속도가 조금 더 빠를 수 있다고 한다.\r\n**앞으로 소스를 분석하면서 차근차근 알아보기로...**\r\n\r\n- HashMap과 HashTable의 정의\r\n> \"키에 대한 해시 값을 사용하여 값을 저장하고 조회하며, 키-값 쌍의 개수에 따라 동적으로 크기가 증가하는 AssociateArray\"\r\n> * (AssociateArray == Map == Dictionary == Symbol Table )\r\n \r\n- http://helloworld.naver.com/helloworld/831311 에서 공부하고 작성하는 것이므로 몇몇 내용이 동일할 수 있습니다. \r\n<Br>\r\n### Java Development Kit (JDK) 1.1.8_16 Solaris\r\n---\r\n* Hashtable.java\r\n\r\n```java\r\n/**\r\n * Hashtable collision list.\r\n * --> Hashtable의 entry는 우리가 흔히 알고있는 LinkedList의 Node와 비슷하다.\r\n */\r\nclass HashtableEntry {\r\n    int hash;\r\n    Object key;\r\n    Object value;\r\n    HashtableEntry next;\r\n    protected Object clone() {\r\n HashtableEntry entry = new HashtableEntry();\r\n entry.hash = hash;\r\n entry.key = key;\r\n entry.value = value;\r\n entry.next = (next != null) ? (HashtableEntry)next.clone() : null;\r\n return entry;\r\n    }\r\n}\r\n\r\n\r\n/*\r\n * 주석 문 생략 .. \r\n *\r\n * @author  Arthur van Hoff\r\n * @version 1.43, 12/12/01\r\n * @see     java.lang.Object#equals(java.lang.Object)\r\n * @see     java.lang.Object#hashCode()\r\n * @see     java.util.Hashtable#rehash()\r\n * @since   JDK1.0\r\n */\r\npublic class Hashtable extends Dictionary implements Cloneable, java.io.Serializable {\r\n    \r\n    /**\r\n     * The hash table data.\r\n     * transient로 선언된 이유는 직렬화(serializ)할 때 전체, table 배열 자체를 직렬화하는 것보다\r\n     * 키-값 쌍을 차례로 기록하는 것이 더 효율적이기 때문이다.\r\n     */\r\n    private transient HashtableEntry table[];\r\n    \r\n    /**\r\n     * The total number of entries in the hash table.\r\n     */\r\n    private transient int count;\r\n    \r\n    /**\r\n     * Rehashes the table when count exceeds this threshold.\r\n     */\r\n    private int threshold;\r\n    \r\n    /**\r\n     * The load factor for the hashtable.\r\n     * loadFactor --> 영역 혼잡도라고 생각하면 될 것 같다.\r\n     * count가 capacity * loadFactor에 도달하는 경우, 크기를 재지정한다.\r\n     * 이때 threshold = capacity * loadFactor 이다.\r\n     * 또한 capacity는 table의 배열 갯수와 같다. ( table = new HashtableEntry[capacity] )\r\n     */\r\n    private float loadFactor;\r\n\r\n    /** use serialVersionUID from JDK 1.0.2 for interoperability */\r\n    private static final long serialVersionUID = 1421746759512286392L;\r\n\r\n    /**\r\n     * Constructor\r\n     * - 해시테이블의 capacity(가용량, 실제로 table의 길이) LoadFactor를 지정한다.\r\n     * - 따로 지정지 않을경우 default로 capacity는 101, LoadFactor는 0.75 이다. (LoadFactor는 0부터 1사이)\r\n     */\r\n    public Hashtable(int initialCapacity, float loadFactor)\r\n    public Hashtable(int initialCapacity)\r\n    public Hashtable()\r\n\r\n    /**\r\n     * Method\r\n     */\r\n    public int size()   // 현재 테이블의 count를 반환한다.\r\n    public boolean isEmpty()    // return count == 0;\r\n    public synchronized Enumeration keys()  {\r\n        // 새로운 HashtableEnumerator를 생성하여 반환한다.\r\n        // 여기에서 true 값이 들어갔는데 이는 Enumeration이 table entry의 key들만을 리턴하겠다는 의미이다.\r\n        // 만일 false 값을 주면 Enumeration은 entry의 value들만을 얻게 된다.\r\n        // 즉, Hashtable의 table은 Enumeration에 key 또는 value만이 복사되어 저장되는 것이 아니라\r\n        // table 자체의 reference가 전달되고 복사되는 것이다. 때문에 keys라는 boolean 값이 들어간 것으로 보인다.\r\n        return new HashtableEnumerator(table, true);\r\n    }\r\n\r\n    public synchronized Enumeration elements() {\r\n        // Value 값들만을 리턴하는 Enumeration 이다.\r\n        // 위 kyes() method와 똑같이 Enumerator를 통해 생성하지만 keys boolean값이 false이다.\r\n        return new HashtableEnumerator(table, false);\r\n    }\r\n\r\n    /**\r\n     *  Value가 포함되어 있는지 보는 method 이다.\r\n     *  2차원 배열을 처음부터 하나씩 탐색 하는것과 같다.\r\n     *  당연히 검색 속도는 느릴 것이다.\r\n     */\r\n    public synchronized boolean contains(Object value) {\r\n        if (value == null) {\r\n            throw new NullPointerException();\r\n        }\r\n\r\n        HashtableEntry tab[] = table;\r\n        for (int i = tab.length ; i-- > 0 ;) {\r\n            for (HashtableEntry e = tab[i] ; e != null ; e = e.next) {\r\n                if (e.value.equals(value)) {\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n\r\n\r\n    public synchronized boolean containsKey(Object key) \r\n\r\n\r\n    public synchronized Object get(Object key)\r\n    protected void rehash()\r\n    public synchronized Object put(Object key, Object value) \r\n    public synchronized Object remove(Object key)\r\n    public synchronized void clear()\r\n    public synchronized Object clone()\r\n    public synchronized String toString()\r\n    private synchronized void writeObject(java.io.ObjectOutputStream s) throws IOException\r\n    private synchronized void readObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException\r\n\r\n/**\r\n * A hashtable enumerator class.  This class should remain opaque \r\n * to the client. It will use the Enumeration interface. \r\n */\r\nclass HashtableEnumerator implements Enumeration {\r\n    boolean keys;\r\n    int index;\r\n    HashtableEntry table[];\r\n    HashtableEntry entry;\r\n\r\n    HashtableEnumerator(HashtableEntry table[], boolean keys) {\r\n    this.table = table;\r\n    this.keys = keys;\r\n    this.index = table.length;\r\n    }\r\n    \r\n    public boolean hasMoreElements() {\r\n    if (entry != null) {\r\n        return true;\r\n    }\r\n    while (index-- > 0) {\r\n        if ((entry = table[index]) != null) {\r\n        return true;\r\n        }\r\n    }\r\n    return false;\r\n    }\r\n\r\n    public Object nextElement() {\r\n    if (entry == null) {\r\n        while ((index-- > 0) && ((entry = table[index]) == null));\r\n    }\r\n    if (entry != null) {\r\n        HashtableEntry e = entry;\r\n        entry = e.next;\r\n        return keys ? e.key : e.value;\r\n    }\r\n    throw new NoSuchElementException(\"HashtableEnumerator\");\r\n    }\r\n}\r\n```"}}