private String addSymbol0(char[] buffer, int offset, int length, int bucket, int collisionCount) { if (fCount >= fThreshold) { // Rehash the table if the threshold is exceeded rehash(); bucket = hash(buffer, offset, length) % fTableSize; } else if (collisionCount >= fCollisionThreshold) { // Select a new hash function and rehash the table if // the collision threshold is exceeded. rebalance(); bucket = hash(buffer, offset, length) % fTableSize; } // add new entry String symbol = new String(buffer, offset, length).intern(); SREntry entry = new SREntry(symbol, buffer, offset, length, fBuckets[bucket], bucket, fReferenceQueue); fBuckets[bucket] = entry; ++fCount; return symbol; } // addSymbol0(char[],int,int,int,int):String
/** * Returns true if the symbol table already contains the specified * symbol. * * @param symbol The symbol to look for. */ public boolean containsSymbol(String symbol) { // search for identical symbol int bucket = hash(symbol) % fTableSize; int length = symbol.length(); OUTER: for (SREntry entry = fBuckets[bucket]; entry != null; entry = entry.next) { SREntryData data = (SREntryData)entry.get(); if (data == null) { continue; } if (length == data.characters.length) { for (int i = 0; i < length; i++) { if (symbol.charAt(i) != data.characters[i]) { continue OUTER; } } return true; } } return false; } // containsSymbol(String):boolean
old = old.next; SREntryData data = (SREntryData)e.get(); if (data != null) { int index = hash(data.symbol) % newCapacity;
int bucket = hash(buffer, offset, length) % fTableSize; OUTER: for (SREntry entry = fBuckets[bucket]; entry != null; entry = entry.next) { SREntryData data = (SREntryData)entry.get(); if (data == null) { continue;
/** * Returns true if the symbol table already contains the specified * symbol. * * @param buffer The buffer containing the symbol to look for. * @param offset The offset into the buffer. * @param length The length of the symbol in the buffer. */ public boolean containsSymbol(char[] buffer, int offset, int length) { // search for identical symbol int bucket = hash(buffer, offset, length) % fTableSize; OUTER: for (SREntry entry = fBuckets[bucket]; entry != null; entry = entry.next) { SREntryData data = (SREntryData)entry.get(); if (data == null) { continue; } if (length == data.characters.length) { for (int i = 0; i < length; i++) { if (buffer[offset + i] != data.characters[i]) { continue OUTER; } } return true; } } return false; } // containsSymbol(char[],int,int):boolean
/** * Adds the specified symbol to the symbol table and returns a * reference to the unique symbol. If the symbol already exists, * the previous symbol reference is returned instead, in order * guarantee that symbol references remain unique. * * @param symbol The new symbol. */ public String addSymbol(String symbol) { clean(); // search for identical symbol int collisionCount = 0; int bucket = hash(symbol) % fTableSize; for (SREntry entry = fBuckets[bucket]; entry != null; entry = entry.next) { SREntryData data = (SREntryData)entry.get(); if (data == null) { continue; } if (data.symbol.equals(symbol)) { return data.symbol; } ++collisionCount; } return addSymbol0(symbol, bucket, collisionCount); } // addSymbol(String):String
private String addSymbol0(String symbol, int bucket, int collisionCount) { if (fCount >= fThreshold) { // Rehash the table if the threshold is exceeded rehash(); bucket = hash(symbol) % fTableSize; } else if (collisionCount >= fCollisionThreshold) { // Select a new hash function and rehash the table if // the collision threshold is exceeded. rebalance(); bucket = hash(symbol) % fTableSize; } // add new entry symbol = symbol.intern(); SREntry entry = new SREntry(symbol, fBuckets[bucket], bucket, fReferenceQueue); fBuckets[bucket] = entry; ++fCount; return symbol; } // addSymbol0(String,int,int):String
/** * Constructs a new entry from the specified symbol information and * next entry reference. */ public SREntry(String internedSymbol, char[] ch, int offset, int length, SREntry next, int bucket, ReferenceQueue q) { super(new SREntryData(internedSymbol, ch, offset, length), q); initialize(next, bucket); }
/** * Constructs a new entry from the specified symbol and next entry * reference. */ public SREntry(String internedSymbol, SREntry next, int bucket, ReferenceQueue q) { super(new SREntryData(internedSymbol), q); initialize(next, bucket); }