Index: src/java/org/apache/lucene/document/Field.java
===================================================================
--- src/java/org/apache/lucene/document/Field.java	(revision 766463)
+++ src/java/org/apache/lucene/document/Field.java	Tue Apr 21 00:23:15 MSD 2009
@@ -20,6 +20,7 @@
 import org.apache.lucene.analysis.TokenStream;
 import org.apache.lucene.index.IndexWriter;   // for javadoc
 import org.apache.lucene.util.Parameter;
+import org.apache.lucene.util.StringHelper;
 
 import java.io.Reader;
 import java.io.Serializable;
@@ -331,7 +332,7 @@
          + "for a field that is not indexed");
           
     if (internName) // field names are optionally interned
-      name = name.intern();        
+      name = StringHelper.intern(name);
     
     this.name = name; 
     
@@ -411,7 +412,7 @@
     if (reader == null)
       throw new NullPointerException("reader cannot be null");
     
-    this.name = name.intern();        // field names are interned
+    this.name = StringHelper.intern(name);        // field names are interned
     this.fieldsData = reader;
     
     this.isStored = false;
@@ -458,7 +459,7 @@
     if (tokenStream == null)
       throw new NullPointerException("tokenStream cannot be null");
     
-    this.name = name.intern();        // field names are interned
+    this.name = StringHelper.intern(name);        // field names are interned
     this.fieldsData = tokenStream;
     
     this.isStored = false;
@@ -502,7 +503,7 @@
     if (value == null)
       throw new IllegalArgumentException("value cannot be null");
     
-    this.name = name.intern();
+    this.name = StringHelper.intern(name);
     fieldsData = value;
     
     if (store == Store.YES) {
Index: src/test/org/apache/lucene/search/SampleComparable.java
===================================================================
--- src/test/org/apache/lucene/search/SampleComparable.java	(revision 766463)
+++ src/test/org/apache/lucene/search/SampleComparable.java	Tue Apr 21 00:23:15 MSD 2009
@@ -21,6 +21,7 @@
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.TermDocs;
 import org.apache.lucene.index.TermEnum;
+import org.apache.lucene.util.StringHelper;
 
 import java.io.IOException;
 import java.io.Serializable;
@@ -69,7 +70,7 @@
     return new SortComparatorSource () {
       public ScoreDocComparator newComparator (final IndexReader reader, String fieldname)
       throws IOException {
-        final String field = fieldname.intern ();
+        final String field = StringHelper.intern(fieldname);
         final TermEnum enumerator = reader.terms (new Term (fieldname, ""));
         try {
           return new ScoreDocComparator () {
@@ -104,7 +105,7 @@
        */
       protected Comparable[] fillCache (IndexReader reader, TermEnum enumerator, String fieldname)
       throws IOException {
-        final String field = fieldname.intern ();
+        final String field = StringHelper.intern(fieldname);
         Comparable[] retArray = new Comparable[reader.maxDoc ()];
         if (retArray.length > 0) {
           TermDocs termDocs = reader.termDocs ();
Index: src/java/org/apache/lucene/search/ExtendedFieldCacheImpl.java
===================================================================
--- src/java/org/apache/lucene/search/ExtendedFieldCacheImpl.java	(revision 766463)
+++ src/java/org/apache/lucene/search/ExtendedFieldCacheImpl.java	Tue Apr 21 00:23:15 MSD 2009
@@ -21,6 +21,7 @@
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.TermDocs;
 import org.apache.lucene.index.TermEnum;
+import org.apache.lucene.util.StringHelper;
 
 import java.io.IOException;
 
@@ -133,7 +134,7 @@
 
     protected Object createValue(IndexReader reader, Object fieldKey)
         throws IOException {
-      String field = ((String)fieldKey).intern();
+      String field = StringHelper.intern((String)fieldKey);
       TermEnum enumerator = reader.terms (new Term (field));
       try {
         Term term = enumerator.term();
Index: src/java/org/apache/lucene/util/StringHelper.java
===================================================================
--- src/java/org/apache/lucene/util/StringHelper.java	(revision 766463)
+++ src/java/org/apache/lucene/util/StringHelper.java	Tue Apr 21 00:29:08 MSD 2009
@@ -61,6 +61,40 @@
     return len;
   }
 
+  private static final String[] cache;
+  private static final int mask;
+
+  static {
+    int size = Integer.getInteger("org.apache.lucene.internCacheSize", 16384);
+    size = BitUtil.nextHighestPowerOfTwo(size);
+    cache = new String[size];
+    mask = size - 1;
+  }
+
+  /**
+   * This method behaves identical to {@link String#intern()}, except it is
+   * much faster. The speedup is gained by relying on its own cache of interned
+   * strings and calling {@link String#intern()} only when called with a new
+   * unique string.<br/>
+   * <br/>
+   * The size of the cache seriously affects performance, and while default of
+   * 16k works good for a hundred of unique strings, you can change it through
+   * "org.apache.lucene.internCacheSize" system property.
+   */
+  public static String intern(String string) {
+    int slot = string.hashCode() & mask;
+
+    String interned = cache[slot];
+
+    if (interned == string ||
+        (interned != null && interned.compareTo(string) == 0))
+      return interned;
+
+    interned = string.intern();
+    cache[slot] = interned;
+    return interned;
+  }
+
   private StringHelper() {
   }
 }
Index: contrib/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java
===================================================================
--- contrib/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java	(revision 766463)
+++ contrib/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java	Tue Apr 21 00:23:15 MSD 2009
@@ -28,10 +28,8 @@
 
 import org.apache.lucene.analysis.CachingTokenFilter;
 import org.apache.lucene.analysis.TokenStream;
-import org.apache.lucene.index.FilterIndexReader;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.Term;
-import org.apache.lucene.index.TermEnum;
 import org.apache.lucene.index.memory.MemoryIndex;
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
@@ -53,6 +51,7 @@
 import org.apache.lucene.search.spans.SpanQuery;
 import org.apache.lucene.search.spans.SpanTermQuery;
 import org.apache.lucene.search.spans.Spans;
+import org.apache.lucene.util.StringHelper;
 
 /**
  * Class used to extract {@link WeightedSpanTerm}s from a {@link Query} based on whether Terms from the query are contained in a supplied TokenStream.
@@ -71,7 +70,7 @@
 
   public WeightedSpanTermExtractor(String defaultField) {
     if (defaultField != null) {
-      this.defaultField = defaultField.intern();
+      this.defaultField = StringHelper.intern(defaultField);
     }
   }
 
@@ -356,7 +355,7 @@
   public Map getWeightedSpanTerms(Query query, CachingTokenFilter cachingTokenFilter,
       String fieldName) throws IOException {
     if (fieldName != null) {
-      this.fieldName = fieldName.intern();
+      this.fieldName = StringHelper.intern(fieldName);
     }
 
     Map terms = new PositionCheckingMap();
Index: src/java/org/apache/lucene/search/SortComparator.java
===================================================================
--- src/java/org/apache/lucene/search/SortComparator.java	(revision 766463)
+++ src/java/org/apache/lucene/search/SortComparator.java	Tue Apr 21 00:23:15 MSD 2009
@@ -18,6 +18,7 @@
  */
 
 import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.util.StringHelper;
 
 import java.io.IOException;
 
@@ -46,7 +47,7 @@
   // inherit javadocs
   public ScoreDocComparator newComparator (final IndexReader reader, final String fieldname)
   throws IOException {
-    final String field = fieldname.intern();
+    final String field = StringHelper.intern(fieldname);
     final Comparable[] cachedValues = FieldCache.DEFAULT.getCustom (reader, field, SortComparator.this);
     
     return new ScoreDocComparator() {
Index: contrib/analyzers/src/java/org/apache/lucene/analysis/query/QueryAutoStopWordAnalyzer.java
===================================================================
--- contrib/analyzers/src/java/org/apache/lucene/analysis/query/QueryAutoStopWordAnalyzer.java	(revision 766463)
+++ contrib/analyzers/src/java/org/apache/lucene/analysis/query/QueryAutoStopWordAnalyzer.java	Tue Apr 21 00:23:15 MSD 2009
@@ -22,6 +22,7 @@
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.TokenStream;
 import org.apache.lucene.analysis.StopFilter;
+import org.apache.lucene.util.StringHelper;
 
 import java.io.IOException;
 import java.io.Reader;
@@ -137,7 +138,7 @@
    */
   public int addStopWords(IndexReader reader, String fieldName, int maxDocFreq) throws IOException {
     HashSet stopWords = new HashSet();
-    String internedFieldName = fieldName.intern();
+    String internedFieldName = StringHelper.intern(fieldName);
     TermEnum te = reader.terms(new Term(fieldName));
     Term term = te.term();
     while (term != null) {
Index: contrib/queries/src/java/org/apache/lucene/search/trie/AbstractTrieRangeQuery.java
===================================================================
--- contrib/queries/src/java/org/apache/lucene/search/trie/AbstractTrieRangeQuery.java	(revision 766463)
+++ contrib/queries/src/java/org/apache/lucene/search/trie/AbstractTrieRangeQuery.java	Tue Apr 21 00:23:15 MSD 2009
@@ -23,14 +23,14 @@
 import org.apache.lucene.search.MultiTermQuery;
 import org.apache.lucene.search.FilteredTermEnum;
 import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.util.ToStringUtils;
+import org.apache.lucene.util.StringHelper;
 
 abstract class AbstractTrieRangeQuery extends MultiTermQuery {
 
   AbstractTrieRangeQuery(final String field, final int precisionStep,
     Number min, Number max, final boolean minInclusive, final boolean maxInclusive
   ) {
-    this.field = field.intern();
+    this.field = StringHelper.intern(field);
     this.precisionStep = precisionStep;
     this.min = min;
     this.max = max;
Index: src/java/org/apache/lucene/search/FieldSortedHitQueue.java
===================================================================
--- src/java/org/apache/lucene/search/FieldSortedHitQueue.java	(revision 766463)
+++ src/java/org/apache/lucene/search/FieldSortedHitQueue.java	Tue Apr 21 00:23:15 MSD 2009
@@ -19,6 +19,7 @@
 
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.util.PriorityQueue;
+import org.apache.lucene.util.StringHelper;
 
 import java.io.IOException;
 import java.text.Collator;
@@ -230,7 +231,7 @@
    */
   static ScoreDocComparator comparatorByte(final IndexReader reader, final String fieldname, final FieldCache.ByteParser parser)
   throws IOException {
-    final String field = fieldname.intern();
+    final String field = StringHelper.intern(fieldname);
     final byte[] fieldOrder = (parser==null)
 	  ? FieldCache.DEFAULT.getBytes(reader, field)
 	  : FieldCache.DEFAULT.getBytes(reader, field, parser);
@@ -263,7 +264,7 @@
    */
   static ScoreDocComparator comparatorShort(final IndexReader reader, final String fieldname, final FieldCache.ShortParser parser)
   throws IOException {
-    final String field = fieldname.intern();
+    final String field = StringHelper.intern(fieldname);
     final short[] fieldOrder = (parser==null)
 	  ? FieldCache.DEFAULT.getShorts(reader, field)
 	  : FieldCache.DEFAULT.getShorts(reader, field, parser);
@@ -296,7 +297,7 @@
    */
   static ScoreDocComparator comparatorInt (final IndexReader reader, final String fieldname, final FieldCache.IntParser parser)
   throws IOException {
-    final String field = fieldname.intern();
+    final String field = StringHelper.intern(fieldname);
     final int[] fieldOrder = (parser==null)
 	  ? FieldCache.DEFAULT.getInts(reader, field)
 	  : FieldCache.DEFAULT.getInts(reader, field, parser);
@@ -329,7 +330,7 @@
    */
   static ScoreDocComparator comparatorLong (final IndexReader reader, final String fieldname, final ExtendedFieldCache.LongParser parser)
   throws IOException {
-    final String field = fieldname.intern();
+    final String field = StringHelper.intern(fieldname);
     final long[] fieldOrder = (parser==null)
 	  ? ExtendedFieldCache.EXT_DEFAULT.getLongs (reader, field)
 	  : ExtendedFieldCache.EXT_DEFAULT.getLongs (reader, field, parser);
@@ -363,7 +364,7 @@
    */
   static ScoreDocComparator comparatorFloat (final IndexReader reader, final String fieldname, final FieldCache.FloatParser parser)
   throws IOException {
-    final String field = fieldname.intern();
+    final String field = StringHelper.intern(fieldname);
     final float[] fieldOrder = (parser==null)
 	  ? FieldCache.DEFAULT.getFloats (reader, field)
 	  : FieldCache.DEFAULT.getFloats (reader, field, parser);
@@ -396,7 +397,7 @@
    */
   static ScoreDocComparator comparatorDouble(final IndexReader reader, final String fieldname, final ExtendedFieldCache.DoubleParser parser)
   throws IOException {
-    final String field = fieldname.intern();
+    final String field = StringHelper.intern(fieldname);
     final double[] fieldOrder = (parser==null)
 	  ? ExtendedFieldCache.EXT_DEFAULT.getDoubles (reader, field)
 	  : ExtendedFieldCache.EXT_DEFAULT.getDoubles (reader, field, parser);
@@ -429,7 +430,7 @@
    */
   static ScoreDocComparator comparatorString (final IndexReader reader, final String fieldname)
   throws IOException {
-    final String field = fieldname.intern();
+    final String field = StringHelper.intern(fieldname);
     final FieldCache.StringIndex index = FieldCache.DEFAULT.getStringIndex (reader, field);
     return new ScoreDocComparator () {
 
@@ -461,7 +462,7 @@
   static ScoreDocComparator comparatorStringLocale (final IndexReader reader, final String fieldname, final Locale locale)
   throws IOException {
     final Collator collator = Collator.getInstance (locale);
-    final String field = fieldname.intern();
+    final String field = StringHelper.intern(fieldname);
     final String[] index = FieldCache.DEFAULT.getStrings (reader, field);
     return new ScoreDocComparator() {
 
Index: src/java/org/apache/lucene/search/FieldCacheImpl.java
===================================================================
--- src/java/org/apache/lucene/search/FieldCacheImpl.java	(revision 766463)
+++ src/java/org/apache/lucene/search/FieldCacheImpl.java	Tue Apr 21 00:23:15 MSD 2009
@@ -21,6 +21,7 @@
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.TermDocs;
 import org.apache.lucene.index.TermEnum;
+import org.apache.lucene.util.StringHelper;
 
 import java.io.IOException;
 import java.util.HashMap;
@@ -95,7 +96,7 @@
 
     /** Creates one of these objects. */
     Entry (String field, int type, Locale locale) {
-      this.field = field.intern();
+      this.field = StringHelper.intern(field);
       this.type = type;
       this.custom = null;
       this.locale = locale;
@@ -103,7 +104,7 @@
 
     /** Creates one of these objects for a custom comparator/parser. */
     Entry (String field, Object custom) {
-      this.field = field.intern();
+      this.field = StringHelper.intern(field);
       this.type = SortField.CUSTOM;
       this.custom = custom;
       this.locale = null;
@@ -111,7 +112,7 @@
 
     /** Creates one of these objects for a custom type with parser, needed by FieldSortedHitQueue. */
     Entry (String field, int type, Parser parser) {
-      this.field = field.intern();
+      this.field = StringHelper.intern(field);
       this.type = type;
       this.custom = parser;
       this.locale = null;
@@ -337,7 +338,7 @@
 
     protected Object createValue(IndexReader reader, Object fieldKey)
         throws IOException {
-      String field = ((String) fieldKey).intern();
+      String field = StringHelper.intern((String) fieldKey);
       final String[] retArray = new String[reader.maxDoc()];
       TermDocs termDocs = reader.termDocs();
       TermEnum termEnum = reader.terms (new Term (field));
@@ -369,7 +370,7 @@
 
     protected Object createValue(IndexReader reader, Object fieldKey)
         throws IOException {
-      String field = ((String) fieldKey).intern();
+      String field = StringHelper.intern((String) fieldKey);
       final int[] retArray = new int[reader.maxDoc()];
       String[] mterms = new String[reader.maxDoc()+1];
       TermDocs termDocs = reader.termDocs();
@@ -443,7 +444,7 @@
 
     protected Object createValue(IndexReader reader, Object fieldKey)
         throws IOException {
-      String field = ((String)fieldKey).intern();
+      String field = StringHelper.intern(((String)fieldKey));
       TermEnum enumerator = reader.terms (new Term (field));
       try {
         Term term = enumerator.term();
Index: src/test/org/apache/lucene/index/TestStressIndexing2.java
===================================================================
--- src/test/org/apache/lucene/index/TestStressIndexing2.java	(revision 766463)
+++ src/test/org/apache/lucene/index/TestStressIndexing2.java	Tue Apr 21 00:23:15 MSD 2009
@@ -20,6 +20,7 @@
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util._TestUtil;
+import org.apache.lucene.util.StringHelper;
 import org.apache.lucene.search.TermQuery;
 
 import java.util.*;
@@ -266,7 +267,7 @@
     TermDocs termDocs2 = r2.termDocs();
 
     // create mapping from id2 space to id2 based on idField
-    idField = idField.intern();
+    idField = StringHelper.intern(idField);
     TermEnum termEnum = r1.terms (new Term (idField, ""));
     do {
       Term term = termEnum.term();
Index: src/java/org/apache/lucene/search/FieldValueHitQueue.java
===================================================================
--- src/java/org/apache/lucene/search/FieldValueHitQueue.java	(revision 766463)
+++ src/java/org/apache/lucene/search/FieldValueHitQueue.java	Tue Apr 21 00:23:15 MSD 2009
@@ -23,6 +23,7 @@
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.TermEnum;
 import org.apache.lucene.util.PriorityQueue;
+import org.apache.lucene.util.StringHelper;
 
 /**
  * Expert: A hit queue for sorting by hits by terms in more than one field.
@@ -229,7 +230,7 @@
   
   /** Attempts to detect the given field type for an IndexReader. */
   static int detectFieldType(IndexReader reader, String fieldKey) throws IOException {
-    String field = fieldKey.intern();
+    String field = StringHelper.intern(fieldKey);
     TermEnum enumerator = reader.terms(new Term(field));
     try {
       Term term = enumerator.term();
Index: contrib/spellchecker/src/java/org/apache/lucene/search/spell/LuceneDictionary.java
===================================================================
--- contrib/spellchecker/src/java/org/apache/lucene/search/spell/LuceneDictionary.java	(revision 766463)
+++ contrib/spellchecker/src/java/org/apache/lucene/search/spell/LuceneDictionary.java	Tue Apr 21 00:23:15 MSD 2009
@@ -23,6 +23,7 @@
 
 import org.apache.lucene.index.TermEnum;
 import org.apache.lucene.index.Term;
+import org.apache.lucene.util.StringHelper;
 
 import java.io.*;
 
@@ -42,7 +43,7 @@
 
   public LuceneDictionary(IndexReader reader, String field) {
     this.reader = reader;
-    this.field = field.intern();
+    this.field = StringHelper.intern(field);
   }
 
   public final Iterator getWordsIterator() {
Index: contrib/highlighter/src/java/org/apache/lucene/search/highlight/SpanScorer.java
===================================================================
--- contrib/highlighter/src/java/org/apache/lucene/search/highlight/SpanScorer.java	(revision 766463)
+++ contrib/highlighter/src/java/org/apache/lucene/search/highlight/SpanScorer.java	Tue Apr 21 00:23:15 MSD 2009
@@ -11,6 +11,7 @@
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.search.ConstantScoreRangeQuery;
 import org.apache.lucene.search.Query;
+import org.apache.lucene.util.StringHelper;
 
 
 /**
@@ -101,7 +102,7 @@
   public SpanScorer(Query query, String field,
     CachingTokenFilter cachingTokenFilter, IndexReader reader, String defaultField)
     throws IOException {
-    this.defaultField = defaultField.intern();
+    this.defaultField = StringHelper.intern(defaultField);
     init(query, field, cachingTokenFilter, reader, false);
   }
   
@@ -111,7 +112,7 @@
   public SpanScorer(Query query, String field,
     CachingTokenFilter cachingTokenFilter, IndexReader reader, String defaultField, boolean expandMultiTermQuery)
     throws IOException {
-    this.defaultField = defaultField.intern();
+    this.defaultField = StringHelper.intern(defaultField);
     init(query, field, cachingTokenFilter, reader, expandMultiTermQuery);
   }
 
@@ -120,7 +121,7 @@
    */
   public SpanScorer(Query query, String field,
     CachingTokenFilter cachingTokenFilter, String defaultField) throws IOException {
-    this.defaultField = defaultField.intern();
+    this.defaultField = StringHelper.intern(defaultField);
     init(query, field, cachingTokenFilter, null, false);
   }
   
@@ -129,7 +130,7 @@
    */
   public SpanScorer(Query query, String field,
     CachingTokenFilter cachingTokenFilter, String defaultField, boolean expandMultiTermQuery) throws IOException {
-    this.defaultField = defaultField.intern();
+    this.defaultField = StringHelper.intern(defaultField);
     init(query, field, cachingTokenFilter, null, expandMultiTermQuery);
   }
 
Index: contrib/miscellaneous/src/java/org/apache/lucene/index/TermVectorAccessor.java
===================================================================
--- contrib/miscellaneous/src/java/org/apache/lucene/index/TermVectorAccessor.java	(revision 766463)
+++ contrib/miscellaneous/src/java/org/apache/lucene/index/TermVectorAccessor.java	Tue Apr 21 00:23:15 MSD 2009
@@ -1,10 +1,10 @@
 package org.apache.lucene.index;
 
+import org.apache.lucene.util.StringHelper;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Collection;
-import java.util.Iterator;
 /*
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -52,7 +52,7 @@
    */
   public void accept(IndexReader indexReader, int documentNumber, String fieldName, TermVectorMapper mapper) throws IOException {
 
-    fieldName = fieldName.intern();
+    fieldName = StringHelper.intern(fieldName);
 
     decoratedMapper.decorated = mapper;
     decoratedMapper.termVectorStored = false;
Index: src/java/org/apache/lucene/index/FieldsReader.java
===================================================================
--- src/java/org/apache/lucene/index/FieldsReader.java	(revision 766463)
+++ src/java/org/apache/lucene/index/FieldsReader.java	Tue Apr 21 00:23:15 MSD 2009
@@ -24,6 +24,7 @@
 import org.apache.lucene.store.AlreadyClosedException;
 import org.apache.lucene.store.BufferedIndexInput;
 import org.apache.lucene.util.CloseableThreadLocal;
+import org.apache.lucene.util.StringHelper;
 
 import java.io.IOException;
 import java.io.Reader;
@@ -643,7 +644,7 @@
 
       this.isTokenized = tokenize;
 
-      this.name = fi.name.intern();
+      this.name = StringHelper.intern(fi.name);
       this.isIndexed = fi.isIndexed;
       this.omitNorms = fi.omitNorms;          
       this.omitTermFreqAndPositions = fi.omitTermFreqAndPositions;
Index: src/java/org/apache/lucene/document/AbstractField.java
===================================================================
--- src/java/org/apache/lucene/document/AbstractField.java	(revision 766463)
+++ src/java/org/apache/lucene/document/AbstractField.java	Tue Apr 21 00:36:05 MSD 2009
@@ -17,6 +17,7 @@
 
 import org.apache.lucene.search.PhraseQuery; // for javadocs
 import org.apache.lucene.search.spans.SpanQuery; // for javadocs
+import org.apache.lucene.util.StringHelper;
 
 
 /**
@@ -51,7 +52,7 @@
   protected AbstractField(String name, Field.Store store, Field.Index index, Field.TermVector termVector) {
     if (name == null)
       throw new NullPointerException("name cannot be null");
-    this.name = name.intern();        // field names are interned
+    this.name = StringHelper.intern(name);        // field names are interned
 
     if (store == Field.Store.YES){
       this.isStored = true;
Index: contrib/miscellaneous/src/java/org/apache/lucene/index/FieldNormModifier.java
===================================================================
--- contrib/miscellaneous/src/java/org/apache/lucene/index/FieldNormModifier.java	(revision 766463)
+++ contrib/miscellaneous/src/java/org/apache/lucene/index/FieldNormModifier.java	Tue Apr 21 00:23:15 MSD 2009
@@ -22,6 +22,7 @@
 import org.apache.lucene.search.Similarity;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
+import org.apache.lucene.util.StringHelper;
 
 /**
  * Given a directory and a list of fields, updates the fieldNorms in place for every document.
@@ -102,7 +103,7 @@
    * @param field the field whose norms should be reset
    */
   public void reSetNorms(String field) throws IOException {
-    String fieldName = field.intern();
+    String fieldName = StringHelper.intern(field);
     int[] termCounts = new int[0];
     byte[] fakeNorms = new byte[0];
     
Index: src/java/org/apache/lucene/search/SortField.java
===================================================================
--- src/java/org/apache/lucene/search/SortField.java	(revision 766463)
+++ src/java/org/apache/lucene/search/SortField.java	Tue Apr 21 00:23:15 MSD 2009
@@ -17,6 +17,8 @@
  * limitations under the License.
  */
 
+import org.apache.lucene.util.StringHelper;
+
 import java.io.IOException;
 import java.io.Serializable;
 import java.util.Locale;
@@ -262,7 +264,7 @@
       if (type != SCORE && type != DOC)
         throw new IllegalArgumentException("field can only be null when type is SCORE or DOC");
     } else {
-      this.field = field.intern();
+      this.field = StringHelper.intern(field);
     }
   }
 
Index: contrib/miscellaneous/src/java/org/apache/lucene/misc/LengthNormModifier.java
===================================================================
--- contrib/miscellaneous/src/java/org/apache/lucene/misc/LengthNormModifier.java	(revision 766463)
+++ contrib/miscellaneous/src/java/org/apache/lucene/misc/LengthNormModifier.java	Tue Apr 21 00:23:15 MSD 2009
@@ -23,6 +23,7 @@
 import org.apache.lucene.search.Similarity;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
+import org.apache.lucene.util.StringHelper;
 
 import java.io.File;
 import java.io.IOException;
@@ -105,7 +106,7 @@
    * @param field the field whose norms should be reset
    */
   public void reSetNorms(String field) throws IOException {
-    String fieldName = field.intern();
+    String fieldName = StringHelper.intern(field);
     int[] termCounts = new int[0];
     
     IndexReader reader = null;
Index: src/java/org/apache/lucene/index/Term.java
===================================================================
--- src/java/org/apache/lucene/index/Term.java	(revision 766463)
+++ src/java/org/apache/lucene/index/Term.java	Tue Apr 21 00:23:15 MSD 2009
@@ -1,5 +1,7 @@
 package org.apache.lucene.index;
 
+import org.apache.lucene.util.StringHelper;
+
 /**
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -47,7 +49,7 @@
   }
 
   Term(String fld, String txt, boolean intern) {
-    field = intern ? fld.intern() : fld;	  // field names are interned
+    field = intern ? StringHelper.intern(fld) : fld;	  // field names are interned
     text = txt;					  // unless already known to be
   }
 
@@ -117,6 +119,6 @@
     throws java.io.IOException, ClassNotFoundException
   {
       in.defaultReadObject();
-      field = field.intern();
+      field = StringHelper.intern(field);
   }
 }
Index: contrib/instantiated/src/java/org/apache/lucene/store/instantiated/InstantiatedIndexWriter.java
===================================================================
--- contrib/instantiated/src/java/org/apache/lucene/store/instantiated/InstantiatedIndexWriter.java	(revision 766463)
+++ contrib/instantiated/src/java/org/apache/lucene/store/instantiated/InstantiatedIndexWriter.java	Tue Apr 21 00:23:15 MSD 2009
@@ -43,6 +43,7 @@
 import org.apache.lucene.index.TermVectorOffsetInfo;
 import org.apache.lucene.search.DefaultSimilarity;
 import org.apache.lucene.search.Similarity;
+import org.apache.lucene.util.StringHelper;
 
 /**
  * This class, similar to {@link org.apache.lucene.index.IndexWriter}, has no locking mechanism.
@@ -458,7 +459,7 @@
       FieldSetting fieldSetting = fieldSettingsByFieldName.get(field.name());
       if (fieldSetting == null) {
         fieldSetting = new FieldSetting();
-        fieldSetting.fieldName = field.name().intern();
+        fieldSetting.fieldName = StringHelper.intern(field.name());
         fieldSettingsByFieldName.put(fieldSetting.fieldName, fieldSetting);
         fieldNameBuffer.add(fieldSetting.fieldName);
       }
Index: contrib/highlighter/src/java/org/apache/lucene/search/highlight/QueryTermExtractor.java
===================================================================
--- contrib/highlighter/src/java/org/apache/lucene/search/highlight/QueryTermExtractor.java	(revision 766463)
+++ contrib/highlighter/src/java/org/apache/lucene/search/highlight/QueryTermExtractor.java	Tue Apr 21 00:23:15 MSD 2009
@@ -26,6 +26,7 @@
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.FilteredQuery;
 import org.apache.lucene.search.Query;
+import org.apache.lucene.util.StringHelper;
 
 /**
  * Utility class used to extract the terms used in a query, plus any weights.
@@ -95,7 +96,7 @@
 		HashSet terms=new HashSet();
 		if(fieldName!=null)
 		{
-		    fieldName=fieldName.intern();
+		    fieldName= StringHelper.intern(fieldName);
 		}
 		getTerms(query,terms,prohibited,fieldName);
 		return (WeightedTerm[]) terms.toArray(new WeightedTerm[0]);
Index: src/java/org/apache/lucene/index/FieldInfos.java
===================================================================
--- src/java/org/apache/lucene/index/FieldInfos.java	(revision 766463)
+++ src/java/org/apache/lucene/index/FieldInfos.java	Tue Apr 21 00:23:15 MSD 2009
@@ -22,6 +22,7 @@
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.IndexInput;
 import org.apache.lucene.store.IndexOutput;
+import org.apache.lucene.util.StringHelper;
 
 import java.io.IOException;
 import java.util.*;
@@ -214,7 +215,7 @@
   private FieldInfo addInternal(String name, boolean isIndexed,
                                 boolean storeTermVector, boolean storePositionWithTermVector, 
                                 boolean storeOffsetWithTermVector, boolean omitNorms, boolean storePayloads, boolean omitTermFreqAndPositions) {
-    name = name.intern();
+    name = StringHelper.intern(name);
     FieldInfo fi = new FieldInfo(name, isIndexed, byNumber.size(), storeTermVector, storePositionWithTermVector,
                                  storeOffsetWithTermVector, omitNorms, storePayloads, omitTermFreqAndPositions);
     byNumber.add(fi);
@@ -298,7 +299,7 @@
   private void read(IndexInput input) throws IOException {
     int size = input.readVInt();//read in the size
     for (int i = 0; i < size; i++) {
-      String name = input.readString().intern();
+      String name = StringHelper.intern(input.readString());
       byte bits = input.readByte();
       boolean isIndexed = (bits & IS_INDEXED) != 0;
       boolean storeTermVector = (bits & STORE_TERMVECTOR) != 0;
