src/java.base/share/classes/java/util/Scanner.java
Print this page
rev 13685 : 8149656: Examine usages of sun.misc.LRUCache
Reviewed-by:
*** 36,47 ****
import java.util.function.Consumer;
import java.util.regex.*;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
- import sun.misc.LRUCache;
-
/**
* A simple text scanner which can parse primitive types and strings using
* regular expressions.
*
* <p>A {@code Scanner} breaks its input into tokens using a
--- 36,45 ----
*** 364,382 ****
// The locale used by this scanner
private Locale locale = null;
// A cache of the last few recently used Patterns
! private LRUCache<String,Pattern> patternCache =
! new LRUCache<String,Pattern>(7) {
! protected Pattern create(String s) {
! return Pattern.compile(s);
! }
! protected boolean hasName(Pattern p, String s) {
! return p.pattern().equals(s);
! }
! };
// A holder of the last IOException encountered
private IOException lastException;
// Number of times this scanner's state has been modified.
--- 362,372 ----
// The locale used by this scanner
private Locale locale = null;
// A cache of the last few recently used Patterns
! private PatternLRUCache patternCache = new PatternLRUCache(7);
// A holder of the last IOException encountered
private IOException lastException;
// Number of times this scanner's state has been modified.
*** 2836,2841 ****
--- 2826,2877 ----
else
return false; // reached end of input
}
}
}
+
+ /** Utility class for small LRU caches. */
+ private static class PatternLRUCache {
+
+ private Pattern[] oa = null;
+ private final int size;
+
+ PatternLRUCache(int size) {
+ this.size = size;
+ }
+
+ boolean hasName(Pattern p, String s) {
+ return p.pattern().equals(s);
+ }
+
+ void moveToFront(Object[] oa, int i) {
+ Object ob = oa[i];
+ for (int j = i; j > 0; j--)
+ oa[j] = oa[j - 1];
+ oa[0] = ob;
+ }
+
+ Pattern forName(String name) {
+ if (oa == null) {
+ Pattern[] temp = new Pattern[size];
+ oa = temp;
+ } else {
+ for (int i = 0; i < oa.length; i++) {
+ Pattern ob = oa[i];
+ if (ob == null)
+ continue;
+ if (hasName(ob, name)) {
+ if (i > 0)
+ moveToFront(oa, i);
+ return ob;
+ }
+ }
+ }
+
+ // Create a new object
+ Pattern ob = Pattern.compile(name);
+ oa[oa.length - 1] = ob;
+ moveToFront(oa, oa.length - 1);
+ return ob;
+ }
+ }
}