home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1999 April / DPPCPRO0499.ISO / April / Notes / 50b2wic.exe / DATA1.CAB / NotesProgramFilesJavaSupport / rt.jar / java / util / Hashtable.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-04-23  |  4.3 KB  |  260 lines

  1. package java.util;
  2.  
  3. import java.io.IOException;
  4. import java.io.ObjectInputStream;
  5. import java.io.ObjectOutputStream;
  6. import java.io.Serializable;
  7.  
  8. public class Hashtable extends Dictionary implements Cloneable, Serializable {
  9.    private transient HashtableEntry[] table;
  10.    private transient int count;
  11.    private int threshold;
  12.    private float loadFactor;
  13.    private static final long serialVersionUID = 1421746759512286392L;
  14.  
  15.    public Hashtable(int var1, float var2) {
  16.       if (var1 > 0 && !((double)var2 <= (double)0.0F)) {
  17.          this.loadFactor = var2;
  18.          this.table = new HashtableEntry[var1];
  19.          this.threshold = (int)((float)var1 * var2);
  20.       } else {
  21.          throw new IllegalArgumentException();
  22.       }
  23.    }
  24.  
  25.    public Hashtable(int var1) {
  26.       this(var1, 0.75F);
  27.    }
  28.  
  29.    public Hashtable() {
  30.       this(101, 0.75F);
  31.    }
  32.  
  33.    public int size() {
  34.       return this.count;
  35.    }
  36.  
  37.    public boolean isEmpty() {
  38.       return this.count == 0;
  39.    }
  40.  
  41.    public synchronized Enumeration keys() {
  42.       return new HashtableEnumerator(this.table, true);
  43.    }
  44.  
  45.    public synchronized Enumeration elements() {
  46.       return new HashtableEnumerator(this.table, false);
  47.    }
  48.  
  49.    public synchronized boolean contains(Object var1) {
  50.       if (var1 == null) {
  51.          throw new NullPointerException();
  52.       } else {
  53.          HashtableEntry[] var2 = this.table;
  54.          int var3 = var2.length;
  55.  
  56.          while(var3-- > 0) {
  57.             for(HashtableEntry var4 = var2[var3]; var4 != null; var4 = var4.next) {
  58.                if (var4.value.equals(var1)) {
  59.                   return true;
  60.                }
  61.             }
  62.          }
  63.  
  64.          return false;
  65.       }
  66.    }
  67.  
  68.    public synchronized boolean containsKey(Object var1) {
  69.       HashtableEntry[] var2 = this.table;
  70.       int var3 = var1.hashCode();
  71.       int var4 = (var3 & Integer.MAX_VALUE) % var2.length;
  72.  
  73.       for(HashtableEntry var5 = var2[var4]; var5 != null; var5 = var5.next) {
  74.          if (var5.hash == var3 && var5.key.equals(var1)) {
  75.             return true;
  76.          }
  77.       }
  78.  
  79.       return false;
  80.    }
  81.  
  82.    public synchronized Object get(Object var1) {
  83.       HashtableEntry[] var2 = this.table;
  84.       int var3 = var1.hashCode();
  85.       int var4 = (var3 & Integer.MAX_VALUE) % var2.length;
  86.  
  87.       for(HashtableEntry var5 = var2[var4]; var5 != null; var5 = var5.next) {
  88.          if (var5.hash == var3 && var5.key.equals(var1)) {
  89.             return var5.value;
  90.          }
  91.       }
  92.  
  93.       return null;
  94.    }
  95.  
  96.    protected void rehash() {
  97.       int var1 = this.table.length;
  98.       HashtableEntry[] var2 = this.table;
  99.       int var3 = var1 * 2 + 1;
  100.       HashtableEntry[] var4 = new HashtableEntry[var3];
  101.       this.threshold = (int)((float)var3 * this.loadFactor);
  102.       this.table = var4;
  103.       int var5 = var1;
  104.  
  105.       HashtableEntry var7;
  106.       int var8;
  107.       while(var5-- > 0) {
  108.          for(HashtableEntry var6 = var2[var5]; var6 != null; var4[var8] = var7) {
  109.             var7 = var6;
  110.             var6 = var6.next;
  111.             var8 = (var7.hash & Integer.MAX_VALUE) % var3;
  112.             var7.next = var4[var8];
  113.          }
  114.       }
  115.  
  116.    }
  117.  
  118.    public synchronized Object put(Object var1, Object var2) {
  119.       if (var2 == null) {
  120.          throw new NullPointerException();
  121.       } else {
  122.          HashtableEntry[] var3 = this.table;
  123.          int var4 = var1.hashCode();
  124.          int var5 = (var4 & Integer.MAX_VALUE) % var3.length;
  125.  
  126.          for(HashtableEntry var6 = var3[var5]; var6 != null; var6 = var6.next) {
  127.             if (var6.hash == var4 && var6.key.equals(var1)) {
  128.                Object var7 = var6.value;
  129.                var6.value = var2;
  130.                return var7;
  131.             }
  132.          }
  133.  
  134.          if (this.count >= this.threshold) {
  135.             this.rehash();
  136.             return this.put(var1, var2);
  137.          } else {
  138.             HashtableEntry var8 = new HashtableEntry();
  139.             var8.hash = var4;
  140.             var8.key = var1;
  141.             var8.value = var2;
  142.             var8.next = var3[var5];
  143.             var3[var5] = var8;
  144.             ++this.count;
  145.             return null;
  146.          }
  147.       }
  148.    }
  149.  
  150.    public synchronized Object remove(Object var1) {
  151.       HashtableEntry[] var2 = this.table;
  152.       int var3 = var1.hashCode();
  153.       int var4 = (var3 & Integer.MAX_VALUE) % var2.length;
  154.       HashtableEntry var5 = var2[var4];
  155.  
  156.       for(HashtableEntry var6 = null; var5 != null; var5 = var5.next) {
  157.          if (var5.hash == var3 && var5.key.equals(var1)) {
  158.             if (var6 != null) {
  159.                var6.next = var5.next;
  160.             } else {
  161.                var2[var4] = var5.next;
  162.             }
  163.  
  164.             --this.count;
  165.             return var5.value;
  166.          }
  167.  
  168.          var6 = var5;
  169.       }
  170.  
  171.       return null;
  172.    }
  173.  
  174.    public synchronized void clear() {
  175.       HashtableEntry[] var1 = this.table;
  176.       int var2 = var1.length;
  177.  
  178.       while(true) {
  179.          --var2;
  180.          if (var2 < 0) {
  181.             this.count = 0;
  182.             return;
  183.          }
  184.  
  185.          var1[var2] = null;
  186.       }
  187.    }
  188.  
  189.    public synchronized Object clone() {
  190.       try {
  191.          Hashtable var1 = (Hashtable)super.clone();
  192.          var1.table = new HashtableEntry[this.table.length];
  193.  
  194.          for(int var2 = this.table.length; var2-- > 0; var1.table[var2] = this.table[var2] != null ? (HashtableEntry)this.table[var2].clone() : null) {
  195.          }
  196.  
  197.          return var1;
  198.       } catch (CloneNotSupportedException var3) {
  199.          throw new InternalError();
  200.       }
  201.    }
  202.  
  203.    public synchronized String toString() {
  204.       int var1 = this.size() - 1;
  205.       StringBuffer var2 = new StringBuffer();
  206.       Enumeration var3 = this.keys();
  207.       Enumeration var4 = this.elements();
  208.       var2.append("{");
  209.  
  210.       for(int var5 = 0; var5 <= var1; ++var5) {
  211.          String var6 = var3.nextElement().toString();
  212.          String var7 = var4.nextElement().toString();
  213.          var2.append(var6 + "=" + var7);
  214.          if (var5 < var1) {
  215.             var2.append(", ");
  216.          }
  217.       }
  218.  
  219.       var2.append("}");
  220.       return var2.toString();
  221.    }
  222.  
  223.    private synchronized void writeObject(ObjectOutputStream var1) throws IOException {
  224.       var1.defaultWriteObject();
  225.       var1.writeInt(this.table.length);
  226.       var1.writeInt(this.count);
  227.  
  228.       for(int var2 = this.table.length - 1; var2 >= 0; --var2) {
  229.          for(HashtableEntry var3 = this.table[var2]; var3 != null; var3 = var3.next) {
  230.             var1.writeObject(var3.key);
  231.             var1.writeObject(var3.value);
  232.          }
  233.       }
  234.  
  235.    }
  236.  
  237.    private synchronized void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
  238.       var1.defaultReadObject();
  239.       int var2 = var1.readInt();
  240.       int var3 = var1.readInt();
  241.       int var4 = (int)((float)var3 * this.loadFactor) + var3 / 20 + 3;
  242.       if (var4 > var3 && (var4 & 1) == 0) {
  243.          --var4;
  244.       }
  245.  
  246.       if (var2 > 0 && var4 > var2) {
  247.          var4 = var2;
  248.       }
  249.  
  250.       this.table = new HashtableEntry[var4];
  251.  
  252.       for(this.count = 0; var3 > 0; --var3) {
  253.          Object var5 = var1.readObject();
  254.          Object var6 = var1.readObject();
  255.          this.put(var5, var6);
  256.       }
  257.  
  258.    }
  259. }
  260.