History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/java/util (990 of 18352 files). Show all

Unified · Split

990 files
  1. java/pkg/java/util/AbstractCollection.class +0 −0
  2. java/pkg/java/util/AbstractCollection.java +457 −0
  3. java/pkg/java/util/AbstractList$1.class +0 −0
  4. java/pkg/java/util/AbstractList$Itr.class +0 −0
  5. java/pkg/java/util/AbstractList$ListItr.class +0 −0
  6. java/pkg/java/util/AbstractList.class +0 −0
  7. java/pkg/java/util/AbstractList.java +781 −0
  8. java/pkg/java/util/AbstractMap$1$1.class +0 −0
  9. java/pkg/java/util/AbstractMap$1.class +0 −0
  10. java/pkg/java/util/AbstractMap$2$1.class +0 −0
  11. java/pkg/java/util/AbstractMap$2.class +0 −0
  12. java/pkg/java/util/AbstractMap$SimpleEntry.class +0 −0
  13. java/pkg/java/util/AbstractMap$SimpleImmutableEntry.class +0 −0
  14. java/pkg/java/util/AbstractMap.class +0 −0
  15. java/pkg/java/util/AbstractMap.java +822 −0
  16. java/pkg/java/util/AbstractQueue.class +0 −0
  17. java/pkg/java/util/AbstractQueue.java +192 −0
  18. java/pkg/java/util/AbstractSequentialList.class +0 −0
  19. java/pkg/java/util/AbstractSequentialList.java +253 −0
  20. java/pkg/java/util/AbstractSet.class +0 −0
  21. java/pkg/java/util/AbstractSet.java +185 −0
  22. java/pkg/java/util/ArrayDeque$1.class +0 −0
  23. java/pkg/java/util/ArrayDeque$DeqIterator.class +0 −0
  24. java/pkg/java/util/ArrayDeque$DescendingIterator.class +0 −0
  25. java/pkg/java/util/ArrayDeque.class +0 −0
  26. java/pkg/java/util/ArrayDeque.java +866 −0
  27. java/pkg/java/util/ArrayList$1.class +0 −0
  28. java/pkg/java/util/ArrayList$Itr.class +0 −0
  29. java/pkg/java/util/ArrayList$ListItr.class +0 −0
  30. java/pkg/java/util/ArrayList$SubList$1.class +0 −0
  31. java/pkg/java/util/ArrayList$SubList.class +0 −0
  32. java/pkg/java/util/ArrayList.class +0 −0
  33. java/pkg/java/util/ArrayList.java +1132 −0
  34. java/pkg/java/util/Arrays$ArrayList.class +0 −0
  35. java/pkg/java/util/Arrays$LegacyMergeSort.class +0 −0
  36. java/pkg/java/util/Arrays.class +0 −0
  37. java/pkg/java/util/Arrays.java +3673 −0
  38. java/pkg/java/util/BitSet.class +0 −0
  39. java/pkg/java/util/BitSet.java +1191 −0
  40. java/pkg/java/util/Calendar$1.class +0 −0
  41. java/pkg/java/util/Calendar$CalendarAccessControlContext.class +0 −0
  42. java/pkg/java/util/Calendar.class +0 −0
  43. java/pkg/java/util/Calendar.java +2824 −0
  44. java/pkg/java/util/Collection.class +0 −0
  45. java/pkg/java/util/Collection.java +456 −0
  46. java/pkg/java/util/Collections$1.class +0 −0
  47. java/pkg/java/util/Collections$2.class +0 −0
  48. java/pkg/java/util/Collections$AsLIFOQueue.class +0 −0
  49. java/pkg/java/util/Collections$CheckedCollection$1.class +0 −0
  50. java/pkg/java/util/Collections$CheckedCollection.class +0 −0
  51. java/pkg/java/util/Collections$CheckedList$1.class +0 −0
  52. java/pkg/java/util/Collections$CheckedList.class +0 −0
  53. java/pkg/java/util/Collections$CheckedMap$CheckedEntrySet$1.class +0 −0
  54. java/pkg/java/util/Collections$CheckedMap$CheckedEntrySet$CheckedEntry.class +0 −0
  55. java/pkg/java/util/Collections$CheckedMap$CheckedEntrySet.class +0 −0
  56. java/pkg/java/util/Collections$CheckedMap.class +0 −0
  57. java/pkg/java/util/Collections$CheckedRandomAccessList.class +0 −0
  58. java/pkg/java/util/Collections$CheckedSet.class +0 −0
  59. java/pkg/java/util/Collections$CheckedSortedMap.class +0 −0
  60. java/pkg/java/util/Collections$CheckedSortedSet.class +0 −0
  61. java/pkg/java/util/Collections$CopiesList.class +0 −0
  62. java/pkg/java/util/Collections$EmptyEnumeration.class +0 −0
  63. java/pkg/java/util/Collections$EmptyIterator.class +0 −0
  64. java/pkg/java/util/Collections$EmptyList.class +0 −0
  65. java/pkg/java/util/Collections$EmptyListIterator.class +0 −0
  66. java/pkg/java/util/Collections$EmptyMap.class +0 −0
  67. java/pkg/java/util/Collections$EmptySet.class +0 −0
  68. java/pkg/java/util/Collections$ReverseComparator.class +0 −0
  69. java/pkg/java/util/Collections$ReverseComparator2.class +0 −0
  70. java/pkg/java/util/Collections$SelfComparable.class +0 −0
  71. java/pkg/java/util/Collections$SetFromMap.class +0 −0
  72. java/pkg/java/util/Collections$SingletonList.class +0 −0
  73. java/pkg/java/util/Collections$SingletonMap.class +0 −0
  74. java/pkg/java/util/Collections$SingletonSet.class +0 −0
  75. java/pkg/java/util/Collections$SynchronizedCollection.class +0 −0
  76. java/pkg/java/util/Collections$SynchronizedList.class +0 −0
  77. java/pkg/java/util/Collections$SynchronizedMap.class +0 −0
  78. java/pkg/java/util/Collections$SynchronizedRandomAccessList.class +0 −0
  79. java/pkg/java/util/Collections$SynchronizedSet.class +0 −0
  80. java/pkg/java/util/Collections$SynchronizedSortedMap.class +0 −0
  81. java/pkg/java/util/Collections$SynchronizedSortedSet.class +0 −0
  82. java/pkg/java/util/Collections$UnmodifiableCollection$1.class +0 −0
  83. java/pkg/java/util/Collections$UnmodifiableCollection.class +0 −0
  84. java/pkg/java/util/Collections$UnmodifiableList$1.class +0 −0
  85. java/pkg/java/util/Collections$UnmodifiableList.class +0 −0
  86. java/pkg/java/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$1.class +0 −0
  87. java/pkg/java/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry.class +0 −0
  88. java/pkg/java/util/Collections$UnmodifiableMap$UnmodifiableEntrySet.class +0 −0
  89. java/pkg/java/util/Collections$UnmodifiableMap.class +0 −0
  90. java/pkg/java/util/Collections$UnmodifiableRandomAccessList.class +0 −0
  91. java/pkg/java/util/Collections$UnmodifiableSet.class +0 −0
  92. java/pkg/java/util/Collections$UnmodifiableSortedMap.class +0 −0
  93. java/pkg/java/util/Collections$UnmodifiableSortedSet.class +0 −0
  94. java/pkg/java/util/Collections.class +0 −0
  95. java/pkg/java/util/Collections.java +3966 −0
  96. java/pkg/java/util/ComparableTimSort.class +0 −0
  97. java/pkg/java/util/ComparableTimSort.java +895 −0
  98. java/pkg/java/util/Comparator.class +0 −0
  99. java/pkg/java/util/Comparator.java +168 −0
  100. java/pkg/java/util/ConcurrentModificationException.class +0 −0
  101. java/pkg/java/util/ConcurrentModificationException.java +123 −0
  102. java/pkg/java/util/Currency$1.class +0 −0
  103. java/pkg/java/util/Currency$CurrencyNameGetter.class +0 −0
  104. java/pkg/java/util/Currency.class +0 −0
  105. java/pkg/java/util/Currency.java +741 −0
  106. java/pkg/java/util/CurrencyData.properties +586 −0
  107. java/pkg/java/util/Date.class +0 −0
  108. java/pkg/java/util/Date.java +1331 −0
  109. java/pkg/java/util/Deque.class +0 −0
  110. java/pkg/java/util/Deque.java +584 −0
  111. java/pkg/java/util/Dictionary.class +0 −0
  112. java/pkg/java/util/Dictionary.java +155 −0
  113. java/pkg/java/util/DualPivotQuicksort.class +0 −0
  114. java/pkg/java/util/DualPivotQuicksort.java +3018 −0
  115. java/pkg/java/util/DuplicateFormatFlagsException.class +0 −0
  116. java/pkg/java/util/DuplicateFormatFlagsException.java +68 −0
  117. java/pkg/java/util/EmptyStackException.class +0 −0
  118. java/pkg/java/util/EmptyStackException.java +46 −0
  119. java/pkg/java/util/EnumMap$1.class +0 −0
  120. java/pkg/java/util/EnumMap$EntryIterator$Entry.class +0 −0
  121. java/pkg/java/util/EnumMap$EntryIterator.class +0 −0
  122. java/pkg/java/util/EnumMap$EntrySet.class +0 −0
  123. java/pkg/java/util/EnumMap$EnumMapIterator.class +0 −0
  124. java/pkg/java/util/EnumMap$KeyIterator.class +0 −0
  125. java/pkg/java/util/EnumMap$KeySet.class +0 −0
  126. java/pkg/java/util/EnumMap$ValueIterator.class +0 −0
  127. java/pkg/java/util/EnumMap$Values.class +0 −0
  128. java/pkg/java/util/EnumMap.class +0 −0
  129. java/pkg/java/util/EnumMap.java +799 −0
  130. java/pkg/java/util/EnumSet$SerializationProxy.class +0 −0
  131. java/pkg/java/util/EnumSet.class +0 −0
  132. java/pkg/java/util/EnumSet.java +443 −0
  133. java/pkg/java/util/Enumeration.class +0 −0
  134. java/pkg/java/util/Enumeration.java +79 −0
  135. java/pkg/java/util/EventListener.class +0 −0
  136. java/pkg/java/util/EventListener.java +33 −0
  137. java/pkg/java/util/EventListenerProxy.class +0 −0
  138. java/pkg/java/util/EventListenerProxy.java +75 −0
  139. java/pkg/java/util/EventObject.class +0 −0
  140. java/pkg/java/util/EventObject.java +78 −0
  141. java/pkg/java/util/FormatFlagsConversionMismatchException.class +0 −0
  142. java/pkg/java/util/FormatFlagsConversionMismatchException.java +84 −0
  143. java/pkg/java/util/Formattable.class +0 −0
  144. java/pkg/java/util/Formattable.java +164 −0
  145. java/pkg/java/util/FormattableFlags.class +0 −0
  146. java/pkg/java/util/FormattableFlags.java +75 −0
  147. java/pkg/java/util/Formatter$BigDecimalLayoutForm.class +0 −0
  148. java/pkg/java/util/Formatter$Conversion.class +0 −0
  149. java/pkg/java/util/Formatter$DateTime.class +0 −0
  150. java/pkg/java/util/Formatter$FixedString.class +0 −0
  151. java/pkg/java/util/Formatter$Flags.class +0 −0
  152. java/pkg/java/util/Formatter$FormatSpecifier$BigDecimalLayout.class +0 −0
  153. java/pkg/java/util/Formatter$FormatSpecifier.class +0 −0
  154. java/pkg/java/util/Formatter$FormatString.class +0 −0
  155. java/pkg/java/util/Formatter.class +0 −0
  156. java/pkg/java/util/Formatter.java +4441 −0
  157. java/pkg/java/util/FormatterClosedException.class +0 −0
  158. java/pkg/java/util/FormatterClosedException.java +45 −0
  159. java/pkg/java/util/GregorianCalendar.class +0 −0
  160. java/pkg/java/util/GregorianCalendar.java +3179 −0
  161. java/pkg/java/util/HashMap$1.class +0 −0
  162. java/pkg/java/util/HashMap$Entry.class +0 −0
  163. java/pkg/java/util/HashMap$EntryIterator.class +0 −0
  164. java/pkg/java/util/HashMap$EntrySet.class +0 −0
  165. java/pkg/java/util/HashMap$HashIterator.class +0 −0
  166. java/pkg/java/util/HashMap$KeyIterator.class +0 −0
  167. java/pkg/java/util/HashMap$KeySet.class +0 −0
  168. java/pkg/java/util/HashMap$ValueIterator.class +0 −0
  169. java/pkg/java/util/HashMap$Values.class +0 −0
  170. java/pkg/java/util/HashMap.class +0 −0
  171. java/pkg/java/util/HashMap.java +1051 −0
  172. java/pkg/java/util/HashSet.class +0 −0
  173. java/pkg/java/util/HashSet.java +312 −0
  174. java/pkg/java/util/Hashtable$1.class +0 −0
  175. java/pkg/java/util/Hashtable$Entry.class +0 −0
  176. java/pkg/java/util/Hashtable$EntrySet.class +0 −0
  177. java/pkg/java/util/Hashtable$Enumerator.class +0 −0
  178. java/pkg/java/util/Hashtable$KeySet.class +0 −0
  179. java/pkg/java/util/Hashtable$ValueCollection.class +0 −0
  180. java/pkg/java/util/Hashtable.class +0 −0
  181. java/pkg/java/util/Hashtable.java +1115 −0
  182. java/pkg/java/util/IdentityHashMap$1.class +0 −0
  183. java/pkg/java/util/IdentityHashMap$EntryIterator$Entry.class +0 −0
  184. java/pkg/java/util/IdentityHashMap$EntryIterator.class +0 −0
  185. java/pkg/java/util/IdentityHashMap$EntrySet.class +0 −0
  186. java/pkg/java/util/IdentityHashMap$IdentityHashMapIterator.class +0 −0
  187. java/pkg/java/util/IdentityHashMap$KeyIterator.class +0 −0
  188. java/pkg/java/util/IdentityHashMap$KeySet.class +0 −0
  189. java/pkg/java/util/IdentityHashMap$ValueIterator.class +0 −0
  190. java/pkg/java/util/IdentityHashMap$Values.class +0 −0
  191. java/pkg/java/util/IdentityHashMap.class +0 −0
  192. java/pkg/java/util/IdentityHashMap.java +1243 −0
  193. java/pkg/java/util/IllegalFormatCodePointException.class +0 −0
  194. java/pkg/java/util/IllegalFormatCodePointException.java +69 −0
  195. java/pkg/java/util/IllegalFormatConversionException.class +0 −0
  196. java/pkg/java/util/IllegalFormatConversionException.java +84 −0
  197. java/pkg/java/util/IllegalFormatException.class +0 −0
  198. java/pkg/java/util/IllegalFormatException.java +42 −0
  199. java/pkg/java/util/IllegalFormatFlagsException.class +0 −0
  200. java/pkg/java/util/IllegalFormatFlagsException.java +67 −0
  201. java/pkg/java/util/IllegalFormatPrecisionException.class +0 −0
  202. java/pkg/java/util/IllegalFormatPrecisionException.java +63 −0
  203. java/pkg/java/util/IllegalFormatWidthException.class +0 −0
  204. java/pkg/java/util/IllegalFormatWidthException.java +62 −0
  205. java/pkg/java/util/IllformedLocaleException.class +0 −0
  206. java/pkg/java/util/IllformedLocaleException.java +90 −0
  207. java/pkg/java/util/InputMismatchException.class +0 −0
  208. java/pkg/java/util/InputMismatchException.java +59 −0
  209. java/pkg/java/util/InvalidPropertiesFormatException.class +0 −0
  210. java/pkg/java/util/InvalidPropertiesFormatException.java +90 −0
  211. java/pkg/java/util/Iterator.class +0 −0
  212. java/pkg/java/util/Iterator.java +87 −0
  213. java/pkg/java/util/JapaneseImperialCalendar.class +0 −0
  214. java/pkg/java/util/JapaneseImperialCalendar.java +2383 −0
  215. java/pkg/java/util/JumboEnumSet$EnumSetIterator.class +0 −0
  216. java/pkg/java/util/JumboEnumSet.class +0 −0
  217. java/pkg/java/util/JumboEnumSet.java +375 −0
  218. java/pkg/java/util/LinkedHashMap$1.class +0 −0
  219. java/pkg/java/util/LinkedHashMap$Entry.class +0 −0
  220. java/pkg/java/util/LinkedHashMap$EntryIterator.class +0 −0
  221. java/pkg/java/util/LinkedHashMap$KeyIterator.class +0 −0
  222. java/pkg/java/util/LinkedHashMap$LinkedHashIterator.class +0 −0
  223. java/pkg/java/util/LinkedHashMap$ValueIterator.class +0 −0
  224. java/pkg/java/util/LinkedHashMap.class +0 −0
  225. java/pkg/java/util/LinkedHashMap.java +491 −0
  226. java/pkg/java/util/LinkedHashSet.class +0 −0
  227. java/pkg/java/util/LinkedHashSet.java +171 −0
  228. java/pkg/java/util/LinkedList$1.class +0 −0
  229. java/pkg/java/util/LinkedList$DescendingIterator.class +0 −0
  230. java/pkg/java/util/LinkedList$ListItr.class +0 −0
  231. java/pkg/java/util/LinkedList$Node.class +0 −0
  232. java/pkg/java/util/LinkedList.class +0 −0
  233. java/pkg/java/util/LinkedList.java +1138 −0
  234. java/pkg/java/util/List.class +0 −0
  235. java/pkg/java/util/List.java +600 −0
  236. java/pkg/java/util/ListIterator.class +0 −0
  237. java/pkg/java/util/ListIterator.java +195 −0
  238. java/pkg/java/util/ListResourceBundle.class +0 −0
  239. java/pkg/java/util/ListResourceBundle.java +204 −0
  240. java/pkg/java/util/Locale$1.class +0 −0
  241. java/pkg/java/util/Locale$Builder.class +0 −0
  242. java/pkg/java/util/Locale$Cache.class +0 −0
  243. java/pkg/java/util/Locale$Category.class +0 −0
  244. java/pkg/java/util/Locale$LocaleKey.class +0 −0
  245. java/pkg/java/util/Locale$LocaleNameGetter.class +0 −0
  246. java/pkg/java/util/Locale.class +0 −0
  247. java/pkg/java/util/Locale.java +2560 −0
  248. java/pkg/java/util/LocaleISOData.class +0 −0
  249. java/pkg/java/util/LocaleISOData.java +478 −0
  250. java/pkg/java/util/Map$Entry.class +0 −0
  251. java/pkg/java/util/Map.class +0 −0
  252. java/pkg/java/util/Map.java +478 −0
  253. java/pkg/java/util/MissingFormatArgumentException.class +0 −0
  254. java/pkg/java/util/MissingFormatArgumentException.java +70 −0
  255. java/pkg/java/util/MissingFormatWidthException.class +0 −0
  256. java/pkg/java/util/MissingFormatWidthException.java +68 −0
  257. java/pkg/java/util/MissingResourceException.class +0 −0
  258. java/pkg/java/util/MissingResourceException.java +124 −0
  259. java/pkg/java/util/NavigableMap.class +0 −0
  260. java/pkg/java/util/NavigableMap.java +424 −0
  261. java/pkg/java/util/NavigableSet.class +0 −0
  262. java/pkg/java/util/NavigableSet.java +319 −0
  263. java/pkg/java/util/NoSuchElementException.class +0 −0
  264. java/pkg/java/util/NoSuchElementException.java +60 −0
  265. java/pkg/java/util/Objects.class +0 −0
  266. java/pkg/java/util/Objects.java +229 −0
  267. java/pkg/java/util/Observable.class +0 −0
  268. java/pkg/java/util/Observable.java +213 −0
  269. java/pkg/java/util/Observer.class +0 −0
  270. java/pkg/java/util/Observer.java +47 −0
  271. java/pkg/java/util/PriorityQueue$1.class +0 −0
  272. java/pkg/java/util/PriorityQueue$Itr.class +0 −0
  273. java/pkg/java/util/PriorityQueue.class +0 −0
  274. java/pkg/java/util/PriorityQueue.java +775 −0
  275. java/pkg/java/util/Properties$LineReader.class +0 −0
  276. java/pkg/java/util/Properties.class +0 −0
  277. java/pkg/java/util/Properties.java +1114 −0
  278. java/pkg/java/util/PropertyPermission.class +0 −0
  279. java/pkg/java/util/PropertyPermission.java +667 −0
  280. java/pkg/java/util/PropertyPermissionCollection.class +0 −0
  281. java/pkg/java/util/PropertyResourceBundle.class +0 −0
  282. java/pkg/java/util/PropertyResourceBundle.java +190 −0
  283. java/pkg/java/util/Queue.class +0 −0
  284. java/pkg/java/util/Queue.java +218 −0
  285. java/pkg/java/util/Random.class +0 −0
  286. java/pkg/java/util/Random.java +575 −0
  287. java/pkg/java/util/RandomAccess.class +0 −0
  288. java/pkg/java/util/RandomAccess.java +68 −0
  289. java/pkg/java/util/RandomAccessSubList.class +0 −0
  290. java/pkg/java/util/RegularEnumSet$EnumSetIterator.class +0 −0
  291. java/pkg/java/util/RegularEnumSet.class +0 −0
  292. java/pkg/java/util/RegularEnumSet.java +303 −0
  293. java/pkg/java/util/ResourceBundle$1.class +0 −0
  294. java/pkg/java/util/ResourceBundle$BundleReference.class +0 −0
  295. java/pkg/java/util/ResourceBundle$CacheKey.class +0 −0
  296. java/pkg/java/util/ResourceBundle$CacheKeyReference.class +0 −0
  297. java/pkg/java/util/ResourceBundle$Control$1.class +0 −0
  298. java/pkg/java/util/ResourceBundle$Control$CandidateListCache.class +0 −0
  299. java/pkg/java/util/ResourceBundle$Control.class +0 −0
  300. java/pkg/java/util/ResourceBundle$LoaderReference.class +0 −0
  301. java/pkg/java/util/ResourceBundle$NoFallbackControl.class +0 −0
  302. java/pkg/java/util/ResourceBundle$RBClassLoader$1.class +0 −0
  303. java/pkg/java/util/ResourceBundle$RBClassLoader.class +0 −0
  304. java/pkg/java/util/ResourceBundle$SingleFormatControl.class +0 −0
  305. java/pkg/java/util/ResourceBundle.class +0 −0
  306. java/pkg/java/util/ResourceBundle.java +2911 −0
  307. java/pkg/java/util/Scanner$1.class +0 −0
  308. java/pkg/java/util/Scanner.class +0 −0
  309. java/pkg/java/util/Scanner.java +2660 −0
  310. java/pkg/java/util/ServiceConfigurationError.class +0 −0
  311. java/pkg/java/util/ServiceConfigurationError.java +87 −0
  312. java/pkg/java/util/ServiceLoader$1.class +0 −0
  313. java/pkg/java/util/ServiceLoader$LazyIterator.class +0 −0
  314. java/pkg/java/util/ServiceLoader.class +0 −0
  315. java/pkg/java/util/ServiceLoader.java +538 −0
  316. java/pkg/java/util/Set.class +0 −0
  317. java/pkg/java/util/Set.java +385 −0
  318. java/pkg/java/util/SimpleTimeZone.class +0 −0
  319. java/pkg/java/util/SimpleTimeZone.java +1706 −0
  320. java/pkg/java/util/SortedMap.class +0 −0
  321. java/pkg/java/util/SortedMap.java +284 −0
  322. java/pkg/java/util/SortedSet.class +0 −0
  323. java/pkg/java/util/SortedSet.java +222 −0
  324. java/pkg/java/util/Stack.class +0 −0
  325. java/pkg/java/util/Stack.java +141 −0
  326. java/pkg/java/util/StringTokenizer.class +0 −0
  327. java/pkg/java/util/StringTokenizer.java +431 −0
  328. java/pkg/java/util/SubList$1.class +0 −0
  329. java/pkg/java/util/SubList.class +0 −0
  330. java/pkg/java/util/TaskQueue.class +0 −0
  331. java/pkg/java/util/TimSort.class +0 −0
  332. java/pkg/java/util/TimSort.java +928 −0
  333. java/pkg/java/util/TimeZone$1.class +0 −0
  334. java/pkg/java/util/TimeZone$DisplayNames.class +0 −0
  335. java/pkg/java/util/TimeZone.class +0 −0
  336. java/pkg/java/util/TimeZone.java +864 −0
  337. java/pkg/java/util/Timer$1.class +0 −0
  338. java/pkg/java/util/Timer.class +0 −0
  339. java/pkg/java/util/Timer.java +720 −0
  340. java/pkg/java/util/TimerTask.class +0 −0
  341. java/pkg/java/util/TimerTask.java +158 −0
  342. java/pkg/java/util/TimerThread.class +0 −0
  343. java/pkg/java/util/TooManyListenersException.class +0 −0
  344. java/pkg/java/util/TooManyListenersException.java +71 −0
  345. java/pkg/java/util/TreeMap$AscendingSubMap$AscendingEntrySetView.class +0 −0
  346. java/pkg/java/util/TreeMap$AscendingSubMap.class +0 −0
  347. java/pkg/java/util/TreeMap$DescendingKeyIterator.class +0 −0
  348. java/pkg/java/util/TreeMap$DescendingSubMap$DescendingEntrySetView.class +0 −0
  349. java/pkg/java/util/TreeMap$DescendingSubMap.class +0 −0
  350. java/pkg/java/util/TreeMap$Entry.class +0 −0
  351. java/pkg/java/util/TreeMap$EntryIterator.class +0 −0
  352. java/pkg/java/util/TreeMap$EntrySet.class +0 −0
  353. java/pkg/java/util/TreeMap$KeyIterator.class +0 −0
  354. java/pkg/java/util/TreeMap$KeySet.class +0 −0
  355. java/pkg/java/util/TreeMap$NavigableSubMap$DescendingSubMapEntryIterator.class +0 −0
  356. java/pkg/java/util/TreeMap$NavigableSubMap$DescendingSubMapKeyIterator.class +0 −0
  357. java/pkg/java/util/TreeMap$NavigableSubMap$EntrySetView.class +0 −0
  358. java/pkg/java/util/TreeMap$NavigableSubMap$SubMapEntryIterator.class +0 −0
  359. java/pkg/java/util/TreeMap$NavigableSubMap$SubMapIterator.class +0 −0
  360. java/pkg/java/util/TreeMap$NavigableSubMap$SubMapKeyIterator.class +0 −0
  361. java/pkg/java/util/TreeMap$NavigableSubMap.class +0 −0
  362. java/pkg/java/util/TreeMap$PrivateEntryIterator.class +0 −0
  363. java/pkg/java/util/TreeMap$SubMap.class +0 −0
  364. java/pkg/java/util/TreeMap$ValueIterator.class +0 −0
  365. java/pkg/java/util/TreeMap$Values.class +0 −0
  366. java/pkg/java/util/TreeMap.class +0 −0
  367. java/pkg/java/util/TreeMap.java +2442 −0
  368. java/pkg/java/util/TreeSet.class +0 −0
  369. java/pkg/java/util/TreeSet.java +539 −0
  370. java/pkg/java/util/UUID.class +0 −0
  371. java/pkg/java/util/UUID.java +443 −0
  372. java/pkg/java/util/UnknownFormatConversionException.class +0 −0
  373. java/pkg/java/util/UnknownFormatConversionException.java +68 −0
  374. java/pkg/java/util/UnknownFormatFlagsException.class +0 −0
  375. java/pkg/java/util/UnknownFormatFlagsException.java +68 −0
  376. java/pkg/java/util/Vector$1.class +0 −0
  377. java/pkg/java/util/Vector$Itr.class +0 −0
  378. java/pkg/java/util/Vector$ListItr.class +0 −0
  379. java/pkg/java/util/Vector.class +0 −0
  380. java/pkg/java/util/Vector.java +1212 −0
  381. java/pkg/java/util/WeakHashMap$1.class +0 −0
  382. java/pkg/java/util/WeakHashMap$Entry.class +0 −0
  383. java/pkg/java/util/WeakHashMap$EntryIterator.class +0 −0
  384. java/pkg/java/util/WeakHashMap$EntrySet.class +0 −0
  385. java/pkg/java/util/WeakHashMap$HashIterator.class +0 −0
  386. java/pkg/java/util/WeakHashMap$KeyIterator.class +0 −0
  387. java/pkg/java/util/WeakHashMap$KeySet.class +0 −0
  388. java/pkg/java/util/WeakHashMap$ValueIterator.class +0 −0
  389. java/pkg/java/util/WeakHashMap$Values.class +0 −0
  390. java/pkg/java/util/WeakHashMap.class +0 −0
  391. java/pkg/java/util/WeakHashMap.java +972 −0
  392. java/pkg/java/util/XMLUtils$1.class +0 −0
  393. java/pkg/java/util/XMLUtils$EH.class +0 −0
  394. java/pkg/java/util/XMLUtils$Resolver.class +0 −0
  395. java/pkg/java/util/XMLUtils.class +0 −0
  396. java/pkg/java/util/XMLUtils.java +206 −0
  397. java/pkg/java/util/concurrent/AbstractExecutorService.class +0 −0
  398. java/pkg/java/util/concurrent/AbstractExecutorService.java +309 −0
  399. java/pkg/java/util/concurrent/ArrayBlockingQueue$Itr.class +0 −0
  400. java/pkg/java/util/concurrent/ArrayBlockingQueue.class +0 −0
  401. java/pkg/java/util/concurrent/ArrayBlockingQueue.java +805 −0
  402. java/pkg/java/util/concurrent/BlockingDeque.class +0 −0
  403. java/pkg/java/util/concurrent/BlockingDeque.java +650 −0
  404. java/pkg/java/util/concurrent/BlockingQueue.class +0 −0
  405. java/pkg/java/util/concurrent/BlockingQueue.java +377 −0
  406. java/pkg/java/util/concurrent/BrokenBarrierException.class +0 −0
  407. java/pkg/java/util/concurrent/BrokenBarrierException.java +67 −0
  408. java/pkg/java/util/concurrent/Callable.class +0 −0
  409. java/pkg/java/util/concurrent/Callable.java +65 −0
  410. java/pkg/java/util/concurrent/CancellationException.class +0 −0
  411. java/pkg/java/util/concurrent/CancellationException.java +63 −0
  412. java/pkg/java/util/concurrent/CompletionService.class +0 −0
  413. java/pkg/java/util/concurrent/CompletionService.java +126 −0
  414. java/pkg/java/util/concurrent/ConcurrentHashMap$EntryIterator.class +0 −0
  415. java/pkg/java/util/concurrent/ConcurrentHashMap$EntrySet.class +0 −0
  416. java/pkg/java/util/concurrent/ConcurrentHashMap$HashEntry.class +0 −0
  417. java/pkg/java/util/concurrent/ConcurrentHashMap$HashIterator.class +0 −0
  418. java/pkg/java/util/concurrent/ConcurrentHashMap$KeyIterator.class +0 −0
  419. java/pkg/java/util/concurrent/ConcurrentHashMap$KeySet.class +0 −0
  420. java/pkg/java/util/concurrent/ConcurrentHashMap$Segment.class +0 −0
  421. java/pkg/java/util/concurrent/ConcurrentHashMap$ValueIterator.class +0 −0
  422. java/pkg/java/util/concurrent/ConcurrentHashMap$Values.class +0 −0
  423. java/pkg/java/util/concurrent/ConcurrentHashMap$WriteThroughEntry.class +0 −0
  424. java/pkg/java/util/concurrent/ConcurrentHashMap.class +0 −0
  425. java/pkg/java/util/concurrent/ConcurrentHashMap.java +1522 −0
  426. java/pkg/java/util/concurrent/ConcurrentLinkedDeque$1.class +0 −0
  427. java/pkg/java/util/concurrent/ConcurrentLinkedDeque$AbstractItr.class +0 −0
  428. java/pkg/java/util/concurrent/ConcurrentLinkedDeque$DescendingItr.class +0 −0
  429. java/pkg/java/util/concurrent/ConcurrentLinkedDeque$Itr.class +0 −0
  430. java/pkg/java/util/concurrent/ConcurrentLinkedDeque$Node.class +0 −0
  431. java/pkg/java/util/concurrent/ConcurrentLinkedDeque.class +0 −0
  432. java/pkg/java/util/concurrent/ConcurrentLinkedDeque.java +1469 −0
  433. java/pkg/java/util/concurrent/ConcurrentLinkedQueue$Itr.class +0 −0
  434. java/pkg/java/util/concurrent/ConcurrentLinkedQueue$Node.class +0 −0
  435. java/pkg/java/util/concurrent/ConcurrentLinkedQueue.class +0 −0
  436. java/pkg/java/util/concurrent/ConcurrentLinkedQueue.java +835 −0
  437. java/pkg/java/util/concurrent/ConcurrentMap.class +0 −0
  438. java/pkg/java/util/concurrent/ConcurrentMap.java +165 −0
  439. java/pkg/java/util/concurrent/ConcurrentNavigableMap.class +0 −0
  440. java/pkg/java/util/concurrent/ConcurrentNavigableMap.java +177 −0
  441. java/pkg/java/util/concurrent/ConcurrentSkipListMap$ComparableUsingComparator.class +0 −0
  442. java/pkg/java/util/concurrent/ConcurrentSkipListMap$EntryIterator.class +0 −0
  443. java/pkg/java/util/concurrent/ConcurrentSkipListMap$EntrySet.class +0 −0
  444. java/pkg/java/util/concurrent/ConcurrentSkipListMap$HeadIndex.class +0 −0
  445. java/pkg/java/util/concurrent/ConcurrentSkipListMap$Index.class +0 −0
  446. java/pkg/java/util/concurrent/ConcurrentSkipListMap$Iter.class +0 −0
  447. java/pkg/java/util/concurrent/ConcurrentSkipListMap$KeyIterator.class +0 −0
  448. java/pkg/java/util/concurrent/ConcurrentSkipListMap$KeySet.class +0 −0
  449. java/pkg/java/util/concurrent/ConcurrentSkipListMap$Node.class +0 −0
  450. java/pkg/java/util/concurrent/ConcurrentSkipListMap$SubMap$SubMapEntryIterator.class +0 −0
  451. java/pkg/java/util/concurrent/ConcurrentSkipListMap$SubMap$SubMapIter.class +0 −0
  452. java/pkg/java/util/concurrent/ConcurrentSkipListMap$SubMap$SubMapKeyIterator.class +0 −0
  453. java/pkg/java/util/concurrent/ConcurrentSkipListMap$SubMap$SubMapValueIterator.class +0 −0
  454. java/pkg/java/util/concurrent/ConcurrentSkipListMap$SubMap.class +0 −0
  455. java/pkg/java/util/concurrent/ConcurrentSkipListMap$ValueIterator.class +0 −0
  456. java/pkg/java/util/concurrent/ConcurrentSkipListMap$Values.class +0 −0
  457. java/pkg/java/util/concurrent/ConcurrentSkipListMap.class +0 −0
  458. java/pkg/java/util/concurrent/ConcurrentSkipListMap.java +3119 −0
  459. java/pkg/java/util/concurrent/ConcurrentSkipListSet.class +0 −0
  460. java/pkg/java/util/concurrent/ConcurrentSkipListSet.java +491 −0
  461. java/pkg/java/util/concurrent/CopyOnWriteArrayList$1.class +0 −0
  462. java/pkg/java/util/concurrent/CopyOnWriteArrayList$COWIterator.class +0 −0
  463. java/pkg/java/util/concurrent/CopyOnWriteArrayList$COWSubList.class +0 −0
  464. java/pkg/java/util/concurrent/CopyOnWriteArrayList$COWSubListIterator.class +0 −0
  465. java/pkg/java/util/concurrent/CopyOnWriteArrayList.class +0 −0
  466. java/pkg/java/util/concurrent/CopyOnWriteArrayList.java +1340 −0
  467. java/pkg/java/util/concurrent/CopyOnWriteArraySet.class +0 −0
  468. java/pkg/java/util/concurrent/CopyOnWriteArraySet.java +392 −0
  469. java/pkg/java/util/concurrent/CountDownLatch$Sync.class +0 −0
  470. java/pkg/java/util/concurrent/CountDownLatch.class +0 −0
  471. java/pkg/java/util/concurrent/CountDownLatch.java +320 −0
  472. java/pkg/java/util/concurrent/CyclicBarrier$1.class +0 −0
  473. java/pkg/java/util/concurrent/CyclicBarrier$Generation.class +0 −0
  474. java/pkg/java/util/concurrent/CyclicBarrier.class +0 −0
  475. java/pkg/java/util/concurrent/CyclicBarrier.java +483 −0
  476. java/pkg/java/util/concurrent/DelayQueue$Itr.class +0 −0
  477. java/pkg/java/util/concurrent/DelayQueue.class +0 −0
  478. java/pkg/java/util/concurrent/DelayQueue.java +546 −0
  479. java/pkg/java/util/concurrent/Delayed.class +0 −0
  480. java/pkg/java/util/concurrent/Delayed.java +62 −0
  481. java/pkg/java/util/concurrent/Exchanger$1.class +0 −0
  482. java/pkg/java/util/concurrent/Exchanger$Node.class +0 −0
  483. java/pkg/java/util/concurrent/Exchanger$Slot.class +0 −0
  484. java/pkg/java/util/concurrent/Exchanger.class +0 −0
  485. java/pkg/java/util/concurrent/Exchanger.java +687 −0
  486. java/pkg/java/util/concurrent/ExecutionException.class +0 −0
  487. java/pkg/java/util/concurrent/ExecutionException.java +94 −0
  488. java/pkg/java/util/concurrent/Executor.class +0 −0
  489. java/pkg/java/util/concurrent/Executor.java +141 −0
  490. java/pkg/java/util/concurrent/ExecutorCompletionService$QueueingFuture.class +0 −0
  491. java/pkg/java/util/concurrent/ExecutorCompletionService.class +0 −0
  492. java/pkg/java/util/concurrent/ExecutorCompletionService.java +205 −0
  493. java/pkg/java/util/concurrent/ExecutorService.class +0 −0
  494. java/pkg/java/util/concurrent/ExecutorService.java +370 −0
  495. java/pkg/java/util/concurrent/Executors$1.class +0 −0
  496. java/pkg/java/util/concurrent/Executors$2.class +0 −0
  497. java/pkg/java/util/concurrent/Executors$DefaultThreadFactory.class +0 −0
  498. java/pkg/java/util/concurrent/Executors$DelegatedExecutorService.class +0 −0
  499. java/pkg/java/util/concurrent/Executors$DelegatedScheduledExecutorService.class +0 −0
  500. java/pkg/java/util/concurrent/Executors$FinalizableDelegatedExecutorService.class +0 −0
  501. java/pkg/java/util/concurrent/Executors$PrivilegedCallable$1.class +0 −0
  502. java/pkg/java/util/concurrent/Executors$PrivilegedCallable.class +0 −0
  503. java/pkg/java/util/concurrent/Executors$PrivilegedCallableUsingCurrentClassLoader$1.class +0 −0
  504. java/pkg/java/util/concurrent/Executors$PrivilegedCallableUsingCurrentClassLoader.class +0 −0
  505. java/pkg/java/util/concurrent/Executors$PrivilegedThreadFactory$1$1.class +0 −0
  506. java/pkg/java/util/concurrent/Executors$PrivilegedThreadFactory$1.class +0 −0
  507. java/pkg/java/util/concurrent/Executors$PrivilegedThreadFactory.class +0 −0
  508. java/pkg/java/util/concurrent/Executors$RunnableAdapter.class +0 −0
  509. java/pkg/java/util/concurrent/Executors.class +0 −0
  510. java/pkg/java/util/concurrent/Executors.java +706 −0
  511. java/pkg/java/util/concurrent/ForkJoinPool$DefaultForkJoinWorkerThreadFactory.class +0 −0
  512. java/pkg/java/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory.class +0 −0
  513. java/pkg/java/util/concurrent/ForkJoinPool$InvokeAll.class +0 −0
  514. java/pkg/java/util/concurrent/ForkJoinPool$ManagedBlocker.class +0 −0
  515. java/pkg/java/util/concurrent/ForkJoinPool.class +0 −0
  516. java/pkg/java/util/concurrent/ForkJoinPool.java +2177 −0
  517. java/pkg/java/util/concurrent/ForkJoinTask$AdaptedCallable.class +0 −0
  518. java/pkg/java/util/concurrent/ForkJoinTask$AdaptedRunnable.class +0 −0
  519. java/pkg/java/util/concurrent/ForkJoinTask$ExceptionNode.class +0 −0
  520. java/pkg/java/util/concurrent/ForkJoinTask.class +0 −0
  521. java/pkg/java/util/concurrent/ForkJoinTask.java +1386 −0
  522. java/pkg/java/util/concurrent/ForkJoinWorkerThread.class +0 −0
  523. java/pkg/java/util/concurrent/ForkJoinWorkerThread.java +998 −0
  524. java/pkg/java/util/concurrent/Future.class +0 −0
  525. java/pkg/java/util/concurrent/Future.java +169 −0
  526. java/pkg/java/util/concurrent/FutureTask$Sync.class +0 −0
  527. java/pkg/java/util/concurrent/FutureTask.class +0 −0
  528. java/pkg/java/util/concurrent/FutureTask.java +360 −0
  529. java/pkg/java/util/concurrent/LinkedBlockingDeque$1.class +0 −0
  530. java/pkg/java/util/concurrent/LinkedBlockingDeque$AbstractItr.class +0 −0
  531. java/pkg/java/util/concurrent/LinkedBlockingDeque$DescendingItr.class +0 −0
  532. java/pkg/java/util/concurrent/LinkedBlockingDeque$Itr.class +0 −0
  533. java/pkg/java/util/concurrent/LinkedBlockingDeque$Node.class +0 −0
  534. java/pkg/java/util/concurrent/LinkedBlockingDeque.class +0 −0
  535. java/pkg/java/util/concurrent/LinkedBlockingDeque.java +1198 −0
  536. java/pkg/java/util/concurrent/LinkedBlockingQueue$Itr.class +0 −0
  537. java/pkg/java/util/concurrent/LinkedBlockingQueue$Node.class +0 −0
  538. java/pkg/java/util/concurrent/LinkedBlockingQueue.class +0 −0
  539. java/pkg/java/util/concurrent/LinkedBlockingQueue.java +910 −0
  540. java/pkg/java/util/concurrent/LinkedTransferQueue$Itr.class +0 −0
  541. java/pkg/java/util/concurrent/LinkedTransferQueue$Node.class +0 −0
  542. java/pkg/java/util/concurrent/LinkedTransferQueue.class +0 −0
  543. java/pkg/java/util/concurrent/LinkedTransferQueue.java +1351 −0
  544. java/pkg/java/util/concurrent/Phaser$QNode.class +0 −0
  545. java/pkg/java/util/concurrent/Phaser.class +0 −0
  546. java/pkg/java/util/concurrent/Phaser.java +1152 −0
  547. java/pkg/java/util/concurrent/PriorityBlockingQueue$Itr.class +0 −0
  548. java/pkg/java/util/concurrent/PriorityBlockingQueue.class +0 −0
  549. java/pkg/java/util/concurrent/PriorityBlockingQueue.java +978 −0
  550. java/pkg/java/util/concurrent/RecursiveAction.class +0 −0
  551. java/pkg/java/util/concurrent/RecursiveAction.java +181 −0
  552. java/pkg/java/util/concurrent/RecursiveTask.class +0 −0
  553. java/pkg/java/util/concurrent/RecursiveTask.java +97 −0
  554. java/pkg/java/util/concurrent/RejectedExecutionException.class +0 −0
  555. java/pkg/java/util/concurrent/RejectedExecutionException.java +91 −0
  556. java/pkg/java/util/concurrent/RejectedExecutionHandler.class +0 −0
  557. java/pkg/java/util/concurrent/RejectedExecutionHandler.java +62 −0
  558. java/pkg/java/util/concurrent/RunnableFuture.class +0 −0
  559. java/pkg/java/util/concurrent/RunnableFuture.java +54 −0
  560. java/pkg/java/util/concurrent/RunnableScheduledFuture.class +0 −0
  561. java/pkg/java/util/concurrent/RunnableScheduledFuture.java +58 −0
  562. java/pkg/java/util/concurrent/ScheduledExecutorService.class +0 −0
  563. java/pkg/java/util/concurrent/ScheduledExecutorService.java +187 −0
  564. java/pkg/java/util/concurrent/ScheduledFuture.class +0 −0
  565. java/pkg/java/util/concurrent/ScheduledFuture.java +48 −0
  566. java/pkg/java/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue$Itr.class +0 −0
  567. java/pkg/java/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue.class +0 −0
  568. java/pkg/java/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask.class +0 −0
  569. java/pkg/java/util/concurrent/ScheduledThreadPoolExecutor.class +0 −0
  570. java/pkg/java/util/concurrent/ScheduledThreadPoolExecutor.java +1277 −0
  571. java/pkg/java/util/concurrent/Semaphore$FairSync.class +0 −0
  572. java/pkg/java/util/concurrent/Semaphore$NonfairSync.class +0 −0
  573. java/pkg/java/util/concurrent/Semaphore$Sync.class +0 −0
  574. java/pkg/java/util/concurrent/Semaphore.class +0 −0
  575. java/pkg/java/util/concurrent/Semaphore.java +713 −0
  576. java/pkg/java/util/concurrent/SynchronousQueue$FifoWaitQueue.class +0 −0
  577. java/pkg/java/util/concurrent/SynchronousQueue$LifoWaitQueue.class +0 −0
  578. java/pkg/java/util/concurrent/SynchronousQueue$TransferQueue$QNode.class +0 −0
  579. java/pkg/java/util/concurrent/SynchronousQueue$TransferQueue.class +0 −0
  580. java/pkg/java/util/concurrent/SynchronousQueue$TransferStack$SNode.class +0 −0
  581. java/pkg/java/util/concurrent/SynchronousQueue$TransferStack.class +0 −0
  582. java/pkg/java/util/concurrent/SynchronousQueue$Transferer.class +0 −0
  583. java/pkg/java/util/concurrent/SynchronousQueue$WaitQueue.class +0 −0
  584. java/pkg/java/util/concurrent/SynchronousQueue.class +0 −0
  585. java/pkg/java/util/concurrent/SynchronousQueue.java +1196 −0
  586. java/pkg/java/util/concurrent/ThreadFactory.class +0 −0
  587. java/pkg/java/util/concurrent/ThreadFactory.java +70 −0
  588. java/pkg/java/util/concurrent/ThreadLocalRandom$1.class +0 −0
  589. java/pkg/java/util/concurrent/ThreadLocalRandom.class +0 −0
  590. java/pkg/java/util/concurrent/ThreadLocalRandom.java +226 −0
  591. java/pkg/java/util/concurrent/ThreadPoolExecutor$AbortPolicy.class +0 −0
  592. java/pkg/java/util/concurrent/ThreadPoolExecutor$CallerRunsPolicy.class +0 −0
  593. java/pkg/java/util/concurrent/ThreadPoolExecutor$DiscardOldestPolicy.class +0 −0
  594. java/pkg/java/util/concurrent/ThreadPoolExecutor$DiscardPolicy.class +0 −0
  595. java/pkg/java/util/concurrent/ThreadPoolExecutor$Worker.class +0 −0
  596. java/pkg/java/util/concurrent/ThreadPoolExecutor.class +0 −0
  597. java/pkg/java/util/concurrent/ThreadPoolExecutor.java +2054 −0
  598. java/pkg/java/util/concurrent/TimeUnit$1.class +0 −0
  599. java/pkg/java/util/concurrent/TimeUnit$2.class +0 −0
  600. java/pkg/java/util/concurrent/TimeUnit$3.class +0 −0
  601. java/pkg/java/util/concurrent/TimeUnit$4.class +0 −0
  602. java/pkg/java/util/concurrent/TimeUnit$5.class +0 −0
  603. java/pkg/java/util/concurrent/TimeUnit$6.class +0 −0
  604. java/pkg/java/util/concurrent/TimeUnit$7.class +0 −0
  605. java/pkg/java/util/concurrent/TimeUnit.class +0 −0
  606. java/pkg/java/util/concurrent/TimeUnit.java +364 −0
  607. java/pkg/java/util/concurrent/TimeoutException.class +0 −0
  608. java/pkg/java/util/concurrent/TimeoutException.java +67 −0
  609. java/pkg/java/util/concurrent/TransferQueue.class +0 −0
  610. java/pkg/java/util/concurrent/TransferQueue.java +161 −0
  611. java/pkg/java/util/concurrent/atomic/AtomicBoolean.class +0 −0
  612. java/pkg/java/util/concurrent/atomic/AtomicBoolean.java +164 −0
  613. java/pkg/java/util/concurrent/atomic/AtomicInteger.class +0 −0
  614. java/pkg/java/util/concurrent/atomic/AtomicInteger.java +265 −0
  615. java/pkg/java/util/concurrent/atomic/AtomicIntegerArray.class +0 −0
  616. java/pkg/java/util/concurrent/atomic/AtomicIntegerArray.java +284 −0
  617. java/pkg/java/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl.class +0 −0
  618. java/pkg/java/util/concurrent/atomic/AtomicIntegerFieldUpdater.class +0 −0
  619. java/pkg/java/util/concurrent/atomic/AtomicIntegerFieldUpdater.java +346 −0
  620. java/pkg/java/util/concurrent/atomic/AtomicLong.class +0 −0
  621. java/pkg/java/util/concurrent/atomic/AtomicLong.java +279 −0
  622. java/pkg/java/util/concurrent/atomic/AtomicLongArray.class +0 −0
  623. java/pkg/java/util/concurrent/atomic/AtomicLongArray.java +284 −0
  624. java/pkg/java/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater.class +0 −0
  625. java/pkg/java/util/concurrent/atomic/AtomicLongFieldUpdater$LockedUpdater.class +0 −0
  626. java/pkg/java/util/concurrent/atomic/AtomicLongFieldUpdater.class +0 −0
  627. java/pkg/java/util/concurrent/atomic/AtomicLongFieldUpdater.java +436 −0
  628. java/pkg/java/util/concurrent/atomic/AtomicMarkableReference$Pair.class +0 −0
  629. java/pkg/java/util/concurrent/atomic/AtomicMarkableReference.class +0 −0
  630. java/pkg/java/util/concurrent/atomic/AtomicMarkableReference.java +212 −0
  631. java/pkg/java/util/concurrent/atomic/AtomicReference.class +0 −0
  632. java/pkg/java/util/concurrent/atomic/AtomicReference.java +155 −0
  633. java/pkg/java/util/concurrent/atomic/AtomicReferenceArray.class +0 −0
  634. java/pkg/java/util/concurrent/atomic/AtomicReferenceArray.java +213 −0
  635. java/pkg/java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl.class +0 −0
  636. java/pkg/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.class +0 −0
  637. java/pkg/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java +304 −0
  638. java/pkg/java/util/concurrent/atomic/AtomicStampedReference$Pair.class +0 −0
  639. java/pkg/java/util/concurrent/atomic/AtomicStampedReference.class +0 −0
  640. java/pkg/java/util/concurrent/atomic/AtomicStampedReference.java +213 −0
  641. java/pkg/java/util/concurrent/atomic/mkfile +20 −0
  642. java/pkg/java/util/concurrent/atomic/package-info.java +199 −0
  643. java/pkg/java/util/concurrent/locks/AbstractOwnableSynchronizer.class +0 −0
  644. java/pkg/java/util/concurrent/locks/AbstractOwnableSynchronizer.java +86 −0
  645. java/pkg/java/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject.class +0 −0
  646. java/pkg/java/util/concurrent/locks/AbstractQueuedLongSynchronizer$Node.class +0 −0
  647. java/pkg/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.class +0 −0
  648. java/pkg/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java +2109 −0
  649. java/pkg/java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject.class +0 −0
  650. java/pkg/java/util/concurrent/locks/AbstractQueuedSynchronizer$Node.class +0 −0
  651. java/pkg/java/util/concurrent/locks/AbstractQueuedSynchronizer.class +0 −0
  652. java/pkg/java/util/concurrent/locks/AbstractQueuedSynchronizer.java +2330 −0
  653. java/pkg/java/util/concurrent/locks/Condition.class +0 −0
  654. java/pkg/java/util/concurrent/locks/Condition.java +488 −0
  655. java/pkg/java/util/concurrent/locks/Lock.class +0 −0
  656. java/pkg/java/util/concurrent/locks/Lock.java +356 −0
  657. java/pkg/java/util/concurrent/locks/LockSupport.class +0 −0
  658. java/pkg/java/util/concurrent/locks/LockSupport.java +385 −0
  659. java/pkg/java/util/concurrent/locks/ReadWriteLock.class +0 −0
  660. java/pkg/java/util/concurrent/locks/ReadWriteLock.java +133 −0
  661. java/pkg/java/util/concurrent/locks/ReentrantLock$FairSync.class +0 −0
  662. java/pkg/java/util/concurrent/locks/ReentrantLock$NonfairSync.class +0 −0
  663. java/pkg/java/util/concurrent/locks/ReentrantLock$Sync.class +0 −0
  664. java/pkg/java/util/concurrent/locks/ReentrantLock.class +0 −0
  665. java/pkg/java/util/concurrent/locks/ReentrantLock.java +770 −0
  666. java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock$FairSync.class +0 −0
  667. java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync.class +0 −0
  668. java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock$ReadLock.class +0 −0
  669. java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock$Sync$HoldCounter.class +0 −0
  670. java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter.class +0 −0
  671. java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock$Sync.class +0 −0
  672. java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock$WriteLock.class +0 −0
  673. java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock.class +0 −0
  674. java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock.java +1486 −0
  675. java/pkg/java/util/concurrent/locks/mkfile +17 −0
  676. java/pkg/java/util/concurrent/locks/package-info.java +79 −0
  677. java/pkg/java/util/concurrent/mkfile +67 −0
  678. java/pkg/java/util/concurrent/package-info.java +300 −0
  679. java/pkg/java/util/jar/Attributes$Name.class +0 −0
  680. java/pkg/java/util/jar/Attributes.class +0 −0
  681. java/pkg/java/util/jar/Attributes.java +663 −0
  682. java/pkg/java/util/jar/JarEntry.class +0 −0
  683. java/pkg/java/util/jar/JarEntry.java +128 −0
  684. java/pkg/java/util/jar/JarException.class +0 −0
  685. java/pkg/java/util/jar/JarException.java +52 −0
  686. java/pkg/java/util/jar/JarFile$1.class +0 −0
  687. java/pkg/java/util/jar/JarFile$2.class +0 −0
  688. java/pkg/java/util/jar/JarFile$3.class +0 −0
  689. java/pkg/java/util/jar/JarFile$4.class +0 −0
  690. java/pkg/java/util/jar/JarFile$JarFileEntry.class +0 −0
  691. java/pkg/java/util/jar/JarFile.class +0 −0
  692. java/pkg/java/util/jar/JarFile.java +736 −0
  693. java/pkg/java/util/jar/JarInputStream.class +0 −0
  694. java/pkg/java/util/jar/JarInputStream.java +233 −0
  695. java/pkg/java/util/jar/JarOutputStream.class +0 −0
  696. java/pkg/java/util/jar/JarOutputStream.java +149 −0
  697. java/pkg/java/util/jar/JarVerifier$1.class +0 −0
  698. java/pkg/java/util/jar/JarVerifier$2.class +0 −0
  699. java/pkg/java/util/jar/JarVerifier$3.class +0 −0
  700. java/pkg/java/util/jar/JarVerifier$4.class +0 −0
  701. java/pkg/java/util/jar/JarVerifier$VerifierCodeSource.class +0 −0
  702. java/pkg/java/util/jar/JarVerifier$VerifierStream.class +0 −0
  703. java/pkg/java/util/jar/JarVerifier.class +0 −0
  704. java/pkg/java/util/jar/JarVerifier.java +882 −0
  705. java/pkg/java/util/jar/JavaUtilJarAccessImpl.class +0 −0
  706. java/pkg/java/util/jar/JavaUtilJarAccessImpl.java +63 −0
  707. java/pkg/java/util/jar/Manifest$FastInputStream.class +0 −0
  708. java/pkg/java/util/jar/Manifest.class +0 −0
  709. java/pkg/java/util/jar/Manifest.java +445 −0
  710. java/pkg/java/util/jar/Pack200$Packer.class +0 −0
  711. java/pkg/java/util/jar/Pack200$Unpacker.class +0 −0
  712. java/pkg/java/util/jar/Pack200.class +0 −0
  713. java/pkg/java/util/jar/Pack200.java +764 −0
  714. java/pkg/java/util/jar/mkfile +17 −0
  715. java/pkg/java/util/jar/package.html +63 −0
  716. java/pkg/java/util/logging/ConsoleHandler.class +0 −0
  717. java/pkg/java/util/logging/ConsoleHandler.java +117 −0
  718. java/pkg/java/util/logging/ErrorManager.class +0 −0
  719. java/pkg/java/util/logging/ErrorManager.java +99 −0
  720. java/pkg/java/util/logging/FileHandler$1.class +0 −0
  721. java/pkg/java/util/logging/FileHandler$InitializationErrorManager.class +0 −0
  722. java/pkg/java/util/logging/FileHandler$MeteredStream.class +0 −0
  723. java/pkg/java/util/logging/FileHandler.class +0 −0
  724. java/pkg/java/util/logging/FileHandler.java +628 −0
  725. java/pkg/java/util/logging/Filter.class +0 −0
  726. java/pkg/java/util/logging/Filter.java +50 −0
  727. java/pkg/java/util/logging/Formatter.class +0 −0
  728. java/pkg/java/util/logging/Formatter.java +147 −0
  729. java/pkg/java/util/logging/Handler.class +0 −0
  730. java/pkg/java/util/logging/Handler.java +304 −0
  731. java/pkg/java/util/logging/Level.class +0 −0
  732. java/pkg/java/util/logging/Level.java +378 −0
  733. java/pkg/java/util/logging/LogManager$1.class +0 −0
  734. java/pkg/java/util/logging/LogManager$2.class +0 −0
  735. java/pkg/java/util/logging/LogManager$3.class +0 −0
  736. java/pkg/java/util/logging/LogManager$4.class +0 −0
  737. java/pkg/java/util/logging/LogManager$5.class +0 −0
  738. java/pkg/java/util/logging/LogManager$Cleaner.class +0 −0
  739. java/pkg/java/util/logging/LogManager$LogNode.class +0 −0
  740. java/pkg/java/util/logging/LogManager$LoggerWeakRef.class +0 −0
  741. java/pkg/java/util/logging/LogManager$RootLogger.class +0 −0
  742. java/pkg/java/util/logging/LogManager.class +0 −0
  743. java/pkg/java/util/logging/LogManager.java +1225 −0
  744. java/pkg/java/util/logging/LogRecord.class +0 −0
  745. java/pkg/java/util/logging/LogRecord.java +566 −0
  746. java/pkg/java/util/logging/Logger.class +0 −0
  747. java/pkg/java/util/logging/Logger.java +1530 −0
  748. java/pkg/java/util/logging/Logging.class +0 −0
  749. java/pkg/java/util/logging/Logging.java +117 −0
  750. java/pkg/java/util/logging/LoggingMXBean.class +0 −0
  751. java/pkg/java/util/logging/LoggingMXBean.java +139 −0
  752. java/pkg/java/util/logging/LoggingPermission.class +0 −0
  753. java/pkg/java/util/logging/LoggingPermission.java +78 −0
  754. java/pkg/java/util/logging/LoggingProxyImpl.class +0 −0
  755. java/pkg/java/util/logging/LoggingProxyImpl.java +107 −0
  756. java/pkg/java/util/logging/MemoryHandler.class +0 −0
  757. java/pkg/java/util/logging/MemoryHandler.java +270 −0
  758. java/pkg/java/util/logging/SimpleFormatter.class +0 −0
  759. java/pkg/java/util/logging/SimpleFormatter.java +169 −0
  760. java/pkg/java/util/logging/SocketHandler.class +0 −0
  761. java/pkg/java/util/logging/SocketHandler.java +191 −0
  762. java/pkg/java/util/logging/StreamHandler.class +0 −0
  763. java/pkg/java/util/logging/StreamHandler.java +286 −0
  764. java/pkg/java/util/logging/XMLFormatter.class +0 −0
  765. java/pkg/java/util/logging/XMLFormatter.java +268 −0
  766. java/pkg/java/util/logging/mkfile +26 −0
  767. java/pkg/java/util/logging/package.html +134 −0
  768. java/pkg/java/util/mkfile +117 −0
  769. java/pkg/java/util/package.html +55 −0
  770. java/pkg/java/util/prefs/AbstractPreferences$1.class +0 −0
  771. java/pkg/java/util/prefs/AbstractPreferences$EventDispatchThread.class +0 −0
  772. java/pkg/java/util/prefs/AbstractPreferences$NodeAddedEvent.class +0 −0
  773. java/pkg/java/util/prefs/AbstractPreferences$NodeRemovedEvent.class +0 −0
  774. java/pkg/java/util/prefs/AbstractPreferences.class +0 −0
  775. java/pkg/java/util/prefs/AbstractPreferences.java +1613 −0
  776. java/pkg/java/util/prefs/BackingStoreException.class +0 −0
  777. java/pkg/java/util/prefs/BackingStoreException.java +58 −0
  778. java/pkg/java/util/prefs/Base64.class +0 −0
  779. java/pkg/java/util/prefs/Base64.java +261 −0
  780. java/pkg/java/util/prefs/InvalidPreferencesFormatException.class +0 −0
  781. java/pkg/java/util/prefs/InvalidPreferencesFormatException.java +77 −0
  782. java/pkg/java/util/prefs/NodeChangeEvent.class +0 −0
  783. java/pkg/java/util/prefs/NodeChangeEvent.java +104 −0
  784. java/pkg/java/util/prefs/NodeChangeListener.class +0 −0
  785. java/pkg/java/util/prefs/NodeChangeListener.java +54 −0
  786. java/pkg/java/util/prefs/PreferenceChangeEvent.class +0 −0
  787. java/pkg/java/util/prefs/PreferenceChangeEvent.java +125 −0
  788. java/pkg/java/util/prefs/PreferenceChangeListener.class +0 −0
  789. java/pkg/java/util/prefs/PreferenceChangeListener.java +46 −0
  790. java/pkg/java/util/prefs/Preferences$1.class +0 −0
  791. java/pkg/java/util/prefs/Preferences$2.class +0 −0
  792. java/pkg/java/util/prefs/Preferences.class +0 −0
  793. java/pkg/java/util/prefs/Preferences.java +1256 −0
  794. java/pkg/java/util/prefs/PreferencesFactory.class +0 −0
  795. java/pkg/java/util/prefs/PreferencesFactory.java +57 −0
  796. java/pkg/java/util/prefs/XmlSupport$1.class +0 −0
  797. java/pkg/java/util/prefs/XmlSupport$EH.class +0 −0
  798. java/pkg/java/util/prefs/XmlSupport$Resolver.class +0 −0
  799. java/pkg/java/util/prefs/XmlSupport.class +0 −0
  800. java/pkg/java/util/prefs/XmlSupport.java +421 −0
  801. java/pkg/java/util/prefs/mkfile +18 −0
  802. java/pkg/java/util/prefs/package.html +44 −0
  803. java/pkg/java/util/regex/ASCII.class +0 −0
  804. java/pkg/java/util/regex/ASCII.java +274 −0
  805. java/pkg/java/util/regex/MatchResult.class +0 −0
  806. java/pkg/java/util/regex/MatchResult.java +188 −0
  807. java/pkg/java/util/regex/Matcher.class +0 −0
  808. java/pkg/java/util/regex/Matcher.java +1256 −0
  809. java/pkg/java/util/regex/Pattern$1.class +0 −0
  810. java/pkg/java/util/regex/Pattern$2.class +0 −0
  811. java/pkg/java/util/regex/Pattern$3.class +0 −0
  812. java/pkg/java/util/regex/Pattern$4.class +0 −0
  813. java/pkg/java/util/regex/Pattern$5.class +0 −0
  814. java/pkg/java/util/regex/Pattern$6.class +0 −0
  815. java/pkg/java/util/regex/Pattern$7.class +0 −0
  816. java/pkg/java/util/regex/Pattern$All.class +0 −0
  817. java/pkg/java/util/regex/Pattern$BackRef.class +0 −0
  818. java/pkg/java/util/regex/Pattern$Begin.class +0 −0
  819. java/pkg/java/util/regex/Pattern$Behind.class +0 −0
  820. java/pkg/java/util/regex/Pattern$BehindS.class +0 −0
  821. java/pkg/java/util/regex/Pattern$BitClass.class +0 −0
  822. java/pkg/java/util/regex/Pattern$Block.class +0 −0
  823. java/pkg/java/util/regex/Pattern$BmpCharProperty.class +0 −0
  824. java/pkg/java/util/regex/Pattern$BnM.class +0 −0
  825. java/pkg/java/util/regex/Pattern$BnMS.class +0 −0
  826. java/pkg/java/util/regex/Pattern$Bound.class +0 −0
  827. java/pkg/java/util/regex/Pattern$Branch.class +0 −0
  828. java/pkg/java/util/regex/Pattern$BranchConn.class +0 −0
  829. java/pkg/java/util/regex/Pattern$CIBackRef.class +0 −0
  830. java/pkg/java/util/regex/Pattern$Caret.class +0 −0
  831. java/pkg/java/util/regex/Pattern$Category.class +0 −0
  832. java/pkg/java/util/regex/Pattern$CharProperty$1.class +0 −0
  833. java/pkg/java/util/regex/Pattern$CharProperty.class +0 −0
  834. java/pkg/java/util/regex/Pattern$CharPropertyNames$1.class +0 −0
  835. java/pkg/java/util/regex/Pattern$CharPropertyNames$10.class +0 −0
  836. java/pkg/java/util/regex/Pattern$CharPropertyNames$11.class +0 −0
  837. java/pkg/java/util/regex/Pattern$CharPropertyNames$12.class +0 −0
  838. java/pkg/java/util/regex/Pattern$CharPropertyNames$13.class +0 −0
  839. java/pkg/java/util/regex/Pattern$CharPropertyNames$14.class +0 −0
  840. java/pkg/java/util/regex/Pattern$CharPropertyNames$15.class +0 −0
  841. java/pkg/java/util/regex/Pattern$CharPropertyNames$16.class +0 −0
  842. java/pkg/java/util/regex/Pattern$CharPropertyNames$17.class +0 −0
  843. java/pkg/java/util/regex/Pattern$CharPropertyNames$18.class +0 −0
  844. java/pkg/java/util/regex/Pattern$CharPropertyNames$19.class +0 −0
  845. java/pkg/java/util/regex/Pattern$CharPropertyNames$2.class +0 −0
  846. java/pkg/java/util/regex/Pattern$CharPropertyNames$20.class +0 −0
  847. java/pkg/java/util/regex/Pattern$CharPropertyNames$21.class +0 −0
  848. java/pkg/java/util/regex/Pattern$CharPropertyNames$22.class +0 −0
  849. java/pkg/java/util/regex/Pattern$CharPropertyNames$23.class +0 −0
  850. java/pkg/java/util/regex/Pattern$CharPropertyNames$3.class +0 −0
  851. java/pkg/java/util/regex/Pattern$CharPropertyNames$4.class +0 −0
  852. java/pkg/java/util/regex/Pattern$CharPropertyNames$5.class +0 −0
  853. java/pkg/java/util/regex/Pattern$CharPropertyNames$6.class +0 −0
  854. java/pkg/java/util/regex/Pattern$CharPropertyNames$7.class +0 −0
  855. java/pkg/java/util/regex/Pattern$CharPropertyNames$8.class +0 −0
  856. java/pkg/java/util/regex/Pattern$CharPropertyNames$9.class +0 −0
  857. java/pkg/java/util/regex/Pattern$CharPropertyNames$CharPropertyFactory.class +0 −0
  858. java/pkg/java/util/regex/Pattern$CharPropertyNames$CloneableProperty.class +0 −0
  859. java/pkg/java/util/regex/Pattern$CharPropertyNames.class +0 −0
  860. java/pkg/java/util/regex/Pattern$Conditional.class +0 −0
  861. java/pkg/java/util/regex/Pattern$Ctype.class +0 −0
  862. java/pkg/java/util/regex/Pattern$Curly.class +0 −0
  863. java/pkg/java/util/regex/Pattern$Dollar.class +0 −0
  864. java/pkg/java/util/regex/Pattern$Dot.class +0 −0
  865. java/pkg/java/util/regex/Pattern$End.class +0 −0
  866. java/pkg/java/util/regex/Pattern$First.class +0 −0
  867. java/pkg/java/util/regex/Pattern$GroupCurly.class +0 −0
  868. java/pkg/java/util/regex/Pattern$GroupHead.class +0 −0
  869. java/pkg/java/util/regex/Pattern$GroupRef.class +0 −0
  870. java/pkg/java/util/regex/Pattern$GroupTail.class +0 −0
  871. java/pkg/java/util/regex/Pattern$LastMatch.class +0 −0
  872. java/pkg/java/util/regex/Pattern$LastNode.class +0 −0
  873. java/pkg/java/util/regex/Pattern$LazyLoop.class +0 −0
  874. java/pkg/java/util/regex/Pattern$Loop.class +0 −0
  875. java/pkg/java/util/regex/Pattern$Neg.class +0 −0
  876. java/pkg/java/util/regex/Pattern$Node.class +0 −0
  877. java/pkg/java/util/regex/Pattern$NotBehind.class +0 −0
  878. java/pkg/java/util/regex/Pattern$NotBehindS.class +0 −0
  879. java/pkg/java/util/regex/Pattern$Pos.class +0 −0
  880. java/pkg/java/util/regex/Pattern$Prolog.class +0 −0
  881. java/pkg/java/util/regex/Pattern$Ques.class +0 −0
  882. java/pkg/java/util/regex/Pattern$Script.class +0 −0
  883. java/pkg/java/util/regex/Pattern$Single.class +0 −0
  884. java/pkg/java/util/regex/Pattern$SingleI.class +0 −0
  885. java/pkg/java/util/regex/Pattern$SingleS.class +0 −0
  886. java/pkg/java/util/regex/Pattern$SingleU.class +0 −0
  887. java/pkg/java/util/regex/Pattern$Slice.class +0 −0
  888. java/pkg/java/util/regex/Pattern$SliceI.class +0 −0
  889. java/pkg/java/util/regex/Pattern$SliceIS.class +0 −0
  890. java/pkg/java/util/regex/Pattern$SliceNode.class +0 −0
  891. java/pkg/java/util/regex/Pattern$SliceS.class +0 −0
  892. java/pkg/java/util/regex/Pattern$SliceU.class +0 −0
  893. java/pkg/java/util/regex/Pattern$SliceUS.class +0 −0
  894. java/pkg/java/util/regex/Pattern$Start.class +0 −0
  895. java/pkg/java/util/regex/Pattern$StartS.class +0 −0
  896. java/pkg/java/util/regex/Pattern$TreeInfo.class +0 −0
  897. java/pkg/java/util/regex/Pattern$UnixCaret.class +0 −0
  898. java/pkg/java/util/regex/Pattern$UnixDollar.class +0 −0
  899. java/pkg/java/util/regex/Pattern$UnixDot.class +0 −0
  900. java/pkg/java/util/regex/Pattern$Utype.class +0 −0
  901. java/pkg/java/util/regex/Pattern.class +0 −0
  902. java/pkg/java/util/regex/Pattern.java +5648 −0
  903. java/pkg/java/util/regex/PatternSyntaxException.class +0 −0
  904. java/pkg/java/util/regex/PatternSyntaxException.java +124 −0
  905. java/pkg/java/util/regex/UnicodeProp$1.class +0 −0
  906. java/pkg/java/util/regex/UnicodeProp$10.class +0 −0
  907. java/pkg/java/util/regex/UnicodeProp$11.class +0 −0
  908. java/pkg/java/util/regex/UnicodeProp$12.class +0 −0
  909. java/pkg/java/util/regex/UnicodeProp$13.class +0 −0
  910. java/pkg/java/util/regex/UnicodeProp$14.class +0 −0
  911. java/pkg/java/util/regex/UnicodeProp$15.class +0 −0
  912. java/pkg/java/util/regex/UnicodeProp$16.class +0 −0
  913. java/pkg/java/util/regex/UnicodeProp$17.class +0 −0
  914. java/pkg/java/util/regex/UnicodeProp$18.class +0 −0
  915. java/pkg/java/util/regex/UnicodeProp$2.class +0 −0
  916. java/pkg/java/util/regex/UnicodeProp$3.class +0 −0
  917. java/pkg/java/util/regex/UnicodeProp$4.class +0 −0
  918. java/pkg/java/util/regex/UnicodeProp$5.class +0 −0
  919. java/pkg/java/util/regex/UnicodeProp$6.class +0 −0
  920. java/pkg/java/util/regex/UnicodeProp$7.class +0 −0
  921. java/pkg/java/util/regex/UnicodeProp$8.class +0 −0
  922. java/pkg/java/util/regex/UnicodeProp$9.class +0 −0
  923. java/pkg/java/util/regex/UnicodeProp.class +0 −0
  924. java/pkg/java/util/regex/UnicodeProp.java +236 −0
  925. java/pkg/java/util/regex/mkfile +13 −0
  926. java/pkg/java/util/regex/package.html +66 −0
  927. java/pkg/java/util/spi/CurrencyNameProvider.class +0 −0
  928. java/pkg/java/util/spi/CurrencyNameProvider.java +119 −0
  929. java/pkg/java/util/spi/LocaleNameProvider.class +0 −0
  930. java/pkg/java/util/spi/LocaleNameProvider.java +144 −0
  931. java/pkg/java/util/spi/LocaleServiceProvider.class +0 −0
  932. java/pkg/java/util/spi/LocaleServiceProvider.java +138 −0
  933. java/pkg/java/util/spi/TimeZoneNameProvider.class +0 −0
  934. java/pkg/java/util/spi/TimeZoneNameProvider.java +80 −0
  935. java/pkg/java/util/spi/mkfile +11 −0
  936. java/pkg/java/util/spi/package.html +50 −0
  937. java/pkg/java/util/zip/Adler32.class +0 −0
  938. java/pkg/java/util/zip/Adler32.java +95 −0
  939. java/pkg/java/util/zip/CRC32.class +0 −0
  940. java/pkg/java/util/zip/CRC32.java +93 −0
  941. java/pkg/java/util/zip/CheckedInputStream.class +0 −0
  942. java/pkg/java/util/zip/CheckedInputStream.java +116 −0
  943. java/pkg/java/util/zip/CheckedOutputStream.class +0 −0
  944. java/pkg/java/util/zip/CheckedOutputStream.java +84 −0
  945. java/pkg/java/util/zip/Checksum.class +0 −0
  946. java/pkg/java/util/zip/Checksum.java +60 −0
  947. java/pkg/java/util/zip/DataFormatException.class +0 −0
  948. java/pkg/java/util/zip/DataFormatException.java +52 −0
  949. java/pkg/java/util/zip/Deflater.class +0 −0
  950. java/pkg/java/util/zip/Deflater.java +550 −0
  951. java/pkg/java/util/zip/DeflaterInputStream.class +0 −0
  952. java/pkg/java/util/zip/DeflaterInputStream.java +294 −0
  953. java/pkg/java/util/zip/DeflaterOutputStream.class +0 −0
  954. java/pkg/java/util/zip/DeflaterOutputStream.java +284 −0
  955. java/pkg/java/util/zip/GZIPInputStream.class +0 −0
  956. java/pkg/java/util/zip/GZIPInputStream.java +289 −0
  957. java/pkg/java/util/zip/GZIPOutputStream.class +0 −0
  958. java/pkg/java/util/zip/GZIPOutputStream.java +223 −0
  959. java/pkg/java/util/zip/Inflater.class +0 −0
  960. java/pkg/java/util/zip/Inflater.java +402 −0
  961. java/pkg/java/util/zip/InflaterInputStream.class +0 −0
  962. java/pkg/java/util/zip/InflaterInputStream.java +288 −0
  963. java/pkg/java/util/zip/InflaterOutputStream.class +0 −0
  964. java/pkg/java/util/zip/InflaterOutputStream.java +276 −0
  965. java/pkg/java/util/zip/ZStreamRef.class +0 −0
  966. java/pkg/java/util/zip/ZStreamRef.java +46 −0
  967. java/pkg/java/util/zip/ZipCoder.class +0 −0
  968. java/pkg/java/util/zip/ZipCoder.java +159 −0
  969. java/pkg/java/util/zip/ZipConstants.class +0 −0
  970. java/pkg/java/util/zip/ZipConstants.java +98 −0
  971. java/pkg/java/util/zip/ZipConstants64.class +0 −0
  972. java/pkg/java/util/zip/ZipConstants64.java +84 −0
  973. java/pkg/java/util/zip/ZipEntry.class +0 −0
  974. java/pkg/java/util/zip/ZipEntry.java +327 −0
  975. java/pkg/java/util/zip/ZipError.class +0 −0
  976. java/pkg/java/util/zip/ZipError.java +44 −0
  977. java/pkg/java/util/zip/ZipException.class +0 −0
  978. java/pkg/java/util/zip/ZipException.java +60 −0
  979. java/pkg/java/util/zip/ZipFile$1.class +0 −0
  980. java/pkg/java/util/zip/ZipFile$ZipFileInflaterInputStream.class +0 −0
  981. java/pkg/java/util/zip/ZipFile$ZipFileInputStream.class +0 −0
  982. java/pkg/java/util/zip/ZipFile.class +0 −0
  983. java/pkg/java/util/zip/ZipFile.java +762 −0
  984. java/pkg/java/util/zip/ZipInputStream.class +0 −0
  985. java/pkg/java/util/zip/ZipInputStream.java +456 −0
  986. java/pkg/java/util/zip/ZipOutputStream$XEntry.class +0 −0
  987. java/pkg/java/util/zip/ZipOutputStream.class +0 −0
  988. java/pkg/java/util/zip/ZipOutputStream.java +620 −0
  989. java/pkg/java/util/zip/mkfile +31 −0
  990. java/pkg/java/util/zip/package.html +98 −0
java/pkg/java/util/AbstractCollection.class+0−0

Binary file not shown.

java/pkg/java/util/AbstractCollection.java+457−0
@@ -0,0 +1,457 @@
1/*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.util;
27
28/**
29 * This class provides a skeletal implementation of the <tt>Collection</tt>
30 * interface, to minimize the effort required to implement this interface. <p>
31 *
32 * To implement an unmodifiable collection, the programmer needs only to
33 * extend this class and provide implementations for the <tt>iterator</tt> and
34 * <tt>size</tt> methods. (The iterator returned by the <tt>iterator</tt>
35 * method must implement <tt>hasNext</tt> and <tt>next</tt>.)<p>
36 *
37 * To implement a modifiable collection, the programmer must additionally
38 * override this class's <tt>add</tt> method (which otherwise throws an
39 * <tt>UnsupportedOperationException</tt>), and the iterator returned by the
40 * <tt>iterator</tt> method must additionally implement its <tt>remove</tt>
41 * method.<p>
42 *
43 * The programmer should generally provide a void (no argument) and
44 * <tt>Collection</tt> constructor, as per the recommendation in the
45 * <tt>Collection</tt> interface specification.<p>
46 *
47 * The documentation for each non-abstract method in this class describes its
48 * implementation in detail. Each of these methods may be overridden if
49 * the collection being implemented admits a more efficient implementation.<p>
50 *
51 * This class is a member of the
52 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
53 * Java Collections Framework</a>.
54 *
55 * @author Josh Bloch
56 * @author Neal Gafter
57 * @see Collection
58 * @since 1.2
59 */
60
61public abstract class AbstractCollection<E> implements Collection<E> {
62 /**
63 * Sole constructor. (For invocation by subclass constructors, typically
64 * implicit.)
65 */
66 protected AbstractCollection() {
67 }
68
69 // Query Operations
70
71 /**
72 * Returns an iterator over the elements contained in this collection.
73 *
74 * @return an iterator over the elements contained in this collection
75 */
76 public abstract Iterator<E> iterator();
77
78 public abstract int size();
79
80 /**
81 * {@inheritDoc}
82 *
83 * <p>This implementation returns <tt>size() == 0</tt>.
84 */
85 public boolean isEmpty() {
86 return size() == 0;
87 }
88
89 /**
90 * {@inheritDoc}
91 *
92 * <p>This implementation iterates over the elements in the collection,
93 * checking each element in turn for equality with the specified element.
94 *
95 * @throws ClassCastException {@inheritDoc}
96 * @throws NullPointerException {@inheritDoc}
97 */
98 public boolean contains(Object o) {
99 Iterator<E> it = iterator();
100 if (o==null) {
101 while (it.hasNext())
102 if (it.next()==null)
103 return true;
104 } else {
105 while (it.hasNext())
106 if (o.equals(it.next()))
107 return true;
108 }
109 return false;
110 }
111
112 /**
113 * {@inheritDoc}
114 *
115 * <p>This implementation returns an array containing all the elements
116 * returned by this collection's iterator, in the same order, stored in
117 * consecutive elements of the array, starting with index {@code 0}.
118 * The length of the returned array is equal to the number of elements
119 * returned by the iterator, even if the size of this collection changes
120 * during iteration, as might happen if the collection permits
121 * concurrent modification during iteration. The {@code size} method is
122 * called only as an optimization hint; the correct result is returned
123 * even if the iterator returns a different number of elements.
124 *
125 * <p>This method is equivalent to:
126 *
127 * <pre> {@code
128 * List<E> list = new ArrayList<E>(size());
129 * for (E e : this)
130 * list.add(e);
131 * return list.toArray();
132 * }</pre>
133 */
134 public Object[] toArray() {
135 // Estimate size of array; be prepared to see more or fewer elements
136 Object[] r = new Object[size()];
137 Iterator<E> it = iterator();
138 for (int i = 0; i < r.length; i++) {
139 if (! it.hasNext()) // fewer elements than expected
140 return Arrays.copyOf(r, i);
141 r[i] = it.next();
142 }
143 return it.hasNext() ? finishToArray(r, it) : r;
144 }
145
146 /**
147 * {@inheritDoc}
148 *
149 * <p>This implementation returns an array containing all the elements
150 * returned by this collection's iterator in the same order, stored in
151 * consecutive elements of the array, starting with index {@code 0}.
152 * If the number of elements returned by the iterator is too large to
153 * fit into the specified array, then the elements are returned in a
154 * newly allocated array with length equal to the number of elements
155 * returned by the iterator, even if the size of this collection
156 * changes during iteration, as might happen if the collection permits
157 * concurrent modification during iteration. The {@code size} method is
158 * called only as an optimization hint; the correct result is returned
159 * even if the iterator returns a different number of elements.
160 *
161 * <p>This method is equivalent to:
162 *
163 * <pre> {@code
164 * List<E> list = new ArrayList<E>(size());
165 * for (E e : this)
166 * list.add(e);
167 * return list.toArray(a);
168 * }</pre>
169 *
170 * @throws ArrayStoreException {@inheritDoc}
171 * @throws NullPointerException {@inheritDoc}
172 */
173 public <T> T[] toArray(T[] a) {
174 // Estimate size of array; be prepared to see more or fewer elements
175 int size = size();
176 T[] r = a.length >= size ? a :
177 (T[])java.lang.reflect.Array
178 .newInstance(a.getClass().getComponentType(), size);
179 Iterator<E> it = iterator();
180
181 for (int i = 0; i < r.length; i++) {
182 if (! it.hasNext()) { // fewer elements than expected
183 if (a != r)
184 return Arrays.copyOf(r, i);
185 r[i] = null; // null-terminate
186 return r;
187 }
188 r[i] = (T)it.next();
189 }
190 return it.hasNext() ? finishToArray(r, it) : r;
191 }
192
193 /**
194 * The maximum size of array to allocate.
195 * Some VMs reserve some header words in an array.
196 * Attempts to allocate larger arrays may result in
197 * OutOfMemoryError: Requested array size exceeds VM limit
198 */
199 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
200
201 /**
202 * Reallocates the array being used within toArray when the iterator
203 * returned more elements than expected, and finishes filling it from
204 * the iterator.
205 *
206 * @param r the array, replete with previously stored elements
207 * @param it the in-progress iterator over this collection
208 * @return array containing the elements in the given array, plus any
209 * further elements returned by the iterator, trimmed to size
210 */
211 private static <T> T[] finishToArray(T[] r, Iterator<?> it) {
212 int i = r.length;
213 while (it.hasNext()) {
214 int cap = r.length;
215 if (i == cap) {
216 int newCap = cap + (cap >> 1) + 1;
217 // overflow-conscious code
218 if (newCap - MAX_ARRAY_SIZE > 0)
219 newCap = hugeCapacity(cap + 1);
220 r = Arrays.copyOf(r, newCap);
221 }
222 r[i++] = (T)it.next();
223 }
224 // trim if overallocated
225 return (i == r.length) ? r : Arrays.copyOf(r, i);
226 }
227
228 private static int hugeCapacity(int minCapacity) {
229 if (minCapacity < 0) // overflow
230 throw new OutOfMemoryError
231 ("Required array size too large");
232 return (minCapacity > MAX_ARRAY_SIZE) ?
233 Integer.MAX_VALUE :
234 MAX_ARRAY_SIZE;
235 }
236
237 // Modification Operations
238
239 /**
240 * {@inheritDoc}
241 *
242 * <p>This implementation always throws an
243 * <tt>UnsupportedOperationException</tt>.
244 *
245 * @throws UnsupportedOperationException {@inheritDoc}
246 * @throws ClassCastException {@inheritDoc}
247 * @throws NullPointerException {@inheritDoc}
248 * @throws IllegalArgumentException {@inheritDoc}
249 * @throws IllegalStateException {@inheritDoc}
250 */
251 public boolean add(E e) {
252 throw new UnsupportedOperationException();
253 }
254
255 /**
256 * {@inheritDoc}
257 *
258 * <p>This implementation iterates over the collection looking for the
259 * specified element. If it finds the element, it removes the element
260 * from the collection using the iterator's remove method.
261 *
262 * <p>Note that this implementation throws an
263 * <tt>UnsupportedOperationException</tt> if the iterator returned by this
264 * collection's iterator method does not implement the <tt>remove</tt>
265 * method and this collection contains the specified object.
266 *
267 * @throws UnsupportedOperationException {@inheritDoc}
268 * @throws ClassCastException {@inheritDoc}
269 * @throws NullPointerException {@inheritDoc}
270 */
271 public boolean remove(Object o) {
272 Iterator<E> it = iterator();
273 if (o==null) {
274 while (it.hasNext()) {
275 if (it.next()==null) {
276 it.remove();
277 return true;
278 }
279 }
280 } else {
281 while (it.hasNext()) {
282 if (o.equals(it.next())) {
283 it.remove();
284 return true;
285 }
286 }
287 }
288 return false;
289 }
290
291
292 // Bulk Operations
293
294 /**
295 * {@inheritDoc}
296 *
297 * <p>This implementation iterates over the specified collection,
298 * checking each element returned by the iterator in turn to see
299 * if it's contained in this collection. If all elements are so
300 * contained <tt>true</tt> is returned, otherwise <tt>false</tt>.
301 *
302 * @throws ClassCastException {@inheritDoc}
303 * @throws NullPointerException {@inheritDoc}
304 * @see #contains(Object)
305 */
306 public boolean containsAll(Collection<?> c) {
307 for (Object e : c)
308 if (!contains(e))
309 return false;
310 return true;
311 }
312
313 /**
314 * {@inheritDoc}
315 *
316 * <p>This implementation iterates over the specified collection, and adds
317 * each object returned by the iterator to this collection, in turn.
318 *
319 * <p>Note that this implementation will throw an
320 * <tt>UnsupportedOperationException</tt> unless <tt>add</tt> is
321 * overridden (assuming the specified collection is non-empty).
322 *
323 * @throws UnsupportedOperationException {@inheritDoc}
324 * @throws ClassCastException {@inheritDoc}
325 * @throws NullPointerException {@inheritDoc}
326 * @throws IllegalArgumentException {@inheritDoc}
327 * @throws IllegalStateException {@inheritDoc}
328 *
329 * @see #add(Object)
330 */
331 public boolean addAll(Collection<? extends E> c) {
332 boolean modified = false;
333 for (E e : c)
334 if (add(e))
335 modified = true;
336 return modified;
337 }
338
339 /**
340 * {@inheritDoc}
341 *
342 * <p>This implementation iterates over this collection, checking each
343 * element returned by the iterator in turn to see if it's contained
344 * in the specified collection. If it's so contained, it's removed from
345 * this collection with the iterator's <tt>remove</tt> method.
346 *
347 * <p>Note that this implementation will throw an
348 * <tt>UnsupportedOperationException</tt> if the iterator returned by the
349 * <tt>iterator</tt> method does not implement the <tt>remove</tt> method
350 * and this collection contains one or more elements in common with the
351 * specified collection.
352 *
353 * @throws UnsupportedOperationException {@inheritDoc}
354 * @throws ClassCastException {@inheritDoc}
355 * @throws NullPointerException {@inheritDoc}
356 *
357 * @see #remove(Object)
358 * @see #contains(Object)
359 */
360 public boolean removeAll(Collection<?> c) {
361 boolean modified = false;
362 Iterator<?> it = iterator();
363 while (it.hasNext()) {
364 if (c.contains(it.next())) {
365 it.remove();
366 modified = true;
367 }
368 }
369 return modified;
370 }
371
372 /**
373 * {@inheritDoc}
374 *
375 * <p>This implementation iterates over this collection, checking each
376 * element returned by the iterator in turn to see if it's contained
377 * in the specified collection. If it's not so contained, it's removed
378 * from this collection with the iterator's <tt>remove</tt> method.
379 *
380 * <p>Note that this implementation will throw an
381 * <tt>UnsupportedOperationException</tt> if the iterator returned by the
382 * <tt>iterator</tt> method does not implement the <tt>remove</tt> method
383 * and this collection contains one or more elements not present in the
384 * specified collection.
385 *
386 * @throws UnsupportedOperationException {@inheritDoc}
387 * @throws ClassCastException {@inheritDoc}
388 * @throws NullPointerException {@inheritDoc}
389 *
390 * @see #remove(Object)
391 * @see #contains(Object)
392 */
393 public boolean retainAll(Collection<?> c) {
394 boolean modified = false;
395 Iterator<E> it = iterator();
396 while (it.hasNext()) {
397 if (!c.contains(it.next())) {
398 it.remove();
399 modified = true;
400 }
401 }
402 return modified;
403 }
404
405 /**
406 * {@inheritDoc}
407 *
408 * <p>This implementation iterates over this collection, removing each
409 * element using the <tt>Iterator.remove</tt> operation. Most
410 * implementations will probably choose to override this method for
411 * efficiency.
412 *
413 * <p>Note that this implementation will throw an
414 * <tt>UnsupportedOperationException</tt> if the iterator returned by this
415 * collection's <tt>iterator</tt> method does not implement the
416 * <tt>remove</tt> method and this collection is non-empty.
417 *
418 * @throws UnsupportedOperationException {@inheritDoc}
419 */
420 public void clear() {
421 Iterator<E> it = iterator();
422 while (it.hasNext()) {
423 it.next();
424 it.remove();
425 }
426 }
427
428
429 // String conversion
430
431 /**
432 * Returns a string representation of this collection. The string
433 * representation consists of a list of the collection's elements in the
434 * order they are returned by its iterator, enclosed in square brackets
435 * (<tt>"[]"</tt>). Adjacent elements are separated by the characters
436 * <tt>", "</tt> (comma and space). Elements are converted to strings as
437 * by {@link String#valueOf(Object)}.
438 *
439 * @return a string representation of this collection
440 */
441 public String toString() {
442 Iterator<E> it = iterator();
443 if (! it.hasNext())
444 return "[]";
445
446 StringBuilder sb = new StringBuilder();
447 sb.append('[');
448 for (;;) {
449 E e = it.next();
450 sb.append(e == this ? "(this Collection)" : e);
451 if (! it.hasNext())
452 return sb.append(']').toString();
453 sb.append(',').append(' ');
454 }
455 }
456
457}
java/pkg/java/util/AbstractList$1.class+0−0

Binary file not shown.

java/pkg/java/util/AbstractList$Itr.class+0−0

Binary file not shown.

java/pkg/java/util/AbstractList$ListItr.class+0−0

Binary file not shown.

java/pkg/java/util/AbstractList.class+0−0

Binary file not shown.

java/pkg/java/util/AbstractList.java+781−0
@@ -0,0 +1,781 @@
1/*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.util;
27
28/**
29 * This class provides a skeletal implementation of the {@link List}
30 * interface to minimize the effort required to implement this interface
31 * backed by a "random access" data store (such as an array). For sequential
32 * access data (such as a linked list), {@link AbstractSequentialList} should
33 * be used in preference to this class.
34 *
35 * <p>To implement an unmodifiable list, the programmer needs only to extend
36 * this class and provide implementations for the {@link #get(int)} and
37 * {@link List#size() size()} methods.
38 *
39 * <p>To implement a modifiable list, the programmer must additionally
40 * override the {@link #set(int, Object) set(int, E)} method (which otherwise
41 * throws an {@code UnsupportedOperationException}). If the list is
42 * variable-size the programmer must additionally override the
43 * {@link #add(int, Object) add(int, E)} and {@link #remove(int)} methods.
44 *
45 * <p>The programmer should generally provide a void (no argument) and collection
46 * constructor, as per the recommendation in the {@link Collection} interface
47 * specification.
48 *
49 * <p>Unlike the other abstract collection implementations, the programmer does
50 * <i>not</i> have to provide an iterator implementation; the iterator and
51 * list iterator are implemented by this class, on top of the "random access"
52 * methods:
53 * {@link #get(int)},
54 * {@link #set(int, Object) set(int, E)},
55 * {@link #add(int, Object) add(int, E)} and
56 * {@link #remove(int)}.
57 *
58 * <p>The documentation for each non-abstract method in this class describes its
59 * implementation in detail. Each of these methods may be overridden if the
60 * collection being implemented admits a more efficient implementation.
61 *
62 * <p>This class is a member of the
63 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
64 * Java Collections Framework</a>.
65 *
66 * @author Josh Bloch
67 * @author Neal Gafter
68 * @since 1.2
69 */
70
71public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
72 /**
73 * Sole constructor. (For invocation by subclass constructors, typically
74 * implicit.)
75 */
76 protected AbstractList() {
77 }
78
79 /**
80 * Appends the specified element to the end of this list (optional
81 * operation).
82 *
83 * <p>Lists that support this operation may place limitations on what
84 * elements may be added to this list. In particular, some
85 * lists will refuse to add null elements, and others will impose
86 * restrictions on the type of elements that may be added. List
87 * classes should clearly specify in their documentation any restrictions
88 * on what elements may be added.
89 *
90 * <p>This implementation calls {@code add(size(), e)}.
91 *
92 * <p>Note that this implementation throws an
93 * {@code UnsupportedOperationException} unless
94 * {@link #add(int, Object) add(int, E)} is overridden.
95 *
96 * @param e element to be appended to this list
97 * @return {@code true} (as specified by {@link Collection#add})
98 * @throws UnsupportedOperationException if the {@code add} operation
99 * is not supported by this list
100 * @throws ClassCastException if the class of the specified element
101 * prevents it from being added to this list
102 * @throws NullPointerException if the specified element is null and this
103 * list does not permit null elements
104 * @throws IllegalArgumentException if some property of this element
105 * prevents it from being added to this list
106 */
107 public boolean add(E e) {
108 add(size(), e);
109 return true;
110 }
111
112 /**
113 * {@inheritDoc}
114 *
115 * @throws IndexOutOfBoundsException {@inheritDoc}
116 */
117 abstract public E get(int index);
118
119 /**
120 * {@inheritDoc}
121 *
122 * <p>This implementation always throws an
123 * {@code UnsupportedOperationException}.
124 *
125 * @throws UnsupportedOperationException {@inheritDoc}
126 * @throws ClassCastException {@inheritDoc}
127 * @throws NullPointerException {@inheritDoc}
128 * @throws IllegalArgumentException {@inheritDoc}
129 * @throws IndexOutOfBoundsException {@inheritDoc}
130 */
131 public E set(int index, E element) {
132 throw new UnsupportedOperationException();
133 }
134
135 /**
136 * {@inheritDoc}
137 *
138 * <p>This implementation always throws an
139 * {@code UnsupportedOperationException}.
140 *
141 * @throws UnsupportedOperationException {@inheritDoc}
142 * @throws ClassCastException {@inheritDoc}
143 * @throws NullPointerException {@inheritDoc}
144 * @throws IllegalArgumentException {@inheritDoc}
145 * @throws IndexOutOfBoundsException {@inheritDoc}
146 */
147 public void add(int index, E element) {
148 throw new UnsupportedOperationException();
149 }
150
151 /**
152 * {@inheritDoc}
153 *
154 * <p>This implementation always throws an
155 * {@code UnsupportedOperationException}.
156 *
157 * @throws UnsupportedOperationException {@inheritDoc}
158 * @throws IndexOutOfBoundsException {@inheritDoc}
159 */
160 public E remove(int index) {
161 throw new UnsupportedOperationException();
162 }
163
164
165 // Search Operations
166
167 /**
168 * {@inheritDoc}
169 *
170 * <p>This implementation first gets a list iterator (with
171 * {@code listIterator()}). Then, it iterates over the list until the
172 * specified element is found or the end of the list is reached.
173 *
174 * @throws ClassCastException {@inheritDoc}
175 * @throws NullPointerException {@inheritDoc}
176 */
177 public int indexOf(Object o) {
178 ListIterator<E> it = listIterator();
179 if (o==null) {
180 while (it.hasNext())
181 if (it.next()==null)
182 return it.previousIndex();
183 } else {
184 while (it.hasNext())
185 if (o.equals(it.next()))
186 return it.previousIndex();
187 }
188 return -1;
189 }
190
191 /**
192 * {@inheritDoc}
193 *
194 * <p>This implementation first gets a list iterator that points to the end
195 * of the list (with {@code listIterator(size())}). Then, it iterates
196 * backwards over the list until the specified element is found, or the
197 * beginning of the list is reached.
198 *
199 * @throws ClassCastException {@inheritDoc}
200 * @throws NullPointerException {@inheritDoc}
201 */
202 public int lastIndexOf(Object o) {
203 ListIterator<E> it = listIterator(size());
204 if (o==null) {
205 while (it.hasPrevious())
206 if (it.previous()==null)
207 return it.nextIndex();
208 } else {
209 while (it.hasPrevious())
210 if (o.equals(it.previous()))
211 return it.nextIndex();
212 }
213 return -1;
214 }
215
216
217 // Bulk Operations
218
219 /**
220 * Removes all of the elements from this list (optional operation).
221 * The list will be empty after this call returns.
222 *
223 * <p>This implementation calls {@code removeRange(0, size())}.
224 *
225 * <p>Note that this implementation throws an
226 * {@code UnsupportedOperationException} unless {@code remove(int
227 * index)} or {@code removeRange(int fromIndex, int toIndex)} is
228 * overridden.
229 *
230 * @throws UnsupportedOperationException if the {@code clear} operation
231 * is not supported by this list
232 */
233 public void clear() {
234 removeRange(0, size());
235 }
236
237 /**
238 * {@inheritDoc}
239 *
240 * <p>This implementation gets an iterator over the specified collection
241 * and iterates over it, inserting the elements obtained from the
242 * iterator into this list at the appropriate position, one at a time,
243 * using {@code add(int, E)}.
244 * Many implementations will override this method for efficiency.
245 *
246 * <p>Note that this implementation throws an
247 * {@code UnsupportedOperationException} unless
248 * {@link #add(int, Object) add(int, E)} is overridden.
249 *
250 * @throws UnsupportedOperationException {@inheritDoc}
251 * @throws ClassCastException {@inheritDoc}
252 * @throws NullPointerException {@inheritDoc}
253 * @throws IllegalArgumentException {@inheritDoc}
254 * @throws IndexOutOfBoundsException {@inheritDoc}
255 */
256 public boolean addAll(int index, Collection<? extends E> c) {
257 rangeCheckForAdd(index);
258 boolean modified = false;
259 for (E e : c) {
260 add(index++, e);
261 modified = true;
262 }
263 return modified;
264 }
265
266
267 // Iterators
268
269 /**
270 * Returns an iterator over the elements in this list in proper sequence.
271 *
272 * <p>This implementation returns a straightforward implementation of the
273 * iterator interface, relying on the backing list's {@code size()},
274 * {@code get(int)}, and {@code remove(int)} methods.
275 *
276 * <p>Note that the iterator returned by this method will throw an
277 * {@link UnsupportedOperationException} in response to its
278 * {@code remove} method unless the list's {@code remove(int)} method is
279 * overridden.
280 *
281 * <p>This implementation can be made to throw runtime exceptions in the
282 * face of concurrent modification, as described in the specification
283 * for the (protected) {@link #modCount} field.
284 *
285 * @return an iterator over the elements in this list in proper sequence
286 */
287 public Iterator<E> iterator() {
288 return new Itr();
289 }
290
291 /**
292 * {@inheritDoc}
293 *
294 * <p>This implementation returns {@code listIterator(0)}.
295 *
296 * @see #listIterator(int)
297 */
298 public ListIterator<E> listIterator() {
299 return listIterator(0);
300 }
301
302 /**
303 * {@inheritDoc}
304 *
305 * <p>This implementation returns a straightforward implementation of the
306 * {@code ListIterator} interface that extends the implementation of the
307 * {@code Iterator} interface returned by the {@code iterator()} method.
308 * The {@code ListIterator} implementation relies on the backing list's
309 * {@code get(int)}, {@code set(int, E)}, {@code add(int, E)}
310 * and {@code remove(int)} methods.
311 *
312 * <p>Note that the list iterator returned by this implementation will
313 * throw an {@link UnsupportedOperationException} in response to its
314 * {@code remove}, {@code set} and {@code add} methods unless the
315 * list's {@code remove(int)}, {@code set(int, E)}, and
316 * {@code add(int, E)} methods are overridden.
317 *
318 * <p>This implementation can be made to throw runtime exceptions in the
319 * face of concurrent modification, as described in the specification for
320 * the (protected) {@link #modCount} field.
321 *
322 * @throws IndexOutOfBoundsException {@inheritDoc}
323 */
324 public ListIterator<E> listIterator(final int index) {
325 rangeCheckForAdd(index);
326
327 return new ListItr(index);
328 }
329
330 private class Itr implements Iterator<E> {
331 /**
332 * Index of element to be returned by subsequent call to next.
333 */
334 int cursor = 0;
335
336 /**
337 * Index of element returned by most recent call to next or
338 * previous. Reset to -1 if this element is deleted by a call
339 * to remove.
340 */
341 int lastRet = -1;
342
343 /**
344 * The modCount value that the iterator believes that the backing
345 * List should have. If this expectation is violated, the iterator
346 * has detected concurrent modification.
347 */
348 int expectedModCount = modCount;
349
350 public boolean hasNext() {
351 return cursor != size();
352 }
353
354 public E next() {
355 checkForComodification();
356 try {
357 int i = cursor;
358 E next = get(i);
359 lastRet = i;
360 cursor = i + 1;
361 return next;
362 } catch (IndexOutOfBoundsException e) {
363 checkForComodification();
364 throw new NoSuchElementException();
365 }
366 }
367
368 public void remove() {
369 if (lastRet < 0)
370 throw new IllegalStateException();
371 checkForComodification();
372
373 try {
374 AbstractList.this.remove(lastRet);
375 if (lastRet < cursor)
376 cursor--;
377 lastRet = -1;
378 expectedModCount = modCount;
379 } catch (IndexOutOfBoundsException e) {
380 throw new ConcurrentModificationException();
381 }
382 }
383
384 final void checkForComodification() {
385 if (modCount != expectedModCount)
386 throw new ConcurrentModificationException();
387 }
388 }
389
390 private class ListItr extends Itr implements ListIterator<E> {
391 ListItr(int index) {
392 cursor = index;
393 }
394
395 public boolean hasPrevious() {
396 return cursor != 0;
397 }
398
399 public E previous() {
400 checkForComodification();
401 try {
402 int i = cursor - 1;
403 E previous = get(i);
404 lastRet = cursor = i;
405 return previous;
406 } catch (IndexOutOfBoundsException e) {
407 checkForComodification();
408 throw new NoSuchElementException();
409 }
410 }
411
412 public int nextIndex() {
413 return cursor;
414 }
415
416 public int previousIndex() {
417 return cursor-1;
418 }
419
420 public void set(E e) {
421 if (lastRet < 0)
422 throw new IllegalStateException();
423 checkForComodification();
424
425 try {
426 AbstractList.this.set(lastRet, e);
427 expectedModCount = modCount;
428 } catch (IndexOutOfBoundsException ex) {
429 throw new ConcurrentModificationException();
430 }
431 }
432
433 public void add(E e) {
434 checkForComodification();
435
436 try {
437 int i = cursor;
438 AbstractList.this.add(i, e);
439 lastRet = -1;
440 cursor = i + 1;
441 expectedModCount = modCount;
442 } catch (IndexOutOfBoundsException ex) {
443 throw new ConcurrentModificationException();
444 }
445 }
446 }
447
448 /**
449 * {@inheritDoc}
450 *
451 * <p>This implementation returns a list that subclasses
452 * {@code AbstractList}. The subclass stores, in private fields, the
453 * offset of the subList within the backing list, the size of the subList
454 * (which can change over its lifetime), and the expected
455 * {@code modCount} value of the backing list. There are two variants
456 * of the subclass, one of which implements {@code RandomAccess}.
457 * If this list implements {@code RandomAccess} the returned list will
458 * be an instance of the subclass that implements {@code RandomAccess}.
459 *
460 * <p>The subclass's {@code set(int, E)}, {@code get(int)},
461 * {@code add(int, E)}, {@code remove(int)}, {@code addAll(int,
462 * Collection)} and {@code removeRange(int, int)} methods all
463 * delegate to the corresponding methods on the backing abstract list,
464 * after bounds-checking the index and adjusting for the offset. The
465 * {@code addAll(Collection c)} method merely returns {@code addAll(size,
466 * c)}.
467 *
468 * <p>The {@code listIterator(int)} method returns a "wrapper object"
469 * over a list iterator on the backing list, which is created with the
470 * corresponding method on the backing list. The {@code iterator} method
471 * merely returns {@code listIterator()}, and the {@code size} method
472 * merely returns the subclass's {@code size} field.
473 *
474 * <p>All methods first check to see if the actual {@code modCount} of
475 * the backing list is equal to its expected value, and throw a
476 * {@code ConcurrentModificationException} if it is not.
477 *
478 * @throws IndexOutOfBoundsException if an endpoint index value is out of range
479 * {@code (fromIndex < 0 || toIndex > size)}
480 * @throws IllegalArgumentException if the endpoint indices are out of order
481 * {@code (fromIndex > toIndex)}
482 */
483 public List<E> subList(int fromIndex, int toIndex) {
484 return (this instanceof RandomAccess ?
485 new RandomAccessSubList<>(this, fromIndex, toIndex) :
486 new SubList<>(this, fromIndex, toIndex));
487 }
488
489 // Comparison and hashing
490
491 /**
492 * Compares the specified object with this list for equality. Returns
493 * {@code true} if and only if the specified object is also a list, both
494 * lists have the same size, and all corresponding pairs of elements in
495 * the two lists are <i>equal</i>. (Two elements {@code e1} and
496 * {@code e2} are <i>equal</i> if {@code (e1==null ? e2==null :
497 * e1.equals(e2))}.) In other words, two lists are defined to be
498 * equal if they contain the same elements in the same order.<p>
499 *
500 * This implementation first checks if the specified object is this
501 * list. If so, it returns {@code true}; if not, it checks if the
502 * specified object is a list. If not, it returns {@code false}; if so,
503 * it iterates over both lists, comparing corresponding pairs of elements.
504 * If any comparison returns {@code false}, this method returns
505 * {@code false}. If either iterator runs out of elements before the
506 * other it returns {@code false} (as the lists are of unequal length);
507 * otherwise it returns {@code true} when the iterations complete.
508 *
509 * @param o the object to be compared for equality with this list
510 * @return {@code true} if the specified object is equal to this list
511 */
512 public boolean equals(Object o) {
513 if (o == this)
514 return true;
515 if (!(o instanceof List))
516 return false;
517
518 ListIterator<E> e1 = listIterator();
519 ListIterator e2 = ((List) o).listIterator();
520 while (e1.hasNext() && e2.hasNext()) {
521 E o1 = e1.next();
522 Object o2 = e2.next();
523 if (!(o1==null ? o2==null : o1.equals(o2)))
524 return false;
525 }
526 return !(e1.hasNext() || e2.hasNext());
527 }
528
529 /**
530 * Returns the hash code value for this list.
531 *
532 * <p>This implementation uses exactly the code that is used to define the
533 * list hash function in the documentation for the {@link List#hashCode}
534 * method.
535 *
536 * @return the hash code value for this list
537 */
538 public int hashCode() {
539 int hashCode = 1;
540 for (E e : this)
541 hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
542 return hashCode;
543 }
544
545 /**
546 * Removes from this list all of the elements whose index is between
547 * {@code fromIndex}, inclusive, and {@code toIndex}, exclusive.
548 * Shifts any succeeding elements to the left (reduces their index).
549 * This call shortens the list by {@code (toIndex - fromIndex)} elements.
550 * (If {@code toIndex==fromIndex}, this operation has no effect.)
551 *
552 * <p>This method is called by the {@code clear} operation on this list
553 * and its subLists. Overriding this method to take advantage of
554 * the internals of the list implementation can <i>substantially</i>
555 * improve the performance of the {@code clear} operation on this list
556 * and its subLists.
557 *
558 * <p>This implementation gets a list iterator positioned before
559 * {@code fromIndex}, and repeatedly calls {@code ListIterator.next}
560 * followed by {@code ListIterator.remove} until the entire range has
561 * been removed. <b>Note: if {@code ListIterator.remove} requires linear
562 * time, this implementation requires quadratic time.</b>
563 *
564 * @param fromIndex index of first element to be removed
565 * @param toIndex index after last element to be removed
566 */
567 protected void removeRange(int fromIndex, int toIndex) {
568 ListIterator<E> it = listIterator(fromIndex);
569 for (int i=0, n=toIndex-fromIndex; i<n; i++) {
570 it.next();
571 it.remove();
572 }
573 }
574
575 /**
576 * The number of times this list has been <i>structurally modified</i>.
577 * Structural modifications are those that change the size of the
578 * list, or otherwise perturb it in such a fashion that iterations in
579 * progress may yield incorrect results.
580 *
581 * <p>This field is used by the iterator and list iterator implementation
582 * returned by the {@code iterator} and {@code listIterator} methods.
583 * If the value of this field changes unexpectedly, the iterator (or list
584 * iterator) will throw a {@code ConcurrentModificationException} in
585 * response to the {@code next}, {@code remove}, {@code previous},
586 * {@code set} or {@code add} operations. This provides
587 * <i>fail-fast</i> behavior, rather than non-deterministic behavior in
588 * the face of concurrent modification during iteration.
589 *
590 * <p><b>Use of this field by subclasses is optional.</b> If a subclass
591 * wishes to provide fail-fast iterators (and list iterators), then it
592 * merely has to increment this field in its {@code add(int, E)} and
593 * {@code remove(int)} methods (and any other methods that it overrides
594 * that result in structural modifications to the list). A single call to
595 * {@code add(int, E)} or {@code remove(int)} must add no more than
596 * one to this field, or the iterators (and list iterators) will throw
597 * bogus {@code ConcurrentModificationExceptions}. If an implementation
598 * does not wish to provide fail-fast iterators, this field may be
599 * ignored.
600 */
601 protected transient int modCount = 0;
602
603 private void rangeCheckForAdd(int index) {
604 if (index < 0 || index > size())
605 throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
606 }
607
608 private String outOfBoundsMsg(int index) {
609 return "Index: "+index+", Size: "+size();
610 }
611}
612
613class SubList<E> extends AbstractList<E> {
614 private final AbstractList<E> l;
615 private final int offset;
616 private int size;
617
618 SubList(AbstractList<E> list, int fromIndex, int toIndex) {
619 if (fromIndex < 0)
620 throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
621 if (toIndex > list.size())
622 throw new IndexOutOfBoundsException("toIndex = " + toIndex);
623 if (fromIndex > toIndex)
624 throw new IllegalArgumentException("fromIndex(" + fromIndex +
625 ") > toIndex(" + toIndex + ")");
626 l = list;
627 offset = fromIndex;
628 size = toIndex - fromIndex;
629 this.modCount = l.modCount;
630 }
631
632 public E set(int index, E element) {
633 rangeCheck(index);
634 checkForComodification();
635 return l.set(index+offset, element);
636 }
637
638 public E get(int index) {
639 rangeCheck(index);
640 checkForComodification();
641 return l.get(index+offset);
642 }
643
644 public int size() {
645 checkForComodification();
646 return size;
647 }
648
649 public void add(int index, E element) {
650 rangeCheckForAdd(index);
651 checkForComodification();
652 l.add(index+offset, element);
653 this.modCount = l.modCount;
654 size++;
655 }
656
657 public E remove(int index) {
658 rangeCheck(index);
659 checkForComodification();
660 E result = l.remove(index+offset);
661 this.modCount = l.modCount;
662 size--;
663 return result;
664 }
665
666 protected void removeRange(int fromIndex, int toIndex) {
667 checkForComodification();
668 l.removeRange(fromIndex+offset, toIndex+offset);
669 this.modCount = l.modCount;
670 size -= (toIndex-fromIndex);
671 }
672
673 public boolean addAll(Collection<? extends E> c) {
674 return addAll(size, c);
675 }
676
677 public boolean addAll(int index, Collection<? extends E> c) {
678 rangeCheckForAdd(index);
679 int cSize = c.size();
680 if (cSize==0)
681 return false;
682
683 checkForComodification();
684 l.addAll(offset+index, c);
685 this.modCount = l.modCount;
686 size += cSize;
687 return true;
688 }
689
690 public Iterator<E> iterator() {
691 return listIterator();
692 }
693
694 public ListIterator<E> listIterator(final int index) {
695 checkForComodification();
696 rangeCheckForAdd(index);
697
698 return new ListIterator<E>() {
699 private final ListIterator<E> i = l.listIterator(index+offset);
700
701 public boolean hasNext() {
702 return nextIndex() < size;
703 }
704
705 public E next() {
706 if (hasNext())
707 return i.next();
708 else
709 throw new NoSuchElementException();
710 }
711
712 public boolean hasPrevious() {
713 return previousIndex() >= 0;
714 }
715
716 public E previous() {
717 if (hasPrevious())
718 return i.previous();
719 else
720 throw new NoSuchElementException();
721 }
722
723 public int nextIndex() {
724 return i.nextIndex() - offset;
725 }
726
727 public int previousIndex() {
728 return i.previousIndex() - offset;
729 }
730
731 public void remove() {
732 i.remove();
733 SubList.this.modCount = l.modCount;
734 size--;
735 }
736
737 public void set(E e) {
738 i.set(e);
739 }
740
741 public void add(E e) {
742 i.add(e);
743 SubList.this.modCount = l.modCount;
744 size++;
745 }
746 };
747 }
748
749 public List<E> subList(int fromIndex, int toIndex) {
750 return new SubList<>(this, fromIndex, toIndex);
751 }
752
753 private void rangeCheck(int index) {
754 if (index < 0 || index >= size)
755 throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
756 }
757
758 private void rangeCheckForAdd(int index) {
759 if (index < 0 || index > size)
760 throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
761 }
762
763 private String outOfBoundsMsg(int index) {
764 return "Index: "+index+", Size: "+size;
765 }
766
767 private void checkForComodification() {
768 if (this.modCount != l.modCount)
769 throw new ConcurrentModificationException();
770 }
771}
772
773class RandomAccessSubList<E> extends SubList<E> implements RandomAccess {
774 RandomAccessSubList(AbstractList<E> list, int fromIndex, int toIndex) {
775 super(list, fromIndex, toIndex);
776 }
777
778 public List<E> subList(int fromIndex, int toIndex) {
779 return new RandomAccessSubList<>(this, fromIndex, toIndex);
780 }
781}
java/pkg/java/util/AbstractMap$1$1.class+0−0

Binary file not shown.

java/pkg/java/util/AbstractMap$1.class+0−0

Binary file not shown.

java/pkg/java/util/AbstractMap$2$1.class+0−0

Binary file not shown.

java/pkg/java/util/AbstractMap$2.class+0−0

Binary file not shown.

java/pkg/java/util/AbstractMap$SimpleEntry.class+0−0

Binary file not shown.

java/pkg/java/util/AbstractMap$SimpleImmutableEntry.class+0−0

Binary file not shown.

java/pkg/java/util/AbstractMap.class+0−0

Binary file not shown.

java/pkg/java/util/AbstractMap.java+822−0
@@ -0,0 +1,822 @@
1/*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.util;
27import java.util.Map.Entry;
28
29/**
30 * This class provides a skeletal implementation of the <tt>Map</tt>
31 * interface, to minimize the effort required to implement this interface.
32 *
33 * <p>To implement an unmodifiable map, the programmer needs only to extend this
34 * class and provide an implementation for the <tt>entrySet</tt> method, which
35 * returns a set-view of the map's mappings. Typically, the returned set
36 * will, in turn, be implemented atop <tt>AbstractSet</tt>. This set should
37 * not support the <tt>add</tt> or <tt>remove</tt> methods, and its iterator
38 * should not support the <tt>remove</tt> method.
39 *
40 * <p>To implement a modifiable map, the programmer must additionally override
41 * this class's <tt>put</tt> method (which otherwise throws an
42 * <tt>UnsupportedOperationException</tt>), and the iterator returned by
43 * <tt>entrySet().iterator()</tt> must additionally implement its
44 * <tt>remove</tt> method.
45 *
46 * <p>The programmer should generally provide a void (no argument) and map
47 * constructor, as per the recommendation in the <tt>Map</tt> interface
48 * specification.
49 *
50 * <p>The documentation for each non-abstract method in this class describes its
51 * implementation in detail. Each of these methods may be overridden if the
52 * map being implemented admits a more efficient implementation.
53 *
54 * <p>This class is a member of the
55 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
56 * Java Collections Framework</a>.
57 *
58 * @param <K> the type of keys maintained by this map
59 * @param <V> the type of mapped values
60 *
61 * @author Josh Bloch
62 * @author Neal Gafter
63 * @see Map
64 * @see Collection
65 * @since 1.2
66 */
67
68public abstract class AbstractMap<K,V> implements Map<K,V> {
69 /**
70 * Sole constructor. (For invocation by subclass constructors, typically
71 * implicit.)
72 */
73 protected AbstractMap() {
74 }
75
76 // Query Operations
77
78 /**
79 * {@inheritDoc}
80 *
81 * <p>This implementation returns <tt>entrySet().size()</tt>.
82 */
83 public int size() {
84 return entrySet().size();
85 }
86
87 /**
88 * {@inheritDoc}
89 *
90 * <p>This implementation returns <tt>size() == 0</tt>.
91 */
92 public boolean isEmpty() {
93 return size() == 0;
94 }
95
96 /**
97 * {@inheritDoc}
98 *
99 * <p>This implementation iterates over <tt>entrySet()</tt> searching
100 * for an entry with the specified value. If such an entry is found,
101 * <tt>true</tt> is returned. If the iteration terminates without
102 * finding such an entry, <tt>false</tt> is returned. Note that this
103 * implementation requires linear time in the size of the map.
104 *
105 * @throws ClassCastException {@inheritDoc}
106 * @throws NullPointerException {@inheritDoc}
107 */
108 public boolean containsValue(Object value) {
109 Iterator<Entry<K,V>> i = entrySet().iterator();
110 if (value==null) {
111 while (i.hasNext()) {
112 Entry<K,V> e = i.next();
113 if (e.getValue()==null)
114 return true;
115 }
116 } else {
117 while (i.hasNext()) {
118 Entry<K,V> e = i.next();
119 if (value.equals(e.getValue()))
120 return true;
121 }
122 }
123 return false;
124 }
125
126 /**
127 * {@inheritDoc}
128 *
129 * <p>This implementation iterates over <tt>entrySet()</tt> searching
130 * for an entry with the specified key. If such an entry is found,
131 * <tt>true</tt> is returned. If the iteration terminates without
132 * finding such an entry, <tt>false</tt> is returned. Note that this
133 * implementation requires linear time in the size of the map; many
134 * implementations will override this method.
135 *
136 * @throws ClassCastException {@inheritDoc}
137 * @throws NullPointerException {@inheritDoc}
138 */
139 public boolean containsKey(Object key) {
140 Iterator<Map.Entry<K,V>> i = entrySet().iterator();
141 if (key==null) {
142 while (i.hasNext()) {
143 Entry<K,V> e = i.next();
144 if (e.getKey()==null)
145 return true;
146 }
147 } else {
148 while (i.hasNext()) {
149 Entry<K,V> e = i.next();
150 if (key.equals(e.getKey()))
151 return true;
152 }
153 }
154 return false;
155 }
156
157 /**
158 * {@inheritDoc}
159 *
160 * <p>This implementation iterates over <tt>entrySet()</tt> searching
161 * for an entry with the specified key. If such an entry is found,
162 * the entry's value is returned. If the iteration terminates without
163 * finding such an entry, <tt>null</tt> is returned. Note that this
164 * implementation requires linear time in the size of the map; many
165 * implementations will override this method.
166 *
167 * @throws ClassCastException {@inheritDoc}
168 * @throws NullPointerException {@inheritDoc}
169 */
170 public V get(Object key) {
171 Iterator<Entry<K,V>> i = entrySet().iterator();
172 if (key==null) {
173 while (i.hasNext()) {
174 Entry<K,V> e = i.next();
175 if (e.getKey()==null)
176 return e.getValue();
177 }
178 } else {
179 while (i.hasNext()) {
180 Entry<K,V> e = i.next();
181 if (key.equals(e.getKey()))
182 return e.getValue();
183 }
184 }
185 return null;
186 }
187
188
189 // Modification Operations
190
191 /**
192 * {@inheritDoc}
193 *
194 * <p>This implementation always throws an
195 * <tt>UnsupportedOperationException</tt>.
196 *
197 * @throws UnsupportedOperationException {@inheritDoc}
198 * @throws ClassCastException {@inheritDoc}
199 * @throws NullPointerException {@inheritDoc}
200 * @throws IllegalArgumentException {@inheritDoc}
201 */
202 public V put(K key, V value) {
203 throw new UnsupportedOperationException();
204 }
205
206 /**
207 * {@inheritDoc}
208 *
209 * <p>This implementation iterates over <tt>entrySet()</tt> searching for an
210 * entry with the specified key. If such an entry is found, its value is
211 * obtained with its <tt>getValue</tt> operation, the entry is removed
212 * from the collection (and the backing map) with the iterator's
213 * <tt>remove</tt> operation, and the saved value is returned. If the
214 * iteration terminates without finding such an entry, <tt>null</tt> is
215 * returned. Note that this implementation requires linear time in the
216 * size of the map; many implementations will override this method.
217 *
218 * <p>Note that this implementation throws an
219 * <tt>UnsupportedOperationException</tt> if the <tt>entrySet</tt>
220 * iterator does not support the <tt>remove</tt> method and this map
221 * contains a mapping for the specified key.
222 *
223 * @throws UnsupportedOperationException {@inheritDoc}
224 * @throws ClassCastException {@inheritDoc}
225 * @throws NullPointerException {@inheritDoc}
226 */
227 public V remove(Object key) {
228 Iterator<Entry<K,V>> i = entrySet().iterator();
229 Entry<K,V> correctEntry = null;
230 if (key==null) {
231 while (correctEntry==null && i.hasNext()) {
232 Entry<K,V> e = i.next();
233 if (e.getKey()==null)
234 correctEntry = e;
235 }
236 } else {
237 while (correctEntry==null && i.hasNext()) {
238 Entry<K,V> e = i.next();
239 if (key.equals(e.getKey()))
240 correctEntry = e;
241 }
242 }
243
244 V oldValue = null;
245 if (correctEntry !=null) {
246 oldValue = correctEntry.getValue();
247 i.remove();
248 }
249 return oldValue;
250 }
251
252
253 // Bulk Operations
254
255 /**
256 * {@inheritDoc}
257 *
258 * <p>This implementation iterates over the specified map's
259 * <tt>entrySet()</tt> collection, and calls this map's <tt>put</tt>
260 * operation once for each entry returned by the iteration.
261 *
262 * <p>Note that this implementation throws an
263 * <tt>UnsupportedOperationException</tt> if this map does not support
264 * the <tt>put</tt> operation and the specified map is nonempty.
265 *
266 * @throws UnsupportedOperationException {@inheritDoc}
267 * @throws ClassCastException {@inheritDoc}
268 * @throws NullPointerException {@inheritDoc}
269 * @throws IllegalArgumentException {@inheritDoc}
270 */
271 public void putAll(Map<? extends K, ? extends V> m) {
272 for (Map.Entry<? extends K, ? extends V> e : m.entrySet())
273 put(e.getKey(), e.getValue());
274 }
275
276 /**
277 * {@inheritDoc}
278 *
279 * <p>This implementation calls <tt>entrySet().clear()</tt>.
280 *
281 * <p>Note that this implementation throws an
282 * <tt>UnsupportedOperationException</tt> if the <tt>entrySet</tt>
283 * does not support the <tt>clear</tt> operation.
284 *
285 * @throws UnsupportedOperationException {@inheritDoc}
286 */
287 public void clear() {
288 entrySet().clear();
289 }
290
291
292 // Views
293
294 /**
295 * Each of these fields are initialized to contain an instance of the
296 * appropriate view the first time this view is requested. The views are
297 * stateless, so there's no reason to create more than one of each.
298 */
299 transient volatile Set<K> keySet = null;
300 transient volatile Collection<V> values = null;
301
302 /**
303 * {@inheritDoc}
304 *
305 * <p>This implementation returns a set that subclasses {@link AbstractSet}.
306 * The subclass's iterator method returns a "wrapper object" over this
307 * map's <tt>entrySet()</tt> iterator. The <tt>size</tt> method
308 * delegates to this map's <tt>size</tt> method and the
309 * <tt>contains</tt> method delegates to this map's
310 * <tt>containsKey</tt> method.
311 *
312 * <p>The set is created the first time this method is called,
313 * and returned in response to all subsequent calls. No synchronization
314 * is performed, so there is a slight chance that multiple calls to this
315 * method will not all return the same set.
316 */
317 public Set<K> keySet() {
318 if (keySet == null) {
319 keySet = new AbstractSet<K>() {
320 public Iterator<K> iterator() {
321 return new Iterator<K>() {
322 private Iterator<Entry<K,V>> i = entrySet().iterator();
323
324 public boolean hasNext() {
325 return i.hasNext();
326 }
327
328 public K next() {
329 return i.next().getKey();
330 }
331
332 public void remove() {
333 i.remove();
334 }
335 };
336 }
337
338 public int size() {
339 return AbstractMap.this.size();
340 }
341
342 public boolean isEmpty() {
343 return AbstractMap.this.isEmpty();
344 }
345
346 public void clear() {
347 AbstractMap.this.clear();
348 }
349
350 public boolean contains(Object k) {
351 return AbstractMap.this.containsKey(k);
352 }
353 };
354 }
355 return keySet;
356 }
357
358 /**
359 * {@inheritDoc}
360 *
361 * <p>This implementation returns a collection that subclasses {@link
362 * AbstractCollection}. The subclass's iterator method returns a
363 * "wrapper object" over this map's <tt>entrySet()</tt> iterator.
364 * The <tt>size</tt> method delegates to this map's <tt>size</tt>
365 * method and the <tt>contains</tt> method delegates to this map's
366 * <tt>containsValue</tt> method.
367 *
368 * <p>The collection is created the first time this method is called, and
369 * returned in response to all subsequent calls. No synchronization is
370 * performed, so there is a slight chance that multiple calls to this
371 * method will not all return the same collection.
372 */
373 public Collection<V> values() {
374 if (values == null) {
375 values = new AbstractCollection<V>() {
376 public Iterator<V> iterator() {
377 return new Iterator<V>() {
378 private Iterator<Entry<K,V>> i = entrySet().iterator();
379
380 public boolean hasNext() {
381 return i.hasNext();
382 }
383
384 public V next() {
385 return i.next().getValue();
386 }
387
388 public void remove() {
389 i.remove();
390 }
391 };
392 }
393
394 public int size() {
395 return AbstractMap.this.size();
396 }
397
398 public boolean isEmpty() {
399 return AbstractMap.this.isEmpty();
400 }
401
402 public void clear() {
403 AbstractMap.this.clear();
404 }
405
406 public boolean contains(Object v) {
407 return AbstractMap.this.containsValue(v);
408 }
409 };
410 }
411 return values;
412 }
413
414 public abstract Set<Entry<K,V>> entrySet();
415
416
417 // Comparison and hashing
418
419 /**
420 * Compares the specified object with this map for equality. Returns
421 * <tt>true</tt> if the given object is also a map and the two maps
422 * represent the same mappings. More formally, two maps <tt>m1</tt> and
423 * <tt>m2</tt> represent the same mappings if
424 * <tt>m1.entrySet().equals(m2.entrySet())</tt>. This ensures that the
425 * <tt>equals</tt> method works properly across different implementations
426 * of the <tt>Map</tt> interface.
427 *
428 * <p>This implementation first checks if the specified object is this map;
429 * if so it returns <tt>true</tt>. Then, it checks if the specified
430 * object is a map whose size is identical to the size of this map; if
431 * not, it returns <tt>false</tt>. If so, it iterates over this map's
432 * <tt>entrySet</tt> collection, and checks that the specified map
433 * contains each mapping that this map contains. If the specified map
434 * fails to contain such a mapping, <tt>false</tt> is returned. If the
435 * iteration completes, <tt>true</tt> is returned.
436 *
437 * @param o object to be compared for equality with this map
438 * @return <tt>true</tt> if the specified object is equal to this map
439 */
440 public boolean equals(Object o) {
441 if (o == this)
442 return true;
443
444 if (!(o instanceof Map))
445 return false;
446 Map<K,V> m = (Map<K,V>) o;
447 if (m.size() != size())
448 return false;
449
450 try {
451 Iterator<Entry<K,V>> i = entrySet().iterator();
452 while (i.hasNext()) {
453 Entry<K,V> e = i.next();
454 K key = e.getKey();
455 V value = e.getValue();
456 if (value == null) {
457 if (!(m.get(key)==null && m.containsKey(key)))
458 return false;
459 } else {
460 if (!value.equals(m.get(key)))
461 return false;
462 }
463 }
464 } catch (ClassCastException unused) {
465 return false;
466 } catch (NullPointerException unused) {
467 return false;
468 }
469
470 return true;
471 }
472
473 /**
474 * Returns the hash code value for this map. The hash code of a map is
475 * defined to be the sum of the hash codes of each entry in the map's
476 * <tt>entrySet()</tt> view. This ensures that <tt>m1.equals(m2)</tt>
477 * implies that <tt>m1.hashCode()==m2.hashCode()</tt> for any two maps
478 * <tt>m1</tt> and <tt>m2</tt>, as required by the general contract of
479 * {@link Object#hashCode}.
480 *
481 * <p>This implementation iterates over <tt>entrySet()</tt>, calling
482 * {@link Map.Entry#hashCode hashCode()} on each element (entry) in the
483 * set, and adding up the results.
484 *
485 * @return the hash code value for this map
486 * @see Map.Entry#hashCode()
487 * @see Object#equals(Object)
488 * @see Set#equals(Object)
489 */
490 public int hashCode() {
491 int h = 0;
492 Iterator<Entry<K,V>> i = entrySet().iterator();
493 while (i.hasNext())
494 h += i.next().hashCode();
495 return h;
496 }
497
498 /**
499 * Returns a string representation of this map. The string representation
500 * consists of a list of key-value mappings in the order returned by the
501 * map's <tt>entrySet</tt> view's iterator, enclosed in braces
502 * (<tt>"{}"</tt>). Adjacent mappings are separated by the characters
503 * <tt>", "</tt> (comma and space). Each key-value mapping is rendered as
504 * the key followed by an equals sign (<tt>"="</tt>) followed by the
505 * associated value. Keys and values are converted to strings as by
506 * {@link String#valueOf(Object)}.
507 *
508 * @return a string representation of this map
509 */
510 public String toString() {
511 Iterator<Entry<K,V>> i = entrySet().iterator();
512 if (! i.hasNext())
513 return "{}";
514
515 StringBuilder sb = new StringBuilder();
516 sb.append('{');
517 for (;;) {
518 Entry<K,V> e = i.next();
519 K key = e.getKey();
520 V value = e.getValue();
521 sb.append(key == this ? "(this Map)" : key);
522 sb.append('=');
523 sb.append(value == this ? "(this Map)" : value);
524 if (! i.hasNext())
525 return sb.append('}').toString();
526 sb.append(',').append(' ');
527 }
528 }
529
530 /**
531 * Returns a shallow copy of this <tt>AbstractMap</tt> instance: the keys
532 * and values themselves are not cloned.
533 *
534 * @return a shallow copy of this map
535 */
536 protected Object clone() throws CloneNotSupportedException {
537 AbstractMap<K,V> result = (AbstractMap<K,V>)super.clone();
538 result.keySet = null;
539 result.values = null;
540 return result;
541 }
542
543 /**
544 * Utility method for SimpleEntry and SimpleImmutableEntry.
545 * Test for equality, checking for nulls.
546 */
547 private static boolean eq(Object o1, Object o2) {
548 return o1 == null ? o2 == null : o1.equals(o2);
549 }
550
551 // Implementation Note: SimpleEntry and SimpleImmutableEntry
552 // are distinct unrelated classes, even though they share
553 // some code. Since you can't add or subtract final-ness
554 // of a field in a subclass, they can't share representations,
555 // and the amount of duplicated code is too small to warrant
556 // exposing a common abstract class.
557
558
559 /**
560 * An Entry maintaining a key and a value. The value may be
561 * changed using the <tt>setValue</tt> method. This class
562 * facilitates the process of building custom map
563 * implementations. For example, it may be convenient to return
564 * arrays of <tt>SimpleEntry</tt> instances in method
565 * <tt>Map.entrySet().toArray</tt>.
566 *
567 * @since 1.6
568 */
569 public static class SimpleEntry<K,V>
570 implements Entry<K,V>, java.io.Serializable
571 {
572 private static final long serialVersionUID = -8499721149061103585L;
573
574 private final K key;
575 private V value;
576
577 /**
578 * Creates an entry representing a mapping from the specified
579 * key to the specified value.
580 *
581 * @param key the key represented by this entry
582 * @param value the value represented by this entry
583 */
584 public SimpleEntry(K key, V value) {
585 this.key = key;
586 this.value = value;
587 }
588
589 /**
590 * Creates an entry representing the same mapping as the
591 * specified entry.
592 *
593 * @param entry the entry to copy
594 */
595 public SimpleEntry(Entry<? extends K, ? extends V> entry) {
596 this.key = entry.getKey();
597 this.value = entry.getValue();
598 }
599
600 /**
601 * Returns the key corresponding to this entry.
602 *
603 * @return the key corresponding to this entry
604 */
605 public K getKey() {
606 return key;
607 }
608
609 /**
610 * Returns the value corresponding to this entry.
611 *
612 * @return the value corresponding to this entry
613 */
614 public V getValue() {
615 return value;
616 }
617
618 /**
619 * Replaces the value corresponding to this entry with the specified
620 * value.
621 *
622 * @param value new value to be stored in this entry
623 * @return the old value corresponding to the entry
624 */
625 public V setValue(V value) {
626 V oldValue = this.value;
627 this.value = value;
628 return oldValue;
629 }
630
631 /**
632 * Compares the specified object with this entry for equality.
633 * Returns {@code true} if the given object is also a map entry and
634 * the two entries represent the same mapping. More formally, two
635 * entries {@code e1} and {@code e2} represent the same mapping
636 * if<pre>
637 * (e1.getKey()==null ?
638 * e2.getKey()==null :
639 * e1.getKey().equals(e2.getKey()))
640 * &amp;&amp;
641 * (e1.getValue()==null ?
642 * e2.getValue()==null :
643 * e1.getValue().equals(e2.getValue()))</pre>
644 * This ensures that the {@code equals} method works properly across
645 * different implementations of the {@code Map.Entry} interface.
646 *
647 * @param o object to be compared for equality with this map entry
648 * @return {@code true} if the specified object is equal to this map
649 * entry
650 * @see #hashCode
651 */
652 public boolean equals(Object o) {
653 if (!(o instanceof Map.Entry))
654 return false;
655 Map.Entry e = (Map.Entry)o;
656 return eq(key, e.getKey()) && eq(value, e.getValue());
657 }
658
659 /**
660 * Returns the hash code value for this map entry. The hash code
661 * of a map entry {@code e} is defined to be: <pre>
662 * (e.getKey()==null ? 0 : e.getKey().hashCode()) ^
663 * (e.getValue()==null ? 0 : e.getValue().hashCode())</pre>
664 * This ensures that {@code e1.equals(e2)} implies that
665 * {@code e1.hashCode()==e2.hashCode()} for any two Entries
666 * {@code e1} and {@code e2}, as required by the general
667 * contract of {@link Object#hashCode}.
668 *
669 * @return the hash code value for this map entry
670 * @see #equals
671 */
672 public int hashCode() {
673 return (key == null ? 0 : key.hashCode()) ^
674 (value == null ? 0 : value.hashCode());
675 }
676
677 /**
678 * Returns a String representation of this map entry. This
679 * implementation returns the string representation of this
680 * entry's key followed by the equals character ("<tt>=</tt>")
681 * followed by the string representation of this entry's value.
682 *
683 * @return a String representation of this map entry
684 */
685 public String toString() {
686 return key + "=" + value;
687 }
688
689 }
690
691 /**
692 * An Entry maintaining an immutable key and value. This class
693 * does not support method <tt>setValue</tt>. This class may be
694 * convenient in methods that return thread-safe snapshots of
695 * key-value mappings.
696 *
697 * @since 1.6
698 */
699 public static class SimpleImmutableEntry<K,V>
700 implements Entry<K,V>, java.io.Serializable
701 {
702 private static final long serialVersionUID = 7138329143949025153L;
703
704 private final K key;
705 private final V value;
706
707 /**
708 * Creates an entry representing a mapping from the specified
709 * key to the specified value.
710 *
711 * @param key the key represented by this entry
712 * @param value the value represented by this entry
713 */
714 public SimpleImmutableEntry(K key, V value) {
715 this.key = key;
716 this.value = value;
717 }
718
719 /**
720 * Creates an entry representing the same mapping as the
721 * specified entry.
722 *
723 * @param entry the entry to copy
724 */
725 public SimpleImmutableEntry(Entry<? extends K, ? extends V> entry) {
726 this.key = entry.getKey();
727 this.value = entry.getValue();
728 }
729
730 /**
731 * Returns the key corresponding to this entry.
732 *
733 * @return the key corresponding to this entry
734 */
735 public K getKey() {
736 return key;
737 }
738
739 /**
740 * Returns the value corresponding to this entry.
741 *
742 * @return the value corresponding to this entry
743 */
744 public V getValue() {
745 return value;
746 }
747
748 /**
749 * Replaces the value corresponding to this entry with the specified
750 * value (optional operation). This implementation simply throws
751 * <tt>UnsupportedOperationException</tt>, as this class implements
752 * an <i>immutable</i> map entry.
753 *
754 * @param value new value to be stored in this entry
755 * @return (Does not return)
756 * @throws UnsupportedOperationException always
757 */
758 public V setValue(V value) {
759 throw new UnsupportedOperationException();
760 }
761
762 /**
763 * Compares the specified object with this entry for equality.
764 * Returns {@code true} if the given object is also a map entry and
765 * the two entries represent the same mapping. More formally, two
766 * entries {@code e1} and {@code e2} represent the same mapping
767 * if<pre>
768 * (e1.getKey()==null ?
769 * e2.getKey()==null :
770 * e1.getKey().equals(e2.getKey()))
771 * &amp;&amp;
772 * (e1.getValue()==null ?
773 * e2.getValue()==null :
774 * e1.getValue().equals(e2.getValue()))</pre>
775 * This ensures that the {@code equals} method works properly across
776 * different implementations of the {@code Map.Entry} interface.
777 *
778 * @param o object to be compared for equality with this map entry
779 * @return {@code true} if the specified object is equal to this map
780 * entry
781 * @see #hashCode
782 */
783 public boolean equals(Object o) {
784 if (!(o instanceof Map.Entry))
785 return false;
786 Map.Entry e = (Map.Entry)o;
787 return eq(key, e.getKey()) && eq(value, e.getValue());
788 }
789
790 /**
791 * Returns the hash code value for this map entry. The hash code
792 * of a map entry {@code e} is defined to be: <pre>
793 * (e.getKey()==null ? 0 : e.getKey().hashCode()) ^
794 * (e.getValue()==null ? 0 : e.getValue().hashCode())</pre>
795 * This ensures that {@code e1.equals(e2)} implies that
796 * {@code e1.hashCode()==e2.hashCode()} for any two Entries
797 * {@code e1} and {@code e2}, as required by the general
798 * contract of {@link Object#hashCode}.
799 *
800 * @return the hash code value for this map entry
801 * @see #equals
802 */
803 public int hashCode() {
804 return (key == null ? 0 : key.hashCode()) ^
805 (value == null ? 0 : value.hashCode());
806 }
807
808 /**
809 * Returns a String representation of this map entry. This
810 * implementation returns the string representation of this
811 * entry's key followed by the equals character ("<tt>=</tt>")
812 * followed by the string representation of this entry's value.
813 *
814 * @return a String representation of this map entry
815 */
816 public String toString() {
817 return key + "=" + value;
818 }
819
820 }
821
822}
java/pkg/java/util/AbstractQueue.class+0−0

Binary file not shown.

java/pkg/java/util/AbstractQueue.java+192−0
@@ -0,0 +1,192 @@
1/*
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3 *
4 * This code is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 2 only, as
6 * published by the Free Software Foundation. Oracle designates this
7 * particular file as subject to the "Classpath" exception as provided
8 * by Oracle in the LICENSE file that accompanied this code.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 */
24
25/*
26 * This file is available under and governed by the GNU General Public
27 * License version 2 only, as published by the Free Software Foundation.
28 * However, the following notice accompanied the original version of this
29 * file:
30 *
31 * Written by Doug Lea with assistance from members of JCP JSR-166
32 * Expert Group and released to the public domain, as explained at
33 * http://creativecommons.org/publicdomain/zero/1.0/
34 */
35
36package java.util;
37
38/**
39 * This class provides skeletal implementations of some {@link Queue}
40 * operations. The implementations in this class are appropriate when
41 * the base implementation does <em>not</em> allow <tt>null</tt>
42 * elements. Methods {@link #add add}, {@link #remove remove}, and
43 * {@link #element element} are based on {@link #offer offer}, {@link
44 * #poll poll}, and {@link #peek peek}, respectively, but throw
45 * exceptions instead of indicating failure via <tt>false</tt> or
46 * <tt>null</tt> returns.
47 *
48 * <p>A <tt>Queue</tt> implementation that extends this class must
49 * minimally define a method {@link Queue#offer} which does not permit
50 * insertion of <tt>null</tt> elements, along with methods {@link
51 * Queue#peek}, {@link Queue#poll}, {@link Collection#size}, and
52 * {@link Collection#iterator}. Typically, additional methods will be
53 * overridden as well. If these requirements cannot be met, consider
54 * instead subclassing {@link AbstractCollection}.
55 *
56 * <p>This class is a member of the
57 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
58 * Java Collections Framework</a>.
59 *
60 * @since 1.5
61 * @author Doug Lea
62 * @param <E> the type of elements held in this collection
63 */
64public abstract class AbstractQueue<E>
65 extends AbstractCollection<E>
66 implements Queue<E> {
67
68 /**
69 * Constructor for use by subclasses.
70 */
71 protected AbstractQueue() {
72 }
73
74 /**
75 * Inserts the specified element into this queue if it is possible to do so
76 * immediately without violating capacity restrictions, returning
77 * <tt>true</tt> upon success and throwing an <tt>IllegalStateException</tt>
78 * if no space is currently available.
79 *
80 * <p>This implementation returns <tt>true</tt> if <tt>offer</tt> succeeds,
81 * else throws an <tt>IllegalStateException</tt>.
82 *
83 * @param e the element to add
84 * @return <tt>true</tt> (as specified by {@link Collection#add})
85 * @throws IllegalStateException if the element cannot be added at this
86 * time due to capacity restrictions
87 * @throws ClassCastException if the class of the specified element
88 * prevents it from being added to this queue
89 * @throws NullPointerException if the specified element is null and
90 * this queue does not permit null elements
91 * @throws IllegalArgumentException if some property of this element
92 * prevents it from being added to this queue
93 */
94 public boolean add(E e) {
95 if (offer(e))
96 return true;
97 else
98 throw new IllegalStateException("Queue full");
99 }
100
101 /**
102 * Retrieves and removes the head of this queue. This method differs
103 * from {@link #poll poll} only in that it throws an exception if this
104 * queue is empty.
105 *
106 * <p>This implementation returns the result of <tt>poll</tt>
107 * unless the queue is empty.
108 *
109 * @return the head of this queue
110 * @throws NoSuchElementException if this queue is empty
111 */
112 public E remove() {
113 E x = poll();
114 if (x != null)
115 return x;
116 else
117 throw new NoSuchElementException();
118 }
119
120 /**
121 * Retrieves, but does not remove, the head of this queue. This method
122 * differs from {@link #peek peek} only in that it throws an exception if
123 * this queue is empty.
124 *
125 * <p>This implementation returns the result of <tt>peek</tt>
126 * unless the queue is empty.
127 *
128 * @return the head of this queue
129 * @throws NoSuchElementException if this queue is empty
130 */
131 public E element() {
132 E x = peek();
133 if (x != null)
134 return x;
135 else
136 throw new NoSuchElementException();
137 }
138
139 /**
140 * Removes all of the elements from this queue.
141 * The queue will be empty after this call returns.
142 *
143 * <p>This implementation repeatedly invokes {@link #poll poll} until it
144 * returns <tt>null</tt>.
145 */
146 public void clear() {
147 while (poll() != null)
148 ;
149 }
150
151 /**
152 * Adds all of the elements in the specified collection to this
153 * queue. Attempts to addAll of a queue to itself result in
154 * <tt>IllegalArgumentException</tt>. Further, the behavior of
155 * this operation is undefined if the specified collection is
156 * modified while the operation is in progress.
157 *
158 * <p>This implementation iterates over the specified collection,
159 * and adds each element returned by the iterator to this
160 * queue, in turn. A runtime exception encountered while
161 * trying to add an element (including, in particular, a
162 * <tt>null</tt> element) may result in only some of the elements
163 * having been successfully added when the associated exception is
164 * thrown.
165 *
166 * @param c collection containing elements to be added to this queue
167 * @return <tt>true</tt> if this queue changed as a result of the call
168 * @throws ClassCastException if the class of an element of the specified
169 * collection prevents it from being added to this queue
170 * @throws NullPointerException if the specified collection contains a
171 * null element and this queue does not permit null elements,
172 * or if the specified collection is null
173 * @throws IllegalArgumentException if some property of an element of the
174 * specified collection prevents it from being added to this
175 * queue, or if the specified collection is this queue
176 * @throws IllegalStateException if not all the elements can be added at
177 * this time due to insertion restrictions
178 * @see #add(Object)
179 */
180 public boolean addAll(Collection<? extends E> c) {
181 if (c == null)
182 throw new NullPointerException();
183 if (c == this)
184 throw new IllegalArgumentException();
185 boolean modified = false;
186 for (E e : c)
187 if (add(e))
188 modified = true;
189 return modified;
190 }
191
192}
java/pkg/java/util/AbstractSequentialList.class+0−0

Binary file not shown.

java/pkg/java/util/AbstractSequentialList.java+253−0
@@ -0,0 +1,253 @@
1/*
2 * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.util;
27
28/**
29 * This class provides a skeletal implementation of the <tt>List</tt>
30 * interface to minimize the effort required to implement this interface
31 * backed by a "sequential access" data store (such as a linked list). For
32 * random access data (such as an array), <tt>AbstractList</tt> should be used
33 * in preference to this class.<p>
34 *
35 * This class is the opposite of the <tt>AbstractList</tt> class in the sense
36 * that it implements the "random access" methods (<tt>get(int index)</tt>,
37 * <tt>set(int index, E element)</tt>, <tt>add(int index, E element)</tt> and
38 * <tt>remove(int index)</tt>) on top of the list's list iterator, instead of
39 * the other way around.<p>
40 *
41 * To implement a list the programmer needs only to extend this class and
42 * provide implementations for the <tt>listIterator</tt> and <tt>size</tt>
43 * methods. For an unmodifiable list, the programmer need only implement the
44 * list iterator's <tt>hasNext</tt>, <tt>next</tt>, <tt>hasPrevious</tt>,
45 * <tt>previous</tt> and <tt>index</tt> methods.<p>
46 *
47 * For a modifiable list the programmer should additionally implement the list
48 * iterator's <tt>set</tt> method. For a variable-size list the programmer
49 * should additionally implement the list iterator's <tt>remove</tt> and
50 * <tt>add</tt> methods.<p>
51 *
52 * The programmer should generally provide a void (no argument) and collection
53 * constructor, as per the recommendation in the <tt>Collection</tt> interface
54 * specification.<p>
55 *
56 * This class is a member of the
57 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
58 * Java Collections Framework</a>.
59 *
60 * @author Josh Bloch
61 * @author Neal Gafter
62 * @see Collection
63 * @see List
64 * @see AbstractList
65 * @see AbstractCollection
66 * @since 1.2
67 */
68
69public abstract class AbstractSequentialList<E> extends AbstractList<E> {
70 /**
71 * Sole constructor. (For invocation by subclass constructors, typically
72 * implicit.)
73 */
74 protected AbstractSequentialList() {
75 }
76
77 /**
78 * Returns the element at the specified position in this list.
79 *
80 * <p>This implementation first gets a list iterator pointing to the
81 * indexed element (with <tt>listIterator(index)</tt>). Then, it gets
82 * the element using <tt>ListIterator.next</tt> and returns it.
83 *
84 * @throws IndexOutOfBoundsException {@inheritDoc}
85 */
86 public E get(int index) {
87 try {
88 return listIterator(index).next();
89 } catch (NoSuchElementException exc) {
90 throw new IndexOutOfBoundsException("Index: "+index);
91 }
92 }
93
94 /**
95 * Replaces the element at the specified position in this list with the
96 * specified element (optional operation).
97 *
98 * <p>This implementation first gets a list iterator pointing to the
99 * indexed element (with <tt>listIterator(index)</tt>). Then, it gets
100 * the current element using <tt>ListIterator.next</tt> and replaces it
101 * with <tt>ListIterator.set</tt>.
102 *
103 * <p>Note that this implementation will throw an
104 * <tt>UnsupportedOperationException</tt> if the list iterator does not
105 * implement the <tt>set</tt> operation.
106 *
107 * @throws UnsupportedOperationException {@inheritDoc}
108 * @throws ClassCastException {@inheritDoc}
109 * @throws NullPointerException {@inheritDoc}
110 * @throws IllegalArgumentException {@inheritDoc}
111 * @throws IndexOutOfBoundsException {@inheritDoc}
112 */
113 public E set(int index, E element) {
114 try {
115 ListIterator<E> e = listIterator(index);
116 E oldVal = e.next();
117 e.set(element);
118 return oldVal;
119 } catch (NoSuchElementException exc) {
120 throw new IndexOutOfBoundsException("Index: "+index);
121 }
122 }
123
124 /**
125 * Inserts the specified element at the specified position in this list
126 * (optional operation). Shifts the element currently at that position
127 * (if any) and any subsequent elements to the right (adds one to their
128 * indices).
129 *
130 * <p>This implementation first gets a list iterator pointing to the
131 * indexed element (with <tt>listIterator(index)</tt>). Then, it
132 * inserts the specified element with <tt>ListIterator.add</tt>.
133 *
134 * <p>Note that this implementation will throw an
135 * <tt>UnsupportedOperationException</tt> if the list iterator does not
136 * implement the <tt>add</tt> operation.
137 *
138 * @throws UnsupportedOperationException {@inheritDoc}
139 * @throws ClassCastException {@inheritDoc}
140 * @throws NullPointerException {@inheritDoc}
141 * @throws IllegalArgumentException {@inheritDoc}
142 * @throws IndexOutOfBoundsException {@inheritDoc}
143 */
144 public void add(int index, E element) {
145 try {
146 listIterator(index).add(element);
147 } catch (NoSuchElementException exc) {
148 throw new IndexOutOfBoundsException("Index: "+index);
149 }
150 }
151
152 /**
153 * Removes the element at the specified position in this list (optional
154 * operation). Shifts any subsequent elements to the left (subtracts one
155 * from their indices). Returns the element that was removed from the
156 * list.
157 *
158 * <p>This implementation first gets a list iterator pointing to the
159 * indexed element (with <tt>listIterator(index)</tt>). Then, it removes
160 * the element with <tt>ListIterator.remove</tt>.
161 *
162 * <p>Note that this implementation will throw an
163 * <tt>UnsupportedOperationException</tt> if the list iterator does not
164 * implement the <tt>remove</tt> operation.
165 *
166 * @throws UnsupportedOperationException {@inheritDoc}
167 * @throws IndexOutOfBoundsException {@inheritDoc}
168 */
169 public E remove(int index) {
170 try {
171 ListIterator<E> e = listIterator(index);
172 E outCast = e.next();
173 e.remove();
174 return outCast;
175 } catch (NoSuchElementException exc) {
176 throw new IndexOutOfBoundsException("Index: "+index);
177 }
178 }
179
180
181 // Bulk Operations
182
183 /**
184 * Inserts all of the elements in the specified collection into this
185 * list at the specified position (optional operation). Shifts the
186 * element currently at that position (if any) and any subsequent
187 * elements to the right (increases their indices). The new elements
188 * will appear in this list in the order that they are returned by the
189 * specified collection's iterator. The behavior of this operation is
190 * undefined if the specified collection is modified while the
191 * operation is in progress. (Note that this will occur if the specified
192 * collection is this list, and it's nonempty.)
193 *
194 * <p>This implementation gets an iterator over the specified collection and
195 * a list iterator over this list pointing to the indexed element (with
196 * <tt>listIterator(index)</tt>). Then, it iterates over the specified
197 * collection, inserting the elements obtained from the iterator into this
198 * list, one at a time, using <tt>ListIterator.add</tt> followed by
199 * <tt>ListIterator.next</tt> (to skip over the added element).
200 *
201 * <p>Note that this implementation will throw an
202 * <tt>UnsupportedOperationException</tt> if the list iterator returned by
203 * the <tt>listIterator</tt> method does not implement the <tt>add</tt>
204 * operation.
205 *
206 * @throws UnsupportedOperationException {@inheritDoc}
207 * @throws ClassCastException {@inheritDoc}
208 * @throws NullPointerException {@inheritDoc}
209 * @throws IllegalArgumentException {@inheritDoc}
210 * @throws IndexOutOfBoundsException {@inheritDoc}
211 */
212 public boolean addAll(int index, Collection<? extends E> c) {
213 try {
214 boolean modified = false;
215 ListIterator<E> e1 = listIterator(index);
216 Iterator<? extends E> e2 = c.iterator();
217 while (e2.hasNext()) {
218 e1.add(e2.next());
219 modified = true;
220 }
221 return modified;
222 } catch (NoSuchElementException exc) {
223 throw new IndexOutOfBoundsException("Index: "+index);
224 }
225 }
226
227
228 // Iterators
229
230 /**
231 * Returns an iterator over the elements in this list (in proper
232 * sequence).<p>
233 *
234 * This implementation merely returns a list iterator over the list.
235 *
236 * @return an iterator over the elements in this list (in proper sequence)
237 */
238 public Iterator<E> iterator() {
239 return listIterator();
240 }
241
242 /**
243 * Returns a list iterator over the elements in this list (in proper
244 * sequence).
245 *
246 * @param index index of first element to be returned from the list
247 * iterator (by a call to the <code>next</code> method)
248 * @return a list iterator over the elements in this list (in proper
249 * sequence)
250 * @throws IndexOutOfBoundsException {@inheritDoc}
251 */
252 public abstract ListIterator<E> listIterator(int index);
253}
java/pkg/java/util/AbstractSet.class+0−0

Binary file not shown.

java/pkg/java/util/AbstractSet.java+185−0
@@ -0,0 +1,185 @@
1/*
2 * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.util;
27
28/**
29 * This class provides a skeletal implementation of the <tt>Set</tt>
30 * interface to minimize the effort required to implement this
31 * interface. <p>
32 *
33 * The process of implementing a set by extending this class is identical
34 * to that of implementing a Collection by extending AbstractCollection,
35 * except that all of the methods and constructors in subclasses of this
36 * class must obey the additional constraints imposed by the <tt>Set</tt>
37 * interface (for instance, the add method must not permit addition of
38 * multiple instances of an object to a set).<p>
39 *
40 * Note that this class does not override any of the implementations from
41 * the <tt>AbstractCollection</tt> class. It merely adds implementations
42 * for <tt>equals</tt> and <tt>hashCode</tt>.<p>
43 *
44 * This class is a member of the
45 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
46 * Java Collections Framework</a>.
47 *
48 * @param <E> the type of elements maintained by this set
49 *
50 * @author Josh Bloch
51 * @author Neal Gafter
52 * @see Collection
53 * @see AbstractCollection
54 * @see Set
55 * @since 1.2
56 */
57
58public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {
59 /**
60 * Sole constructor. (For invocation by subclass constructors, typically
61 * implicit.)
62 */
63 protected AbstractSet() {
64 }
65
66 // Comparison and hashing
67
68 /**
69 * Compares the specified object with this set for equality. Returns
70 * <tt>true</tt> if the given object is also a set, the two sets have
71 * the same size, and every member of the given set is contained in
72 * this set. This ensures that the <tt>equals</tt> method works
73 * properly across different implementations of the <tt>Set</tt>
74 * interface.<p>
75 *
76 * This implementation first checks if the specified object is this
77 * set; if so it returns <tt>true</tt>. Then, it checks if the
78 * specified object is a set whose size is identical to the size of
79 * this set; if not, it returns false. If so, it returns
80 * <tt>containsAll((Collection) o)</tt>.
81 *
82 * @param o object to be compared for equality with this set
83 * @return <tt>true</tt> if the specified object is equal to this set
84 */
85 public boolean equals(Object o) {
86 if (o == this)
87 return true;
88
89 if (!(o instanceof Set))
90 return false;
91 Collection c = (Collection) o;
92 if (c.size() != size())
93 return false;
94 try {
95 return containsAll(c);
96 } catch (ClassCastException unused) {
97 return false;
98 } catch (NullPointerException unused) {
99 return false;
100 }
101 }
102
103 /**
104 * Returns the hash code value for this set. The hash code of a set is
105 * defined to be the sum of the hash codes of the elements in the set,
106 * where the hash code of a <tt>null</tt> element is defined to be zero.
107 * This ensures that <tt>s1.equals(s2)</tt> implies that
108 * <tt>s1.hashCode()==s2.hashCode()</tt> for any two sets <tt>s1</tt>
109 * and <tt>s2</tt>, as required by the general contract of
110 * {@link Object#hashCode}.
111 *
112 * <p>This implementation iterates over the set, calling the
113 * <tt>hashCode</tt> method on each element in the set, and adding up
114 * the results.
115 *
116 * @return the hash code value for this set
117 * @see Object#equals(Object)
118 * @see Set#equals(Object)
119 */
120 public int hashCode() {
121 int h = 0;
122 Iterator<E> i = iterator();
123 while (i.hasNext()) {
124 E obj = i.next();
125 if (obj != null)
126 h += obj.hashCode();
127 }
128 return h;
129 }
130
131 /**
132 * Removes from this set all of its elements that are contained in the
133 * specified collection (optional operation). If the specified
134 * collection is also a set, this operation effectively modifies this
135 * set so that its value is the <i>asymmetric set difference</i> of
136 * the two sets.
137 *
138 * <p>This implementation determines which is the smaller of this set
139 * and the specified collection, by invoking the <tt>size</tt>
140 * method on each. If this set has fewer elements, then the
141 * implementation iterates over this set, checking each element
142 * returned by the iterator in turn to see if it is contained in
143 * the specified collection. If it is so contained, it is removed
144 * from this set with the iterator's <tt>remove</tt> method. If
145 * the specified collection has fewer elements, then the
146 * implementation iterates over the specified collection, removing
147 * from this set each element returned by the iterator, using this
148 * set's <tt>remove</tt> method.
149 *
150 * <p>Note that this implementation will throw an
151 * <tt>UnsupportedOperationException</tt> if the iterator returned by the
152 * <tt>iterator</tt> method does not implement the <tt>remove</tt> method.
153 *
154 * @param c collection containing elements to be removed from this set
155 * @return <tt>true</tt> if this set changed as a result of the call
156 * @throws UnsupportedOperationException if the <tt>removeAll</tt> operation
157 * is not supported by this set
158 * @throws ClassCastException if the class of an element of this set
159 * is incompatible with the specified collection
160 * (<a href="Collection.html#optional-restrictions">optional</a>)
161 * @throws NullPointerException if this set contains a null element and the
162 * specified collection does not permit null elements
163 * (<a href="Collection.html#optional-restrictions">optional</a>),
164 * or if the specified collection is null
165 * @see #remove(Object)
166 * @see #contains(Object)
167 */
168 public boolean removeAll(Collection<?> c) {
169 boolean modified = false;
170
171 if (size() > c.size()) {
172 for (Iterator<?> i = c.iterator(); i.hasNext(); )
173 modified |= remove(i.next());
174 } else {
175 for (Iterator<?> i = iterator(); i.hasNext(); ) {
176 if (c.contains(i.next())) {
177 i.remove();
178 modified = true;
179 }
180 }
181 }
182 return modified;
183 }
184
185}
java/pkg/java/util/ArrayDeque$1.class+0−0

Binary file not shown.

java/pkg/java/util/ArrayDeque$DeqIterator.class+0−0

Binary file not shown.

java/pkg/java/util/ArrayDeque$DescendingIterator.class+0−0

Binary file not shown.

java/pkg/java/util/ArrayDeque.class+0−0

Binary file not shown.

java/pkg/java/util/ArrayDeque.java+866−0
@@ -0,0 +1,866 @@
1/*
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3 *
4 * This code is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 2 only, as
6 * published by the Free Software Foundation. Oracle designates this
7 * particular file as subject to the "Classpath" exception as provided
8 * by Oracle in the LICENSE file that accompanied this code.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 */
24
25/*
26 * This file is available under and governed by the GNU General Public
27 * License version 2 only, as published by the Free Software Foundation.
28 * However, the following notice accompanied the original version of this
29 * file:
30 *
31 * Written by Josh Bloch of Google Inc. and released to the public domain,
32 * as explained at http://creativecommons.org/publicdomain/zero/1.0/.
33 */
34
35package java.util;
36import java.io.*;
37
38/**
39 * Resizable-array implementation of the {@link Deque} interface. Array
40 * deques have no capacity restrictions; they grow as necessary to support
41 * usage. They are not thread-safe; in the absence of external
42 * synchronization, they do not support concurrent access by multiple threads.
43 * Null elements are prohibited. This class is likely to be faster than
44 * {@link Stack} when used as a stack, and faster than {@link LinkedList}
45 * when used as a queue.
46 *
47 * <p>Most <tt>ArrayDeque</tt> operations run in amortized constant time.
48 * Exceptions include {@link #remove(Object) remove}, {@link
49 * #removeFirstOccurrence removeFirstOccurrence}, {@link #removeLastOccurrence
50 * removeLastOccurrence}, {@link #contains contains}, {@link #iterator
51 * iterator.remove()}, and the bulk operations, all of which run in linear
52 * time.
53 *
54 * <p>The iterators returned by this class's <tt>iterator</tt> method are
55 * <i>fail-fast</i>: If the deque is modified at any time after the iterator
56 * is created, in any way except through the iterator's own <tt>remove</tt>
57 * method, the iterator will generally throw a {@link
58 * ConcurrentModificationException}. Thus, in the face of concurrent
59 * modification, the iterator fails quickly and cleanly, rather than risking
60 * arbitrary, non-deterministic behavior at an undetermined time in the
61 * future.
62 *
63 * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
64 * as it is, generally speaking, impossible to make any hard guarantees in the
65 * presence of unsynchronized concurrent modification. Fail-fast iterators
66 * throw <tt>ConcurrentModificationException</tt> on a best-effort basis.
67 * Therefore, it would be wrong to write a program that depended on this
68 * exception for its correctness: <i>the fail-fast behavior of iterators
69 * should be used only to detect bugs.</i>
70 *
71 * <p>This class and its iterator implement all of the
72 * <em>optional</em> methods of the {@link Collection} and {@link
73 * Iterator} interfaces.
74 *
75 * <p>This class is a member of the
76 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
77 * Java Collections Framework</a>.
78 *
79 * @author Josh Bloch and Doug Lea
80 * @since 1.6
81 * @param <E> the type of elements held in this collection
82 */
83public class ArrayDeque<E> extends AbstractCollection<E>
84 implements Deque<E>, Cloneable, Serializable
85{
86 /**
87 * The array in which the elements of the deque are stored.
88 * The capacity of the deque is the length of this array, which is
89 * always a power of two. The array is never allowed to become
90 * full, except transiently within an addX method where it is
91 * resized (see doubleCapacity) immediately upon becoming full,
92 * thus avoiding head and tail wrapping around to equal each
93 * other. We also guarantee that all array cells not holding
94 * deque elements are always null.
95 */
96 private transient E[] elements;
97
98 /**
99 * The index of the element at the head of the deque (which is the
100 * element that would be removed by remove() or pop()); or an
101 * arbitrary number equal to tail if the deque is empty.
102 */
103 private transient int head;
104
105 /**
106 * The index at which the next element would be added to the tail
107 * of the deque (via addLast(E), add(E), or push(E)).
108 */
109 private transient int tail;
110
111 /**
112 * The minimum capacity that we'll use for a newly created deque.
113 * Must be a power of 2.
114 */
115 private static final int MIN_INITIAL_CAPACITY = 8;
116
117 // ****** Array allocation and resizing utilities ******
118
119 /**
120 * Allocate empty array to hold the given number of elements.
121 *
122 * @param numElements the number of elements to hold
123 */
124 private void allocateElements(int numElements) {
125 int initialCapacity = MIN_INITIAL_CAPACITY;
126 // Find the best power of two to hold elements.
127 // Tests "<=" because arrays aren't kept full.
128 if (numElements >= initialCapacity) {
129 initialCapacity = numElements;
130 initialCapacity |= (initialCapacity >>> 1);
131 initialCapacity |= (initialCapacity >>> 2);
132 initialCapacity |= (initialCapacity >>> 4);
133 initialCapacity |= (initialCapacity >>> 8);
134 initialCapacity |= (initialCapacity >>> 16);
135 initialCapacity++;
136
137 if (initialCapacity < 0) // Too many elements, must back off
138 initialCapacity >>>= 1;// Good luck allocating 2 ^ 30 elements
139 }
140 elements = (E[]) new Object[initialCapacity];
141 }
142
143 /**
144 * Double the capacity of this deque. Call only when full, i.e.,
145 * when head and tail have wrapped around to become equal.
146 */
147 private void doubleCapacity() {
148 assert head == tail;
149 int p = head;
150 int n = elements.length;
151 int r = n - p; // number of elements to the right of p
152 int newCapacity = n << 1;
153 if (newCapacity < 0)
154 throw new IllegalStateException("Sorry, deque too big");
155 Object[] a = new Object[newCapacity];
156 System.arraycopy(elements, p, a, 0, r);
157 System.arraycopy(elements, 0, a, r, p);
158 elements = (E[])a;
159 head = 0;
160 tail = n;
161 }
162
163 /**
164 * Copies the elements from our element array into the specified array,
165 * in order (from first to last element in the deque). It is assumed
166 * that the array is large enough to hold all elements in the deque.
167 *
168 * @return its argument
169 */
170 private <T> T[] copyElements(T[] a) {
171 if (head < tail) {
172 System.arraycopy(elements, head, a, 0, size());
173 } else if (head > tail) {
174 int headPortionLen = elements.length - head;
175 System.arraycopy(elements, head, a, 0, headPortionLen);
176 System.arraycopy(elements, 0, a, headPortionLen, tail);
177 }
178 return a;
179 }
180
181 /**
182 * Constructs an empty array deque with an initial capacity
183 * sufficient to hold 16 elements.
184 */
185 public ArrayDeque() {
186 elements = (E[]) new Object[16];
187 }
188
189 /**
190 * Constructs an empty array deque with an initial capacity
191 * sufficient to hold the specified number of elements.
192 *
193 * @param numElements lower bound on initial capacity of the deque
194 */
195 public ArrayDeque(int numElements) {
196 allocateElements(numElements);
197 }
198
199 /**
200 * Constructs a deque containing the elements of the specified
201 * collection, in the order they are returned by the collection's
202 * iterator. (The first element returned by the collection's
203 * iterator becomes the first element, or <i>front</i> of the
204 * deque.)
205 *
206 * @param c the collection whose elements are to be placed into the deque
207 * @throws NullPointerException if the specified collection is null
208 */
209 public ArrayDeque(Collection<? extends E> c) {
210 allocateElements(c.size());
211 addAll(c);
212 }
213
214 // The main insertion and extraction methods are addFirst,
215 // addLast, pollFirst, pollLast. The other methods are defined in
216 // terms of these.
217
218 /**
219 * Inserts the specified element at the front of this deque.
220 *
221 * @param e the element to add
222 * @throws NullPointerException if the specified element is null
223 */
224 public void addFirst(E e) {
225 if (e == null)
226 throw new NullPointerException();
227 elements[head = (head - 1) & (elements.length - 1)] = e;
228 if (head == tail)
229 doubleCapacity();
230 }
231
232 /**
233 * Inserts the specified element at the end of this deque.
234 *
235 * <p>This method is equivalent to {@link #add}.
236 *
237 * @param e the element to add
238 * @throws NullPointerException if the specified element is null
239 */
240 public void addLast(E e) {
241 if (e == null)
242 throw new NullPointerException();
243 elements[tail] = e;
244 if ( (tail = (tail + 1) & (elements.length - 1)) == head)
245 doubleCapacity();
246 }
247
248 /**
249 * Inserts the specified element at the front of this deque.
250 *
251 * @param e the element to add
252 * @return <tt>true</tt> (as specified by {@link Deque#offerFirst})
253 * @throws NullPointerException if the specified element is null
254 */
255 public boolean offerFirst(E e) {
256 addFirst(e);
257 return true;
258 }
259
260 /**
261 * Inserts the specified element at the end of this deque.
262 *
263 * @param e the element to add
264 * @return <tt>true</tt> (as specified by {@link Deque#offerLast})
265 * @throws NullPointerException if the specified element is null
266 */
267 public boolean offerLast(E e) {
268 addLast(e);
269 return true;
270 }
271
272 /**
273 * @throws NoSuchElementException {@inheritDoc}
274 */
275 public E removeFirst() {
276 E x = pollFirst();
277 if (x == null)
278 throw new NoSuchElementException();
279 return x;
280 }
281
282 /**
283 * @throws NoSuchElementException {@inheritDoc}
284 */
285 public E removeLast() {
286 E x = pollLast();
287 if (x == null)
288 throw new NoSuchElementException();
289 return x;
290 }
291
292 public E pollFirst() {
293 int h = head;
294 E result = elements[h]; // Element is null if deque empty
295 if (result == null)
296 return null;
297 elements[h] = null; // Must null out slot
298 head = (h + 1) & (elements.length - 1);
299 return result;
300 }
301
302 public E pollLast() {
303 int t = (tail - 1) & (elements.length - 1);
304 E result = elements[t];
305 if (result == null)
306 return null;
307 elements[t] = null;
308 tail = t;
309 return result;
310 }
311
312 /**
313 * @throws NoSuchElementException {@inheritDoc}
314 */
315 public E getFirst() {
316 E x = elements[head];
317 if (x == null)
318 throw new NoSuchElementException();
319 return x;
320 }
321
322 /**
323 * @throws NoSuchElementException {@inheritDoc}
324 */
325 public E getLast() {
326 E x = elements[(tail - 1) & (elements.length - 1)];
327 if (x == null)
328 throw new NoSuchElementException();
329 return x;
330 }
331
332 public E peekFirst() {
333 return elements[head]; // elements[head] is null if deque empty
334 }
335
336 public E peekLast() {
337 return elements[(tail - 1) & (elements.length - 1)];
338 }
339
340 /**
341 * Removes the first occurrence of the specified element in this
342 * deque (when traversing the deque from head to tail).
343 * If the deque does not contain the element, it is unchanged.
344 * More formally, removes the first element <tt>e</tt> such that
345 * <tt>o.equals(e)</tt> (if such an element exists).
346 * Returns <tt>true</tt> if this deque contained the specified element
347 * (or equivalently, if this deque changed as a result of the call).
348 *
349 * @param o element to be removed from this deque, if present
350 * @return <tt>true</tt> if the deque contained the specified element
351 */
352 public boolean removeFirstOccurrence(Object o) {
353 if (o == null)
354 return false;
355 int mask = elements.length - 1;
356 int i = head;
357 E x;
358 while ( (x = elements[i]) != null) {
359 if (o.equals(x)) {
360 delete(i);
361 return true;
362 }
363 i = (i + 1) & mask;
364 }
365 return false;
366 }
367
368 /**
369 * Removes the last occurrence of the specified element in this
370 * deque (when traversing the deque from head to tail).
371 * If the deque does not contain the element, it is unchanged.
372 * More formally, removes the last element <tt>e</tt> such that
373 * <tt>o.equals(e)</tt> (if such an element exists).
374 * Returns <tt>true</tt> if this deque contained the specified element
375 * (or equivalently, if this deque changed as a result of the call).
376 *
377 * @param o element to be removed from this deque, if present
378 * @return <tt>true</tt> if the deque contained the specified element
379 */
380 public boolean removeLastOccurrence(Object o) {
381 if (o == null)
382 return false;
383 int mask = elements.length - 1;
384 int i = (tail - 1) & mask;
385 E x;
386 while ( (x = elements[i]) != null) {
387 if (o.equals(x)) {
388 delete(i);
389 return true;
390 }
391 i = (i - 1) & mask;
392 }
393 return false;
394 }
395
396 // *** Queue methods ***
397
398 /**
399 * Inserts the specified element at the end of this deque.
400 *
401 * <p>This method is equivalent to {@link #addLast}.
402 *
403 * @param e the element to add
404 * @return <tt>true</tt> (as specified by {@link Collection#add})
405 * @throws NullPointerException if the specified element is null
406 */
407 public boolean add(E e) {
408 addLast(e);
409 return true;
410 }
411
412 /**
413 * Inserts the specified element at the end of this deque.
414 *
415 * <p>This method is equivalent to {@link #offerLast}.
416 *
417 * @param e the element to add
418 * @return <tt>true</tt> (as specified by {@link Queue#offer})
419 * @throws NullPointerException if the specified element is null
420 */
421 public boolean offer(E e) {
422 return offerLast(e);
423 }
424
425 /**
426 * Retrieves and removes the head of the queue represented by this deque.
427 *
428 * This method differs from {@link #poll poll} only in that it throws an
429 * exception if this deque is empty.
430 *
431 * <p>This method is equivalent to {@link #removeFirst}.
432 *
433 * @return the head of the queue represented by this deque
434 * @throws NoSuchElementException {@inheritDoc}
435 */
436 public E remove() {
437 return removeFirst();
438 }
439
440 /**
441 * Retrieves and removes the head of the queue represented by this deque
442 * (in other words, the first element of this deque), or returns
443 * <tt>null</tt> if this deque is empty.
444 *
445 * <p>This method is equivalent to {@link #pollFirst}.
446 *
447 * @return the head of the queue represented by this deque, or
448 * <tt>null</tt> if this deque is empty
449 */
450 public E poll() {
451 return pollFirst();
452 }
453
454 /**
455 * Retrieves, but does not remove, the head of the queue represented by
456 * this deque. This method differs from {@link #peek peek} only in
457 * that it throws an exception if this deque is empty.
458 *
459 * <p>This method is equivalent to {@link #getFirst}.
460 *
461 * @return the head of the queue represented by this deque
462 * @throws NoSuchElementException {@inheritDoc}
463 */
464 public E element() {
465 return getFirst();
466 }
467
468 /**
469 * Retrieves, but does not remove, the head of the queue represented by
470 * this deque, or returns <tt>null</tt> if this deque is empty.
471 *
472 * <p>This method is equivalent to {@link #peekFirst}.
473 *
474 * @return the head of the queue represented by this deque, or
475 * <tt>null</tt> if this deque is empty
476 */
477 public E peek() {
478 return peekFirst();
479 }
480
481 // *** Stack methods ***
482
483 /**
484 * Pushes an element onto the stack represented by this deque. In other
485 * words, inserts the element at the front of this deque.
486 *
487 * <p>This method is equivalent to {@link #addFirst}.
488 *
489 * @param e the element to push
490 * @throws NullPointerException if the specified element is null
491 */
492 public void push(E e) {
493 addFirst(e);
494 }
495
496 /**
497 * Pops an element from the stack represented by this deque. In other
498 * words, removes and returns the first element of this deque.
499 *
500 * <p>This method is equivalent to {@link #removeFirst()}.
501 *
502 * @return the element at the front of this deque (which is the top
503 * of the stack represented by this deque)
504 * @throws NoSuchElementException {@inheritDoc}
505 */
506 public E pop() {
507 return removeFirst();
508 }
509
510 private void checkInvariants() {
511 assert elements[tail] == null;
512 assert head == tail ? elements[head] == null :
513 (elements[head] != null &&
514 elements[(tail - 1) & (elements.length - 1)] != null);
515 assert elements[(head - 1) & (elements.length - 1)] == null;
516 }
517
518 /**
519 * Removes the element at the specified position in the elements array,
520 * adjusting head and tail as necessary. This can result in motion of
521 * elements backwards or forwards in the array.
522 *
523 * <p>This method is called delete rather than remove to emphasize
524 * that its semantics differ from those of {@link List#remove(int)}.
525 *
526 * @return true if elements moved backwards
527 */
528 private boolean delete(int i) {
529 checkInvariants();
530 final E[] elements = this.elements;
531 final int mask = elements.length - 1;
532 final int h = head;
533 final int t = tail;
534 final int front = (i - h) & mask;
535 final int back = (t - i) & mask;
536
537 // Invariant: head <= i < tail mod circularity
538 if (front >= ((t - h) & mask))
539 throw new ConcurrentModificationException();
540
541 // Optimize for least element motion
542 if (front < back) {
543 if (h <= i) {
544 System.arraycopy(elements, h, elements, h + 1, front);
545 } else { // Wrap around
546 System.arraycopy(elements, 0, elements, 1, i);
547 elements[0] = elements[mask];
548 System.arraycopy(elements, h, elements, h + 1, mask - h);
549 }
550 elements[h] = null;
551 head = (h + 1) & mask;
552 return false;
553 } else {
554 if (i < t) { // Copy the null tail as well
555 System.arraycopy(elements, i + 1, elements, i, back);
556 tail = t - 1;
557 } else { // Wrap around
558 System.arraycopy(elements, i + 1, elements, i, mask - i);
559 elements[mask] = elements[0];
560 System.arraycopy(elements, 1, elements, 0, t);
561 tail = (t - 1) & mask;
562 }
563 return true;
564 }
565 }
566
567 // *** Collection Methods ***
568
569 /**
570 * Returns the number of elements in this deque.
571 *
572 * @return the number of elements in this deque
573 */
574 public int size() {
575 return (tail - head) & (elements.length - 1);
576 }
577
578 /**
579 * Returns <tt>true</tt> if this deque contains no elements.
580 *
581 * @return <tt>true</tt> if this deque contains no elements
582 */
583 public boolean isEmpty() {
584 return head == tail;
585 }
586
587 /**
588 * Returns an iterator over the elements in this deque. The elements
589 * will be ordered from first (head) to last (tail). This is the same
590 * order that elements would be dequeued (via successive calls to
591 * {@link #remove} or popped (via successive calls to {@link #pop}).
592 *
593 * @return an iterator over the elements in this deque
594 */
595 public Iterator<E> iterator() {
596 return new DeqIterator();
597 }
598
599 public Iterator<E> descendingIterator() {
600 return new DescendingIterator();
601 }
602
603 private class DeqIterator implements Iterator<E> {
604 /**
605 * Index of element to be returned by subsequent call to next.
606 */
607 private int cursor = head;
608
609 /**
610 * Tail recorded at construction (also in remove), to stop
611 * iterator and also to check for comodification.
612 */
613 private int fence = tail;
614
615 /**
616 * Index of element returned by most recent call to next.
617 * Reset to -1 if element is deleted by a call to remove.
618 */
619 private int lastRet = -1;
620
621 public boolean hasNext() {
622 return cursor != fence;
623 }
624
625 public E next() {
626 if (cursor == fence)
627 throw new NoSuchElementException();
628 E result = elements[cursor];
629 // This check doesn't catch all possible comodifications,
630 // but does catch the ones that corrupt traversal
631 if (tail != fence || result == null)
632 throw new ConcurrentModificationException();
633 lastRet = cursor;
634 cursor = (cursor + 1) & (elements.length - 1);
635 return result;
636 }
637
638 public void remove() {
639 if (lastRet < 0)
640 throw new IllegalStateException();
641 if (delete(lastRet)) { // if left-shifted, undo increment in next()
642 cursor = (cursor - 1) & (elements.length - 1);
643 fence = tail;
644 }
645 lastRet = -1;
646 }
647 }
648
649 private class DescendingIterator implements Iterator<E> {
650 /*
651 * This class is nearly a mirror-image of DeqIterator, using
652 * tail instead of head for initial cursor, and head instead of
653 * tail for fence.
654 */
655 private int cursor = tail;
656 private int fence = head;
657 private int lastRet = -1;
658
659 public boolean hasNext() {
660 return cursor != fence;
661 }
662
663 public E next() {
664 if (cursor == fence)
665 throw new NoSuchElementException();
666 cursor = (cursor - 1) & (elements.length - 1);
667 E result = elements[cursor];
668 if (head != fence || result == null)
669 throw new ConcurrentModificationException();
670 lastRet = cursor;
671 return result;
672 }
673
674 public void remove() {
675 if (lastRet < 0)
676 throw new IllegalStateException();
677 if (!delete(lastRet)) {
678 cursor = (cursor + 1) & (elements.length - 1);
679 fence = head;
680 }
681 lastRet = -1;
682 }
683 }
684
685 /**
686 * Returns <tt>true</tt> if this deque contains the specified element.
687 * More formally, returns <tt>true</tt> if and only if this deque contains
688 * at least one element <tt>e</tt> such that <tt>o.equals(e)</tt>.
689 *
690 * @param o object to be checked for containment in this deque
691 * @return <tt>true</tt> if this deque contains the specified element
692 */
693 public boolean contains(Object o) {
694 if (o == null)
695 return false;
696 int mask = elements.length - 1;
697 int i = head;
698 E x;
699 while ( (x = elements[i]) != null) {
700 if (o.equals(x))
701 return true;
702 i = (i + 1) & mask;
703 }
704 return false;
705 }
706
707 /**
708 * Removes a single instance of the specified element from this deque.
709 * If the deque does not contain the element, it is unchanged.
710 * More formally, removes the first element <tt>e</tt> such that
711 * <tt>o.equals(e)</tt> (if such an element exists).
712 * Returns <tt>true</tt> if this deque contained the specified element
713 * (or equivalently, if this deque changed as a result of the call).
714 *
715 * <p>This method is equivalent to {@link #removeFirstOccurrence}.
716 *
717 * @param o element to be removed from this deque, if present
718 * @return <tt>true</tt> if this deque contained the specified element
719 */
720 public boolean remove(Object o) {
721 return removeFirstOccurrence(o);
722 }
723
724 /**
725 * Removes all of the elements from this deque.
726 * The deque will be empty after this call returns.
727 */
728 public void clear() {
729 int h = head;
730 int t = tail;
731 if (h != t) { // clear all cells
732 head = tail = 0;
733 int i = h;
734 int mask = elements.length - 1;
735 do {
736 elements[i] = null;
737 i = (i + 1) & mask;
738 } while (i != t);
739 }
740 }
741
742 /**
743 * Returns an array containing all of the elements in this deque
744 * in proper sequence (from first to last element).
745 *
746 * <p>The returned array will be "safe" in that no references to it are
747 * maintained by this deque. (In other words, this method must allocate
748 * a new array). The caller is thus free to modify the returned array.
749 *
750 * <p>This method acts as bridge between array-based and collection-based
751 * APIs.
752 *
753 * @return an array containing all of the elements in this deque
754 */
755 public Object[] toArray() {
756 return copyElements(new Object[size()]);
757 }
758
759 /**
760 * Returns an array containing all of the elements in this deque in
761 * proper sequence (from first to last element); the runtime type of the
762 * returned array is that of the specified array. If the deque fits in
763 * the specified array, it is returned therein. Otherwise, a new array
764 * is allocated with the runtime type of the specified array and the
765 * size of this deque.
766 *
767 * <p>If this deque fits in the specified array with room to spare
768 * (i.e., the array has more elements than this deque), the element in
769 * the array immediately following the end of the deque is set to
770 * <tt>null</tt>.
771 *
772 * <p>Like the {@link #toArray()} method, this method acts as bridge between
773 * array-based and collection-based APIs. Further, this method allows
774 * precise control over the runtime type of the output array, and may,
775 * under certain circumstances, be used to save allocation costs.
776 *
777 * <p>Suppose <tt>x</tt> is a deque known to contain only strings.
778 * The following code can be used to dump the deque into a newly
779 * allocated array of <tt>String</tt>:
780 *
781 * <pre>
782 * String[] y = x.toArray(new String[0]);</pre>
783 *
784 * Note that <tt>toArray(new Object[0])</tt> is identical in function to
785 * <tt>toArray()</tt>.
786 *
787 * @param a the array into which the elements of the deque are to
788 * be stored, if it is big enough; otherwise, a new array of the
789 * same runtime type is allocated for this purpose
790 * @return an array containing all of the elements in this deque
791 * @throws ArrayStoreException if the runtime type of the specified array
792 * is not a supertype of the runtime type of every element in
793 * this deque
794 * @throws NullPointerException if the specified array is null
795 */
796 public <T> T[] toArray(T[] a) {
797 int size = size();
798 if (a.length < size)
799 a = (T[])java.lang.reflect.Array.newInstance(
800 a.getClass().getComponentType(), size);
801 copyElements(a);
802 if (a.length > size)
803 a[size] = null;
804 return a;
805 }
806
807 // *** Object methods ***
808
809 /**
810 * Returns a copy of this deque.
811 *
812 * @return a copy of this deque
813 */
814 public ArrayDeque<E> clone() {
815 try {
816 ArrayDeque<E> result = (ArrayDeque<E>) super.clone();
817 result.elements = Arrays.copyOf(elements, elements.length);
818 return result;
819
820 } catch (CloneNotSupportedException e) {
821 throw new AssertionError();
822 }
823 }
824
825 /**
826 * Appease the serialization gods.
827 */
828 private static final long serialVersionUID = 2340985798034038923L;
829
830 /**
831 * Serialize this deque.
832 *
833 * @serialData The current size (<tt>int</tt>) of the deque,
834 * followed by all of its elements (each an object reference) in
835 * first-to-last order.
836 */
837 private void writeObject(ObjectOutputStream s) throws IOException {
838 s.defaultWriteObject();
839
840 // Write out size
841 s.writeInt(size());
842
843 // Write out elements in order.
844 int mask = elements.length - 1;
845 for (int i = head; i != tail; i = (i + 1) & mask)
846 s.writeObject(elements[i]);
847 }
848
849 /**
850 * Deserialize this deque.
851 */
852 private void readObject(ObjectInputStream s)
853 throws IOException, ClassNotFoundException {
854 s.defaultReadObject();
855
856 // Read in size and allocate array
857 int size = s.readInt();
858 allocateElements(size);
859 head = 0;
860 tail = size;
861
862 // Read in all elements in the proper order.
863 for (int i = 0; i < size; i++)
864 elements[i] = (E)s.readObject();
865 }
866}
java/pkg/java/util/ArrayList$1.class+0−0

Binary file not shown.

java/pkg/java/util/ArrayList$Itr.class+0−0

Binary file not shown.

java/pkg/java/util/ArrayList$ListItr.class+0−0

Binary file not shown.

java/pkg/java/util/ArrayList$SubList$1.class+0−0

Binary file not shown.

java/pkg/java/util/ArrayList$SubList.class+0−0

Binary file not shown.

java/pkg/java/util/ArrayList.class+0−0

Binary file not shown.

java/pkg/java/util/ArrayList.java+1132−0
@@ -0,0 +1,1132 @@
1/*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.util;
27
28/**
29 * Resizable-array implementation of the <tt>List</tt> interface. Implements
30 * all optional list operations, and permits all elements, including
31 * <tt>null</tt>. In addition to implementing the <tt>List</tt> interface,
32 * this class provides methods to manipulate the size of the array that is
33 * used internally to store the list. (This class is roughly equivalent to
34 * <tt>Vector</tt>, except that it is unsynchronized.)
35 *
36 * <p>The <tt>size</tt>, <tt>isEmpty</tt>, <tt>get</tt>, <tt>set</tt>,
37 * <tt>iterator</tt>, and <tt>listIterator</tt> operations run in constant
38 * time. The <tt>add</tt> operation runs in <i>amortized constant time</i>,
39 * that is, adding n elements requires O(n) time. All of the other operations
40 * run in linear time (roughly speaking). The constant factor is low compared
41 * to that for the <tt>LinkedList</tt> implementation.
42 *
43 * <p>Each <tt>ArrayList</tt> instance has a <i>capacity</i>. The capacity is
44 * the size of the array used to store the elements in the list. It is always
45 * at least as large as the list size. As elements are added to an ArrayList,
46 * its capacity grows automatically. The details of the growth policy are not
47 * specified beyond the fact that adding an element has constant amortized
48 * time cost.
49 *
50 * <p>An application can increase the capacity of an <tt>ArrayList</tt> instance
51 * before adding a large number of elements using the <tt>ensureCapacity</tt>
52 * operation. This may reduce the amount of incremental reallocation.
53 *
54 * <p><strong>Note that this implementation is not synchronized.</strong>
55 * If multiple threads access an <tt>ArrayList</tt> instance concurrently,
56 * and at least one of the threads modifies the list structurally, it
57 * <i>must</i> be synchronized externally. (A structural modification is
58 * any operation that adds or deletes one or more elements, or explicitly
59 * resizes the backing array; merely setting the value of an element is not
60 * a structural modification.) This is typically accomplished by
61 * synchronizing on some object that naturally encapsulates the list.
62 *
63 * If no such object exists, the list should be "wrapped" using the
64 * {@link Collections#synchronizedList Collections.synchronizedList}
65 * method. This is best done at creation time, to prevent accidental
66 * unsynchronized access to the list:<pre>
67 * List list = Collections.synchronizedList(new ArrayList(...));</pre>
68 *
69 * <p><a name="fail-fast"/>
70 * The iterators returned by this class's {@link #iterator() iterator} and
71 * {@link #listIterator(int) listIterator} methods are <em>fail-fast</em>:
72 * if the list is structurally modified at any time after the iterator is
73 * created, in any way except through the iterator's own
74 * {@link ListIterator#remove() remove} or
75 * {@link ListIterator#add(Object) add} methods, the iterator will throw a
76 * {@link ConcurrentModificationException}. Thus, in the face of
77 * concurrent modification, the iterator fails quickly and cleanly, rather
78 * than risking arbitrary, non-deterministic behavior at an undetermined
79 * time in the future.
80 *
81 * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
82 * as it is, generally speaking, impossible to make any hard guarantees in the
83 * presence of unsynchronized concurrent modification. Fail-fast iterators
84 * throw {@code ConcurrentModificationException} on a best-effort basis.
85 * Therefore, it would be wrong to write a program that depended on this
86 * exception for its correctness: <i>the fail-fast behavior of iterators
87 * should be used only to detect bugs.</i>
88 *
89 * <p>This class is a member of the
90 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
91 * Java Collections Framework</a>.
92 *
93 * @author Josh Bloch
94 * @author Neal Gafter
95 * @see Collection
96 * @see List
97 * @see LinkedList
98 * @see Vector
99 * @since 1.2
100 */
101
102public class ArrayList<E> extends AbstractList<E>
103 implements List<E>, RandomAccess, Cloneable, java.io.Serializable
104{
105 private static final long serialVersionUID = 8683452581122892189L;
106
107 /**
108 * The array buffer into which the elements of the ArrayList are stored.
109 * The capacity of the ArrayList is the length of this array buffer.
110 */
111 private transient Object[] elementData;
112
113 /**
114 * The size of the ArrayList (the number of elements it contains).
115 *
116 * @serial
117 */
118 private int size;
119
120 /**
121 * Constructs an empty list with the specified initial capacity.
122 *
123 * @param initialCapacity the initial capacity of the list
124 * @throws IllegalArgumentException if the specified initial capacity
125 * is negative
126 */
127 public ArrayList(int initialCapacity) {
128 super();
129 if (initialCapacity < 0)
130 throw new IllegalArgumentException("Illegal Capacity: "+
131 initialCapacity);
132 this.elementData = new Object[initialCapacity];
133 }
134
135 /**
136 * Constructs an empty list with an initial capacity of ten.
137 */
138 public ArrayList() {
139 this(10);
140 }
141
142 /**
143 * Constructs a list containing the elements of the specified
144 * collection, in the order they are returned by the collection's
145 * iterator.
146 *
147 * @param c the collection whose elements are to be placed into this list
148 * @throws NullPointerException if the specified collection is null
149 */
150 public ArrayList(Collection<? extends E> c) {
151 elementData = c.toArray();
152 size = elementData.length;
153 // c.toArray might (incorrectly) not return Object[] (see 6260652)
154 if (elementData.getClass() != Object[].class)
155 elementData = Arrays.copyOf(elementData, size, Object[].class);
156 }
157
158 /**
159 * Trims the capacity of this <tt>ArrayList</tt> instance to be the
160 * list's current size. An application can use this operation to minimize
161 * the storage of an <tt>ArrayList</tt> instance.
162 */
163 public void trimToSize() {
164 modCount++;
165 int oldCapacity = elementData.length;
166 if (size < oldCapacity) {
167 elementData = Arrays.copyOf(elementData, size);
168 }
169 }
170
171 /**
172 * Increases the capacity of this <tt>ArrayList</tt> instance, if
173 * necessary, to ensure that it can hold at least the number of elements
174 * specified by the minimum capacity argument.
175 *
176 * @param minCapacity the desired minimum capacity
177 */
178 public void ensureCapacity(int minCapacity) {
179 if (minCapacity > 0)
180 ensureCapacityInternal(minCapacity);
181 }
182
183 private void ensureCapacityInternal(int minCapacity) {
184 modCount++;
185 // overflow-conscious code
186 if (minCapacity - elementData.length > 0)
187 grow(minCapacity);
188 }
189
190 /**
191 * The maximum size of array to allocate.
192 * Some VMs reserve some header words in an array.
193 * Attempts to allocate larger arrays may result in
194 * OutOfMemoryError: Requested array size exceeds VM limit
195 */
196 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
197
198 /**
199 * Increases the capacity to ensure that it can hold at least the
200 * number of elements specified by the minimum capacity argument.
201 *
202 * @param minCapacity the desired minimum capacity
203 */
204 private void grow(int minCapacity) {
205 // overflow-conscious code
206 int oldCapacity = elementData.length;
207 int newCapacity = oldCapacity + (oldCapacity >> 1);
208 if (newCapacity - minCapacity < 0)
209 newCapacity = minCapacity;
210 if (newCapacity - MAX_ARRAY_SIZE > 0)
211 newCapacity = hugeCapacity(minCapacity);
212 // minCapacity is usually close to size, so this is a win:
213 elementData = Arrays.copyOf(elementData, newCapacity);
214 }
215
216 private static int hugeCapacity(int minCapacity) {
217 if (minCapacity < 0) // overflow
218 throw new OutOfMemoryError();
219 return (minCapacity > MAX_ARRAY_SIZE) ?
220 Integer.MAX_VALUE :
221 MAX_ARRAY_SIZE;
222 }
223
224 /**
225 * Returns the number of elements in this list.
226 *
227 * @return the number of elements in this list
228 */
229 public int size() {
230 return size;
231 }
232
233 /**
234 * Returns <tt>true</tt> if this list contains no elements.
235 *
236 * @return <tt>true</tt> if this list contains no elements
237 */
238 public boolean isEmpty() {
239 return size == 0;
240 }
241
242 /**
243 * Returns <tt>true</tt> if this list contains the specified element.
244 * More formally, returns <tt>true</tt> if and only if this list contains
245 * at least one element <tt>e</tt> such that
246 * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
247 *
248 * @param o element whose presence in this list is to be tested
249 * @return <tt>true</tt> if this list contains the specified element
250 */
251 public boolean contains(Object o) {
252 return indexOf(o) >= 0;
253 }
254
255 /**
256 * Returns the index of the first occurrence of the specified element
257 * in this list, or -1 if this list does not contain the element.
258 * More formally, returns the lowest index <tt>i</tt> such that
259 * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,
260 * or -1 if there is no such index.
261 */
262 public int indexOf(Object o) {
263 if (o == null) {
264 for (int i = 0; i < size; i++)
265 if (elementData[i]==null)
266 return i;
267 } else {
268 for (int i = 0; i < size; i++)
269 if (o.equals(elementData[i]))
270 return i;
271 }
272 return -1;
273 }
274
275 /**
276 * Returns the index of the last occurrence of the specified element
277 * in this list, or -1 if this list does not contain the element.
278 * More formally, returns the highest index <tt>i</tt> such that
279 * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,
280 * or -1 if there is no such index.
281 */
282 public int lastIndexOf(Object o) {
283 if (o == null) {
284 for (int i = size-1; i >= 0; i--)
285 if (elementData[i]==null)
286 return i;
287 } else {
288 for (int i = size-1; i >= 0; i--)
289 if (o.equals(elementData[i]))
290 return i;
291 }
292 return -1;
293 }
294
295 /**
296 * Returns a shallow copy of this <tt>ArrayList</tt> instance. (The
297 * elements themselves are not copied.)
298 *
299 * @return a clone of this <tt>ArrayList</tt> instance
300 */
301 public Object clone() {
302 try {
303 @SuppressWarnings("unchecked")
304 ArrayList<E> v = (ArrayList<E>) super.clone();
305 v.elementData = Arrays.copyOf(elementData, size);
306 v.modCount = 0;
307 return v;
308 } catch (CloneNotSupportedException e) {
309 // this shouldn't happen, since we are Cloneable
310 throw new InternalError();
311 }
312 }
313
314 /**
315 * Returns an array containing all of the elements in this list
316 * in proper sequence (from first to last element).
317 *
318 * <p>The returned array will be "safe" in that no references to it are
319 * maintained by this list. (In other words, this method must allocate
320 * a new array). The caller is thus free to modify the returned array.
321 *
322 * <p>This method acts as bridge between array-based and collection-based
323 * APIs.
324 *
325 * @return an array containing all of the elements in this list in
326 * proper sequence
327 */
328 public Object[] toArray() {
329 return Arrays.copyOf(elementData, size);
330 }
331
332 /**
333 * Returns an array containing all of the elements in this list in proper
334 * sequence (from first to last element); the runtime type of the returned
335 * array is that of the specified array. If the list fits in the
336 * specified array, it is returned therein. Otherwise, a new array is
337 * allocated with the runtime type of the specified array and the size of
338 * this list.
339 *
340 * <p>If the list fits in the specified array with room to spare
341 * (i.e., the array has more elements than the list), the element in
342 * the array immediately following the end of the collection is set to
343 * <tt>null</tt>. (This is useful in determining the length of the
344 * list <i>only</i> if the caller knows that the list does not contain
345 * any null elements.)
346 *
347 * @param a the array into which the elements of the list are to
348 * be stored, if it is big enough; otherwise, a new array of the
349 * same runtime type is allocated for this purpose.
350 * @return an array containing the elements of the list
351 * @throws ArrayStoreException if the runtime type of the specified array
352 * is not a supertype of the runtime type of every element in
353 * this list
354 * @throws NullPointerException if the specified array is null
355 */
356 @SuppressWarnings("unchecked")
357 public <T> T[] toArray(T[] a) {
358 if (a.length < size)
359 // Make a new array of a's runtime type, but my contents:
360 return (T[]) Arrays.copyOf(elementData, size, a.getClass());
361 System.arraycopy(elementData, 0, a, 0, size);
362 if (a.length > size)
363 a[size] = null;
364 return a;
365 }
366
367 // Positional Access Operations
368
369 @SuppressWarnings("unchecked")
370 E elementData(int index) {
371 return (E) elementData[index];
372 }
373
374 /**
375 * Returns the element at the specified position in this list.
376 *
377 * @param index index of the element to return
378 * @return the element at the specified position in this list
379 * @throws IndexOutOfBoundsException {@inheritDoc}
380 */
381 public E get(int index) {
382 rangeCheck(index);
383
384 return elementData(index);
385 }
386
387 /**
388 * Replaces the element at the specified position in this list with
389 * the specified element.
390 *
391 * @param index index of the element to replace
392 * @param element element to be stored at the specified position
393 * @return the element previously at the specified position
394 * @throws IndexOutOfBoundsException {@inheritDoc}
395 */
396 public E set(int index, E element) {
397 rangeCheck(index);
398
399 E oldValue = elementData(index);
400 elementData[index] = element;
401 return oldValue;
402 }
403
404 /**
405 * Appends the specified element to the end of this list.
406 *
407 * @param e element to be appended to this list
408 * @return <tt>true</tt> (as specified by {@link Collection#add})
409 */
410 public boolean add(E e) {
411 ensureCapacityInternal(size + 1); // Increments modCount!!
412 elementData[size++] = e;
413 return true;
414 }
415
416 /**
417 * Inserts the specified element at the specified position in this
418 * list. Shifts the element currently at that position (if any) and
419 * any subsequent elements to the right (adds one to their indices).
420 *
421 * @param index index at which the specified element is to be inserted
422 * @param element element to be inserted
423 * @throws IndexOutOfBoundsException {@inheritDoc}
424 */
425 public void add(int index, E element) {
426 rangeCheckForAdd(index);
427
428 ensureCapacityInternal(size + 1); // Increments modCount!!
429 System.arraycopy(elementData, index, elementData, index + 1,
430 size - index);
431 elementData[index] = element;
432 size++;
433 }
434
435 /**
436 * Removes the element at the specified position in this list.
437 * Shifts any subsequent elements to the left (subtracts one from their
438 * indices).
439 *
440 * @param index the index of the element to be removed
441 * @return the element that was removed from the list
442 * @throws IndexOutOfBoundsException {@inheritDoc}
443 */
444 public E remove(int index) {
445 rangeCheck(index);
446
447 modCount++;
448 E oldValue = elementData(index);
449
450 int numMoved = size - index - 1;
451 if (numMoved > 0)
452 System.arraycopy(elementData, index+1, elementData, index,
453 numMoved);
454 elementData[--size] = null; // Let gc do its work
455
456 return oldValue;
457 }
458
459 /**
460 * Removes the first occurrence of the specified element from this list,
461 * if it is present. If the list does not contain the element, it is
462 * unchanged. More formally, removes the element with the lowest index
463 * <tt>i</tt> such that
464 * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>
465 * (if such an element exists). Returns <tt>true</tt> if this list
466 * contained the specified element (or equivalently, if this list
467 * changed as a result of the call).
468 *
469 * @param o element to be removed from this list, if present
470 * @return <tt>true</tt> if this list contained the specified element
471 */
472 public boolean remove(Object o) {
473 if (o == null) {
474 for (int index = 0; index < size; index++)
475 if (elementData[index] == null) {
476 fastRemove(index);
477 return true;
478 }
479 } else {
480 for (int index = 0; index < size; index++)
481 if (o.equals(elementData[index])) {
482 fastRemove(index);
483 return true;
484 }
485 }
486 return false;
487 }
488
489 /*
490 * Private remove method that skips bounds checking and does not
491 * return the value removed.
492 */
493 private void fastRemove(int index) {
494 modCount++;
495 int numMoved = size - index - 1;
496 if (numMoved > 0)
497 System.arraycopy(elementData, index+1, elementData, index,
498 numMoved);
499 elementData[--size] = null; // Let gc do its work
500 }
501
502 /**
503 * Removes all of the elements from this list. The list will
504 * be empty after this call returns.
505 */
506 public void clear() {
507 modCount++;
508
509 // Let gc do its work
510 for (int i = 0; i < size; i++)
511 elementData[i] = null;
512
513 size = 0;
514 }
515
516 /**
517 * Appends all of the elements in the specified collection to the end of
518 * this list, in the order that they are returned by the
519 * specified collection's Iterator. The behavior of this operation is
520 * undefined if the specified collection is modified while the operation
521 * is in progress. (This implies that the behavior of this call is
522 * undefined if the specified collection is this list, and this
523 * list is nonempty.)
524 *
525 * @param c collection containing elements to be added to this list
526 * @return <tt>true</tt> if this list changed as a result of the call
527 * @throws NullPointerException if the specified collection is null
528 */
529 public boolean addAll(Collection<? extends E> c) {
530 Object[] a = c.toArray();
531 int numNew = a.length;
532 ensureCapacityInternal(size + numNew); // Increments modCount
533 System.arraycopy(a, 0, elementData, size, numNew);
534 size += numNew;
535 return numNew != 0;
536 }
537
538 /**
539 * Inserts all of the elements in the specified collection into this
540 * list, starting at the specified position. Shifts the element
541 * currently at that position (if any) and any subsequent elements to
542 * the right (increases their indices). The new elements will appear
543 * in the list in the order that they are returned by the
544 * specified collection's iterator.
545 *
546 * @param index index at which to insert the first element from the
547 * specified collection
548 * @param c collection containing elements to be added to this list
549 * @return <tt>true</tt> if this list changed as a result of the call
550 * @throws IndexOutOfBoundsException {@inheritDoc}
551 * @throws NullPointerException if the specified collection is null
552 */
553 public boolean addAll(int index, Collection<? extends E> c) {
554 rangeCheckForAdd(index);
555
556 Object[] a = c.toArray();
557 int numNew = a.length;
558 ensureCapacityInternal(size + numNew); // Increments modCount
559
560 int numMoved = size - index;
561 if (numMoved > 0)
562 System.arraycopy(elementData, index, elementData, index + numNew,
563 numMoved);
564
565 System.arraycopy(a, 0, elementData, index, numNew);
566 size += numNew;
567 return numNew != 0;
568 }
569
570 /**
571 * Removes from this list all of the elements whose index is between
572 * {@code fromIndex}, inclusive, and {@code toIndex}, exclusive.
573 * Shifts any succeeding elements to the left (reduces their index).
574 * This call shortens the list by {@code (toIndex - fromIndex)} elements.
575 * (If {@code toIndex==fromIndex}, this operation has no effect.)
576 *
577 * @throws IndexOutOfBoundsException if {@code fromIndex} or
578 * {@code toIndex} is out of range
579 * ({@code fromIndex < 0 ||
580 * fromIndex >= size() ||
581 * toIndex > size() ||
582 * toIndex < fromIndex})
583 */
584 protected void removeRange(int fromIndex, int toIndex) {
585 modCount++;
586 int numMoved = size - toIndex;
587 System.arraycopy(elementData, toIndex, elementData, fromIndex,
588 numMoved);
589
590 // Let gc do its work
591 int newSize = size - (toIndex-fromIndex);
592 while (size != newSize)
593 elementData[--size] = null;
594 }
595
596 /**
597 * Checks if the given index is in range. If not, throws an appropriate
598 * runtime exception. This method does *not* check if the index is
599 * negative: It is always used immediately prior to an array access,
600 * which throws an ArrayIndexOutOfBoundsException if index is negative.
601 */
602 private void rangeCheck(int index) {
603 if (index >= size)
604 throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
605 }
606
607 /**
608 * A version of rangeCheck used by add and addAll.
609 */
610 private void rangeCheckForAdd(int index) {
611 if (index > size || index < 0)
612 throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
613 }
614
615 /**
616 * Constructs an IndexOutOfBoundsException detail message.
617 * Of the many possible refactorings of the error handling code,
618 * this "outlining" performs best with both server and client VMs.
619 */
620 private String outOfBoundsMsg(int index) {
621 return "Index: "+index+", Size: "+size;
622 }
623
624 /**
625 * Removes from this list all of its elements that are contained in the
626 * specified collection.
627 *
628 * @param c collection containing elements to be removed from this list
629 * @return {@code true} if this list changed as a result of the call
630 * @throws ClassCastException if the class of an element of this list
631 * is incompatible with the specified collection
632 * (<a href="Collection.html#optional-restrictions">optional</a>)
633 * @throws NullPointerException if this list contains a null element and the
634 * specified collection does not permit null elements
635 * (<a href="Collection.html#optional-restrictions">optional</a>),
636 * or if the specified collection is null
637 * @see Collection#contains(Object)
638 */
639 public boolean removeAll(Collection<?> c) {
640 return batchRemove(c, false);
641 }
642
643 /**
644 * Retains only the elements in this list that are contained in the
645 * specified collection. In other words, removes from this list all
646 * of its elements that are not contained in the specified collection.
647 *
648 * @param c collection containing elements to be retained in this list
649 * @return {@code true} if this list changed as a result of the call
650 * @throws ClassCastException if the class of an element of this list
651 * is incompatible with the specified collection
652 * (<a href="Collection.html#optional-restrictions">optional</a>)
653 * @throws NullPointerException if this list contains a null element and the
654 * specified collection does not permit null elements
655 * (<a href="Collection.html#optional-restrictions">optional</a>),
656 * or if the specified collection is null
657 * @see Collection#contains(Object)
658 */
659 public boolean retainAll(Collection<?> c) {
660 return batchRemove(c, true);
661 }
662
663 private boolean batchRemove(Collection<?> c, boolean complement) {
664 final Object[] elementData = this.elementData;
665 int r = 0, w = 0;
666 boolean modified = false;
667 try {
668 for (; r < size; r++)
669 if (c.contains(elementData[r]) == complement)
670 elementData[w++] = elementData[r];
671 } finally {
672 // Preserve behavioral compatibility with AbstractCollection,
673 // even if c.contains() throws.
674 if (r != size) {
675 System.arraycopy(elementData, r,
676 elementData, w,
677 size - r);
678 w += size - r;
679 }
680 if (w != size) {
681 for (int i = w; i < size; i++)
682 elementData[i] = null;
683 modCount += size - w;
684 size = w;
685 modified = true;
686 }
687 }
688 return modified;
689 }
690
691 /**
692 * Save the state of the <tt>ArrayList</tt> instance to a stream (that
693 * is, serialize it).
694 *
695 * @serialData The length of the array backing the <tt>ArrayList</tt>
696 * instance is emitted (int), followed by all of its elements
697 * (each an <tt>Object</tt>) in the proper order.
698 */
699 private void writeObject(java.io.ObjectOutputStream s)
700 throws java.io.IOException{
701 // Write out element count, and any hidden stuff
702 int expectedModCount = modCount;
703 s.defaultWriteObject();
704
705 // Write out array length
706 s.writeInt(elementData.length);
707
708 // Write out all elements in the proper order.
709 for (int i=0; i<size; i++)
710 s.writeObject(elementData[i]);
711
712 if (modCount != expectedModCount) {
713 throw new ConcurrentModificationException();
714 }
715
716 }
717
718 /**
719 * Reconstitute the <tt>ArrayList</tt> instance from a stream (that is,
720 * deserialize it).
721 */
722 private void readObject(java.io.ObjectInputStream s)
723 throws java.io.IOException, ClassNotFoundException {
724 // Read in size, and any hidden stuff
725 s.defaultReadObject();
726
727 // Read in array length and allocate array
728 int arrayLength = s.readInt();
729 Object[] a = elementData = new Object[arrayLength];
730
731 // Read in all elements in the proper order.
732 for (int i=0; i<size; i++)
733 a[i] = s.readObject();
734 }
735
736 /**
737 * Returns a list iterator over the elements in this list (in proper
738 * sequence), starting at the specified position in the list.
739 * The specified index indicates the first element that would be
740 * returned by an initial call to {@link ListIterator#next next}.
741 * An initial call to {@link ListIterator#previous previous} would
742 * return the element with the specified index minus one.
743 *
744 * <p>The returned list iterator is <a href="#fail-fast"><i>fail-fast</i></a>.
745 *
746 * @throws IndexOutOfBoundsException {@inheritDoc}
747 */
748 public ListIterator<E> listIterator(int index) {
749 if (index < 0 || index > size)
750 throw new IndexOutOfBoundsException("Index: "+index);
751 return new ListItr(index);
752 }
753
754 /**
755 * Returns a list iterator over the elements in this list (in proper
756 * sequence).
757 *
758 * <p>The returned list iterator is <a href="#fail-fast"><i>fail-fast</i></a>.
759 *
760 * @see #listIterator(int)
761 */
762 public ListIterator<E> listIterator() {
763 return new ListItr(0);
764 }
765
766 /**
767 * Returns an iterator over the elements in this list in proper sequence.
768 *
769 * <p>The returned iterator is <a href="#fail-fast"><i>fail-fast</i></a>.
770 *
771 * @return an iterator over the elements in this list in proper sequence
772 */
773 public Iterator<E> iterator() {
774 return new Itr();
775 }
776
777 /**
778 * An optimized version of AbstractList.Itr
779 */
780 private class Itr implements Iterator<E> {
781 int cursor; // index of next element to return
782 int lastRet = -1; // index of last element returned; -1 if no such
783 int expectedModCount = modCount;
784
785 public boolean hasNext() {
786 return cursor != size;
787 }
788
789 @SuppressWarnings("unchecked")
790 public E next() {
791 checkForComodification();
792 int i = cursor;
793 if (i >= size)
794 throw new NoSuchElementException();
795 Object[] elementData = ArrayList.this.elementData;
796 if (i >= elementData.length)
797 throw new ConcurrentModificationException();
798 cursor = i + 1;
799 return (E) elementData[lastRet = i];
800 }
801
802 public void remove() {
803 if (lastRet < 0)
804 throw new IllegalStateException();
805 checkForComodification();
806
807 try {
808 ArrayList.this.remove(lastRet);
809 cursor = lastRet;
810 lastRet = -1;
811 expectedModCount = modCount;
812 } catch (IndexOutOfBoundsException ex) {
813 throw new ConcurrentModificationException();
814 }
815 }
816
817 final void checkForComodification() {
818 if (modCount != expectedModCount)
819 throw new ConcurrentModificationException();
820 }
821 }
822
823 /**
824 * An optimized version of AbstractList.ListItr
825 */
826 private class ListItr extends Itr implements ListIterator<E> {
827 ListItr(int index) {
828 super();
829 cursor = index;
830 }
831
832 public boolean hasPrevious() {
833 return cursor != 0;
834 }
835
836 public int nextIndex() {
837 return cursor;
838 }
839
840 public int previousIndex() {
841 return cursor - 1;
842 }
843
844 @SuppressWarnings("unchecked")
845 public E previous() {
846 checkForComodification();
847 int i = cursor - 1;
848 if (i < 0)
849 throw new NoSuchElementException();
850 Object[] elementData = ArrayList.this.elementData;
851 if (i >= elementData.length)
852 throw new ConcurrentModificationException();
853 cursor = i;
854 return (E) elementData[lastRet = i];
855 }
856
857 public void set(E e) {
858 if (lastRet < 0)
859 throw new IllegalStateException();
860 checkForComodification();
861
862 try {
863 ArrayList.this.set(lastRet, e);
864 } catch (IndexOutOfBoundsException ex) {
865 throw new ConcurrentModificationException();
866 }
867 }
868
869 public void add(E e) {
870 checkForComodification();
871
872 try {
873 int i = cursor;
874 ArrayList.this.add(i, e);
875 cursor = i + 1;
876 lastRet = -1;
877 expectedModCount = modCount;
878 } catch (IndexOutOfBoundsException ex) {
879 throw new ConcurrentModificationException();
880 }
881 }
882 }
883
884 /**
885 * Returns a view of the portion of this list between the specified
886 * {@code fromIndex}, inclusive, and {@code toIndex}, exclusive. (If
887 * {@code fromIndex} and {@code toIndex} are equal, the returned list is
888 * empty.) The returned list is backed by this list, so non-structural
889 * changes in the returned list are reflected in this list, and vice-versa.
890 * The returned list supports all of the optional list operations.
891 *
892 * <p>This method eliminates the need for explicit range operations (of
893 * the sort that commonly exist for arrays). Any operation that expects
894 * a list can be used as a range operation by passing a subList view
895 * instead of a whole list. For example, the following idiom
896 * removes a range of elements from a list:
897 * <pre>
898 * list.subList(from, to).clear();
899 * </pre>
900 * Similar idioms may be constructed for {@link #indexOf(Object)} and
901 * {@link #lastIndexOf(Object)}, and all of the algorithms in the
902 * {@link Collections} class can be applied to a subList.
903 *
904 * <p>The semantics of the list returned by this method become undefined if
905 * the backing list (i.e., this list) is <i>structurally modified</i> in
906 * any way other than via the returned list. (Structural modifications are
907 * those that change the size of this list, or otherwise perturb it in such
908 * a fashion that iterations in progress may yield incorrect results.)
909 *
910 * @throws IndexOutOfBoundsException {@inheritDoc}
911 * @throws IllegalArgumentException {@inheritDoc}
912 */
913 public List<E> subList(int fromIndex, int toIndex) {
914 subListRangeCheck(fromIndex, toIndex, size);
915 return new SubList(this, 0, fromIndex, toIndex);
916 }
917
918 static void subListRangeCheck(int fromIndex, int toIndex, int size) {
919 if (fromIndex < 0)
920 throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
921 if (toIndex > size)
922 throw new IndexOutOfBoundsException("toIndex = " + toIndex);
923 if (fromIndex > toIndex)
924 throw new IllegalArgumentException("fromIndex(" + fromIndex +
925 ") > toIndex(" + toIndex + ")");
926 }
927
928 private class SubList extends AbstractList<E> implements RandomAccess {
929 private final AbstractList<E> parent;
930 private final int parentOffset;
931 private final int offset;
932 int size;
933
934 SubList(AbstractList<E> parent,
935 int offset, int fromIndex, int toIndex) {
936 this.parent = parent;
937 this.parentOffset = fromIndex;
938 this.offset = offset + fromIndex;
939 this.size = toIndex - fromIndex;
940 this.modCount = ArrayList.this.modCount;
941 }
942
943 public E set(int index, E e) {
944 rangeCheck(index);
945 checkForComodification();
946 E oldValue = ArrayList.this.elementData(offset + index);
947 ArrayList.this.elementData[offset + index] = e;
948 return oldValue;
949 }
950
951 public E get(int index) {
952 rangeCheck(index);
953 checkForComodification();
954 return ArrayList.this.elementData(offset + index);
955 }
956
957 public int size() {
958 checkForComodification();
959 return this.size;
960 }
961
962 public void add(int index, E e) {
963 rangeCheckForAdd(index);
964 checkForComodification();
965 parent.add(parentOffset + index, e);
966 this.modCount = parent.modCount;
967 this.size++;
968 }
969
970 public E remove(int index) {
971 rangeCheck(index);
972 checkForComodification();
973 E result = parent.remove(parentOffset + index);
974 this.modCount = parent.modCount;
975 this.size--;
976 return result;
977 }
978
979 protected void removeRange(int fromIndex, int toIndex) {
980 checkForComodification();
981 parent.removeRange(parentOffset + fromIndex,
982 parentOffset + toIndex);
983 this.modCount = parent.modCount;
984 this.size -= toIndex - fromIndex;
985 }
986
987 public boolean addAll(Collection<? extends E> c) {
988 return addAll(this.size, c);
989 }
990
991 public boolean addAll(int index, Collection<? extends E> c) {
992 rangeCheckForAdd(index);
993 int cSize = c.size();
994 if (cSize==0)
995 return false;
996
997 checkForComodification();
998 parent.addAll(parentOffset + index, c);
999 this.modCount = parent.modCount;
1000 this.size += cSize;
1001 return true;
1002 }
1003
1004 public Iterator<E> iterator() {
1005 return listIterator();
1006 }
1007
1008 public ListIterator<E> listIterator(final int index) {
1009 checkForComodification();
1010 rangeCheckForAdd(index);
1011 final int offset = this.offset;
1012
1013 return new ListIterator<E>() {
1014 int cursor = index;
1015 int lastRet = -1;
1016 int expectedModCount = ArrayList.this.modCount;
1017
1018 public boolean hasNext() {
1019 return cursor != SubList.this.size;
1020 }
1021
1022 @SuppressWarnings("unchecked")
1023 public E next() {
1024 checkForComodification();
1025 int i = cursor;
1026 if (i >= SubList.this.size)
1027 throw new NoSuchElementException();
1028 Object[] elementData = ArrayList.this.elementData;
1029 if (offset + i >= elementData.length)
1030 throw new ConcurrentModificationException();
1031 cursor = i + 1;
1032 return (E) elementData[offset + (lastRet = i)];
1033 }
1034
1035 public boolean hasPrevious() {
1036 return cursor != 0;
1037 }
1038
1039 @SuppressWarnings("unchecked")
1040 public E previous() {
1041 checkForComodification();
1042 int i = cursor - 1;
1043 if (i < 0)
1044 throw new NoSuchElementException();
1045 Object[] elementData = ArrayList.this.elementData;
1046 if (offset + i >= elementData.length)
1047 throw new ConcurrentModificationException();
1048 cursor = i;
1049 return (E) elementData[offset + (lastRet = i)];
1050 }
1051
1052 public int nextIndex() {
1053 return cursor;
1054 }
1055
1056 public int previousIndex() {
1057 return cursor - 1;
1058 }
1059
1060 public void remove() {
1061 if (lastRet < 0)
1062 throw new IllegalStateException();
1063 checkForComodification();
1064
1065 try {
1066 SubList.this.remove(lastRet);
1067 cursor = lastRet;
1068 lastRet = -1;
1069 expectedModCount = ArrayList.this.modCount;
1070 } catch (IndexOutOfBoundsException ex) {
1071 throw new ConcurrentModificationException();
1072 }
1073 }
1074
1075 public void set(E e) {
1076 if (lastRet < 0)
1077 throw new IllegalStateException();
1078 checkForComodification();
1079
1080 try {
1081 ArrayList.this.set(offset + lastRet, e);
1082 } catch (IndexOutOfBoundsException ex) {
1083 throw new ConcurrentModificationException();
1084 }
1085 }
1086
1087 public void add(E e) {
1088 checkForComodification();
1089
1090 try {
1091 int i = cursor;
1092 SubList.this.add(i, e);
1093 cursor = i + 1;
1094 lastRet = -1;
1095 expectedModCount = ArrayList.this.modCount;
1096 } catch (IndexOutOfBoundsException ex) {
1097 throw new ConcurrentModificationException();
1098 }
1099 }
1100
1101 final void checkForComodification() {
1102 if (expectedModCount != ArrayList.this.modCount)
1103 throw new ConcurrentModificationException();
1104 }
1105 };
1106 }
1107
1108 public List<E> subList(int fromIndex, int toIndex) {
1109 subListRangeCheck(fromIndex, toIndex, size);
1110 return new SubList(this, offset, fromIndex, toIndex);
1111 }
1112
1113 private void rangeCheck(int index) {
1114 if (index < 0 || index >= this.size)
1115 throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
1116 }
1117
1118 private void rangeCheckForAdd(int index) {
1119 if (index < 0 || index > this.size)
1120 throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
1121 }
1122
1123 private String outOfBoundsMsg(int index) {
1124 return "Index: "+index+", Size: "+this.size;
1125 }
1126
1127 private void checkForComodification() {
1128 if (ArrayList.this.modCount != this.modCount)
1129 throw new ConcurrentModificationException();
1130 }
1131 }
1132}
java/pkg/java/util/Arrays$ArrayList.class+0−0

Binary file not shown.

java/pkg/java/util/Arrays$LegacyMergeSort.class+0−0

Binary file not shown.

java/pkg/java/util/Arrays.class+0−0

Binary file not shown.

java/pkg/java/util/Arrays.java+3673−0
@@ -0,0 +1,3673 @@
1/*
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.util;
27
28import java.lang.reflect.*;
29
30/**
31 * This class contains various methods for manipulating arrays (such as
32 * sorting and searching). This class also contains a static factory
33 * that allows arrays to be viewed as lists.
34 *
35 * <p>The methods in this class all throw a {@code NullPointerException},
36 * if the specified array reference is null, except where noted.
37 *
38 * <p>The documentation for the methods contained in this class includes
39 * briefs description of the <i>implementations</i>. Such descriptions should
40 * be regarded as <i>implementation notes</i>, rather than parts of the
41 * <i>specification</i>. Implementors should feel free to substitute other
42 * algorithms, so long as the specification itself is adhered to. (For
43 * example, the algorithm used by {@code sort(Object[])} does not have to be
44 * a MergeSort, but it does have to be <i>stable</i>.)
45 *
46 * <p>This class is a member of the
47 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
48 * Java Collections Framework</a>.
49 *
50 * @author Josh Bloch
51 * @author Neal Gafter
52 * @author John Rose
53 * @since 1.2
54 */
55public class Arrays {
56
57 // Suppresses default constructor, ensuring non-instantiability.
58 private Arrays() {}
59
60 /*
61 * Sorting of primitive type arrays.
62 */
63
64 /**
65 * Sorts the specified array into ascending numerical order.
66 *
67 * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
68 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
69 * offers O(n log(n)) performance on many data sets that cause other
70 * quicksorts to degrade to quadratic performance, and is typically
71 * faster than traditional (one-pivot) Quicksort implementations.
72 *
73 * @param a the array to be sorted
74 */
75 public static void sort(int[] a) {
76 DualPivotQuicksort.sort(a);
77 }
78
79 /**
80 * Sorts the specified range of the array into ascending order. The range
81 * to be sorted extends from the index {@code fromIndex}, inclusive, to
82 * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
83 * the range to be sorted is empty.
84 *
85 * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
86 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
87 * offers O(n log(n)) performance on many data sets that cause other
88 * quicksorts to degrade to quadratic performance, and is typically
89 * faster than traditional (one-pivot) Quicksort implementations.
90 *
91 * @param a the array to be sorted
92 * @param fromIndex the index of the first element, inclusive, to be sorted
93 * @param toIndex the index of the last element, exclusive, to be sorted
94 *
95 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
96 * @throws ArrayIndexOutOfBoundsException
97 * if {@code fromIndex < 0} or {@code toIndex > a.length}
98 */
99 public static void sort(int[] a, int fromIndex, int toIndex) {
100 rangeCheck(a.length, fromIndex, toIndex);
101 DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
102 }
103
104 /**
105 * Sorts the specified array into ascending numerical order.
106 *
107 * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
108 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
109 * offers O(n log(n)) performance on many data sets that cause other
110 * quicksorts to degrade to quadratic performance, and is typically
111 * faster than traditional (one-pivot) Quicksort implementations.
112 *
113 * @param a the array to be sorted
114 */
115 public static void sort(long[] a) {
116 DualPivotQuicksort.sort(a);
117 }
118
119 /**
120 * Sorts the specified range of the array into ascending order. The range
121 * to be sorted extends from the index {@code fromIndex}, inclusive, to
122 * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
123 * the range to be sorted is empty.
124 *
125 * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
126 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
127 * offers O(n log(n)) performance on many data sets that cause other
128 * quicksorts to degrade to quadratic performance, and is typically
129 * faster than traditional (one-pivot) Quicksort implementations.
130 *
131 * @param a the array to be sorted
132 * @param fromIndex the index of the first element, inclusive, to be sorted
133 * @param toIndex the index of the last element, exclusive, to be sorted
134 *
135 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
136 * @throws ArrayIndexOutOfBoundsException
137 * if {@code fromIndex < 0} or {@code toIndex > a.length}
138 */
139 public static void sort(long[] a, int fromIndex, int toIndex) {
140 rangeCheck(a.length, fromIndex, toIndex);
141 DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
142 }
143
144 /**
145 * Sorts the specified array into ascending numerical order.
146 *
147 * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
148 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
149 * offers O(n log(n)) performance on many data sets that cause other
150 * quicksorts to degrade to quadratic performance, and is typically
151 * faster than traditional (one-pivot) Quicksort implementations.
152 *
153 * @param a the array to be sorted
154 */
155 public static void sort(short[] a) {
156 DualPivotQuicksort.sort(a);
157 }
158
159 /**
160 * Sorts the specified range of the array into ascending order. The range
161 * to be sorted extends from the index {@code fromIndex}, inclusive, to
162 * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
163 * the range to be sorted is empty.
164 *
165 * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
166 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
167 * offers O(n log(n)) performance on many data sets that cause other
168 * quicksorts to degrade to quadratic performance, and is typically
169 * faster than traditional (one-pivot) Quicksort implementations.
170 *
171 * @param a the array to be sorted
172 * @param fromIndex the index of the first element, inclusive, to be sorted
173 * @param toIndex the index of the last element, exclusive, to be sorted
174 *
175 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
176 * @throws ArrayIndexOutOfBoundsException
177 * if {@code fromIndex < 0} or {@code toIndex > a.length}
178 */
179 public static void sort(short[] a, int fromIndex, int toIndex) {
180 rangeCheck(a.length, fromIndex, toIndex);
181 DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
182 }
183
184 /**
185 * Sorts the specified array into ascending numerical order.
186 *
187 * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
188 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
189 * offers O(n log(n)) performance on many data sets that cause other
190 * quicksorts to degrade to quadratic performance, and is typically
191 * faster than traditional (one-pivot) Quicksort implementations.
192 *
193 * @param a the array to be sorted
194 */
195 public static void sort(char[] a) {
196 DualPivotQuicksort.sort(a);
197 }
198
199 /**
200 * Sorts the specified range of the array into ascending order. The range
201 * to be sorted extends from the index {@code fromIndex}, inclusive, to
202 * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
203 * the range to be sorted is empty.
204 *
205 * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
206 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
207 * offers O(n log(n)) performance on many data sets that cause other
208 * quicksorts to degrade to quadratic performance, and is typically
209 * faster than traditional (one-pivot) Quicksort implementations.
210 *
211 * @param a the array to be sorted
212 * @param fromIndex the index of the first element, inclusive, to be sorted
213 * @param toIndex the index of the last element, exclusive, to be sorted
214 *
215 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
216 * @throws ArrayIndexOutOfBoundsException
217 * if {@code fromIndex < 0} or {@code toIndex > a.length}
218 */
219 public static void sort(char[] a, int fromIndex, int toIndex) {
220 rangeCheck(a.length, fromIndex, toIndex);
221 DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
222 }
223
224 /**
225 * Sorts the specified array into ascending numerical order.
226 *
227 * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
228 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
229 * offers O(n log(n)) performance on many data sets that cause other
230 * quicksorts to degrade to quadratic performance, and is typically
231 * faster than traditional (one-pivot) Quicksort implementations.
232 *
233 * @param a the array to be sorted
234 */
235 public static void sort(byte[] a) {
236 DualPivotQuicksort.sort(a);
237 }
238
239 /**
240 * Sorts the specified range of the array into ascending order. The range
241 * to be sorted extends from the index {@code fromIndex}, inclusive, to
242 * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
243 * the range to be sorted is empty.
244 *
245 * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
246 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
247 * offers O(n log(n)) performance on many data sets that cause other
248 * quicksorts to degrade to quadratic performance, and is typically
249 * faster than traditional (one-pivot) Quicksort implementations.
250 *
251 * @param a the array to be sorted
252 * @param fromIndex the index of the first element, inclusive, to be sorted
253 * @param toIndex the index of the last element, exclusive, to be sorted
254 *
255 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
256 * @throws ArrayIndexOutOfBoundsException
257 * if {@code fromIndex < 0} or {@code toIndex > a.length}
258 */
259 public static void sort(byte[] a, int fromIndex, int toIndex) {
260 rangeCheck(a.length, fromIndex, toIndex);
261 DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
262 }
263
264 /**
265 * Sorts the specified array into ascending numerical order.
266 *
267 * <p>The {@code <} relation does not provide a total order on all float
268 * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN}
269 * value compares neither less than, greater than, nor equal to any value,
270 * even itself. This method uses the total order imposed by the method
271 * {@link Float#compareTo}: {@code -0.0f} is treated as less than value
272 * {@code 0.0f} and {@code Float.NaN} is considered greater than any
273 * other value and all {@code Float.NaN} values are considered equal.
274 *
275 * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
276 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
277 * offers O(n log(n)) performance on many data sets that cause other
278 * quicksorts to degrade to quadratic performance, and is typically
279 * faster than traditional (one-pivot) Quicksort implementations.
280 *
281 * @param a the array to be sorted
282 */
283 public static void sort(float[] a) {
284 DualPivotQuicksort.sort(a);
285 }
286
287 /**
288 * Sorts the specified range of the array into ascending order. The range
289 * to be sorted extends from the index {@code fromIndex}, inclusive, to
290 * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
291 * the range to be sorted is empty.
292 *
293 * <p>The {@code <} relation does not provide a total order on all float
294 * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN}
295 * value compares neither less than, greater than, nor equal to any value,
296 * even itself. This method uses the total order imposed by the method
297 * {@link Float#compareTo}: {@code -0.0f} is treated as less than value
298 * {@code 0.0f} and {@code Float.NaN} is considered greater than any
299 * other value and all {@code Float.NaN} values are considered equal.
300 *
301 * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
302 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
303 * offers O(n log(n)) performance on many data sets that cause other
304 * quicksorts to degrade to quadratic performance, and is typically
305 * faster than traditional (one-pivot) Quicksort implementations.
306 *
307 * @param a the array to be sorted
308 * @param fromIndex the index of the first element, inclusive, to be sorted
309 * @param toIndex the index of the last element, exclusive, to be sorted
310 *
311 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
312 * @throws ArrayIndexOutOfBoundsException
313 * if {@code fromIndex < 0} or {@code toIndex > a.length}
314 */
315 public static void sort(float[] a, int fromIndex, int toIndex) {
316 rangeCheck(a.length, fromIndex, toIndex);
317 DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
318 }
319
320 /**
321 * Sorts the specified array into ascending numerical order.
322 *
323 * <p>The {@code <} relation does not provide a total order on all double
324 * values: {@code -0.0d == 0.0d} is {@code true} and a {@code Double.NaN}
325 * value compares neither less than, greater than, nor equal to any value,
326 * even itself. This method uses the total order imposed by the method
327 * {@link Double#compareTo}: {@code -0.0d} is treated as less than value
328 * {@code 0.0d} and {@code Double.NaN} is considered greater than any
329 * other value and all {@code Double.NaN} values are considered equal.
330 *
331 * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
332 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
333 * offers O(n log(n)) performance on many data sets that cause other
334 * quicksorts to degrade to quadratic performance, and is typically
335 * faster than traditional (one-pivot) Quicksort implementations.
336 *
337 * @param a the array to be sorted
338 */
339 public static void sort(double[] a) {
340 DualPivotQuicksort.sort(a);
341 }
342
343 /**
344 * Sorts the specified range of the array into ascending order. The range
345 * to be sorted extends from the index {@code fromIndex}, inclusive, to
346 * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
347 * the range to be sorted is empty.
348 *
349 * <p>The {@code <} relation does not provide a total order on all double
350 * values: {@code -0.0d == 0.0d} is {@code true} and a {@code Double.NaN}
351 * value compares neither less than, greater than, nor equal to any value,
352 * even itself. This method uses the total order imposed by the method
353 * {@link Double#compareTo}: {@code -0.0d} is treated as less than value
354 * {@code 0.0d} and {@code Double.NaN} is considered greater than any
355 * other value and all {@code Double.NaN} values are considered equal.
356 *
357 * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
358 * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
359 * offers O(n log(n)) performance on many data sets that cause other
360 * quicksorts to degrade to quadratic performance, and is typically
361 * faster than traditional (one-pivot) Quicksort implementations.
362 *
363 * @param a the array to be sorted
364 * @param fromIndex the index of the first element, inclusive, to be sorted
365 * @param toIndex the index of the last element, exclusive, to be sorted
366 *
367 * @throws IllegalArgumentException if {@code fromIndex > toIndex}
368 * @throws ArrayIndexOutOfBoundsException
369 * if {@code fromIndex < 0} or {@code toIndex > a.length}
370 */
371 public static void sort(double[] a, int fromIndex, int toIndex) {
372 rangeCheck(a.length, fromIndex, toIndex);
373 DualPivotQuicksort.sort(a, fromIndex, toIndex - 1);
374 }
375
376 /*
377 * Sorting of complex type arrays.
378 */
379
380 /**
381 * Old merge sort implementation can be selected (for
382 * compatibility with broken comparators) using a system property.
383 * Cannot be a static boolean in the enclosing class due to
384 * circular dependencies. To be removed in a future release.
385 */
386 static final class LegacyMergeSort {
387 private static final boolean userRequested =
388 java.security.AccessController.doPrivileged(
389 new sun.security.action.GetBooleanAction(
390 "java.util.Arrays.useLegacyMergeSort")).booleanValue();
391 }
392
393 /*
394 * If this platform has an optimizing VM, check whether ComparableTimSort
395 * offers any performance benefit over TimSort in conjunction with a
396 * comparator that returns:
397 * {@code ((Comparable)first).compareTo(Second)}.
398 * If not, you are better off deleting ComparableTimSort to
399 * eliminate the code duplication. In other words, the commented
400 * out code below is the preferable implementation for sorting
401 * arrays of Comparables if it offers sufficient performance.
402 */
403
404// /**
405// * A comparator that implements the natural ordering of a group of
406// * mutually comparable elements. Using this comparator saves us
407// * from duplicating most of the code in this file (one version for
408// * Comparables, one for explicit Comparators).
409// */
410// private static final Comparator<Object> NATURAL_ORDER =
411// new Comparator<Object>() {
412// @SuppressWarnings("unchecked")
413// public int compare(Object first, Object second) {
414// return ((Comparable<Object>)first).compareTo(second);
415// }
416// };
417//
418// public static void sort(Object[] a) {
419// sort(a, 0, a.length, NATURAL_ORDER);
420// }
421//
422// public static void sort(Object[] a, int fromIndex, int toIndex) {
423// sort(a, fromIndex, toIndex, NATURAL_ORDER);
424// }
425
426 /**
427 * Sorts the specified array of objects into ascending order, according
428 * to the {@linkplain Comparable natural ordering} of its elements.
429 * All elements in the array must implement the {@link Comparable}
430 * interface. Furthermore, all elements in the array must be
431 * <i>mutually comparable</i> (that is, {@code e1.compareTo(e2)} must
432 * not throw a {@code ClassCastException} for any elements {@code e1}
433 * and {@code e2} in the array).
434 *
435 * <p>This sort is guaranteed to be <i>stable</i>: equal elements will
436 * not be reordered as a result of the sort.
437 *
438 * <p>Implementation note: This implementation is a stable, adaptive,
439 * iterative mergesort that requires far fewer than n lg(n) comparisons
440 * when the input array is partially sorted, while offering the
441 * performance of a traditional mergesort when the input array is
442 * randomly ordered. If the input array is nearly sorted, the
443 * implementation requires approximately n comparisons. Temporary
444 * storage requirements vary from a small constant for nearly sorted
445 * input arrays to n/2 object references for randomly ordered input
446 * arrays.
447 *
448 * <p>The implementation takes equal advantage of ascending and
449 * descending order in its input array, and can take advantage of
450 * ascending and descending order in different parts of the the same
451 * input array. It is well-suited to merging two or more sorted arrays:
452 * simply concatenate the arrays and sort the resulting array.
453 *
454 * <p>The implementation was adapted from Tim Peters's list sort for Python
455 * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
456 * TimSort</a>). It uses techiques from Peter McIlroy's "Optimistic
457 * Sorting and Information Theoretic Complexity", in Proceedings of the
458 * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
459 * January 1993.
460 *
461 * @param a the array to be sorted
462 * @throws ClassCastException if the array contains elements that are not
463 * <i>mutually comparable</i> (for example, strings and integers)
464 * @throws IllegalArgumentException (optional) if the natural
465 * ordering of the array elements is found to violate the
466 * {@link Comparable} contract
467 */
468 public static void sort(Object[] a) {
469 if (LegacyMergeSort.userRequested)
470 legacyMergeSort(a);
471 else
472 ComparableTimSort.sort(a);
473 }
474
475 /** To be removed in a future release. */
476 private static void legacyMergeSort(Object[] a) {
477 Object[] aux = a.clone();
478 mergeSort(aux, a, 0, a.length, 0);
479 }
480
481 /**
482 * Sorts the specified range of the specified array of objects into
483 * ascending order, according to the
484 * {@linkplain Comparable natural ordering} of its
485 * elements. The range to be sorted extends from index
486 * {@code fromIndex}, inclusive, to index {@code toIndex}, exclusive.
487 * (If {@code fromIndex==toIndex}, the range to be sorted is empty.) All
488 * elements in this range must implement the {@link Comparable}
489 * interface. Furthermore, all elements in this range must be <i>mutually
490 * comparable</i> (that is, {@code e1.compareTo(e2)} must not throw a
491 * {@code ClassCastException} for any elements {@code e1} and
492 * {@code e2} in the array).
493 *
494 * <p>This sort is guaranteed to be <i>stable</i>: equal elements will
495 * not be reordered as a result of the sort.
496 *
497 * <p>Implementation note: This implementation is a stable, adaptive,
498 * iterative mergesort that requires far fewer than n lg(n) comparisons
499 * when the input array is partially sorted, while offering the
500 * performance of a traditional mergesort when the input array is
501 * randomly ordered. If the input array is nearly sorted, the
502 * implementation requires approximately n comparisons. Temporary
503 * storage requirements vary from a small constant for nearly sorted
504 * input arrays to n/2 object references for randomly ordered input
505 * arrays.
506 *
507 * <p>The implementation takes equal advantage of ascending and
508 * descending order in its input array, and can take advantage of
509 * ascending and descending order in different parts of the the same
510 * input array. It is well-suited to merging two or more sorted arrays:
511 * simply concatenate the arrays and sort the resulting array.
512 *
513 * <p>The implementation was adapted from Tim Peters's list sort for Python
514 * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
515 * TimSort</a>). It uses techiques from Peter McIlroy's "Optimistic
516 * Sorting and Information Theoretic Complexity", in Proceedings of the
517 * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
518 * January 1993.
519 *
520 * @param a the array to be sorted
521 * @param fromIndex the index of the first element (inclusive) to be
522 * sorted
523 * @param toIndex the index of the last element (exclusive) to be sorted
524 * @throws IllegalArgumentException if {@code fromIndex > toIndex} or
525 * (optional) if the natural ordering of the array elements is
526 * found to violate the {@link Comparable} contract
527 * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
528 * {@code toIndex > a.length}
529 * @throws ClassCastException if the array contains elements that are
530 * not <i>mutually comparable</i> (for example, strings and
531 * integers).
532 */
533 public static void sort(Object[] a, int fromIndex, int toIndex) {
534 if (LegacyMergeSort.userRequested)
535 legacyMergeSort(a, fromIndex, toIndex);
536 else
537 ComparableTimSort.sort(a, fromIndex, toIndex);
538 }
539
540 /** To be removed in a future release. */
541 private static void legacyMergeSort(Object[] a,
542 int fromIndex, int toIndex) {
543 rangeCheck(a.length, fromIndex, toIndex);
544 Object[] aux = copyOfRange(a, fromIndex, toIndex);
545 mergeSort(aux, a, fromIndex, toIndex, -fromIndex);
546 }
547
548 /**
549 * Tuning parameter: list size at or below which insertion sort will be
550 * used in preference to mergesort.
551 * To be removed in a future release.
552 */
553 private static final int INSERTIONSORT_THRESHOLD = 7;
554
555 /**
556 * Src is the source array that starts at index 0
557 * Dest is the (possibly larger) array destination with a possible offset
558 * low is the index in dest to start sorting
559 * high is the end index in dest to end sorting
560 * off is the offset to generate corresponding low, high in src
561 * To be removed in a future release.
562 */
563 private static void mergeSort(Object[] src,
564 Object[] dest,
565 int low,
566 int high,
567 int off) {
568 int length = high - low;
569
570 // Insertion sort on smallest arrays
571 if (length < INSERTIONSORT_THRESHOLD) {
572 for (int i=low; i<high; i++)
573 for (int j=i; j>low &&
574 ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
575 swap(dest, j, j-1);
576 return;
577 }
578
579 // Recursively sort halves of dest into src
580 int destLow = low;
581 int destHigh = high;
582 low += off;
583 high += off;
584 int mid = (low + high) >>> 1;
585 mergeSort(dest, src, low, mid, -off);
586 mergeSort(dest, src, mid, high, -off);
587
588 // If list is already sorted, just copy from src to dest. This is an
589 // optimization that results in faster sorts for nearly ordered lists.
590 if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {
591 System.arraycopy(src, low, dest, destLow, length);
592 return;
593 }
594
595 // Merge sorted halves (now in src) into dest
596 for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
597 if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)
598 dest[i] = src[p++];
599 else
600 dest[i] = src[q++];
601 }
602 }
603
604 /**
605 * Swaps x[a] with x[b].
606 */
607 private static void swap(Object[] x, int a, int b) {
608 Object t = x[a];
609 x[a] = x[b];
610 x[b] = t;
611 }
612
613 /**
614 * Sorts the specified array of objects according to the order induced by
615 * the specified comparator. All elements in the array must be
616 * <i>mutually comparable</i> by the specified comparator (that is,
617 * {@code c.compare(e1, e2)} must not throw a {@code ClassCastException}
618 * for any elements {@code e1} and {@code e2} in the array).
619 *
620 * <p>This sort is guaranteed to be <i>stable</i>: equal elements will
621 * not be reordered as a result of the sort.
622 *
623 * <p>Implementation note: This implementation is a stable, adaptive,
624 * iterative mergesort that requires far fewer than n lg(n) comparisons
625 * when the input array is partially sorted, while offering the
626 * performance of a traditional mergesort when the input array is
627 * randomly ordered. If the input array is nearly sorted, the
628 * implementation requires approximately n comparisons. Temporary
629 * storage requirements vary from a small constant for nearly sorted
630 * input arrays to n/2 object references for randomly ordered input
631 * arrays.
632 *
633 * <p>The implementation takes equal advantage of ascending and
634 * descending order in its input array, and can take advantage of
635 * ascending and descending order in different parts of the the same
636 * input array. It is well-suited to merging two or more sorted arrays:
637 * simply concatenate the arrays and sort the resulting array.
638 *
639 * <p>The implementation was adapted from Tim Peters's list sort for Python
640 * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
641 * TimSort</a>). It uses techiques from Peter McIlroy's "Optimistic
642 * Sorting and Information Theoretic Complexity", in Proceedings of the
643 * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
644 * January 1993.
645 *
646 * @param a the array to be sorted
647 * @param c the comparator to determine the order of the array. A
648 * {@code null} value indicates that the elements'
649 * {@linkplain Comparable natural ordering} should be used.
650 * @throws ClassCastException if the array contains elements that are
651 * not <i>mutually comparable</i> using the specified comparator
652 * @throws IllegalArgumentException (optional) if the comparator is
653 * found to violate the {@link Comparator} contract
654 */
655 public static <T> void sort(T[] a, Comparator<? super T> c) {
656 if (LegacyMergeSort.userRequested)
657 legacyMergeSort(a, c);
658 else
659 TimSort.sort(a, c);
660 }
661
662 /** To be removed in a future release. */
663 private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) {
664 T[] aux = a.clone();
665 if (c==null)
666 mergeSort(aux, a, 0, a.length, 0);
667 else
668 mergeSort(aux, a, 0, a.length, 0, c);
669 }
670
671 /**
672 * Sorts the specified range of the specified array of objects according
673 * to the order induced by the specified comparator. The range to be
674 * sorted extends from index {@code fromIndex}, inclusive, to index
675 * {@code toIndex}, exclusive. (If {@code fromIndex==toIndex}, the
676 * range to be sorted is empty.) All elements in the range must be
677 * <i>mutually comparable</i> by the specified comparator (that is,
678 * {@code c.compare(e1, e2)} must not throw a {@code ClassCastException}
679 * for any elements {@code e1} and {@code e2} in the range).
680 *
681 * <p>This sort is guaranteed to be <i>stable</i>: equal elements will
682 * not be reordered as a result of the sort.
683 *
684 * <p>Implementation note: This implementation is a stable, adaptive,
685 * iterative mergesort that requires far fewer than n lg(n) comparisons
686 * when the input array is partially sorted, while offering the
687 * performance of a traditional mergesort when the input array is
688 * randomly ordered. If the input array is nearly sorted, the
689 * implementation requires approximately n comparisons. Temporary
690 * storage requirements vary from a small constant for nearly sorted
691 * input arrays to n/2 object references for randomly ordered input
692 * arrays.
693 *
694 * <p>The implementation takes equal advantage of ascending and
695 * descending order in its input array, and can take advantage of
696 * ascending and descending order in different parts of the the same
697 * input array. It is well-suited to merging two or more sorted arrays:
698 * simply concatenate the arrays and sort the resulting array.
699 *
700 * <p>The implementation was adapted from Tim Peters's list sort for Python
701 * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
702 * TimSort</a>). It uses techiques from Peter McIlroy's "Optimistic
703 * Sorting and Information Theoretic Complexity", in Proceedings of the
704 * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
705 * January 1993.
706 *
707 * @param a the array to be sorted
708 * @param fromIndex the index of the first element (inclusive) to be
709 * sorted
710 * @param toIndex the index of the last element (exclusive) to be sorted
711 * @param c the comparator to determine the order of the array. A
712 * {@code null} value indicates that the elements'
713 * {@linkplain Comparable natural ordering} should be used.
714 * @throws ClassCastException if the array contains elements that are not
715 * <i>mutually comparable</i> using the specified comparator.
716 * @throws IllegalArgumentException if {@code fromIndex > toIndex} or
717 * (optional) if the comparator is found to violate the
718 * {@link Comparator} contract
719 * @throws ArrayIndexOutOfBoundsException if {@code fromIndex < 0} or
720 * {@code toIndex > a.length}
721 */
722 public static <T> void sort(T[] a, int fromIndex, int toIndex,
723 Comparator<? super T> c) {
724 if (LegacyMergeSort.userRequested)
725 legacyMergeSort(a, fromIndex, toIndex, c);
726 else
727 TimSort.sort(a, fromIndex, toIndex, c);
728 }
729
730 /** To be removed in a future release. */
731 private static <T> void legacyMergeSort(T[] a, int fromIndex, int toIndex,
732 Comparator<? super T> c) {
733 rangeCheck(a.length, fromIndex, toIndex);
734 T[] aux = copyOfRange(a, fromIndex, toIndex);
735 if (c==null)
736 mergeSort(aux, a, fromIndex, toIndex, -fromIndex);
737 else
738 mergeSort(aux, a, fromIndex, toIndex, -fromIndex, c);
739 }
740
741 /**
742 * Src is the source array that starts at index 0
743 * Dest is the (possibly larger) array destination with a possible offset
744 * low is the index in dest to start sorting
745 * high is the end index in dest to end sorting
746 * off is the offset into src corresponding to low in dest
747 * To be removed in a future release.
748 */
749 private static void mergeSort(Object[] src,
750 Object[] dest,
751 int low, int high, int off,
752 Comparator c) {
753 int length = high - low;
754
755 // Insertion sort on smallest arrays
756 if (length < INSERTIONSORT_THRESHOLD) {
757 for (int i=low; i<high; i++)
758 for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
759 swap(dest, j, j-1);
760 return;
761 }
762
763 // Recursively sort halves of dest into src
764 int destLow = low;
765 int destHigh = high;
766 low += off;
767 high += off;
768 int mid = (low + high) >>> 1;
769 mergeSort(dest, src, low, mid, -off, c);
770 mergeSort(dest, src, mid, high, -off, c);
771
772 // If list is already sorted, just copy from src to dest. This is an
773 // optimization that results in faster sorts for nearly ordered lists.
774 if (c.compare(src[mid-1], src[mid]) <= 0) {
775 System.arraycopy(src, low, dest, destLow, length);
776 return;
777 }
778
779 // Merge sorted halves (now in src) into dest
780 for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
781 if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)
782 dest[i] = src[p++];
783 else
784 dest[i] = src[q++];
785 }
786 }
787
788 /**
789 * Checks that {@code fromIndex} and {@code toIndex} are in
790 * the range and throws an appropriate exception, if they aren't.
791 */
792 private static void rangeCheck(int length, int fromIndex, int toIndex) {
793 if (fromIndex > toIndex) {
794 throw new IllegalArgumentException(
795 "fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")");
796 }
797 if (fromIndex < 0) {
798 throw new ArrayIndexOutOfBoundsException(fromIndex);
799 }
800 if (toIndex > length) {
801 throw new ArrayIndexOutOfBoundsException(toIndex);
802 }
803 }
804
805 // Searching
806
807 /**
808 * Searches the specified array of longs for the specified value using the
809 * binary search algorithm. The array must be sorted (as
810 * by the {@link #sort(long[])} method) prior to making this call. If it
811 * is not sorted, the results are undefined. If the array contains
812 * multiple elements with the specified value, there is no guarantee which
813 * one will be found.
814 *
815 * @param a the array to be searched
816 * @param key the value to be searched for
817 * @return index of the search key, if it is contained in the array;
818 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
819 * <i>insertion point</i> is defined as the point at which the
820 * key would be inserted into the array: the index of the first
821 * element greater than the key, or <tt>a.length</tt> if all
822 * elements in the array are less than the specified key. Note
823 * that this guarantees that the return value will be &gt;= 0 if
824 * and only if the key is found.
825 */
826 public static int binarySearch(long[] a, long key) {
827 return binarySearch0(a, 0, a.length, key);
828 }
829
830 /**
831 * Searches a range of
832 * the specified array of longs for the specified value using the
833 * binary search algorithm.
834 * The range must be sorted (as
835 * by the {@link #sort(long[], int, int)} method)
836 * prior to making this call. If it
837 * is not sorted, the results are undefined. If the range contains
838 * multiple elements with the specified value, there is no guarantee which
839 * one will be found.
840 *
841 * @param a the array to be searched
842 * @param fromIndex the index of the first element (inclusive) to be
843 * searched
844 * @param toIndex the index of the last element (exclusive) to be searched
845 * @param key the value to be searched for
846 * @return index of the search key, if it is contained in the array
847 * within the specified range;
848 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
849 * <i>insertion point</i> is defined as the point at which the
850 * key would be inserted into the array: the index of the first
851 * element in the range greater than the key,
852 * or <tt>toIndex</tt> if all
853 * elements in the range are less than the specified key. Note
854 * that this guarantees that the return value will be &gt;= 0 if
855 * and only if the key is found.
856 * @throws IllegalArgumentException
857 * if {@code fromIndex > toIndex}
858 * @throws ArrayIndexOutOfBoundsException
859 * if {@code fromIndex < 0 or toIndex > a.length}
860 * @since 1.6
861 */
862 public static int binarySearch(long[] a, int fromIndex, int toIndex,
863 long key) {
864 rangeCheck(a.length, fromIndex, toIndex);
865 return binarySearch0(a, fromIndex, toIndex, key);
866 }
867
868 // Like public version, but without range checks.
869 private static int binarySearch0(long[] a, int fromIndex, int toIndex,
870 long key) {
871 int low = fromIndex;
872 int high = toIndex - 1;
873
874 while (low <= high) {
875 int mid = (low + high) >>> 1;
876 long midVal = a[mid];
877
878 if (midVal < key)
879 low = mid + 1;
880 else if (midVal > key)
881 high = mid - 1;
882 else
883 return mid; // key found
884 }
885 return -(low + 1); // key not found.
886 }
887
888 /**
889 * Searches the specified array of ints for the specified value using the
890 * binary search algorithm. The array must be sorted (as
891 * by the {@link #sort(int[])} method) prior to making this call. If it
892 * is not sorted, the results are undefined. If the array contains
893 * multiple elements with the specified value, there is no guarantee which
894 * one will be found.
895 *
896 * @param a the array to be searched
897 * @param key the value to be searched for
898 * @return index of the search key, if it is contained in the array;
899 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
900 * <i>insertion point</i> is defined as the point at which the
901 * key would be inserted into the array: the index of the first
902 * element greater than the key, or <tt>a.length</tt> if all
903 * elements in the array are less than the specified key. Note
904 * that this guarantees that the return value will be &gt;= 0 if
905 * and only if the key is found.
906 */
907 public static int binarySearch(int[] a, int key) {
908 return binarySearch0(a, 0, a.length, key);
909 }
910
911 /**
912 * Searches a range of
913 * the specified array of ints for the specified value using the
914 * binary search algorithm.
915 * The range must be sorted (as
916 * by the {@link #sort(int[], int, int)} method)
917 * prior to making this call. If it
918 * is not sorted, the results are undefined. If the range contains
919 * multiple elements with the specified value, there is no guarantee which
920 * one will be found.
921 *
922 * @param a the array to be searched
923 * @param fromIndex the index of the first element (inclusive) to be
924 * searched
925 * @param toIndex the index of the last element (exclusive) to be searched
926 * @param key the value to be searched for
927 * @return index of the search key, if it is contained in the array
928 * within the specified range;
929 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
930 * <i>insertion point</i> is defined as the point at which the
931 * key would be inserted into the array: the index of the first
932 * element in the range greater than the key,
933 * or <tt>toIndex</tt> if all
934 * elements in the range are less than the specified key. Note
935 * that this guarantees that the return value will be &gt;= 0 if
936 * and only if the key is found.
937 * @throws IllegalArgumentException
938 * if {@code fromIndex > toIndex}
939 * @throws ArrayIndexOutOfBoundsException
940 * if {@code fromIndex < 0 or toIndex > a.length}
941 * @since 1.6
942 */
943 public static int binarySearch(int[] a, int fromIndex, int toIndex,
944 int key) {
945 rangeCheck(a.length, fromIndex, toIndex);
946 return binarySearch0(a, fromIndex, toIndex, key);
947 }
948
949 // Like public version, but without range checks.
950 private static int binarySearch0(int[] a, int fromIndex, int toIndex,
951 int key) {
952 int low = fromIndex;
953 int high = toIndex - 1;
954
955 while (low <= high) {
956 int mid = (low + high) >>> 1;
957 int midVal = a[mid];
958
959 if (midVal < key)
960 low = mid + 1;
961 else if (midVal > key)
962 high = mid - 1;
963 else
964 return mid; // key found
965 }
966 return -(low + 1); // key not found.
967 }
968
969 /**
970 * Searches the specified array of shorts for the specified value using
971 * the binary search algorithm. The array must be sorted
972 * (as by the {@link #sort(short[])} method) prior to making this call. If
973 * it is not sorted, the results are undefined. If the array contains
974 * multiple elements with the specified value, there is no guarantee which
975 * one will be found.
976 *
977 * @param a the array to be searched
978 * @param key the value to be searched for
979 * @return index of the search key, if it is contained in the array;
980 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
981 * <i>insertion point</i> is defined as the point at which the
982 * key would be inserted into the array: the index of the first
983 * element greater than the key, or <tt>a.length</tt> if all
984 * elements in the array are less than the specified key. Note
985 * that this guarantees that the return value will be &gt;= 0 if
986 * and only if the key is found.
987 */
988 public static int binarySearch(short[] a, short key) {
989 return binarySearch0(a, 0, a.length, key);
990 }
991
992 /**
993 * Searches a range of
994 * the specified array of shorts for the specified value using
995 * the binary search algorithm.
996 * The range must be sorted
997 * (as by the {@link #sort(short[], int, int)} method)
998 * prior to making this call. If
999 * it is not sorted, the results are undefined. If the range contains
1000 * multiple elements with the specified value, there is no guarantee which
1001 * one will be found.
1002 *
1003 * @param a the array to be searched
1004 * @param fromIndex the index of the first element (inclusive) to be
1005 * searched
1006 * @param toIndex the index of the last element (exclusive) to be searched
1007 * @param key the value to be searched for
1008 * @return index of the search key, if it is contained in the array
1009 * within the specified range;
1010 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
1011 * <i>insertion point</i> is defined as the point at which the
1012 * key would be inserted into the array: the index of the first
1013 * element in the range greater than the key,
1014 * or <tt>toIndex</tt> if all
1015 * elements in the range are less than the specified key. Note
1016 * that this guarantees that the return value will be &gt;= 0 if
1017 * and only if the key is found.
1018 * @throws IllegalArgumentException
1019 * if {@code fromIndex > toIndex}
1020 * @throws ArrayIndexOutOfBoundsException
1021 * if {@code fromIndex < 0 or toIndex > a.length}
1022 * @since 1.6
1023 */
1024 public static int binarySearch(short[] a, int fromIndex, int toIndex,
1025 short key) {
1026 rangeCheck(a.length, fromIndex, toIndex);
1027 return binarySearch0(a, fromIndex, toIndex, key);
1028 }
1029
1030 // Like public version, but without range checks.
1031 private static int binarySearch0(short[] a, int fromIndex, int toIndex,
1032 short key) {
1033 int low = fromIndex;
1034 int high = toIndex - 1;
1035
1036 while (low <= high) {
1037 int mid = (low + high) >>> 1;
1038 short midVal = a[mid];
1039
1040 if (midVal < key)
1041 low = mid + 1;
1042 else if (midVal > key)
1043 high = mid - 1;
1044 else
1045 return mid; // key found
1046 }
1047 return -(low + 1); // key not found.
1048 }
1049
1050 /**
1051 * Searches the specified array of chars for the specified value using the
1052 * binary search algorithm. The array must be sorted (as
1053 * by the {@link #sort(char[])} method) prior to making this call. If it
1054 * is not sorted, the results are undefined. If the array contains
1055 * multiple elements with the specified value, there is no guarantee which
1056 * one will be found.
1057 *
1058 * @param a the array to be searched
1059 * @param key the value to be searched for
1060 * @return index of the search key, if it is contained in the array;
1061 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
1062 * <i>insertion point</i> is defined as the point at which the
1063 * key would be inserted into the array: the index of the first
1064 * element greater than the key, or <tt>a.length</tt> if all
1065 * elements in the array are less than the specified key. Note
1066 * that this guarantees that the return value will be &gt;= 0 if
1067 * and only if the key is found.
1068 */
1069 public static int binarySearch(char[] a, char key) {
1070 return binarySearch0(a, 0, a.length, key);
1071 }
1072
1073 /**
1074 * Searches a range of
1075 * the specified array of chars for the specified value using the
1076 * binary search algorithm.
1077 * The range must be sorted (as
1078 * by the {@link #sort(char[], int, int)} method)
1079 * prior to making this call. If it
1080 * is not sorted, the results are undefined. If the range contains
1081 * multiple elements with the specified value, there is no guarantee which
1082 * one will be found.
1083 *
1084 * @param a the array to be searched
1085 * @param fromIndex the index of the first element (inclusive) to be
1086 * searched
1087 * @param toIndex the index of the last element (exclusive) to be searched
1088 * @param key the value to be searched for
1089 * @return index of the search key, if it is contained in the array
1090 * within the specified range;
1091 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
1092 * <i>insertion point</i> is defined as the point at which the
1093 * key would be inserted into the array: the index of the first
1094 * element in the range greater than the key,
1095 * or <tt>toIndex</tt> if all
1096 * elements in the range are less than the specified key. Note
1097 * that this guarantees that the return value will be &gt;= 0 if
1098 * and only if the key is found.
1099 * @throws IllegalArgumentException
1100 * if {@code fromIndex > toIndex}
1101 * @throws ArrayIndexOutOfBoundsException
1102 * if {@code fromIndex < 0 or toIndex > a.length}
1103 * @since 1.6
1104 */
1105 public static int binarySearch(char[] a, int fromIndex, int toIndex,
1106 char key) {
1107 rangeCheck(a.length, fromIndex, toIndex);
1108 return binarySearch0(a, fromIndex, toIndex, key);
1109 }
1110
1111 // Like public version, but without range checks.
1112 private static int binarySearch0(char[] a, int fromIndex, int toIndex,
1113 char key) {
1114 int low = fromIndex;
1115 int high = toIndex - 1;
1116
1117 while (low <= high) {
1118 int mid = (low + high) >>> 1;
1119 char midVal = a[mid];
1120
1121 if (midVal < key)
1122 low = mid + 1;
1123 else if (midVal > key)
1124 high = mid - 1;
1125 else
1126 return mid; // key found
1127 }
1128 return -(low + 1); // key not found.
1129 }
1130
1131 /**
1132 * Searches the specified array of bytes for the specified value using the
1133 * binary search algorithm. The array must be sorted (as
1134 * by the {@link #sort(byte[])} method) prior to making this call. If it
1135 * is not sorted, the results are undefined. If the array contains
1136 * multiple elements with the specified value, there is no guarantee which
1137 * one will be found.
1138 *
1139 * @param a the array to be searched
1140 * @param key the value to be searched for
1141 * @return index of the search key, if it is contained in the array;
1142 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
1143 * <i>insertion point</i> is defined as the point at which the
1144 * key would be inserted into the array: the index of the first
1145 * element greater than the key, or <tt>a.length</tt> if all
1146 * elements in the array are less than the specified key. Note
1147 * that this guarantees that the return value will be &gt;= 0 if
1148 * and only if the key is found.
1149 */
1150 public static int binarySearch(byte[] a, byte key) {
1151 return binarySearch0(a, 0, a.length, key);
1152 }
1153
1154 /**
1155 * Searches a range of
1156 * the specified array of bytes for the specified value using the
1157 * binary search algorithm.
1158 * The range must be sorted (as
1159 * by the {@link #sort(byte[], int, int)} method)
1160 * prior to making this call. If it
1161 * is not sorted, the results are undefined. If the range contains
1162 * multiple elements with the specified value, there is no guarantee which
1163 * one will be found.
1164 *
1165 * @param a the array to be searched
1166 * @param fromIndex the index of the first element (inclusive) to be
1167 * searched
1168 * @param toIndex the index of the last element (exclusive) to be searched
1169 * @param key the value to be searched for
1170 * @return index of the search key, if it is contained in the array
1171 * within the specified range;
1172 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
1173 * <i>insertion point</i> is defined as the point at which the
1174 * key would be inserted into the array: the index of the first
1175 * element in the range greater than the key,
1176 * or <tt>toIndex</tt> if all
1177 * elements in the range are less than the specified key. Note
1178 * that this guarantees that the return value will be &gt;= 0 if
1179 * and only if the key is found.
1180 * @throws IllegalArgumentException
1181 * if {@code fromIndex > toIndex}
1182 * @throws ArrayIndexOutOfBoundsException
1183 * if {@code fromIndex < 0 or toIndex > a.length}
1184 * @since 1.6
1185 */
1186 public static int binarySearch(byte[] a, int fromIndex, int toIndex,
1187 byte key) {
1188 rangeCheck(a.length, fromIndex, toIndex);
1189 return binarySearch0(a, fromIndex, toIndex, key);
1190 }
1191
1192 // Like public version, but without range checks.
1193 private static int binarySearch0(byte[] a, int fromIndex, int toIndex,
1194 byte key) {
1195 int low = fromIndex;
1196 int high = toIndex - 1;
1197
1198 while (low <= high) {
1199 int mid = (low + high) >>> 1;
1200 byte midVal = a[mid];
1201
1202 if (midVal < key)
1203 low = mid + 1;
1204 else if (midVal > key)
1205 high = mid - 1;
1206 else
1207 return mid; // key found
1208 }
1209 return -(low + 1); // key not found.
1210 }
1211
1212 /**
1213 * Searches the specified array of doubles for the specified value using
1214 * the binary search algorithm. The array must be sorted
1215 * (as by the {@link #sort(double[])} method) prior to making this call.
1216 * If it is not sorted, the results are undefined. If the array contains
1217 * multiple elements with the specified value, there is no guarantee which
1218 * one will be found. This method considers all NaN values to be
1219 * equivalent and equal.
1220 *
1221 * @param a the array to be searched
1222 * @param key the value to be searched for
1223 * @return index of the search key, if it is contained in the array;
1224 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
1225 * <i>insertion point</i> is defined as the point at which the
1226 * key would be inserted into the array: the index of the first
1227 * element greater than the key, or <tt>a.length</tt> if all
1228 * elements in the array are less than the specified key. Note
1229 * that this guarantees that the return value will be &gt;= 0 if
1230 * and only if the key is found.
1231 */
1232 public static int binarySearch(double[] a, double key) {
1233 return binarySearch0(a, 0, a.length, key);
1234 }
1235
1236 /**
1237 * Searches a range of
1238 * the specified array of doubles for the specified value using
1239 * the binary search algorithm.
1240 * The range must be sorted
1241 * (as by the {@link #sort(double[], int, int)} method)
1242 * prior to making this call.
1243 * If it is not sorted, the results are undefined. If the range contains
1244 * multiple elements with the specified value, there is no guarantee which
1245 * one will be found. This method considers all NaN values to be
1246 * equivalent and equal.
1247 *
1248 * @param a the array to be searched
1249 * @param fromIndex the index of the first element (inclusive) to be
1250 * searched
1251 * @param toIndex the index of the last element (exclusive) to be searched
1252 * @param key the value to be searched for
1253 * @return index of the search key, if it is contained in the array
1254 * within the specified range;
1255 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
1256 * <i>insertion point</i> is defined as the point at which the
1257 * key would be inserted into the array: the index of the first
1258 * element in the range greater than the key,
1259 * or <tt>toIndex</tt> if all
1260 * elements in the range are less than the specified key. Note
1261 * that this guarantees that the return value will be &gt;= 0 if
1262 * and only if the key is found.
1263 * @throws IllegalArgumentException
1264 * if {@code fromIndex > toIndex}
1265 * @throws ArrayIndexOutOfBoundsException
1266 * if {@code fromIndex < 0 or toIndex > a.length}
1267 * @since 1.6
1268 */
1269 public static int binarySearch(double[] a, int fromIndex, int toIndex,
1270 double key) {
1271 rangeCheck(a.length, fromIndex, toIndex);
1272 return binarySearch0(a, fromIndex, toIndex, key);
1273 }
1274
1275 // Like public version, but without range checks.
1276 private static int binarySearch0(double[] a, int fromIndex, int toIndex,
1277 double key) {
1278 int low = fromIndex;
1279 int high = toIndex - 1;
1280
1281 while (low <= high) {
1282 int mid = (low + high) >>> 1;
1283 double midVal = a[mid];
1284
1285 if (midVal < key)
1286 low = mid + 1; // Neither val is NaN, thisVal is smaller
1287 else if (midVal > key)
1288 high = mid - 1; // Neither val is NaN, thisVal is larger
1289 else {
1290 long midBits = Double.doubleToLongBits(midVal);
1291 long keyBits = Double.doubleToLongBits(key);
1292 if (midBits == keyBits) // Values are equal
1293 return mid; // Key found
1294 else if (midBits < keyBits) // (-0.0, 0.0) or (!NaN, NaN)
1295 low = mid + 1;
1296 else // (0.0, -0.0) or (NaN, !NaN)
1297 high = mid - 1;
1298 }
1299 }
1300 return -(low + 1); // key not found.
1301 }
1302
1303 /**
1304 * Searches the specified array of floats for the specified value using
1305 * the binary search algorithm. The array must be sorted
1306 * (as by the {@link #sort(float[])} method) prior to making this call. If
1307 * it is not sorted, the results are undefined. If the array contains
1308 * multiple elements with the specified value, there is no guarantee which
1309 * one will be found. This method considers all NaN values to be
1310 * equivalent and equal.
1311 *
1312 * @param a the array to be searched
1313 * @param key the value to be searched for
1314 * @return index of the search key, if it is contained in the array;
1315 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
1316 * <i>insertion point</i> is defined as the point at which the
1317 * key would be inserted into the array: the index of the first
1318 * element greater than the key, or <tt>a.length</tt> if all
1319 * elements in the array are less than the specified key. Note
1320 * that this guarantees that the return value will be &gt;= 0 if
1321 * and only if the key is found.
1322 */
1323 public static int binarySearch(float[] a, float key) {
1324 return binarySearch0(a, 0, a.length, key);
1325 }
1326
1327 /**
1328 * Searches a range of
1329 * the specified array of floats for the specified value using
1330 * the binary search algorithm.
1331 * The range must be sorted
1332 * (as by the {@link #sort(float[], int, int)} method)
1333 * prior to making this call. If
1334 * it is not sorted, the results are undefined. If the range contains
1335 * multiple elements with the specified value, there is no guarantee which
1336 * one will be found. This method considers all NaN values to be
1337 * equivalent and equal.
1338 *
1339 * @param a the array to be searched
1340 * @param fromIndex the index of the first element (inclusive) to be
1341 * searched
1342 * @param toIndex the index of the last element (exclusive) to be searched
1343 * @param key the value to be searched for
1344 * @return index of the search key, if it is contained in the array
1345 * within the specified range;
1346 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
1347 * <i>insertion point</i> is defined as the point at which the
1348 * key would be inserted into the array: the index of the first
1349 * element in the range greater than the key,
1350 * or <tt>toIndex</tt> if all
1351 * elements in the range are less than the specified key. Note
1352 * that this guarantees that the return value will be &gt;= 0 if
1353 * and only if the key is found.
1354 * @throws IllegalArgumentException
1355 * if {@code fromIndex > toIndex}
1356 * @throws ArrayIndexOutOfBoundsException
1357 * if {@code fromIndex < 0 or toIndex > a.length}
1358 * @since 1.6
1359 */
1360 public static int binarySearch(float[] a, int fromIndex, int toIndex,
1361 float key) {
1362 rangeCheck(a.length, fromIndex, toIndex);
1363 return binarySearch0(a, fromIndex, toIndex, key);
1364 }
1365
1366 // Like public version, but without range checks.
1367 private static int binarySearch0(float[] a, int fromIndex, int toIndex,
1368 float key) {
1369 int low = fromIndex;
1370 int high = toIndex - 1;
1371
1372 while (low <= high) {
1373 int mid = (low + high) >>> 1;
1374 float midVal = a[mid];
1375
1376 if (midVal < key)
1377 low = mid + 1; // Neither val is NaN, thisVal is smaller
1378 else if (midVal > key)
1379 high = mid - 1; // Neither val is NaN, thisVal is larger
1380 else {
1381 int midBits = Float.floatToIntBits(midVal);
1382 int keyBits = Float.floatToIntBits(key);
1383 if (midBits == keyBits) // Values are equal
1384 return mid; // Key found
1385 else if (midBits < keyBits) // (-0.0, 0.0) or (!NaN, NaN)
1386 low = mid + 1;
1387 else // (0.0, -0.0) or (NaN, !NaN)
1388 high = mid - 1;
1389 }
1390 }
1391 return -(low + 1); // key not found.
1392 }
1393
1394 /**
1395 * Searches the specified array for the specified object using the binary
1396 * search algorithm. The array must be sorted into ascending order
1397 * according to the
1398 * {@linkplain Comparable natural ordering}
1399 * of its elements (as by the
1400 * {@link #sort(Object[])} method) prior to making this call.
1401 * If it is not sorted, the results are undefined.
1402 * (If the array contains elements that are not mutually comparable (for
1403 * example, strings and integers), it <i>cannot</i> be sorted according
1404 * to the natural ordering of its elements, hence results are undefined.)
1405 * If the array contains multiple
1406 * elements equal to the specified object, there is no guarantee which
1407 * one will be found.
1408 *
1409 * @param a the array to be searched
1410 * @param key the value to be searched for
1411 * @return index of the search key, if it is contained in the array;
1412 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
1413 * <i>insertion point</i> is defined as the point at which the
1414 * key would be inserted into the array: the index of the first
1415 * element greater than the key, or <tt>a.length</tt> if all
1416 * elements in the array are less than the specified key. Note
1417 * that this guarantees that the return value will be &gt;= 0 if
1418 * and only if the key is found.
1419 * @throws ClassCastException if the search key is not comparable to the
1420 * elements of the array.
1421 */
1422 public static int binarySearch(Object[] a, Object key) {
1423 return binarySearch0(a, 0, a.length, key);
1424 }
1425
1426 /**
1427 * Searches a range of
1428 * the specified array for the specified object using the binary
1429 * search algorithm.
1430 * The range must be sorted into ascending order
1431 * according to the
1432 * {@linkplain Comparable natural ordering}
1433 * of its elements (as by the
1434 * {@link #sort(Object[], int, int)} method) prior to making this
1435 * call. If it is not sorted, the results are undefined.
1436 * (If the range contains elements that are not mutually comparable (for
1437 * example, strings and integers), it <i>cannot</i> be sorted according
1438 * to the natural ordering of its elements, hence results are undefined.)
1439 * If the range contains multiple
1440 * elements equal to the specified object, there is no guarantee which
1441 * one will be found.
1442 *
1443 * @param a the array to be searched
1444 * @param fromIndex the index of the first element (inclusive) to be
1445 * searched
1446 * @param toIndex the index of the last element (exclusive) to be searched
1447 * @param key the value to be searched for
1448 * @return index of the search key, if it is contained in the array
1449 * within the specified range;
1450 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
1451 * <i>insertion point</i> is defined as the point at which the
1452 * key would be inserted into the array: the index of the first
1453 * element in the range greater than the key,
1454 * or <tt>toIndex</tt> if all
1455 * elements in the range are less than the specified key. Note
1456 * that this guarantees that the return value will be &gt;= 0 if
1457 * and only if the key is found.
1458 * @throws ClassCastException if the search key is not comparable to the
1459 * elements of the array within the specified range.
1460 * @throws IllegalArgumentException
1461 * if {@code fromIndex > toIndex}
1462 * @throws ArrayIndexOutOfBoundsException
1463 * if {@code fromIndex < 0 or toIndex > a.length}
1464 * @since 1.6
1465 */
1466 public static int binarySearch(Object[] a, int fromIndex, int toIndex,
1467 Object key) {
1468 rangeCheck(a.length, fromIndex, toIndex);
1469 return binarySearch0(a, fromIndex, toIndex, key);
1470 }
1471
1472 // Like public version, but without range checks.
1473 private static int binarySearch0(Object[] a, int fromIndex, int toIndex,
1474 Object key) {
1475 int low = fromIndex;
1476 int high = toIndex - 1;
1477
1478 while (low <= high) {
1479 int mid = (low + high) >>> 1;
1480 Comparable midVal = (Comparable)a[mid];
1481 int cmp = midVal.compareTo(key);
1482
1483 if (cmp < 0)
1484 low = mid + 1;
1485 else if (cmp > 0)
1486 high = mid - 1;
1487 else
1488 return mid; // key found
1489 }
1490 return -(low + 1); // key not found.
1491 }
1492
1493 /**
1494 * Searches the specified array for the specified object using the binary
1495 * search algorithm. The array must be sorted into ascending order
1496 * according to the specified comparator (as by the
1497 * {@link #sort(Object[], Comparator) sort(T[], Comparator)}
1498 * method) prior to making this call. If it is
1499 * not sorted, the results are undefined.
1500 * If the array contains multiple
1501 * elements equal to the specified object, there is no guarantee which one
1502 * will be found.
1503 *
1504 * @param a the array to be searched
1505 * @param key the value to be searched for
1506 * @param c the comparator by which the array is ordered. A
1507 * <tt>null</tt> value indicates that the elements'
1508 * {@linkplain Comparable natural ordering} should be used.
1509 * @return index of the search key, if it is contained in the array;
1510 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
1511 * <i>insertion point</i> is defined as the point at which the
1512 * key would be inserted into the array: the index of the first
1513 * element greater than the key, or <tt>a.length</tt> if all
1514 * elements in the array are less than the specified key. Note
1515 * that this guarantees that the return value will be &gt;= 0 if
1516 * and only if the key is found.
1517 * @throws ClassCastException if the array contains elements that are not
1518 * <i>mutually comparable</i> using the specified comparator,
1519 * or the search key is not comparable to the
1520 * elements of the array using this comparator.
1521 */
1522 public static <T> int binarySearch(T[] a, T key, Comparator<? super T> c) {
1523 return binarySearch0(a, 0, a.length, key, c);
1524 }
1525
1526 /**
1527 * Searches a range of
1528 * the specified array for the specified object using the binary
1529 * search algorithm.
1530 * The range must be sorted into ascending order
1531 * according to the specified comparator (as by the
1532 * {@link #sort(Object[], int, int, Comparator)
1533 * sort(T[], int, int, Comparator)}
1534 * method) prior to making this call.
1535 * If it is not sorted, the results are undefined.
1536 * If the range contains multiple elements equal to the specified object,
1537 * there is no guarantee which one will be found.
1538 *
1539 * @param a the array to be searched
1540 * @param fromIndex the index of the first element (inclusive) to be
1541 * searched
1542 * @param toIndex the index of the last element (exclusive) to be searched
1543 * @param key the value to be searched for
1544 * @param c the comparator by which the array is ordered. A
1545 * <tt>null</tt> value indicates that the elements'
1546 * {@linkplain Comparable natural ordering} should be used.
1547 * @return index of the search key, if it is contained in the array
1548 * within the specified range;
1549 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
1550 * <i>insertion point</i> is defined as the point at which the
1551 * key would be inserted into the array: the index of the first
1552 * element in the range greater than the key,
1553 * or <tt>toIndex</tt> if all
1554 * elements in the range are less than the specified key. Note
1555 * that this guarantees that the return value will be &gt;= 0 if
1556 * and only if the key is found.
1557 * @throws ClassCastException if the range contains elements that are not
1558 * <i>mutually comparable</i> using the specified comparator,
1559 * or the search key is not comparable to the
1560 * elements in the range using this comparator.
1561 * @throws IllegalArgumentException
1562 * if {@code fromIndex > toIndex}
1563 * @throws ArrayIndexOutOfBoundsException
1564 * if {@code fromIndex < 0 or toIndex > a.length}
1565 * @since 1.6
1566 */
1567 public static <T> int binarySearch(T[] a, int fromIndex, int toIndex,
1568 T key, Comparator<? super T> c) {
1569 rangeCheck(a.length, fromIndex, toIndex);
1570 return binarySearch0(a, fromIndex, toIndex, key, c);
1571 }
1572
1573 // Like public version, but without range checks.
1574 private static <T> int binarySearch0(T[] a, int fromIndex, int toIndex,
1575 T key, Comparator<? super T> c) {
1576 if (c == null) {
1577 return binarySearch0(a, fromIndex, toIndex, key);
1578 }
1579 int low = fromIndex;
1580 int high = toIndex - 1;
1581
1582 while (low <= high) {
1583 int mid = (low + high) >>> 1;
1584 T midVal = a[mid];
1585 int cmp = c.compare(midVal, key);
1586 if (cmp < 0)
1587 low = mid + 1;
1588 else if (cmp > 0)
1589 high = mid - 1;
1590 else
1591 return mid; // key found
1592 }
1593 return -(low + 1); // key not found.
1594 }
1595
1596 // Equality Testing
1597
1598 /**
1599 * Returns <tt>true</tt> if the two specified arrays of longs are
1600 * <i>equal</i> to one another. Two arrays are considered equal if both
1601 * arrays contain the same number of elements, and all corresponding pairs
1602 * of elements in the two arrays are equal. In other words, two arrays
1603 * are equal if they contain the same elements in the same order. Also,
1604 * two array references are considered equal if both are <tt>null</tt>.<p>
1605 *
1606 * @param a one array to be tested for equality
1607 * @param a2 the other array to be tested for equality
1608 * @return <tt>true</tt> if the two arrays are equal
1609 */
1610 public static boolean equals(long[] a, long[] a2) {
1611 if (a==a2)
1612 return true;
1613 if (a==null || a2==null)
1614 return false;
1615
1616 int length = a.length;
1617 if (a2.length != length)
1618 return false;
1619
1620 for (int i=0; i<length; i++)
1621 if (a[i] != a2[i])
1622 return false;
1623
1624 return true;
1625 }
1626
1627 /**
1628 * Returns <tt>true</tt> if the two specified arrays of ints are
1629 * <i>equal</i> to one another. Two arrays are considered equal if both
1630 * arrays contain the same number of elements, and all corresponding pairs
1631 * of elements in the two arrays are equal. In other words, two arrays
1632 * are equal if they contain the same elements in the same order. Also,
1633 * two array references are considered equal if both are <tt>null</tt>.<p>
1634 *
1635 * @param a one array to be tested for equality
1636 * @param a2 the other array to be tested for equality
1637 * @return <tt>true</tt> if the two arrays are equal
1638 */
1639 public static boolean equals(int[] a, int[] a2) {
1640 if (a==a2)
1641 return true;
1642 if (a==null || a2==null)
1643 return false;
1644
1645 int length = a.length;
1646 if (a2.length != length)
1647 return false;
1648
1649 for (int i=0; i<length; i++)
1650 if (a[i] != a2[i])
1651 return false;
1652
1653 return true;
1654 }
1655
1656 /**
1657 * Returns <tt>true</tt> if the two specified arrays of shorts are
1658 * <i>equal</i> to one another. Two arrays are considered equal if both
1659 * arrays contain the same number of elements, and all corresponding pairs
1660 * of elements in the two arrays are equal. In other words, two arrays
1661 * are equal if they contain the same elements in the same order. Also,
1662 * two array references are considered equal if both are <tt>null</tt>.<p>
1663 *
1664 * @param a one array to be tested for equality
1665 * @param a2 the other array to be tested for equality
1666 * @return <tt>true</tt> if the two arrays are equal
1667 */
1668 public static boolean equals(short[] a, short a2[]) {
1669 if (a==a2)
1670 return true;
1671 if (a==null || a2==null)
1672 return false;
1673
1674 int length = a.length;
1675 if (a2.length != length)
1676 return false;
1677
1678 for (int i=0; i<length; i++)
1679 if (a[i] != a2[i])
1680 return false;
1681
1682 return true;
1683 }
1684
1685 /**
1686 * Returns <tt>true</tt> if the two specified arrays of chars are
1687 * <i>equal</i> to one another. Two arrays are considered equal if both
1688 * arrays contain the same number of elements, and all corresponding pairs
1689 * of elements in the two arrays are equal. In other words, two arrays
1690 * are equal if they contain the same elements in the same order. Also,
1691 * two array references are considered equal if both are <tt>null</tt>.<p>
1692 *
1693 * @param a one array to be tested for equality
1694 * @param a2 the other array to be tested for equality
1695 * @return <tt>true</tt> if the two arrays are equal
1696 */
1697 public static boolean equals(char[] a, char[] a2) {
1698 if (a==a2)
1699 return true;
1700 if (a==null || a2==null)
1701 return false;
1702
1703 int length = a.length;
1704 if (a2.length != length)
1705 return false;
1706
1707 for (int i=0; i<length; i++)
1708 if (a[i] != a2[i])
1709 return false;
1710
1711 return true;
1712 }
1713
1714 /**
1715 * Returns <tt>true</tt> if the two specified arrays of bytes are
1716 * <i>equal</i> to one another. Two arrays are considered equal if both
1717 * arrays contain the same number of elements, and all corresponding pairs
1718 * of elements in the two arrays are equal. In other words, two arrays
1719 * are equal if they contain the same elements in the same order. Also,
1720 * two array references are considered equal if both are <tt>null</tt>.<p>
1721 *
1722 * @param a one array to be tested for equality
1723 * @param a2 the other array to be tested for equality
1724 * @return <tt>true</tt> if the two arrays are equal
1725 */
1726 public static boolean equals(byte[] a, byte[] a2) {
1727 if (a==a2)
1728 return true;
1729 if (a==null || a2==null)
1730 return false;
1731
1732 int length = a.length;
1733 if (a2.length != length)
1734 return false;
1735
1736 for (int i=0; i<length; i++)
1737 if (a[i] != a2[i])
1738 return false;
1739
1740 return true;
1741 }
1742
1743 /**
1744 * Returns <tt>true</tt> if the two specified arrays of booleans are
1745 * <i>equal</i> to one another. Two arrays are considered equal if both
1746 * arrays contain the same number of elements, and all corresponding pairs
1747 * of elements in the two arrays are equal. In other words, two arrays
1748 * are equal if they contain the same elements in the same order. Also,
1749 * two array references are considered equal if both are <tt>null</tt>.<p>
1750 *
1751 * @param a one array to be tested for equality
1752 * @param a2 the other array to be tested for equality
1753 * @return <tt>true</tt> if the two arrays are equal
1754 */
1755 public static boolean equals(boolean[] a, boolean[] a2) {
1756 if (a==a2)
1757 return true;
1758 if (a==null || a2==null)
1759 return false;
1760
1761 int length = a.length;
1762 if (a2.length != length)
1763 return false;
1764
1765 for (int i=0; i<length; i++)
1766 if (a[i] != a2[i])
1767 return false;
1768
1769 return true;
1770 }
1771
1772 /**
1773 * Returns <tt>true</tt> if the two specified arrays of doubles are
1774 * <i>equal</i> to one another. Two arrays are considered equal if both
1775 * arrays contain the same number of elements, and all corresponding pairs
1776 * of elements in the two arrays are equal. In other words, two arrays
1777 * are equal if they contain the same elements in the same order. Also,
1778 * two array references are considered equal if both are <tt>null</tt>.<p>
1779 *
1780 * Two doubles <tt>d1</tt> and <tt>d2</tt> are considered equal if:
1781 * <pre> <tt>new Double(d1).equals(new Double(d2))</tt></pre>
1782 * (Unlike the <tt>==</tt> operator, this method considers
1783 * <tt>NaN</tt> equals to itself, and 0.0d unequal to -0.0d.)
1784 *
1785 * @param a one array to be tested for equality
1786 * @param a2 the other array to be tested for equality
1787 * @return <tt>true</tt> if the two arrays are equal
1788 * @see Double#equals(Object)
1789 */
1790 public static boolean equals(double[] a, double[] a2) {
1791 if (a==a2)
1792 return true;
1793 if (a==null || a2==null)
1794 return false;
1795
1796 int length = a.length;
1797 if (a2.length != length)
1798 return false;
1799
1800 for (int i=0; i<length; i++)
1801 if (Double.doubleToLongBits(a[i])!=Double.doubleToLongBits(a2[i]))
1802 return false;
1803
1804 return true;
1805 }
1806
1807 /**
1808 * Returns <tt>true</tt> if the two specified arrays of floats are
1809 * <i>equal</i> to one another. Two arrays are considered equal if both
1810 * arrays contain the same number of elements, and all corresponding pairs
1811 * of elements in the two arrays are equal. In other words, two arrays
1812 * are equal if they contain the same elements in the same order. Also,
1813 * two array references are considered equal if both are <tt>null</tt>.<p>
1814 *
1815 * Two floats <tt>f1</tt> and <tt>f2</tt> are considered equal if:
1816 * <pre> <tt>new Float(f1).equals(new Float(f2))</tt></pre>
1817 * (Unlike the <tt>==</tt> operator, this method considers
1818 * <tt>NaN</tt> equals to itself, and 0.0f unequal to -0.0f.)
1819 *
1820 * @param a one array to be tested for equality
1821 * @param a2 the other array to be tested for equality
1822 * @return <tt>true</tt> if the two arrays are equal
1823 * @see Float#equals(Object)
1824 */
1825 public static boolean equals(float[] a, float[] a2) {
1826 if (a==a2)
1827 return true;
1828 if (a==null || a2==null)
1829 return false;
1830
1831 int length = a.length;
1832 if (a2.length != length)
1833 return false;
1834
1835 for (int i=0; i<length; i++)
1836 if (Float.floatToIntBits(a[i])!=Float.floatToIntBits(a2[i]))
1837 return false;
1838
1839 return true;
1840 }
1841
1842 /**
1843 * Returns <tt>true</tt> if the two specified arrays of Objects are
1844 * <i>equal</i> to one another. The two arrays are considered equal if
1845 * both arrays contain the same number of elements, and all corresponding
1846 * pairs of elements in the two arrays are equal. Two objects <tt>e1</tt>
1847 * and <tt>e2</tt> are considered <i>equal</i> if <tt>(e1==null ? e2==null
1848 * : e1.equals(e2))</tt>. In other words, the two arrays are equal if
1849 * they contain the same elements in the same order. Also, two array
1850 * references are considered equal if both are <tt>null</tt>.<p>
1851 *
1852 * @param a one array to be tested for equality
1853 * @param a2 the other array to be tested for equality
1854 * @return <tt>true</tt> if the two arrays are equal
1855 */
1856 public static boolean equals(Object[] a, Object[] a2) {
1857 if (a==a2)
1858 return true;
1859 if (a==null || a2==null)
1860 return false;
1861
1862 int length = a.length;
1863 if (a2.length != length)
1864 return false;
1865
1866 for (int i=0; i<length; i++) {
1867 Object o1 = a[i];
1868 Object o2 = a2[i];
1869 if (!(o1==null ? o2==null : o1.equals(o2)))
1870 return false;
1871 }
1872
1873 return true;
1874 }
1875
1876 // Filling
1877
1878 /**
1879 * Assigns the specified long value to each element of the specified array
1880 * of longs.
1881 *
1882 * @param a the array to be filled
1883 * @param val the value to be stored in all elements of the array
1884 */
1885 public static void fill(long[] a, long val) {
1886 for (int i = 0, len = a.length; i < len; i++)
1887 a[i] = val;
1888 }
1889
1890 /**
1891 * Assigns the specified long value to each element of the specified
1892 * range of the specified array of longs. The range to be filled
1893 * extends from index <tt>fromIndex</tt>, inclusive, to index
1894 * <tt>toIndex</tt>, exclusive. (If <tt>fromIndex==toIndex</tt>, the
1895 * range to be filled is empty.)
1896 *
1897 * @param a the array to be filled
1898 * @param fromIndex the index of the first element (inclusive) to be
1899 * filled with the specified value
1900 * @param toIndex the index of the last element (exclusive) to be
1901 * filled with the specified value
1902 * @param val the value to be stored in all elements of the array
1903 * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
1904 * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
1905 * <tt>toIndex &gt; a.length</tt>
1906 */
1907 public static void fill(long[] a, int fromIndex, int toIndex, long val) {
1908 rangeCheck(a.length, fromIndex, toIndex);
1909 for (int i = fromIndex; i < toIndex; i++)
1910 a[i] = val;
1911 }
1912
1913 /**
1914 * Assigns the specified int value to each element of the specified array
1915 * of ints.
1916 *
1917 * @param a the array to be filled
1918 * @param val the value to be stored in all elements of the array
1919 */
1920 public static void fill(int[] a, int val) {
1921 for (int i = 0, len = a.length; i < len; i++)
1922 a[i] = val;
1923 }
1924
1925 /**
1926 * Assigns the specified int value to each element of the specified
1927 * range of the specified array of ints. The range to be filled
1928 * extends from index <tt>fromIndex</tt>, inclusive, to index
1929 * <tt>toIndex</tt>, exclusive. (If <tt>fromIndex==toIndex</tt>, the
1930 * range to be filled is empty.)
1931 *
1932 * @param a the array to be filled
1933 * @param fromIndex the index of the first element (inclusive) to be
1934 * filled with the specified value
1935 * @param toIndex the index of the last element (exclusive) to be
1936 * filled with the specified value
1937 * @param val the value to be stored in all elements of the array
1938 * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
1939 * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
1940 * <tt>toIndex &gt; a.length</tt>
1941 */
1942 public static void fill(int[] a, int fromIndex, int toIndex, int val) {
1943 rangeCheck(a.length, fromIndex, toIndex);
1944 for (int i = fromIndex; i < toIndex; i++)
1945 a[i] = val;
1946 }
1947
1948 /**
1949 * Assigns the specified short value to each element of the specified array
1950 * of shorts.
1951 *
1952 * @param a the array to be filled
1953 * @param val the value to be stored in all elements of the array
1954 */
1955 public static void fill(short[] a, short val) {
1956 for (int i = 0, len = a.length; i < len; i++)
1957 a[i] = val;
1958 }
1959
1960 /**
1961 * Assigns the specified short value to each element of the specified
1962 * range of the specified array of shorts. The range to be filled
1963 * extends from index <tt>fromIndex</tt>, inclusive, to index
1964 * <tt>toIndex</tt>, exclusive. (If <tt>fromIndex==toIndex</tt>, the
1965 * range to be filled is empty.)
1966 *
1967 * @param a the array to be filled
1968 * @param fromIndex the index of the first element (inclusive) to be
1969 * filled with the specified value
1970 * @param toIndex the index of the last element (exclusive) to be
1971 * filled with the specified value
1972 * @param val the value to be stored in all elements of the array
1973 * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
1974 * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
1975 * <tt>toIndex &gt; a.length</tt>
1976 */
1977 public static void fill(short[] a, int fromIndex, int toIndex, short val) {
1978 rangeCheck(a.length, fromIndex, toIndex);
1979 for (int i = fromIndex; i < toIndex; i++)
1980 a[i] = val;
1981 }
1982
1983 /**
1984 * Assigns the specified char value to each element of the specified array
1985 * of chars.
1986 *
1987 * @param a the array to be filled
1988 * @param val the value to be stored in all elements of the array
1989 */
1990 public static void fill(char[] a, char val) {
1991 for (int i = 0, len = a.length; i < len; i++)
1992 a[i] = val;
1993 }
1994
1995 /**
1996 * Assigns the specified char value to each element of the specified
1997 * range of the specified array of chars. The range to be filled
1998 * extends from index <tt>fromIndex</tt>, inclusive, to index
1999 * <tt>toIndex</tt>, exclusive. (If <tt>fromIndex==toIndex</tt>, the
2000 * range to be filled is empty.)
2001 *
2002 * @param a the array to be filled
2003 * @param fromIndex the index of the first element (inclusive) to be
2004 * filled with the specified value
2005 * @param toIndex the index of the last element (exclusive) to be
2006 * filled with the specified value
2007 * @param val the value to be stored in all elements of the array
2008 * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
2009 * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
2010 * <tt>toIndex &gt; a.length</tt>
2011 */
2012 public static void fill(char[] a, int fromIndex, int toIndex, char val) {
2013 rangeCheck(a.length, fromIndex, toIndex);
2014 for (int i = fromIndex; i < toIndex; i++)
2015 a[i] = val;
2016 }
2017
2018 /**
2019 * Assigns the specified byte value to each element of the specified array
2020 * of bytes.
2021 *
2022 * @param a the array to be filled
2023 * @param val the value to be stored in all elements of the array
2024 */
2025 public static void fill(byte[] a, byte val) {
2026 for (int i = 0, len = a.length; i < len; i++)
2027 a[i] = val;
2028 }
2029
2030 /**
2031 * Assigns the specified byte value to each element of the specified
2032 * range of the specified array of bytes. The range to be filled
2033 * extends from index <tt>fromIndex</tt>, inclusive, to index
2034 * <tt>toIndex</tt>, exclusive. (If <tt>fromIndex==toIndex</tt>, the
2035 * range to be filled is empty.)
2036 *
2037 * @param a the array to be filled
2038 * @param fromIndex the index of the first element (inclusive) to be
2039 * filled with the specified value
2040 * @param toIndex the index of the last element (exclusive) to be
2041 * filled with the specified value
2042 * @param val the value to be stored in all elements of the array
2043 * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
2044 * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
2045 * <tt>toIndex &gt; a.length</tt>
2046 */
2047 public static void fill(byte[] a, int fromIndex, int toIndex, byte val) {
2048 rangeCheck(a.length, fromIndex, toIndex);
2049 for (int i = fromIndex; i < toIndex; i++)
2050 a[i] = val;
2051 }
2052
2053 /**
2054 * Assigns the specified boolean value to each element of the specified
2055 * array of booleans.
2056 *
2057 * @param a the array to be filled
2058 * @param val the value to be stored in all elements of the array
2059 */
2060 public static void fill(boolean[] a, boolean val) {
2061 for (int i = 0, len = a.length; i < len; i++)
2062 a[i] = val;
2063 }
2064
2065 /**
2066 * Assigns the specified boolean value to each element of the specified
2067 * range of the specified array of booleans. The range to be filled
2068 * extends from index <tt>fromIndex</tt>, inclusive, to index
2069 * <tt>toIndex</tt>, exclusive. (If <tt>fromIndex==toIndex</tt>, the
2070 * range to be filled is empty.)
2071 *
2072 * @param a the array to be filled
2073 * @param fromIndex the index of the first element (inclusive) to be
2074 * filled with the specified value
2075 * @param toIndex the index of the last element (exclusive) to be
2076 * filled with the specified value
2077 * @param val the value to be stored in all elements of the array
2078 * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
2079 * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
2080 * <tt>toIndex &gt; a.length</tt>
2081 */
2082 public static void fill(boolean[] a, int fromIndex, int toIndex,
2083 boolean val) {
2084 rangeCheck(a.length, fromIndex, toIndex);
2085 for (int i = fromIndex; i < toIndex; i++)
2086 a[i] = val;
2087 }
2088
2089 /**
2090 * Assigns the specified double value to each element of the specified
2091 * array of doubles.
2092 *
2093 * @param a the array to be filled
2094 * @param val the value to be stored in all elements of the array
2095 */
2096 public static void fill(double[] a, double val) {
2097 for (int i = 0, len = a.length; i < len; i++)
2098 a[i] = val;
2099 }
2100
2101 /**
2102 * Assigns the specified double value to each element of the specified
2103 * range of the specified array of doubles. The range to be filled
2104 * extends from index <tt>fromIndex</tt>, inclusive, to index
2105 * <tt>toIndex</tt>, exclusive. (If <tt>fromIndex==toIndex</tt>, the
2106 * range to be filled is empty.)
2107 *
2108 * @param a the array to be filled
2109 * @param fromIndex the index of the first element (inclusive) to be
2110 * filled with the specified value
2111 * @param toIndex the index of the last element (exclusive) to be
2112 * filled with the specified value
2113 * @param val the value to be stored in all elements of the array
2114 * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
2115 * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
2116 * <tt>toIndex &gt; a.length</tt>
2117 */
2118 public static void fill(double[] a, int fromIndex, int toIndex,double val){
2119 rangeCheck(a.length, fromIndex, toIndex);
2120 for (int i = fromIndex; i < toIndex; i++)
2121 a[i] = val;
2122 }
2123
2124 /**
2125 * Assigns the specified float value to each element of the specified array
2126 * of floats.
2127 *
2128 * @param a the array to be filled
2129 * @param val the value to be stored in all elements of the array
2130 */
2131 public static void fill(float[] a, float val) {
2132 for (int i = 0, len = a.length; i < len; i++)
2133 a[i] = val;
2134 }
2135
2136 /**
2137 * Assigns the specified float value to each element of the specified
2138 * range of the specified array of floats. The range to be filled
2139 * extends from index <tt>fromIndex</tt>, inclusive, to index
2140 * <tt>toIndex</tt>, exclusive. (If <tt>fromIndex==toIndex</tt>, the
2141 * range to be filled is empty.)
2142 *
2143 * @param a the array to be filled
2144 * @param fromIndex the index of the first element (inclusive) to be
2145 * filled with the specified value
2146 * @param toIndex the index of the last element (exclusive) to be
2147 * filled with the specified value
2148 * @param val the value to be stored in all elements of the array
2149 * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
2150 * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
2151 * <tt>toIndex &gt; a.length</tt>
2152 */
2153 public static void fill(float[] a, int fromIndex, int toIndex, float val) {
2154 rangeCheck(a.length, fromIndex, toIndex);
2155 for (int i = fromIndex; i < toIndex; i++)
2156 a[i] = val;
2157 }
2158
2159 /**
2160 * Assigns the specified Object reference to each element of the specified
2161 * array of Objects.
2162 *
2163 * @param a the array to be filled
2164 * @param val the value to be stored in all elements of the array
2165 * @throws ArrayStoreException if the specified value is not of a
2166 * runtime type that can be stored in the specified array
2167 */
2168 public static void fill(Object[] a, Object val) {
2169 for (int i = 0, len = a.length; i < len; i++)
2170 a[i] = val;
2171 }
2172
2173 /**
2174 * Assigns the specified Object reference to each element of the specified
2175 * range of the specified array of Objects. The range to be filled
2176 * extends from index <tt>fromIndex</tt>, inclusive, to index
2177 * <tt>toIndex</tt>, exclusive. (If <tt>fromIndex==toIndex</tt>, the
2178 * range to be filled is empty.)
2179 *
2180 * @param a the array to be filled
2181 * @param fromIndex the index of the first element (inclusive) to be
2182 * filled with the specified value
2183 * @param toIndex the index of the last element (exclusive) to be
2184 * filled with the specified value
2185 * @param val the value to be stored in all elements of the array
2186 * @throws IllegalArgumentException if <tt>fromIndex &gt; toIndex</tt>
2187 * @throws ArrayIndexOutOfBoundsException if <tt>fromIndex &lt; 0</tt> or
2188 * <tt>toIndex &gt; a.length</tt>
2189 * @throws ArrayStoreException if the specified value is not of a
2190 * runtime type that can be stored in the specified array
2191 */
2192 public static void fill(Object[] a, int fromIndex, int toIndex, Object val) {
2193 rangeCheck(a.length, fromIndex, toIndex);
2194 for (int i = fromIndex; i < toIndex; i++)
2195 a[i] = val;
2196 }
2197
2198 // Cloning
2199
2200 /**
2201 * Copies the specified array, truncating or padding with nulls (if necessary)
2202 * so the copy has the specified length. For all indices that are
2203 * valid in both the original array and the copy, the two arrays will
2204 * contain identical values. For any indices that are valid in the
2205 * copy but not the original, the copy will contain <tt>null</tt>.
2206 * Such indices will exist if and only if the specified length
2207 * is greater than that of the original array.
2208 * The resulting array is of exactly the same class as the original array.
2209 *
2210 * @param original the array to be copied
2211 * @param newLength the length of the copy to be returned
2212 * @return a copy of the original array, truncated or padded with nulls
2213 * to obtain the specified length
2214 * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
2215 * @throws NullPointerException if <tt>original</tt> is null
2216 * @since 1.6
2217 */
2218 public static <T> T[] copyOf(T[] original, int newLength) {
2219 return (T[]) copyOf(original, newLength, original.getClass());
2220 }
2221
2222 /**
2223 * Copies the specified array, truncating or padding with nulls (if necessary)
2224 * so the copy has the specified length. For all indices that are
2225 * valid in both the original array and the copy, the two arrays will
2226 * contain identical values. For any indices that are valid in the
2227 * copy but not the original, the copy will contain <tt>null</tt>.
2228 * Such indices will exist if and only if the specified length
2229 * is greater than that of the original array.
2230 * The resulting array is of the class <tt>newType</tt>.
2231 *
2232 * @param original the array to be copied
2233 * @param newLength the length of the copy to be returned
2234 * @param newType the class of the copy to be returned
2235 * @return a copy of the original array, truncated or padded with nulls
2236 * to obtain the specified length
2237 * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
2238 * @throws NullPointerException if <tt>original</tt> is null
2239 * @throws ArrayStoreException if an element copied from
2240 * <tt>original</tt> is not of a runtime type that can be stored in
2241 * an array of class <tt>newType</tt>
2242 * @since 1.6
2243 */
2244 public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
2245 T[] copy = ((Object)newType == (Object)Object[].class)
2246 ? (T[]) new Object[newLength]
2247 : (T[]) Array.newInstance(newType.getComponentType(), newLength);
2248 System.arraycopy(original, 0, copy, 0,
2249 Math.min(original.length, newLength));
2250 return copy;
2251 }
2252
2253 /**
2254 * Copies the specified array, truncating or padding with zeros (if necessary)
2255 * so the copy has the specified length. For all indices that are
2256 * valid in both the original array and the copy, the two arrays will
2257 * contain identical values. For any indices that are valid in the
2258 * copy but not the original, the copy will contain <tt>(byte)0</tt>.
2259 * Such indices will exist if and only if the specified length
2260 * is greater than that of the original array.
2261 *
2262 * @param original the array to be copied
2263 * @param newLength the length of the copy to be returned
2264 * @return a copy of the original array, truncated or padded with zeros
2265 * to obtain the specified length
2266 * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
2267 * @throws NullPointerException if <tt>original</tt> is null
2268 * @since 1.6
2269 */
2270 public static byte[] copyOf(byte[] original, int newLength) {
2271 byte[] copy = new byte[newLength];
2272 System.arraycopy(original, 0, copy, 0,
2273 Math.min(original.length, newLength));
2274 return copy;
2275 }
2276
2277 /**
2278 * Copies the specified array, truncating or padding with zeros (if necessary)
2279 * so the copy has the specified length. For all indices that are
2280 * valid in both the original array and the copy, the two arrays will
2281 * contain identical values. For any indices that are valid in the
2282 * copy but not the original, the copy will contain <tt>(short)0</tt>.
2283 * Such indices will exist if and only if the specified length
2284 * is greater than that of the original array.
2285 *
2286 * @param original the array to be copied
2287 * @param newLength the length of the copy to be returned
2288 * @return a copy of the original array, truncated or padded with zeros
2289 * to obtain the specified length
2290 * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
2291 * @throws NullPointerException if <tt>original</tt> is null
2292 * @since 1.6
2293 */
2294 public static short[] copyOf(short[] original, int newLength) {
2295 short[] copy = new short[newLength];
2296 System.arraycopy(original, 0, copy, 0,
2297 Math.min(original.length, newLength));
2298 return copy;
2299 }
2300
2301 /**
2302 * Copies the specified array, truncating or padding with zeros (if necessary)
2303 * so the copy has the specified length. For all indices that are
2304 * valid in both the original array and the copy, the two arrays will
2305 * contain identical values. For any indices that are valid in the
2306 * copy but not the original, the copy will contain <tt>0</tt>.
2307 * Such indices will exist if and only if the specified length
2308 * is greater than that of the original array.
2309 *
2310 * @param original the array to be copied
2311 * @param newLength the length of the copy to be returned
2312 * @return a copy of the original array, truncated or padded with zeros
2313 * to obtain the specified length
2314 * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
2315 * @throws NullPointerException if <tt>original</tt> is null
2316 * @since 1.6
2317 */
2318 public static int[] copyOf(int[] original, int newLength) {
2319 int[] copy = new int[newLength];
2320 System.arraycopy(original, 0, copy, 0,
2321 Math.min(original.length, newLength));
2322 return copy;
2323 }
2324
2325 /**
2326 * Copies the specified array, truncating or padding with zeros (if necessary)
2327 * so the copy has the specified length. For all indices that are
2328 * valid in both the original array and the copy, the two arrays will
2329 * contain identical values. For any indices that are valid in the
2330 * copy but not the original, the copy will contain <tt>0L</tt>.
2331 * Such indices will exist if and only if the specified length
2332 * is greater than that of the original array.
2333 *
2334 * @param original the array to be copied
2335 * @param newLength the length of the copy to be returned
2336 * @return a copy of the original array, truncated or padded with zeros
2337 * to obtain the specified length
2338 * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
2339 * @throws NullPointerException if <tt>original</tt> is null
2340 * @since 1.6
2341 */
2342 public static long[] copyOf(long[] original, int newLength) {
2343 long[] copy = new long[newLength];
2344 System.arraycopy(original, 0, copy, 0,
2345 Math.min(original.length, newLength));
2346 return copy;
2347 }
2348
2349 /**
2350 * Copies the specified array, truncating or padding with null characters (if necessary)
2351 * so the copy has the specified length. For all indices that are valid
2352 * in both the original array and the copy, the two arrays will contain
2353 * identical values. For any indices that are valid in the copy but not
2354 * the original, the copy will contain <tt>'\\u000'</tt>. Such indices
2355 * will exist if and only if the specified length is greater than that of
2356 * the original array.
2357 *
2358 * @param original the array to be copied
2359 * @param newLength the length of the copy to be returned
2360 * @return a copy of the original array, truncated or padded with null characters
2361 * to obtain the specified length
2362 * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
2363 * @throws NullPointerException if <tt>original</tt> is null
2364 * @since 1.6
2365 */
2366 public static char[] copyOf(char[] original, int newLength) {
2367 char[] copy = new char[newLength];
2368 System.arraycopy(original, 0, copy, 0,
2369 Math.min(original.length, newLength));
2370 return copy;
2371 }
2372
2373 /**
2374 * Copies the specified array, truncating or padding with zeros (if necessary)
2375 * so the copy has the specified length. For all indices that are
2376 * valid in both the original array and the copy, the two arrays will
2377 * contain identical values. For any indices that are valid in the
2378 * copy but not the original, the copy will contain <tt>0f</tt>.
2379 * Such indices will exist if and only if the specified length
2380 * is greater than that of the original array.
2381 *
2382 * @param original the array to be copied
2383 * @param newLength the length of the copy to be returned
2384 * @return a copy of the original array, truncated or padded with zeros
2385 * to obtain the specified length
2386 * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
2387 * @throws NullPointerException if <tt>original</tt> is null
2388 * @since 1.6
2389 */
2390 public static float[] copyOf(float[] original, int newLength) {
2391 float[] copy = new float[newLength];
2392 System.arraycopy(original, 0, copy, 0,
2393 Math.min(original.length, newLength));
2394 return copy;
2395 }
2396
2397 /**
2398 * Copies the specified array, truncating or padding with zeros (if necessary)
2399 * so the copy has the specified length. For all indices that are
2400 * valid in both the original array and the copy, the two arrays will
2401 * contain identical values. For any indices that are valid in the
2402 * copy but not the original, the copy will contain <tt>0d</tt>.
2403 * Such indices will exist if and only if the specified length
2404 * is greater than that of the original array.
2405 *
2406 * @param original the array to be copied
2407 * @param newLength the length of the copy to be returned
2408 * @return a copy of the original array, truncated or padded with zeros
2409 * to obtain the specified length
2410 * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
2411 * @throws NullPointerException if <tt>original</tt> is null
2412 * @since 1.6
2413 */
2414 public static double[] copyOf(double[] original, int newLength) {
2415 double[] copy = new double[newLength];
2416 System.arraycopy(original, 0, copy, 0,
2417 Math.min(original.length, newLength));
2418 return copy;
2419 }
2420
2421 /**
2422 * Copies the specified array, truncating or padding with <tt>false</tt> (if necessary)
2423 * so the copy has the specified length. For all indices that are
2424 * valid in both the original array and the copy, the two arrays will
2425 * contain identical values. For any indices that are valid in the
2426 * copy but not the original, the copy will contain <tt>false</tt>.
2427 * Such indices will exist if and only if the specified length
2428 * is greater than that of the original array.
2429 *
2430 * @param original the array to be copied
2431 * @param newLength the length of the copy to be returned
2432 * @return a copy of the original array, truncated or padded with false elements
2433 * to obtain the specified length
2434 * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
2435 * @throws NullPointerException if <tt>original</tt> is null
2436 * @since 1.6
2437 */
2438 public static boolean[] copyOf(boolean[] original, int newLength) {
2439 boolean[] copy = new boolean[newLength];
2440 System.arraycopy(original, 0, copy, 0,
2441 Math.min(original.length, newLength));
2442 return copy;
2443 }
2444
2445 /**
2446 * Copies the specified range of the specified array into a new array.
2447 * The initial index of the range (<tt>from</tt>) must lie between zero
2448 * and <tt>original.length</tt>, inclusive. The value at
2449 * <tt>original[from]</tt> is placed into the initial element of the copy
2450 * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
2451 * Values from subsequent elements in the original array are placed into
2452 * subsequent elements in the copy. The final index of the range
2453 * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
2454 * may be greater than <tt>original.length</tt>, in which case
2455 * <tt>null</tt> is placed in all elements of the copy whose index is
2456 * greater than or equal to <tt>original.length - from</tt>. The length
2457 * of the returned array will be <tt>to - from</tt>.
2458 * <p>
2459 * The resulting array is of exactly the same class as the original array.
2460 *
2461 * @param original the array from which a range is to be copied
2462 * @param from the initial index of the range to be copied, inclusive
2463 * @param to the final index of the range to be copied, exclusive.
2464 * (This index may lie outside the array.)
2465 * @return a new array containing the specified range from the original array,
2466 * truncated or padded with nulls to obtain the required length
2467 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
2468 * or {@code from > original.length}
2469 * @throws IllegalArgumentException if <tt>from &gt; to</tt>
2470 * @throws NullPointerException if <tt>original</tt> is null
2471 * @since 1.6
2472 */
2473 public static <T> T[] copyOfRange(T[] original, int from, int to) {
2474 return copyOfRange(original, from, to, (Class<T[]>) original.getClass());
2475 }
2476
2477 /**
2478 * Copies the specified range of the specified array into a new array.
2479 * The initial index of the range (<tt>from</tt>) must lie between zero
2480 * and <tt>original.length</tt>, inclusive. The value at
2481 * <tt>original[from]</tt> is placed into the initial element of the copy
2482 * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
2483 * Values from subsequent elements in the original array are placed into
2484 * subsequent elements in the copy. The final index of the range
2485 * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
2486 * may be greater than <tt>original.length</tt>, in which case
2487 * <tt>null</tt> is placed in all elements of the copy whose index is
2488 * greater than or equal to <tt>original.length - from</tt>. The length
2489 * of the returned array will be <tt>to - from</tt>.
2490 * The resulting array is of the class <tt>newType</tt>.
2491 *
2492 * @param original the array from which a range is to be copied
2493 * @param from the initial index of the range to be copied, inclusive
2494 * @param to the final index of the range to be copied, exclusive.
2495 * (This index may lie outside the array.)
2496 * @param newType the class of the copy to be returned
2497 * @return a new array containing the specified range from the original array,
2498 * truncated or padded with nulls to obtain the required length
2499 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
2500 * or {@code from > original.length}
2501 * @throws IllegalArgumentException if <tt>from &gt; to</tt>
2502 * @throws NullPointerException if <tt>original</tt> is null
2503 * @throws ArrayStoreException if an element copied from
2504 * <tt>original</tt> is not of a runtime type that can be stored in
2505 * an array of class <tt>newType</tt>.
2506 * @since 1.6
2507 */
2508 public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
2509 int newLength = to - from;
2510 if (newLength < 0)
2511 throw new IllegalArgumentException(from + " > " + to);
2512 T[] copy = ((Object)newType == (Object)Object[].class)
2513 ? (T[]) new Object[newLength]
2514 : (T[]) Array.newInstance(newType.getComponentType(), newLength);
2515 System.arraycopy(original, from, copy, 0,
2516 Math.min(original.length - from, newLength));
2517 return copy;
2518 }
2519
2520 /**
2521 * Copies the specified range of the specified array into a new array.
2522 * The initial index of the range (<tt>from</tt>) must lie between zero
2523 * and <tt>original.length</tt>, inclusive. The value at
2524 * <tt>original[from]</tt> is placed into the initial element of the copy
2525 * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
2526 * Values from subsequent elements in the original array are placed into
2527 * subsequent elements in the copy. The final index of the range
2528 * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
2529 * may be greater than <tt>original.length</tt>, in which case
2530 * <tt>(byte)0</tt> is placed in all elements of the copy whose index is
2531 * greater than or equal to <tt>original.length - from</tt>. The length
2532 * of the returned array will be <tt>to - from</tt>.
2533 *
2534 * @param original the array from which a range is to be copied
2535 * @param from the initial index of the range to be copied, inclusive
2536 * @param to the final index of the range to be copied, exclusive.
2537 * (This index may lie outside the array.)
2538 * @return a new array containing the specified range from the original array,
2539 * truncated or padded with zeros to obtain the required length
2540 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
2541 * or {@code from > original.length}
2542 * @throws IllegalArgumentException if <tt>from &gt; to</tt>
2543 * @throws NullPointerException if <tt>original</tt> is null
2544 * @since 1.6
2545 */
2546 public static byte[] copyOfRange(byte[] original, int from, int to) {
2547 int newLength = to - from;
2548 if (newLength < 0)
2549 throw new IllegalArgumentException(from + " > " + to);
2550 byte[] copy = new byte[newLength];
2551 System.arraycopy(original, from, copy, 0,
2552 Math.min(original.length - from, newLength));
2553 return copy;
2554 }
2555
2556 /**
2557 * Copies the specified range of the specified array into a new array.
2558 * The initial index of the range (<tt>from</tt>) must lie between zero
2559 * and <tt>original.length</tt>, inclusive. The value at
2560 * <tt>original[from]</tt> is placed into the initial element of the copy
2561 * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
2562 * Values from subsequent elements in the original array are placed into
2563 * subsequent elements in the copy. The final index of the range
2564 * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
2565 * may be greater than <tt>original.length</tt>, in which case
2566 * <tt>(short)0</tt> is placed in all elements of the copy whose index is
2567 * greater than or equal to <tt>original.length - from</tt>. The length
2568 * of the returned array will be <tt>to - from</tt>.
2569 *
2570 * @param original the array from which a range is to be copied
2571 * @param from the initial index of the range to be copied, inclusive
2572 * @param to the final index of the range to be copied, exclusive.
2573 * (This index may lie outside the array.)
2574 * @return a new array containing the specified range from the original array,
2575 * truncated or padded with zeros to obtain the required length
2576 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
2577 * or {@code from > original.length}
2578 * @throws IllegalArgumentException if <tt>from &gt; to</tt>
2579 * @throws NullPointerException if <tt>original</tt> is null
2580 * @since 1.6
2581 */
2582 public static short[] copyOfRange(short[] original, int from, int to) {
2583 int newLength = to - from;
2584 if (newLength < 0)
2585 throw new IllegalArgumentException(from + " > " + to);
2586 short[] copy = new short[newLength];
2587 System.arraycopy(original, from, copy, 0,
2588 Math.min(original.length - from, newLength));
2589 return copy;
2590 }
2591
2592 /**
2593 * Copies the specified range of the specified array into a new array.
2594 * The initial index of the range (<tt>from</tt>) must lie between zero
2595 * and <tt>original.length</tt>, inclusive. The value at
2596 * <tt>original[from]</tt> is placed into the initial element of the copy
2597 * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
2598 * Values from subsequent elements in the original array are placed into
2599 * subsequent elements in the copy. The final index of the range
2600 * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
2601 * may be greater than <tt>original.length</tt>, in which case
2602 * <tt>0</tt> is placed in all elements of the copy whose index is
2603 * greater than or equal to <tt>original.length - from</tt>. The length
2604 * of the returned array will be <tt>to - from</tt>.
2605 *
2606 * @param original the array from which a range is to be copied
2607 * @param from the initial index of the range to be copied, inclusive
2608 * @param to the final index of the range to be copied, exclusive.
2609 * (This index may lie outside the array.)
2610 * @return a new array containing the specified range from the original array,
2611 * truncated or padded with zeros to obtain the required length
2612 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
2613 * or {@code from > original.length}
2614 * @throws IllegalArgumentException if <tt>from &gt; to</tt>
2615 * @throws NullPointerException if <tt>original</tt> is null
2616 * @since 1.6
2617 */
2618 public static int[] copyOfRange(int[] original, int from, int to) {
2619 int newLength = to - from;
2620 if (newLength < 0)
2621 throw new IllegalArgumentException(from + " > " + to);
2622 int[] copy = new int[newLength];
2623 System.arraycopy(original, from, copy, 0,
2624 Math.min(original.length - from, newLength));
2625 return copy;
2626 }
2627
2628 /**
2629 * Copies the specified range of the specified array into a new array.
2630 * The initial index of the range (<tt>from</tt>) must lie between zero
2631 * and <tt>original.length</tt>, inclusive. The value at
2632 * <tt>original[from]</tt> is placed into the initial element of the copy
2633 * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
2634 * Values from subsequent elements in the original array are placed into
2635 * subsequent elements in the copy. The final index of the range
2636 * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
2637 * may be greater than <tt>original.length</tt>, in which case
2638 * <tt>0L</tt> is placed in all elements of the copy whose index is
2639 * greater than or equal to <tt>original.length - from</tt>. The length
2640 * of the returned array will be <tt>to - from</tt>.
2641 *
2642 * @param original the array from which a range is to be copied
2643 * @param from the initial index of the range to be copied, inclusive
2644 * @param to the final index of the range to be copied, exclusive.
2645 * (This index may lie outside the array.)
2646 * @return a new array containing the specified range from the original array,
2647 * truncated or padded with zeros to obtain the required length
2648 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
2649 * or {@code from > original.length}
2650 * @throws IllegalArgumentException if <tt>from &gt; to</tt>
2651 * @throws NullPointerException if <tt>original</tt> is null
2652 * @since 1.6
2653 */
2654 public static long[] copyOfRange(long[] original, int from, int to) {
2655 int newLength = to - from;
2656 if (newLength < 0)
2657 throw new IllegalArgumentException(from + " > " + to);
2658 long[] copy = new long[newLength];
2659 System.arraycopy(original, from, copy, 0,
2660 Math.min(original.length - from, newLength));
2661 return copy;
2662 }
2663
2664 /**
2665 * Copies the specified range of the specified array into a new array.
2666 * The initial index of the range (<tt>from</tt>) must lie between zero
2667 * and <tt>original.length</tt>, inclusive. The value at
2668 * <tt>original[from]</tt> is placed into the initial element of the copy
2669 * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
2670 * Values from subsequent elements in the original array are placed into
2671 * subsequent elements in the copy. The final index of the range
2672 * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
2673 * may be greater than <tt>original.length</tt>, in which case
2674 * <tt>'\\u000'</tt> is placed in all elements of the copy whose index is
2675 * greater than or equal to <tt>original.length - from</tt>. The length
2676 * of the returned array will be <tt>to - from</tt>.
2677 *
2678 * @param original the array from which a range is to be copied
2679 * @param from the initial index of the range to be copied, inclusive
2680 * @param to the final index of the range to be copied, exclusive.
2681 * (This index may lie outside the array.)
2682 * @return a new array containing the specified range from the original array,
2683 * truncated or padded with null characters to obtain the required length
2684 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
2685 * or {@code from > original.length}
2686 * @throws IllegalArgumentException if <tt>from &gt; to</tt>
2687 * @throws NullPointerException if <tt>original</tt> is null
2688 * @since 1.6
2689 */
2690 public static char[] copyOfRange(char[] original, int from, int to) {
2691 int newLength = to - from;
2692 if (newLength < 0)
2693 throw new IllegalArgumentException(from + " > " + to);
2694 char[] copy = new char[newLength];
2695 System.arraycopy(original, from, copy, 0,
2696 Math.min(original.length - from, newLength));
2697 return copy;
2698 }
2699
2700 /**
2701 * Copies the specified range of the specified array into a new array.
2702 * The initial index of the range (<tt>from</tt>) must lie between zero
2703 * and <tt>original.length</tt>, inclusive. The value at
2704 * <tt>original[from]</tt> is placed into the initial element of the copy
2705 * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
2706 * Values from subsequent elements in the original array are placed into
2707 * subsequent elements in the copy. The final index of the range
2708 * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
2709 * may be greater than <tt>original.length</tt>, in which case
2710 * <tt>0f</tt> is placed in all elements of the copy whose index is
2711 * greater than or equal to <tt>original.length - from</tt>. The length
2712 * of the returned array will be <tt>to - from</tt>.
2713 *
2714 * @param original the array from which a range is to be copied
2715 * @param from the initial index of the range to be copied, inclusive
2716 * @param to the final index of the range to be copied, exclusive.
2717 * (This index may lie outside the array.)
2718 * @return a new array containing the specified range from the original array,
2719 * truncated or padded with zeros to obtain the required length
2720 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
2721 * or {@code from > original.length}
2722 * @throws IllegalArgumentException if <tt>from &gt; to</tt>
2723 * @throws NullPointerException if <tt>original</tt> is null
2724 * @since 1.6
2725 */
2726 public static float[] copyOfRange(float[] original, int from, int to) {
2727 int newLength = to - from;
2728 if (newLength < 0)
2729 throw new IllegalArgumentException(from + " > " + to);
2730 float[] copy = new float[newLength];
2731 System.arraycopy(original, from, copy, 0,
2732 Math.min(original.length - from, newLength));
2733 return copy;
2734 }
2735
2736 /**
2737 * Copies the specified range of the specified array into a new array.
2738 * The initial index of the range (<tt>from</tt>) must lie between zero
2739 * and <tt>original.length</tt>, inclusive. The value at
2740 * <tt>original[from]</tt> is placed into the initial element of the copy
2741 * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
2742 * Values from subsequent elements in the original array are placed into
2743 * subsequent elements in the copy. The final index of the range
2744 * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
2745 * may be greater than <tt>original.length</tt>, in which case
2746 * <tt>0d</tt> is placed in all elements of the copy whose index is
2747 * greater than or equal to <tt>original.length - from</tt>. The length
2748 * of the returned array will be <tt>to - from</tt>.
2749 *
2750 * @param original the array from which a range is to be copied
2751 * @param from the initial index of the range to be copied, inclusive
2752 * @param to the final index of the range to be copied, exclusive.
2753 * (This index may lie outside the array.)
2754 * @return a new array containing the specified range from the original array,
2755 * truncated or padded with zeros to obtain the required length
2756 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
2757 * or {@code from > original.length}
2758 * @throws IllegalArgumentException if <tt>from &gt; to</tt>
2759 * @throws NullPointerException if <tt>original</tt> is null
2760 * @since 1.6
2761 */
2762 public static double[] copyOfRange(double[] original, int from, int to) {
2763 int newLength = to - from;
2764 if (newLength < 0)
2765 throw new IllegalArgumentException(from + " > " + to);
2766 double[] copy = new double[newLength];
2767 System.arraycopy(original, from, copy, 0,
2768 Math.min(original.length - from, newLength));
2769 return copy;
2770 }
2771
2772 /**
2773 * Copies the specified range of the specified array into a new array.
2774 * The initial index of the range (<tt>from</tt>) must lie between zero
2775 * and <tt>original.length</tt>, inclusive. The value at
2776 * <tt>original[from]</tt> is placed into the initial element of the copy
2777 * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
2778 * Values from subsequent elements in the original array are placed into
2779 * subsequent elements in the copy. The final index of the range
2780 * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
2781 * may be greater than <tt>original.length</tt>, in which case
2782 * <tt>false</tt> is placed in all elements of the copy whose index is
2783 * greater than or equal to <tt>original.length - from</tt>. The length
2784 * of the returned array will be <tt>to - from</tt>.
2785 *
2786 * @param original the array from which a range is to be copied
2787 * @param from the initial index of the range to be copied, inclusive
2788 * @param to the final index of the range to be copied, exclusive.
2789 * (This index may lie outside the array.)
2790 * @return a new array containing the specified range from the original array,
2791 * truncated or padded with false elements to obtain the required length
2792 * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
2793 * or {@code from > original.length}
2794 * @throws IllegalArgumentException if <tt>from &gt; to</tt>
2795 * @throws NullPointerException if <tt>original</tt> is null
2796 * @since 1.6
2797 */
2798 public static boolean[] copyOfRange(boolean[] original, int from, int to) {
2799 int newLength = to - from;
2800 if (newLength < 0)
2801 throw new IllegalArgumentException(from + " > " + to);
2802 boolean[] copy = new boolean[newLength];
2803 System.arraycopy(original, from, copy, 0,
2804 Math.min(original.length - from, newLength));
2805 return copy;
2806 }
2807
2808 // Misc
2809
2810 /**
2811 * Returns a fixed-size list backed by the specified array. (Changes to
2812 * the returned list "write through" to the array.) This method acts
2813 * as bridge between array-based and collection-based APIs, in
2814 * combination with {@link Collection#toArray}. The returned list is
2815 * serializable and implements {@link RandomAccess}.
2816 *
2817 * <p>This method also provides a convenient way to create a fixed-size
2818 * list initialized to contain several elements:
2819 * <pre>
2820 * List&lt;String&gt; stooges = Arrays.asList("Larry", "Moe", "Curly");
2821 * </pre>
2822 *
2823 * @param a the array by which the list will be backed
2824 * @return a list view of the specified array
2825 */
2826 @SafeVarargs
2827 public static <T> List<T> asList(T... a) {
2828 return new ArrayList<>(a);
2829 }
2830
2831 /**
2832 * @serial include
2833 */
2834 private static class ArrayList<E> extends AbstractList<E>
2835 implements RandomAccess, java.io.Serializable
2836 {
2837 private static final long serialVersionUID = -2764017481108945198L;
2838 private final E[] a;
2839
2840 ArrayList(E[] array) {
2841 if (array==null)
2842 throw new NullPointerException();
2843 a = array;
2844 }
2845
2846 public int size() {
2847 return a.length;
2848 }
2849
2850 public Object[] toArray() {
2851 return a.clone();
2852 }
2853
2854 public <T> T[] toArray(T[] a) {
2855 int size = size();
2856 if (a.length < size)
2857 return Arrays.copyOf(this.a, size,
2858 (Class<? extends T[]>) a.getClass());
2859 System.arraycopy(this.a, 0, a, 0, size);
2860 if (a.length > size)
2861 a[size] = null;
2862 return a;
2863 }
2864
2865 public E get(int index) {
2866 return a[index];
2867 }
2868
2869 public E set(int index, E element) {
2870 E oldValue = a[index];
2871 a[index] = element;
2872 return oldValue;
2873 }
2874
2875 public int indexOf(Object o) {
2876 if (o==null) {
2877 for (int i=0; i<a.length; i++)
2878 if (a[i]==null)
2879 return i;
2880 } else {
2881 for (int i=0; i<a.length; i++)
2882 if (o.equals(a[i]))
2883 return i;
2884 }
2885 return -1;
2886 }
2887
2888 public boolean contains(Object o) {
2889 return indexOf(o) != -1;
2890 }
2891 }
2892
2893 /**
2894 * Returns a hash code based on the contents of the specified array.
2895 * For any two <tt>long</tt> arrays <tt>a</tt> and <tt>b</tt>
2896 * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
2897 * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
2898 *
2899 * <p>The value returned by this method is the same value that would be
2900 * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
2901 * method on a {@link List} containing a sequence of {@link Long}
2902 * instances representing the elements of <tt>a</tt> in the same order.
2903 * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
2904 *
2905 * @param a the array whose hash value to compute
2906 * @return a content-based hash code for <tt>a</tt>
2907 * @since 1.5
2908 */
2909 public static int hashCode(long a[]) {
2910 if (a == null)
2911 return 0;
2912
2913 int result = 1;
2914 for (long element : a) {
2915 int elementHash = (int)(element ^ (element >>> 32));
2916 result = 31 * result + elementHash;
2917 }
2918
2919 return result;
2920 }
2921
2922 /**
2923 * Returns a hash code based on the contents of the specified array.
2924 * For any two non-null <tt>int</tt> arrays <tt>a</tt> and <tt>b</tt>
2925 * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
2926 * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
2927 *
2928 * <p>The value returned by this method is the same value that would be
2929 * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
2930 * method on a {@link List} containing a sequence of {@link Integer}
2931 * instances representing the elements of <tt>a</tt> in the same order.
2932 * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
2933 *
2934 * @param a the array whose hash value to compute
2935 * @return a content-based hash code for <tt>a</tt>
2936 * @since 1.5
2937 */
2938 public static int hashCode(int a[]) {
2939 if (a == null)
2940 return 0;
2941
2942 int result = 1;
2943 for (int element : a)
2944 result = 31 * result + element;
2945
2946 return result;
2947 }
2948
2949 /**
2950 * Returns a hash code based on the contents of the specified array.
2951 * For any two <tt>short</tt> arrays <tt>a</tt> and <tt>b</tt>
2952 * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
2953 * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
2954 *
2955 * <p>The value returned by this method is the same value that would be
2956 * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
2957 * method on a {@link List} containing a sequence of {@link Short}
2958 * instances representing the elements of <tt>a</tt> in the same order.
2959 * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
2960 *
2961 * @param a the array whose hash value to compute
2962 * @return a content-based hash code for <tt>a</tt>
2963 * @since 1.5
2964 */
2965 public static int hashCode(short a[]) {
2966 if (a == null)
2967 return 0;
2968
2969 int result = 1;
2970 for (short element : a)
2971 result = 31 * result + element;
2972
2973 return result;
2974 }
2975
2976 /**
2977 * Returns a hash code based on the contents of the specified array.
2978 * For any two <tt>char</tt> arrays <tt>a</tt> and <tt>b</tt>
2979 * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
2980 * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
2981 *
2982 * <p>The value returned by this method is the same value that would be
2983 * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
2984 * method on a {@link List} containing a sequence of {@link Character}
2985 * instances representing the elements of <tt>a</tt> in the same order.
2986 * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
2987 *
2988 * @param a the array whose hash value to compute
2989 * @return a content-based hash code for <tt>a</tt>
2990 * @since 1.5
2991 */
2992 public static int hashCode(char a[]) {
2993 if (a == null)
2994 return 0;
2995
2996 int result = 1;
2997 for (char element : a)
2998 result = 31 * result + element;
2999
3000 return result;
3001 }
3002
3003 /**
3004 * Returns a hash code based on the contents of the specified array.
3005 * For any two <tt>byte</tt> arrays <tt>a</tt> and <tt>b</tt>
3006 * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
3007 * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
3008 *
3009 * <p>The value returned by this method is the same value that would be
3010 * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
3011 * method on a {@link List} containing a sequence of {@link Byte}
3012 * instances representing the elements of <tt>a</tt> in the same order.
3013 * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
3014 *
3015 * @param a the array whose hash value to compute
3016 * @return a content-based hash code for <tt>a</tt>
3017 * @since 1.5
3018 */
3019 public static int hashCode(byte a[]) {
3020 if (a == null)
3021 return 0;
3022
3023 int result = 1;
3024 for (byte element : a)
3025 result = 31 * result + element;
3026
3027 return result;
3028 }
3029
3030 /**
3031 * Returns a hash code based on the contents of the specified array.
3032 * For any two <tt>boolean</tt> arrays <tt>a</tt> and <tt>b</tt>
3033 * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
3034 * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
3035 *
3036 * <p>The value returned by this method is the same value that would be
3037 * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
3038 * method on a {@link List} containing a sequence of {@link Boolean}
3039 * instances representing the elements of <tt>a</tt> in the same order.
3040 * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
3041 *
3042 * @param a the array whose hash value to compute
3043 * @return a content-based hash code for <tt>a</tt>
3044 * @since 1.5
3045 */
3046 public static int hashCode(boolean a[]) {
3047 if (a == null)
3048 return 0;
3049
3050 int result = 1;
3051 for (boolean element : a)
3052 result = 31 * result + (element ? 1231 : 1237);
3053
3054 return result;
3055 }
3056
3057 /**
3058 * Returns a hash code based on the contents of the specified array.
3059 * For any two <tt>float</tt> arrays <tt>a</tt> and <tt>b</tt>
3060 * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
3061 * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
3062 *
3063 * <p>The value returned by this method is the same value that would be
3064 * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
3065 * method on a {@link List} containing a sequence of {@link Float}
3066 * instances representing the elements of <tt>a</tt> in the same order.
3067 * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
3068 *
3069 * @param a the array whose hash value to compute
3070 * @return a content-based hash code for <tt>a</tt>
3071 * @since 1.5
3072 */
3073 public static int hashCode(float a[]) {
3074 if (a == null)
3075 return 0;
3076
3077 int result = 1;
3078 for (float element : a)
3079 result = 31 * result + Float.floatToIntBits(element);
3080
3081 return result;
3082 }
3083
3084 /**
3085 * Returns a hash code based on the contents of the specified array.
3086 * For any two <tt>double</tt> arrays <tt>a</tt> and <tt>b</tt>
3087 * such that <tt>Arrays.equals(a, b)</tt>, it is also the case that
3088 * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
3089 *
3090 * <p>The value returned by this method is the same value that would be
3091 * obtained by invoking the {@link List#hashCode() <tt>hashCode</tt>}
3092 * method on a {@link List} containing a sequence of {@link Double}
3093 * instances representing the elements of <tt>a</tt> in the same order.
3094 * If <tt>a</tt> is <tt>null</tt>, this method returns 0.
3095 *
3096 * @param a the array whose hash value to compute
3097 * @return a content-based hash code for <tt>a</tt>
3098 * @since 1.5
3099 */
3100 public static int hashCode(double a[]) {
3101 if (a == null)
3102 return 0;
3103
3104 int result = 1;
3105 for (double element : a) {
3106 long bits = Double.doubleToLongBits(element);
3107 result = 31 * result + (int)(bits ^ (bits >>> 32));
3108 }
3109 return result;
3110 }
3111
3112 /**
3113 * Returns a hash code based on the contents of the specified array. If
3114 * the array contains other arrays as elements, the hash code is based on
3115 * their identities rather than their contents. It is therefore
3116 * acceptable to invoke this method on an array that contains itself as an
3117 * element, either directly or indirectly through one or more levels of
3118 * arrays.
3119 *
3120 * <p>For any two arrays <tt>a</tt> and <tt>b</tt> such that
3121 * <tt>Arrays.equals(a, b)</tt>, it is also the case that
3122 * <tt>Arrays.hashCode(a) == Arrays.hashCode(b)</tt>.
3123 *
3124 * <p>The value returned by this method is equal to the value that would
3125 * be returned by <tt>Arrays.asList(a).hashCode()</tt>, unless <tt>a</tt>
3126 * is <tt>null</tt>, in which case <tt>0</tt> is returned.
3127 *
3128 * @param a the array whose content-based hash code to compute
3129 * @return a content-based hash code for <tt>a</tt>
3130 * @see #deepHashCode(Object[])
3131 * @since 1.5
3132 */
3133 public static int hashCode(Object a[]) {
3134 if (a == null)
3135 return 0;
3136
3137 int result = 1;
3138
3139 for (Object element : a)
3140 result = 31 * result + (element == null ? 0 : element.hashCode());
3141
3142 return result;
3143 }
3144
3145 /**
3146 * Returns a hash code based on the "deep contents" of the specified
3147 * array. If the array contains other arrays as elements, the
3148 * hash code is based on their contents and so on, ad infinitum.
3149 * It is therefore unacceptable to invoke this method on an array that
3150 * contains itself as an element, either directly or indirectly through
3151 * one or more levels of arrays. The behavior of such an invocation is
3152 * undefined.
3153 *
3154 * <p>For any two arrays <tt>a</tt> and <tt>b</tt> such that
3155 * <tt>Arrays.deepEquals(a, b)</tt>, it is also the case that
3156 * <tt>Arrays.deepHashCode(a) == Arrays.deepHashCode(b)</tt>.
3157 *
3158 * <p>The computation of the value returned by this method is similar to
3159 * that of the value returned by {@link List#hashCode()} on a list
3160 * containing the same elements as <tt>a</tt> in the same order, with one
3161 * difference: If an element <tt>e</tt> of <tt>a</tt> is itself an array,
3162 * its hash code is computed not by calling <tt>e.hashCode()</tt>, but as
3163 * by calling the appropriate overloading of <tt>Arrays.hashCode(e)</tt>
3164 * if <tt>e</tt> is an array of a primitive type, or as by calling
3165 * <tt>Arrays.deepHashCode(e)</tt> recursively if <tt>e</tt> is an array
3166 * of a reference type. If <tt>a</tt> is <tt>null</tt>, this method
3167 * returns 0.
3168 *
3169 * @param a the array whose deep-content-based hash code to compute
3170 * @return a deep-content-based hash code for <tt>a</tt>
3171 * @see #hashCode(Object[])
3172 * @since 1.5
3173 */
3174 public static int deepHashCode(Object a[]) {
3175 if (a == null)
3176 return 0;
3177
3178 int result = 1;
3179
3180 for (Object element : a) {
3181 int elementHash = 0;
3182 if (element instanceof Object[])
3183 elementHash = deepHashCode((Object[]) element);
3184 else if (element instanceof byte[])
3185 elementHash = hashCode((byte[]) element);
3186 else if (element instanceof short[])
3187 elementHash = hashCode((short[]) element);
3188 else if (element instanceof int[])
3189 elementHash = hashCode((int[]) element);
3190 else if (element instanceof long[])
3191 elementHash = hashCode((long[]) element);
3192 else if (element instanceof char[])
3193 elementHash = hashCode((char[]) element);
3194 else if (element instanceof float[])
3195 elementHash = hashCode((float[]) element);
3196 else if (element instanceof double[])
3197 elementHash = hashCode((double[]) element);
3198 else if (element instanceof boolean[])
3199 elementHash = hashCode((boolean[]) element);
3200 else if (element != null)
3201 elementHash = element.hashCode();
3202
3203 result = 31 * result + elementHash;
3204 }
3205
3206 return result;
3207 }
3208
3209 /**
3210 * Returns <tt>true</tt> if the two specified arrays are <i>deeply
3211 * equal</i> to one another. Unlike the {@link #equals(Object[],Object[])}
3212 * method, this method is appropriate for use with nested arrays of
3213 * arbitrary depth.
3214 *
3215 * <p>Two array references are considered deeply equal if both
3216 * are <tt>null</tt>, or if they refer to arrays that contain the same
3217 * number of elements and all corresponding pairs of elements in the two
3218 * arrays are deeply equal.
3219 *
3220 * <p>Two possibly <tt>null</tt> elements <tt>e1</tt> and <tt>e2</tt> are
3221 * deeply equal if any of the following conditions hold:
3222 * <ul>
3223 * <li> <tt>e1</tt> and <tt>e2</tt> are both arrays of object reference
3224 * types, and <tt>Arrays.deepEquals(e1, e2) would return true</tt>
3225 * <li> <tt>e1</tt> and <tt>e2</tt> are arrays of the same primitive
3226 * type, and the appropriate overloading of
3227 * <tt>Arrays.equals(e1, e2)</tt> would return true.
3228 * <li> <tt>e1 == e2</tt>
3229 * <li> <tt>e1.equals(e2)</tt> would return true.
3230 * </ul>
3231 * Note that this definition permits <tt>null</tt> elements at any depth.
3232 *
3233 * <p>If either of the specified arrays contain themselves as elements
3234 * either directly or indirectly through one or more levels of arrays,
3235 * the behavior of this method is undefined.
3236 *
3237 * @param a1 one array to be tested for equality
3238 * @param a2 the other array to be tested for equality
3239 * @return <tt>true</tt> if the two arrays are equal
3240 * @see #equals(Object[],Object[])
3241 * @see Objects#deepEquals(Object, Object)
3242 * @since 1.5
3243 */
3244 public static boolean deepEquals(Object[] a1, Object[] a2) {
3245 if (a1 == a2)
3246 return true;
3247 if (a1 == null || a2==null)
3248 return false;
3249 int length = a1.length;
3250 if (a2.length != length)
3251 return false;
3252
3253 for (int i = 0; i < length; i++) {
3254 Object e1 = a1[i];
3255 Object e2 = a2[i];
3256
3257 if (e1 == e2)
3258 continue;
3259 if (e1 == null)
3260 return false;
3261
3262 // Figure out whether the two elements are equal
3263 boolean eq = deepEquals0(e1, e2);
3264
3265 if (!eq)
3266 return false;
3267 }
3268 return true;
3269 }
3270
3271 static boolean deepEquals0(Object e1, Object e2) {
3272 assert e1 != null;
3273 boolean eq;
3274 if (e1 instanceof Object[] && e2 instanceof Object[])
3275 eq = deepEquals ((Object[]) e1, (Object[]) e2);
3276 else if (e1 instanceof byte[] && e2 instanceof byte[])
3277 eq = equals((byte[]) e1, (byte[]) e2);
3278 else if (e1 instanceof short[] && e2 instanceof short[])
3279 eq = equals((short[]) e1, (short[]) e2);
3280 else if (e1 instanceof int[] && e2 instanceof int[])
3281 eq = equals((int[]) e1, (int[]) e2);
3282 else if (e1 instanceof long[] && e2 instanceof long[])
3283 eq = equals((long[]) e1, (long[]) e2);
3284 else if (e1 instanceof char[] && e2 instanceof char[])
3285 eq = equals((char[]) e1, (char[]) e2);
3286 else if (e1 instanceof float[] && e2 instanceof float[])
3287 eq = equals((float[]) e1, (float[]) e2);
3288 else if (e1 instanceof double[] && e2 instanceof double[])
3289 eq = equals((double[]) e1, (double[]) e2);
3290 else if (e1 instanceof boolean[] && e2 instanceof boolean[])
3291 eq = equals((boolean[]) e1, (boolean[]) e2);
3292 else
3293 eq = e1.equals(e2);
3294 return eq;
3295 }
3296
3297 /**
3298 * Returns a string representation of the contents of the specified array.
3299 * The string representation consists of a list of the array's elements,
3300 * enclosed in square brackets (<tt>"[]"</tt>). Adjacent elements are
3301 * separated by the characters <tt>", "</tt> (a comma followed by a
3302 * space). Elements are converted to strings as by
3303 * <tt>String.valueOf(long)</tt>. Returns <tt>"null"</tt> if <tt>a</tt>
3304 * is <tt>null</tt>.
3305 *
3306 * @param a the array whose string representation to return
3307 * @return a string representation of <tt>a</tt>
3308 * @since 1.5
3309 */
3310 public static String toString(long[] a) {
3311 if (a == null)
3312 return "null";
3313 int iMax = a.length - 1;
3314 if (iMax == -1)
3315 return "[]";
3316
3317 StringBuilder b = new StringBuilder();
3318 b.append('[');
3319 for (int i = 0; ; i++) {
3320 b.append(a[i]);
3321 if (i == iMax)
3322 return b.append(']').toString();
3323 b.append(", ");
3324 }
3325 }
3326
3327 /**
3328 * Returns a string representation of the contents of the specified array.
3329 * The string representation consists of a list of the array's elements,
3330 * enclosed in square brackets (<tt>"[]"</tt>). Adjacent elements are
3331 * separated by the characters <tt>", "</tt> (a comma followed by a
3332 * space). Elements are converted to strings as by
3333 * <tt>String.valueOf(int)</tt>. Returns <tt>"null"</tt> if <tt>a</tt> is
3334 * <tt>null</tt>.
3335 *
3336 * @param a the array whose string representation to return
3337 * @return a string representation of <tt>a</tt>
3338 * @since 1.5
3339 */
3340 public static String toString(int[] a) {
3341 if (a == null)
3342 return "null";
3343 int iMax = a.length - 1;
3344 if (iMax == -1)
3345 return "[]";
3346
3347 StringBuilder b = new StringBuilder();
3348 b.append('[');
3349 for (int i = 0; ; i++) {
3350 b.append(a[i]);
3351 if (i == iMax)
3352 return b.append(']').toString();
3353 b.append(", ");
3354 }
3355 }
3356
3357 /**
3358 * Returns a string representation of the contents of the specified array.
3359 * The string representation consists of a list of the array's elements,
3360 * enclosed in square brackets (<tt>"[]"</tt>). Adjacent elements are
3361 * separated by the characters <tt>", "</tt> (a comma followed by a
3362 * space). Elements are converted to strings as by
3363 * <tt>String.valueOf(short)</tt>. Returns <tt>"null"</tt> if <tt>a</tt>
3364 * is <tt>null</tt>.
3365 *
3366 * @param a the array whose string representation to return
3367 * @return a string representation of <tt>a</tt>
3368 * @since 1.5
3369 */
3370 public static String toString(short[] a) {
3371 if (a == null)
3372 return "null";
3373 int iMax = a.length - 1;
3374 if (iMax == -1)
3375 return "[]";
3376
3377 StringBuilder b = new StringBuilder();
3378 b.append('[');
3379 for (int i = 0; ; i++) {
3380 b.append(a[i]);
3381 if (i == iMax)
3382 return b.append(']').toString();
3383 b.append(", ");
3384 }
3385 }
3386
3387 /**
3388 * Returns a string representation of the contents of the specified array.
3389 * The string representation consists of a list of the array's elements,
3390 * enclosed in square brackets (<tt>"[]"</tt>). Adjacent elements are
3391 * separated by the characters <tt>", "</tt> (a comma followed by a
3392 * space). Elements are converted to strings as by
3393 * <tt>String.valueOf(char)</tt>. Returns <tt>"null"</tt> if <tt>a</tt>
3394 * is <tt>null</tt>.
3395 *
3396 * @param a the array whose string representation to return
3397 * @return a string representation of <tt>a</tt>
3398 * @since 1.5
3399 */
3400 public static String toString(char[] a) {
3401 if (a == null)
3402 return "null";
3403 int iMax = a.length - 1;
3404 if (iMax == -1)
3405 return "[]";
3406
3407 StringBuilder b = new StringBuilder();
3408 b.append('[');
3409 for (int i = 0; ; i++) {
3410 b.append(a[i]);
3411 if (i == iMax)
3412 return b.append(']').toString();
3413 b.append(", ");
3414 }
3415 }
3416
3417 /**
3418 * Returns a string representation of the contents of the specified array.
3419 * The string representation consists of a list of the array's elements,
3420 * enclosed in square brackets (<tt>"[]"</tt>). Adjacent elements
3421 * are separated by the characters <tt>", "</tt> (a comma followed
3422 * by a space). Elements are converted to strings as by
3423 * <tt>String.valueOf(byte)</tt>. Returns <tt>"null"</tt> if
3424 * <tt>a</tt> is <tt>null</tt>.
3425 *
3426 * @param a the array whose string representation to return
3427 * @return a string representation of <tt>a</tt>
3428 * @since 1.5
3429 */
3430 public static String toString(byte[] a) {
3431 if (a == null)
3432 return "null";
3433 int iMax = a.length - 1;
3434 if (iMax == -1)
3435 return "[]";
3436
3437 StringBuilder b = new StringBuilder();
3438 b.append('[');
3439 for (int i = 0; ; i++) {
3440 b.append(a[i]);
3441 if (i == iMax)
3442 return b.append(']').toString();
3443 b.append(", ");
3444 }
3445 }
3446
3447 /**
3448 * Returns a string representation of the contents of the specified array.
3449 * The string representation consists of a list of the array's elements,
3450 * enclosed in square brackets (<tt>"[]"</tt>). Adjacent elements are
3451 * separated by the characters <tt>", "</tt> (a comma followed by a
3452 * space). Elements are converted to strings as by
3453 * <tt>String.valueOf(boolean)</tt>. Returns <tt>"null"</tt> if
3454 * <tt>a</tt> is <tt>null</tt>.
3455 *
3456 * @param a the array whose string representation to return
3457 * @return a string representation of <tt>a</tt>
3458 * @since 1.5
3459 */
3460 public static String toString(boolean[] a) {
3461 if (a == null)
3462 return "null";
3463 int iMax = a.length - 1;
3464 if (iMax == -1)
3465 return "[]";
3466
3467 StringBuilder b = new StringBuilder();
3468 b.append('[');
3469 for (int i = 0; ; i++) {
3470 b.append(a[i]);
3471 if (i == iMax)
3472 return b.append(']').toString();
3473 b.append(", ");
3474 }
3475 }
3476
3477 /**
3478 * Returns a string representation of the contents of the specified array.
3479 * The string representation consists of a list of the array's elements,
3480 * enclosed in square brackets (<tt>"[]"</tt>). Adjacent elements are
3481 * separated by the characters <tt>", "</tt> (a comma followed by a
3482 * space). Elements are converted to strings as by
3483 * <tt>String.valueOf(float)</tt>. Returns <tt>"null"</tt> if <tt>a</tt>
3484 * is <tt>null</tt>.
3485 *
3486 * @param a the array whose string representation to return
3487 * @return a string representation of <tt>a</tt>
3488 * @since 1.5
3489 */
3490 public static String toString(float[] a) {
3491 if (a == null)
3492 return "null";
3493
3494 int iMax = a.length - 1;
3495 if (iMax == -1)
3496 return "[]";
3497
3498 StringBuilder b = new StringBuilder();
3499 b.append('[');
3500 for (int i = 0; ; i++) {
3501 b.append(a[i]);
3502 if (i == iMax)
3503 return b.append(']').toString();
3504 b.append(", ");
3505 }
3506 }
3507
3508 /**
3509 * Returns a string representation of the contents of the specified array.
3510 * The string representation consists of a list of the array's elements,
3511 * enclosed in square brackets (<tt>"[]"</tt>). Adjacent elements are
3512 * separated by the characters <tt>", "</tt> (a comma followed by a
3513 * space). Elements are converted to strings as by
3514 * <tt>String.valueOf(double)</tt>. Returns <tt>"null"</tt> if <tt>a</tt>
3515 * is <tt>null</tt>.
3516 *
3517 * @param a the array whose string representation to return
3518 * @return a string representation of <tt>a</tt>
3519 * @since 1.5
3520 */
3521 public static String toString(double[] a) {
3522 if (a == null)
3523 return "null";
3524 int iMax = a.length - 1;
3525 if (iMax == -1)
3526 return "[]";
3527
3528 StringBuilder b = new StringBuilder();
3529 b.append('[');
3530 for (int i = 0; ; i++) {
3531 b.append(a[i]);
3532 if (i == iMax)
3533 return b.append(']').toString();
3534 b.append(", ");
3535 }
3536 }
3537
3538 /**
3539 * Returns a string representation of the contents of the specified array.
3540 * If the array contains other arrays as elements, they are converted to
3541 * strings by the {@link Object#toString} method inherited from
3542 * <tt>Object</tt>, which describes their <i>identities</i> rather than
3543 * their contents.
3544 *
3545 * <p>The value returned by this method is equal to the value that would
3546 * be returned by <tt>Arrays.asList(a).toString()</tt>, unless <tt>a</tt>
3547 * is <tt>null</tt>, in which case <tt>"null"</tt> is returned.
3548 *
3549 * @param a the array whose string representation to return
3550 * @return a string representation of <tt>a</tt>
3551 * @see #deepToString(Object[])
3552 * @since 1.5
3553 */
3554 public static String toString(Object[] a) {
3555 if (a == null)
3556 return "null";
3557
3558 int iMax = a.length - 1;
3559 if (iMax == -1)
3560 return "[]";
3561
3562 StringBuilder b = new StringBuilder();
3563 b.append('[');
3564 for (int i = 0; ; i++) {
3565 b.append(String.valueOf(a[i]));
3566 if (i == iMax)
3567 return b.append(']').toString();
3568 b.append(", ");
3569 }
3570 }
3571
3572 /**
3573 * Returns a string representation of the "deep contents" of the specified
3574 * array. If the array contains other arrays as elements, the string
3575 * representation contains their contents and so on. This method is
3576 * designed for converting multidimensional arrays to strings.
3577 *
3578 * <p>The string representation consists of a list of the array's
3579 * elements, enclosed in square brackets (<tt>"[]"</tt>). Adjacent
3580 * elements are separated by the characters <tt>", "</tt> (a comma
3581 * followed by a space). Elements are converted to strings as by
3582 * <tt>String.valueOf(Object)</tt>, unless they are themselves
3583 * arrays.
3584 *
3585 * <p>If an element <tt>e</tt> is an array of a primitive type, it is
3586 * converted to a string as by invoking the appropriate overloading of
3587 * <tt>Arrays.toString(e)</tt>. If an element <tt>e</tt> is an array of a
3588 * reference type, it is converted to a string as by invoking
3589 * this method recursively.
3590 *
3591 * <p>To avoid infinite recursion, if the specified array contains itself
3592 * as an element, or contains an indirect reference to itself through one
3593 * or more levels of arrays, the self-reference is converted to the string
3594 * <tt>"[...]"</tt>. For example, an array containing only a reference
3595 * to itself would be rendered as <tt>"[[...]]"</tt>.
3596 *
3597 * <p>This method returns <tt>"null"</tt> if the specified array
3598 * is <tt>null</tt>.
3599 *
3600 * @param a the array whose string representation to return
3601 * @return a string representation of <tt>a</tt>
3602 * @see #toString(Object[])
3603 * @since 1.5
3604 */
3605 public static String deepToString(Object[] a) {
3606 if (a == null)
3607 return "null";
3608
3609 int bufLen = 20 * a.length;
3610 if (a.length != 0 && bufLen <= 0)
3611 bufLen = Integer.MAX_VALUE;
3612 StringBuilder buf = new StringBuilder(bufLen);
3613 deepToString(a, buf, new HashSet<Object[]>());
3614 return buf.toString();
3615 }
3616
3617 private static void deepToString(Object[] a, StringBuilder buf,
3618 Set<Object[]> dejaVu) {
3619 if (a == null) {
3620 buf.append("null");
3621 return;
3622 }
3623 int iMax = a.length - 1;
3624 if (iMax == -1) {
3625 buf.append("[]");
3626 return;
3627 }
3628
3629 dejaVu.add(a);
3630 buf.append('[');
3631 for (int i = 0; ; i++) {
3632
3633 Object element = a[i];
3634 if (element == null) {
3635 buf.append("null");
3636 } else {
3637 Class eClass = element.getClass();
3638
3639 if (eClass.isArray()) {
3640 if (eClass == byte[].class)
3641 buf.append(toString((byte[]) element));
3642 else if (eClass == short[].class)
3643 buf.append(toString((short[]) element));
3644 else if (eClass == int[].class)
3645 buf.append(toString((int[]) element));
3646 else if (eClass == long[].class)
3647 buf.append(toString((long[]) element));
3648 else if (eClass == char[].class)
3649 buf.append(toString((char[]) element));
3650 else if (eClass == float[].class)
3651 buf.append(toString((float[]) element));
3652 else if (eClass == double[].class)
3653 buf.append(toString((double[]) element));
3654 else if (eClass == boolean[].class)
3655 buf.append(toString((boolean[]) element));
3656 else { // element is an array of object references
3657 if (dejaVu.contains(element))
3658 buf.append("[...]");
3659 else
3660 deepToString((Object[])element, buf, dejaVu);
3661 }
3662 } else { // element is non-null and not an array
3663 buf.append(element.toString());
3664 }
3665 }
3666 if (i == iMax)
3667 break;
3668 buf.append(", ");
3669 }
3670 buf.append(']');
3671 dejaVu.remove(a);
3672 }
3673}
java/pkg/java/util/BitSet.class+0−0

Binary file not shown.

java/pkg/java/util/BitSet.java+1191−0
@@ -0,0 +1,1191 @@
1/*
2 * Copyright (c) 1995, 2007, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.util;
27
28import java.io.*;
29import java.nio.ByteBuffer;
30import java.nio.ByteOrder;
31import java.nio.LongBuffer;
32
33/**
34 * This class implements a vector of bits that grows as needed. Each
35 * component of the bit set has a {@code boolean} value. The
36 * bits of a {@code BitSet} are indexed by nonnegative integers.
37 * Individual indexed bits can be examined, set, or cleared. One
38 * {@code BitSet} may be used to modify the contents of another
39 * {@code BitSet} through logical AND, logical inclusive OR, and
40 * logical exclusive OR operations.
41 *
42 * <p>By default, all bits in the set initially have the value
43 * {@code false}.
44 *
45 * <p>Every bit set has a current size, which is the number of bits
46 * of space currently in use by the bit set. Note that the size is
47 * related to the implementation of a bit set, so it may change with
48 * implementation. The length of a bit set relates to logical length
49 * of a bit set and is defined independently of implementation.
50 *
51 * <p>Unless otherwise noted, passing a null parameter to any of the
52 * methods in a {@code BitSet} will result in a
53 * {@code NullPointerException}.
54 *
55 * <p>A {@code BitSet} is not safe for multithreaded use without
56 * external synchronization.
57 *
58 * @author Arthur van Hoff
59 * @author Michael McCloskey
60 * @author Martin Buchholz
61 * @since JDK1.0
62 */
63public class BitSet implements Cloneable, java.io.Serializable {
64 /*
65 * BitSets are packed into arrays of "words." Currently a word is
66 * a long, which consists of 64 bits, requiring 6 address bits.
67 * The choice of word size is determined purely by performance concerns.
68 */
69 private final static int ADDRESS_BITS_PER_WORD = 6;
70 private final static int BITS_PER_WORD = 1 << ADDRESS_BITS_PER_WORD;
71 private final static int BIT_INDEX_MASK = BITS_PER_WORD - 1;
72
73 /* Used to shift left or right for a partial word mask */
74 private static final long WORD_MASK = 0xffffffffffffffffL;
75
76 /**
77 * @serialField bits long[]
78 *
79 * The bits in this BitSet. The ith bit is stored in bits[i/64] at
80 * bit position i % 64 (where bit position 0 refers to the least
81 * significant bit and 63 refers to the most significant bit).
82 */
83 private static final ObjectStreamField[] serialPersistentFields = {
84 new ObjectStreamField("bits", long[].class),
85 };
86
87 /**
88 * The internal field corresponding to the serialField "bits".
89 */
90 private long[] words;
91
92 /**
93 * The number of words in the logical size of this BitSet.
94 */
95 private transient int wordsInUse = 0;
96
97 /**
98 * Whether the size of "words" is user-specified. If so, we assume
99 * the user knows what he's doing and try harder to preserve it.
100 */
101 private transient boolean sizeIsSticky = false;
102
103 /* use serialVersionUID from JDK 1.0.2 for interoperability */
104 private static final long serialVersionUID = 7997698588986878753L;
105
106 /**
107 * Given a bit index, return word index containing it.
108 */
109 private static int wordIndex(int bitIndex) {
110 return bitIndex >> ADDRESS_BITS_PER_WORD;
111 }
112
113 /**
114 * Every public method must preserve these invariants.
115 */
116 private void checkInvariants() {
117 assert(wordsInUse == 0 || words[wordsInUse - 1] != 0);
118 assert(wordsInUse >= 0 && wordsInUse <= words.length);
119 assert(wordsInUse == words.length || words[wordsInUse] == 0);
120 }
121
122 /**
123 * Sets the field wordsInUse to the logical size in words of the bit set.
124 * WARNING:This method assumes that the number of words actually in use is
125 * less than or equal to the current value of wordsInUse!
126 */
127 private void recalculateWordsInUse() {
128 // Traverse the bitset until a used word is found
129 int i;
130 for (i = wordsInUse-1; i >= 0; i--)
131 if (words[i] != 0)
132 break;
133
134 wordsInUse = i+1; // The new logical size
135 }
136
137 /**
138 * Creates a new bit set. All bits are initially {@code false}.
139 */
140 public BitSet() {
141 initWords(BITS_PER_WORD);
142 sizeIsSticky = false;
143 }
144
145 /**
146 * Creates a bit set whose initial size is large enough to explicitly
147 * represent bits with indices in the range {@code 0} through
148 * {@code nbits-1}. All bits are initially {@code false}.
149 *
150 * @param nbits the initial size of the bit set
151 * @throws NegativeArraySizeException if the specified initial size
152 * is negative
153 */
154 public BitSet(int nbits) {
155 // nbits can't be negative; size 0 is OK
156 if (nbits < 0)
157 throw new NegativeArraySizeException("nbits < 0: " + nbits);
158
159 initWords(nbits);
160 sizeIsSticky = true;
161 }
162
163 private void initWords(int nbits) {
164 words = new long[wordIndex(nbits-1) + 1];
165 }
166
167 /**
168 * Creates a bit set using words as the internal representation.
169 * The last word (if there is one) must be non-zero.
170 */
171 private BitSet(long[] words) {
172 this.words = words;
173 this.wordsInUse = words.length;
174 checkInvariants();
175 }
176
177 /**
178 * Returns a new bit set containing all the bits in the given long array.
179 *
180 * <p>More precisely,
181 * <br>{@code BitSet.valueOf(longs).get(n) == ((longs[n/64] & (1L<<(n%64))) != 0)}
182 * <br>for all {@code n < 64 * longs.length}.
183 *
184 * <p>This method is equivalent to
185 * {@code BitSet.valueOf(LongBuffer.wrap(longs))}.
186 *
187 * @param longs a long array containing a little-endian representation
188 * of a sequence of bits to be used as the initial bits of the
189 * new bit set
190 * @since 1.7
191 */
192 public static BitSet valueOf(long[] longs) {
193 int n;
194 for (n = longs.length; n > 0 && longs[n - 1] == 0; n--)
195 ;
196 return new BitSet(Arrays.copyOf(longs, n));
197 }
198
199 /**
200 * Returns a new bit set containing all the bits in the given long
201 * buffer between its position and limit.
202 *
203 * <p>More precisely,
204 * <br>{@code BitSet.valueOf(lb).get(n) == ((lb.get(lb.position()+n/64) & (1L<<(n%64))) != 0)}
205 * <br>for all {@code n < 64 * lb.remaining()}.
206 *
207 * <p>The long buffer is not modified by this method, and no
208 * reference to the buffer is retained by the bit set.
209 *
210 * @param lb a long buffer containing a little-endian representation
211 * of a sequence of bits between its position and limit, to be
212 * used as the initial bits of the new bit set
213 * @since 1.7
214 */
215 public static BitSet valueOf(LongBuffer lb) {
216 lb = lb.slice();
217 int n;
218 for (n = lb.remaining(); n > 0 && lb.get(n - 1) == 0; n--)
219 ;
220 long[] words = new long[n];
221 lb.get(words);
222 return new BitSet(words);
223 }
224
225 /**
226 * Returns a new bit set containing all the bits in the given byte array.
227 *
228 * <p>More precisely,
229 * <br>{@code BitSet.valueOf(bytes).get(n) == ((bytes[n/8] & (1<<(n%8))) != 0)}
230 * <br>for all {@code n < 8 * bytes.length}.
231 *
232 * <p>This method is equivalent to
233 * {@code BitSet.valueOf(ByteBuffer.wrap(bytes))}.
234 *
235 * @param bytes a byte array containing a little-endian
236 * representation of a sequence of bits to be used as the
237 * initial bits of the new bit set
238 * @since 1.7
239 */
240 public static BitSet valueOf(byte[] bytes) {
241 return BitSet.valueOf(ByteBuffer.wrap(bytes));
242 }
243
244 /**
245 * Returns a new bit set containing all the bits in the given byte
246 * buffer between its position and limit.
247 *
248 * <p>More precisely,
249 * <br>{@code BitSet.valueOf(bb).get(n) == ((bb.get(bb.position()+n/8) & (1<<(n%8))) != 0)}
250 * <br>for all {@code n < 8 * bb.remaining()}.
251 *
252 * <p>The byte buffer is not modified by this method, and no
253 * reference to the buffer is retained by the bit set.
254 *
255 * @param bb a byte buffer containing a little-endian representation
256 * of a sequence of bits between its position and limit, to be
257 * used as the initial bits of the new bit set
258 * @since 1.7
259 */
260 public static BitSet valueOf(ByteBuffer bb) {
261 bb = bb.slice().order(ByteOrder.LITTLE_ENDIAN);
262 int n;
263 for (n = bb.remaining(); n > 0 && bb.get(n - 1) == 0; n--)
264 ;
265 long[] words = new long[(n + 7) / 8];
266 bb.limit(n);
267 int i = 0;
268 while (bb.remaining() >= 8)
269 words[i++] = bb.getLong();
270 for (int remaining = bb.remaining(), j = 0; j < remaining; j++)
271 words[i] |= (bb.get() & 0xffL) << (8 * j);
272 return new BitSet(words);
273 }
274
275 /**
276 * Returns a new byte array containing all the bits in this bit set.
277 *
278 * <p>More precisely, if
279 * <br>{@code byte[] bytes = s.toByteArray();}
280 * <br>then {@code bytes.length == (s.length()+7)/8} and
281 * <br>{@code s.get(n) == ((bytes[n/8] & (1<<(n%8))) != 0)}
282 * <br>for all {@code n < 8 * bytes.length}.
283 *
284 * @return a byte array containing a little-endian representation
285 * of all the bits in this bit set
286 * @since 1.7
287 */
288 public byte[] toByteArray() {
289 int n = wordsInUse;
290 if (n == 0)
291 return new byte[0];
292 int len = 8 * (n-1);
293 for (long x = words[n - 1]; x != 0; x >>>= 8)
294 len++;
295 byte[] bytes = new byte[len];
296 ByteBuffer bb = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN);
297 for (int i = 0; i < n - 1; i++)
298 bb.putLong(words[i]);
299 for (long x = words[n - 1]; x != 0; x >>>= 8)
300 bb.put((byte) (x & 0xff));
301 return bytes;
302 }
303
304 /**
305 * Returns a new long array containing all the bits in this bit set.
306 *
307 * <p>More precisely, if
308 * <br>{@code long[] longs = s.toLongArray();}
309 * <br>then {@code longs.length == (s.length()+63)/64} and
310 * <br>{@code s.get(n) == ((longs[n/64] & (1L<<(n%64))) != 0)}
311 * <br>for all {@code n < 64 * longs.length}.
312 *
313 * @return a long array containing a little-endian representation
314 * of all the bits in this bit set
315 * @since 1.7
316 */
317 public long[] toLongArray() {
318 return Arrays.copyOf(words, wordsInUse);
319 }
320
321 /**
322 * Ensures that the BitSet can hold enough words.
323 * @param wordsRequired the minimum acceptable number of words.
324 */
325 private void ensureCapacity(int wordsRequired) {
326 if (words.length < wordsRequired) {
327 // Allocate larger of doubled size or required size
328 int request = Math.max(2 * words.length, wordsRequired);
329 words = Arrays.copyOf(words, request);
330 sizeIsSticky = false;
331 }
332 }
333
334 /**
335 * Ensures that the BitSet can accommodate a given wordIndex,
336 * temporarily violating the invariants. The caller must
337 * restore the invariants before returning to the user,
338 * possibly using recalculateWordsInUse().
339 * @param wordIndex the index to be accommodated.
340 */
341 private void expandTo(int wordIndex) {
342 int wordsRequired = wordIndex+1;
343 if (wordsInUse < wordsRequired) {
344 ensureCapacity(wordsRequired);
345 wordsInUse = wordsRequired;
346 }
347 }
348
349 /**
350 * Checks that fromIndex ... toIndex is a valid range of bit indices.
351 */
352 private static void checkRange(int fromIndex, int toIndex) {
353 if (fromIndex < 0)
354 throw new IndexOutOfBoundsException("fromIndex < 0: " + fromIndex);
355 if (toIndex < 0)
356 throw new IndexOutOfBoundsException("toIndex < 0: " + toIndex);
357 if (fromIndex > toIndex)
358 throw new IndexOutOfBoundsException("fromIndex: " + fromIndex +
359 " > toIndex: " + toIndex);
360 }
361
362 /**
363 * Sets the bit at the specified index to the complement of its
364 * current value.
365 *
366 * @param bitIndex the index of the bit to flip
367 * @throws IndexOutOfBoundsException if the specified index is negative
368 * @since 1.4
369 */
370 public void flip(int bitIndex) {
371 if (bitIndex < 0)
372 throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);
373
374 int wordIndex = wordIndex(bitIndex);
375 expandTo(wordIndex);
376
377 words[wordIndex] ^= (1L << bitIndex);
378
379 recalculateWordsInUse();
380 checkInvariants();
381 }
382
383 /**
384 * Sets each bit from the specified {@code fromIndex} (inclusive) to the
385 * specified {@code toIndex} (exclusive) to the complement of its current
386 * value.
387 *
388 * @param fromIndex index of the first bit to flip
389 * @param toIndex index after the last bit to flip
390 * @throws IndexOutOfBoundsException if {@code fromIndex} is negative,
391 * or {@code toIndex} is negative, or {@code fromIndex} is
392 * larger than {@code toIndex}
393 * @since 1.4
394 */
395 public void flip(int fromIndex, int toIndex) {
396 checkRange(fromIndex, toIndex);
397
398 if (fromIndex == toIndex)
399 return;
400
401 int startWordIndex = wordIndex(fromIndex);
402 int endWordIndex = wordIndex(toIndex - 1);
403 expandTo(endWordIndex);
404
405 long firstWordMask = WORD_MASK << fromIndex;
406 long lastWordMask = WORD_MASK >>> -toIndex;
407 if (startWordIndex == endWordIndex) {
408 // Case 1: One word
409 words[startWordIndex] ^= (firstWordMask & lastWordMask);
410 } else {
411 // Case 2: Multiple words
412 // Handle first word
413 words[startWordIndex] ^= firstWordMask;
414
415 // Handle intermediate words, if any
416 for (int i = startWordIndex+1; i < endWordIndex; i++)
417 words[i] ^= WORD_MASK;
418
419 // Handle last word
420 words[endWordIndex] ^= lastWordMask;
421 }
422
423 recalculateWordsInUse();
424 checkInvariants();
425 }
426
427 /**
428 * Sets the bit at the specified index to {@code true}.
429 *
430 * @param bitIndex a bit index
431 * @throws IndexOutOfBoundsException if the specified index is negative
432 * @since JDK1.0
433 */
434 public void set(int bitIndex) {
435 if (bitIndex < 0)
436 throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);
437
438 int wordIndex = wordIndex(bitIndex);
439 expandTo(wordIndex);
440
441 words[wordIndex] |= (1L << bitIndex); // Restores invariants
442
443 checkInvariants();
444 }
445
446 /**
447 * Sets the bit at the specified index to the specified value.
448 *
449 * @param bitIndex a bit index
450 * @param value a boolean value to set
451 * @throws IndexOutOfBoundsException if the specified index is negative
452 * @since 1.4
453 */
454 public void set(int bitIndex, boolean value) {
455 if (value)
456 set(bitIndex);
457 else
458 clear(bitIndex);
459 }
460
461 /**
462 * Sets the bits from the specified {@code fromIndex} (inclusive) to the
463 * specified {@code toIndex} (exclusive) to {@code true}.
464 *
465 * @param fromIndex index of the first bit to be set
466 * @param toIndex index after the last bit to be set
467 * @throws IndexOutOfBoundsException if {@code fromIndex} is negative,
468 * or {@code toIndex} is negative, or {@code fromIndex} is
469 * larger than {@code toIndex}
470 * @since 1.4
471 */
472 public void set(int fromIndex, int toIndex) {
473 checkRange(fromIndex, toIndex);
474
475 if (fromIndex == toIndex)
476 return;
477
478 // Increase capacity if necessary
479 int startWordIndex = wordIndex(fromIndex);
480 int endWordIndex = wordIndex(toIndex - 1);
481 expandTo(endWordIndex);
482
483 long firstWordMask = WORD_MASK << fromIndex;
484 long lastWordMask = WORD_MASK >>> -toIndex;
485 if (startWordIndex == endWordIndex) {
486 // Case 1: One word
487 words[startWordIndex] |= (firstWordMask & lastWordMask);
488 } else {
489 // Case 2: Multiple words
490 // Handle first word
491 words[startWordIndex] |= firstWordMask;
492
493 // Handle intermediate words, if any
494 for (int i = startWordIndex+1; i < endWordIndex; i++)
495 words[i] = WORD_MASK;
496
497 // Handle last word (restores invariants)
498 words[endWordIndex] |= lastWordMask;
499 }
500
501 checkInvariants();
502 }
503
504 /**
505 * Sets the bits from the specified {@code fromIndex} (inclusive) to the
506 * specified {@code toIndex} (exclusive) to the specified value.
507 *
508 * @param fromIndex index of the first bit to be set
509 * @param toIndex index after the last bit to be set
510 * @param value value to set the selected bits to
511 * @throws IndexOutOfBoundsException if {@code fromIndex} is negative,
512 * or {@code toIndex} is negative, or {@code fromIndex} is
513 * larger than {@code toIndex}
514 * @since 1.4
515 */
516 public void set(int fromIndex, int toIndex, boolean value) {
517 if (value)
518 set(fromIndex, toIndex);
519 else
520 clear(fromIndex, toIndex);
521 }
522
523 /**
524 * Sets the bit specified by the index to {@code false}.
525 *
526 * @param bitIndex the index of the bit to be cleared
527 * @throws IndexOutOfBoundsException if the specified index is negative
528 * @since JDK1.0
529 */
530 public void clear(int bitIndex) {
531 if (bitIndex < 0)
532 throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);
533
534 int wordIndex = wordIndex(bitIndex);
535 if (wordIndex >= wordsInUse)
536 return;
537
538 words[wordIndex] &= ~(1L << bitIndex);
539
540 recalculateWordsInUse();
541 checkInvariants();
542 }
543
544 /**
545 * Sets the bits from the specified {@code fromIndex} (inclusive) to the
546 * specified {@code toIndex} (exclusive) to {@code false}.
547 *
548 * @param fromIndex index of the first bit to be cleared
549 * @param toIndex index after the last bit to be cleared
550 * @throws IndexOutOfBoundsException if {@code fromIndex} is negative,
551 * or {@code toIndex} is negative, or {@code fromIndex} is
552 * larger than {@code toIndex}
553 * @since 1.4
554 */
555 public void clear(int fromIndex, int toIndex) {
556 checkRange(fromIndex, toIndex);
557
558 if (fromIndex == toIndex)
559 return;
560
561 int startWordIndex = wordIndex(fromIndex);
562 if (startWordIndex >= wordsInUse)
563 return;
564
565 int endWordIndex = wordIndex(toIndex - 1);
566 if (endWordIndex >= wordsInUse) {
567 toIndex = length();
568 endWordIndex = wordsInUse - 1;
569 }
570
571 long firstWordMask = WORD_MASK << fromIndex;
572 long lastWordMask = WORD_MASK >>> -toIndex;
573 if (startWordIndex == endWordIndex) {
574 // Case 1: One word
575 words[startWordIndex] &= ~(firstWordMask & lastWordMask);
576 } else {
577 // Case 2: Multiple words
578 // Handle first word
579 words[startWordIndex] &= ~firstWordMask;
580
581 // Handle intermediate words, if any
582 for (int i = startWordIndex+1; i < endWordIndex; i++)
583 words[i] = 0;
584
585 // Handle last word
586 words[endWordIndex] &= ~lastWordMask;
587 }
588
589 recalculateWordsInUse();
590 checkInvariants();
591 }
592
593 /**
594 * Sets all of the bits in this BitSet to {@code false}.
595 *
596 * @since 1.4
597 */
598 public void clear() {
599 while (wordsInUse > 0)
600 words[--wordsInUse] = 0;
601 }
602
603 /**
604 * Returns the value of the bit with the specified index. The value
605 * is {@code true} if the bit with the index {@code bitIndex}
606 * is currently set in this {@code BitSet}; otherwise, the result
607 * is {@code false}.
608 *
609 * @param bitIndex the bit index
610 * @return the value of the bit with the specified index
611 * @throws IndexOutOfBoundsException if the specified index is negative
612 */
613 public boolean get(int bitIndex) {
614 if (bitIndex < 0)
615 throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);
616
617 checkInvariants();
618
619 int wordIndex = wordIndex(bitIndex);
620 return (wordIndex < wordsInUse)
621 && ((words[wordIndex] & (1L << bitIndex)) != 0);
622 }
623
624 /**
625 * Returns a new {@code BitSet} composed of bits from this {@code BitSet}
626 * from {@code fromIndex} (inclusive) to {@code toIndex} (exclusive).
627 *
628 * @param fromIndex index of the first bit to include
629 * @param toIndex index after the last bit to include
630 * @return a new {@code BitSet} from a range of this {@code BitSet}
631 * @throws IndexOutOfBoundsException if {@code fromIndex} is negative,
632 * or {@code toIndex} is negative, or {@code fromIndex} is
633 * larger than {@code toIndex}
634 * @since 1.4
635 */
636 public BitSet get(int fromIndex, int toIndex) {
637 checkRange(fromIndex, toIndex);
638
639 checkInvariants();
640
641 int len = length();
642
643 // If no set bits in range return empty bitset
644 if (len <= fromIndex || fromIndex == toIndex)
645 return new BitSet(0);
646
647 // An optimization
648 if (toIndex > len)
649 toIndex = len;
650
651 BitSet result = new BitSet(toIndex - fromIndex);
652 int targetWords = wordIndex(toIndex - fromIndex - 1) + 1;
653 int sourceIndex = wordIndex(fromIndex);
654 boolean wordAligned = ((fromIndex & BIT_INDEX_MASK) == 0);
655
656 // Process all words but the last word
657 for (int i = 0; i < targetWords - 1; i++, sourceIndex++)
658 result.words[i] = wordAligned ? words[sourceIndex] :
659 (words[sourceIndex] >>> fromIndex) |
660 (words[sourceIndex+1] << -fromIndex);
661
662 // Process the last word
663 long lastWordMask = WORD_MASK >>> -toIndex;
664 result.words[targetWords - 1] =
665 ((toIndex-1) & BIT_INDEX_MASK) < (fromIndex & BIT_INDEX_MASK)
666 ? /* straddles source words */
667 ((words[sourceIndex] >>> fromIndex) |
668 (words[sourceIndex+1] & lastWordMask) << -fromIndex)
669 :
670 ((words[sourceIndex] & lastWordMask) >>> fromIndex);
671
672 // Set wordsInUse correctly
673 result.wordsInUse = targetWords;
674 result.recalculateWordsInUse();
675 result.checkInvariants();
676
677 return result;
678 }
679
680 /**
681 * Returns the index of the first bit that is set to {@code true}
682 * that occurs on or after the specified starting index. If no such
683 * bit exists then {@code -1} is returned.
684 *
685 * <p>To iterate over the {@code true} bits in a {@code BitSet},
686 * use the following loop:
687 *
688 * <pre> {@code
689 * for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
690 * // operate on index i here
691 * }}</pre>
692 *
693 * @param fromIndex the index to start checking from (inclusive)
694 * @return the index of the next set bit, or {@code -1} if there
695 * is no such bit
696 * @throws IndexOutOfBoundsException if the specified index is negative
697 * @since 1.4
698 */
699 public int nextSetBit(int fromIndex) {
700 if (fromIndex < 0)
701 throw new IndexOutOfBoundsException("fromIndex < 0: " + fromIndex);
702
703 checkInvariants();
704
705 int u = wordIndex(fromIndex);
706 if (u >= wordsInUse)
707 return -1;
708
709 long word = words[u] & (WORD_MASK << fromIndex);
710
711 while (true) {
712 if (word != 0)
713 return (u * BITS_PER_WORD) + Long.numberOfTrailingZeros(word);
714 if (++u == wordsInUse)
715 return -1;
716 word = words[u];
717 }
718 }
719
720 /**
721 * Returns the index of the first bit that is set to {@code false}
722 * that occurs on or after the specified starting index.
723 *
724 * @param fromIndex the index to start checking from (inclusive)
725 * @return the index of the next clear bit
726 * @throws IndexOutOfBoundsException if the specified index is negative
727 * @since 1.4
728 */
729 public int nextClearBit(int fromIndex) {
730 // Neither spec nor implementation handle bitsets of maximal length.
731 // See 4816253.
732 if (fromIndex < 0)
733 throw new IndexOutOfBoundsException("fromIndex < 0: " + fromIndex);
734
735 checkInvariants();
736
737 int u = wordIndex(fromIndex);
738 if (u >= wordsInUse)
739 return fromIndex;
740
741 long word = ~words[u] & (WORD_MASK << fromIndex);
742
743 while (true) {
744 if (word != 0)
745 return (u * BITS_PER_WORD) + Long.numberOfTrailingZeros(word);
746 if (++u == wordsInUse)
747 return wordsInUse * BITS_PER_WORD;
748 word = ~words[u];
749 }
750 }
751
752 /**
753 * Returns the index of the nearest bit that is set to {@code true}
754 * that occurs on or before the specified starting index.
755 * If no such bit exists, or if {@code -1} is given as the
756 * starting index, then {@code -1} is returned.
757 *
758 * <p>To iterate over the {@code true} bits in a {@code BitSet},
759 * use the following loop:
760 *
761 * <pre> {@code
762 * for (int i = bs.length(); (i = bs.previousSetBit(i-1)) >= 0; ) {
763 * // operate on index i here
764 * }}</pre>
765 *
766 * @param fromIndex the index to start checking from (inclusive)
767 * @return the index of the previous set bit, or {@code -1} if there
768 * is no such bit
769 * @throws IndexOutOfBoundsException if the specified index is less
770 * than {@code -1}
771 * @since 1.7
772 */
773 public int previousSetBit(int fromIndex) {
774 if (fromIndex < 0) {
775 if (fromIndex == -1)
776 return -1;
777 throw new IndexOutOfBoundsException(
778 "fromIndex < -1: " + fromIndex);
779 }
780
781 checkInvariants();
782
783 int u = wordIndex(fromIndex);
784 if (u >= wordsInUse)
785 return length() - 1;
786
787 long word = words[u] & (WORD_MASK >>> -(fromIndex+1));
788
789 while (true) {
790 if (word != 0)
791 return (u+1) * BITS_PER_WORD - 1 - Long.numberOfLeadingZeros(word);
792 if (u-- == 0)
793 return -1;
794 word = words[u];
795 }
796 }
797
798 /**
799 * Returns the index of the nearest bit that is set to {@code false}
800 * that occurs on or before the specified starting index.
801 * If no such bit exists, or if {@code -1} is given as the
802 * starting index, then {@code -1} is returned.
803 *
804 * @param fromIndex the index to start checking from (inclusive)
805 * @return the index of the previous clear bit, or {@code -1} if there
806 * is no such bit
807 * @throws IndexOutOfBoundsException if the specified index is less
808 * than {@code -1}
809 * @since 1.7
810 */
811 public int previousClearBit(int fromIndex) {
812 if (fromIndex < 0) {
813 if (fromIndex == -1)
814 return -1;
815 throw new IndexOutOfBoundsException(
816 "fromIndex < -1: " + fromIndex);
817 }
818
819 checkInvariants();
820
821 int u = wordIndex(fromIndex);
822 if (u >= wordsInUse)
823 return fromIndex;
824
825 long word = ~words[u] & (WORD_MASK >>> -(fromIndex+1));
826
827 while (true) {
828 if (word != 0)
829 return (u+1) * BITS_PER_WORD -1 - Long.numberOfLeadingZeros(word);
830 if (u-- == 0)
831 return -1;
832 word = ~words[u];
833 }
834 }
835
836 /**
837 * Returns the "logical size" of this {@code BitSet}: the index of
838 * the highest set bit in the {@code BitSet} plus one. Returns zero
839 * if the {@code BitSet} contains no set bits.
840 *
841 * @return the logical size of this {@code BitSet}
842 * @since 1.2
843 */
844 public int length() {
845 if (wordsInUse == 0)
846 return 0;
847
848 return BITS_PER_WORD * (wordsInUse - 1) +
849 (BITS_PER_WORD - Long.numberOfLeadingZeros(words[wordsInUse - 1]));
850 }
851
852 /**
853 * Returns true if this {@code BitSet} contains no bits that are set
854 * to {@code true}.
855 *
856 * @return boolean indicating whether this {@code BitSet} is empty
857 * @since 1.4
858 */
859 public boolean isEmpty() {
860 return wordsInUse == 0;
861 }
862
863 /**
864 * Returns true if the specified {@code BitSet} has any bits set to
865 * {@code true} that are also set to {@code true} in this {@code BitSet}.
866 *
867 * @param set {@code BitSet} to intersect with
868 * @return boolean indicating whether this {@code BitSet} intersects
869 * the specified {@code BitSet}
870 * @since 1.4
871 */
872 public boolean intersects(BitSet set) {
873 for (int i = Math.min(wordsInUse, set.wordsInUse) - 1; i >= 0; i--)
874 if ((words[i] & set.words[i]) != 0)
875 return true;
876 return false;
877 }
878
879 /**
880 * Returns the number of bits set to {@code true} in this {@code BitSet}.
881 *
882 * @return the number of bits set to {@code true} in this {@code BitSet}
883 * @since 1.4
884 */
885 public int cardinality() {
886 int sum = 0;
887 for (int i = 0; i < wordsInUse; i++)
888 sum += Long.bitCount(words[i]);
889 return sum;
890 }
891
892 /**
893 * Performs a logical <b>AND</b> of this target bit set with the
894 * argument bit set. This bit set is modified so that each bit in it
895 * has the value {@code true} if and only if it both initially
896 * had the value {@code true} and the corresponding bit in the
897 * bit set argument also had the value {@code true}.
898 *
899 * @param set a bit set
900 */
901 public void and(BitSet set) {
902 if (this == set)
903 return;
904
905 while (wordsInUse > set.wordsInUse)
906 words[--wordsInUse] = 0;
907
908 // Perform logical AND on words in common
909 for (int i = 0; i < wordsInUse; i++)
910 words[i] &= set.words[i];
911
912 recalculateWordsInUse();
913 checkInvariants();
914 }
915
916 /**
917 * Performs a logical <b>OR</b> of this bit set with the bit set
918 * argument. This bit set is modified so that a bit in it has the
919 * value {@code true} if and only if it either already had the
920 * value {@code true} or the corresponding bit in the bit set
921 * argument has the value {@code true}.
922 *
923 * @param set a bit set
924 */
925 public void or(BitSet set) {
926 if (this == set)
927 return;
928
929 int wordsInCommon = Math.min(wordsInUse, set.wordsInUse);
930
931 if (wordsInUse < set.wordsInUse) {
932 ensureCapacity(set.wordsInUse);
933 wordsInUse = set.wordsInUse;
934 }
935
936 // Perform logical OR on words in common
937 for (int i = 0; i < wordsInCommon; i++)
938 words[i] |= set.words[i];
939
940 // Copy any remaining words
941 if (wordsInCommon < set.wordsInUse)
942 System.arraycopy(set.words, wordsInCommon,
943 words, wordsInCommon,
944 wordsInUse - wordsInCommon);
945
946 // recalculateWordsInUse() is unnecessary
947 checkInvariants();
948 }
949
950 /**
951 * Performs a logical <b>XOR</b> of this bit set with the bit set
952 * argument. This bit set is modified so that a bit in it has the
953 * value {@code true} if and only if one of the following
954 * statements holds:
955 * <ul>
956 * <li>The bit initially has the value {@code true}, and the
957 * corresponding bit in the argument has the value {@code false}.
958 * <li>The bit initially has the value {@code false}, and the
959 * corresponding bit in the argument has the value {@code true}.
960 * </ul>
961 *
962 * @param set a bit set
963 */
964 public void xor(BitSet set) {
965 int wordsInCommon = Math.min(wordsInUse, set.wordsInUse);
966
967 if (wordsInUse < set.wordsInUse) {
968 ensureCapacity(set.wordsInUse);
969 wordsInUse = set.wordsInUse;
970 }
971
972 // Perform logical XOR on words in common
973 for (int i = 0; i < wordsInCommon; i++)
974 words[i] ^= set.words[i];
975
976 // Copy any remaining words
977 if (wordsInCommon < set.wordsInUse)
978 System.arraycopy(set.words, wordsInCommon,
979 words, wordsInCommon,
980 set.wordsInUse - wordsInCommon);
981
982 recalculateWordsInUse();
983 checkInvariants();
984 }
985
986 /**
987 * Clears all of the bits in this {@code BitSet} whose corresponding
988 * bit is set in the specified {@code BitSet}.
989 *
990 * @param set the {@code BitSet} with which to mask this
991 * {@code BitSet}
992 * @since 1.2
993 */
994 public void andNot(BitSet set) {
995 // Perform logical (a & !b) on words in common
996 for (int i = Math.min(wordsInUse, set.wordsInUse) - 1; i >= 0; i--)
997 words[i] &= ~set.words[i];
998
999 recalculateWordsInUse();
1000 checkInvariants();
1001 }
1002
1003 /**
1004 * Returns the hash code value for this bit set. The hash code depends
1005 * only on which bits are set within this {@code BitSet}.
1006 *
1007 * <p>The hash code is defined to be the result of the following
1008 * calculation:
1009 * <pre> {@code
1010 * public int hashCode() {
1011 * long h = 1234;
1012 * long[] words = toLongArray();
1013 * for (int i = words.length; --i >= 0; )
1014 * h ^= words[i] * (i + 1);
1015 * return (int)((h >> 32) ^ h);
1016 * }}</pre>
1017 * Note that the hash code changes if the set of bits is altered.
1018 *
1019 * @return the hash code value for this bit set
1020 */
1021 public int hashCode() {
1022 long h = 1234;
1023 for (int i = wordsInUse; --i >= 0; )
1024 h ^= words[i] * (i + 1);
1025
1026 return (int)((h >> 32) ^ h);
1027 }
1028
1029 /**
1030 * Returns the number of bits of space actually in use by this
1031 * {@code BitSet} to represent bit values.
1032 * The maximum element in the set is the size - 1st element.
1033 *
1034 * @return the number of bits currently in this bit set
1035 */
1036 public int size() {
1037 return words.length * BITS_PER_WORD;
1038 }
1039
1040 /**
1041 * Compares this object against the specified object.
1042 * The result is {@code true} if and only if the argument is
1043 * not {@code null} and is a {@code Bitset} object that has
1044 * exactly the same set of bits set to {@code true} as this bit
1045 * set. That is, for every nonnegative {@code int} index {@code k},
1046 * <pre>((BitSet)obj).get(k) == this.get(k)</pre>
1047 * must be true. The current sizes of the two bit sets are not compared.
1048 *
1049 * @param obj the object to compare with
1050 * @return {@code true} if the objects are the same;
1051 * {@code false} otherwise
1052 * @see #size()
1053 */
1054 public boolean equals(Object obj) {
1055 if (!(obj instanceof BitSet))
1056 return false;
1057 if (this == obj)
1058 return true;
1059
1060 BitSet set = (BitSet) obj;
1061
1062 checkInvariants();
1063 set.checkInvariants();
1064
1065 if (wordsInUse != set.wordsInUse)
1066 return false;
1067
1068 // Check words in use by both BitSets
1069 for (int i = 0; i < wordsInUse; i++)
1070 if (words[i] != set.words[i])
1071 return false;
1072
1073 return true;
1074 }
1075
1076 /**
1077 * Cloning this {@code BitSet} produces a new {@code BitSet}
1078 * that is equal to it.
1079 * The clone of the bit set is another bit set that has exactly the
1080 * same bits set to {@code true} as this bit set.
1081 *
1082 * @return a clone of this bit set
1083 * @see #size()
1084 */
1085 public Object clone() {
1086 if (! sizeIsSticky)
1087 trimToSize();
1088
1089 try {
1090 BitSet result = (BitSet) super.clone();
1091 result.words = words.clone();
1092 result.checkInvariants();
1093 return result;
1094 } catch (CloneNotSupportedException e) {
1095 throw new InternalError();
1096 }
1097 }
1098
1099 /**
1100 * Attempts to reduce internal storage used for the bits in this bit set.
1101 * Calling this method may, but is not required to, affect the value
1102 * returned by a subsequent call to the {@link #size()} method.
1103 */
1104 private void trimToSize() {
1105 if (wordsInUse != words.length) {
1106 words = Arrays.copyOf(words, wordsInUse);
1107 checkInvariants();
1108 }
1109 }
1110
1111 /**
1112 * Save the state of the {@code BitSet} instance to a stream (i.e.,
1113 * serialize it).
1114 */
1115 private void writeObject(ObjectOutputStream s)
1116 throws IOException {
1117
1118 checkInvariants();
1119
1120 if (! sizeIsSticky)
1121 trimToSize();
1122
1123 ObjectOutputStream.PutField fields = s.putFields();
1124 fields.put("bits", words);
1125 s.writeFields();
1126 }
1127
1128 /**
1129 * Reconstitute the {@code BitSet} instance from a stream (i.e.,
1130 * deserialize it).
1131 */
1132 private void readObject(ObjectInputStream s)
1133 throws IOException, ClassNotFoundException {
1134
1135 ObjectInputStream.GetField fields = s.readFields();
1136 words = (long[]) fields.get("bits", null);
1137
1138 // Assume maximum length then find real length
1139 // because recalculateWordsInUse assumes maintenance
1140 // or reduction in logical size
1141 wordsInUse = words.length;
1142 recalculateWordsInUse();
1143 sizeIsSticky = (words.length > 0 && words[words.length-1] == 0L); // heuristic
1144 checkInvariants();
1145 }
1146
1147 /**
1148 * Returns a string representation of this bit set. For every index
1149 * for which this {@code BitSet} contains a bit in the set
1150 * state, the decimal representation of that index is included in
1151 * the result. Such indices are listed in order from lowest to
1152 * highest, separated by ",&nbsp;" (a comma and a space) and
1153 * surrounded by braces, resulting in the usual mathematical
1154 * notation for a set of integers.
1155 *
1156 * <p>Example:
1157 * <pre>
1158 * BitSet drPepper = new BitSet();</pre>
1159 * Now {@code drPepper.toString()} returns "{@code {}}".<p>
1160 * <pre>
1161 * drPepper.set(2);</pre>
1162 * Now {@code drPepper.toString()} returns "{@code {2}}".<p>
1163 * <pre>
1164 * drPepper.set(4);
1165 * drPepper.set(10);</pre>
1166 * Now {@code drPepper.toString()} returns "{@code {2, 4, 10}}".
1167 *
1168 * @return a string representation of this bit set
1169 */
1170 public String toString() {
1171 checkInvariants();
1172
1173 int numBits = (wordsInUse > 128) ?
1174 cardinality() : wordsInUse * BITS_PER_WORD;
1175 StringBuilder b = new StringBuilder(6*numBits + 2);
1176 b.append('{');
1177
1178 int i = nextSetBit(0);
1179 if (i != -1) {
1180 b.append(i);
1181 for (i = nextSetBit(i+1); i >= 0; i = nextSetBit(i+1)) {
1182 int endOfRun = nextClearBit(i);
1183 do { b.append(", ").append(i); }
1184 while (++i < endOfRun);
1185 }
1186 }
1187
1188 b.append('}');
1189 return b.toString();
1190 }
1191}
java/pkg/java/util/Calendar$1.class+0−0

Binary file not shown.

java/pkg/java/util/Calendar$CalendarAccessControlContext.class+0−0

Binary file not shown.

java/pkg/java/util/Calendar.class+0−0

Binary file not shown.

java/pkg/java/util/Calendar.java+2824−0
@@ -0,0 +1,2824 @@
1/*
2 * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26/*
27 * (C) Copyright Taligent, Inc. 1996-1998 - All Rights Reserved
28 * (C) Copyright IBM Corp. 1996-1998 - All Rights Reserved
29 *
30 * The original version of this source code and documentation is copyrighted
31 * and owned by Taligent, Inc., a wholly-owned subsidiary of IBM. These
32 * materials are provided under terms of a License Agreement between Taligent
33 * and Sun. This technology is protected by multiple US and International
34 * patents. This notice and attribution to Taligent may not be removed.
35 * Taligent is a registered trademark of Taligent, Inc.
36 *
37 */
38
39package java.util;
40
41import java.io.IOException;
42import java.io.ObjectInputStream;
43import java.io.ObjectOutputStream;
44import java.io.OptionalDataException;
45import java.io.Serializable;
46import java.security.AccessControlContext;
47import java.security.AccessController;
48import java.security.PermissionCollection;
49import java.security.PrivilegedActionException;
50import java.security.PrivilegedExceptionAction;
51import java.security.ProtectionDomain;
52import java.text.DateFormat;
53import java.text.DateFormatSymbols;
54import java.util.concurrent.ConcurrentHashMap;
55import java.util.concurrent.ConcurrentMap;
56import sun.util.BuddhistCalendar;
57import sun.util.calendar.ZoneInfo;
58import sun.util.resources.LocaleData;
59
60/**
61 * The <code>Calendar</code> class is an abstract class that provides methods
62 * for converting between a specific instant in time and a set of {@link
63 * #fields calendar fields} such as <code>YEAR</code>, <code>MONTH</code>,
64 * <code>DAY_OF_MONTH</code>, <code>HOUR</code>, and so on, and for
65 * manipulating the calendar fields, such as getting the date of the next
66 * week. An instant in time can be represented by a millisecond value that is
67 * an offset from the <a name="Epoch"><em>Epoch</em></a>, January 1, 1970
68 * 00:00:00.000 GMT (Gregorian).
69 *
70 * <p>The class also provides additional fields and methods for
71 * implementing a concrete calendar system outside the package. Those
72 * fields and methods are defined as <code>protected</code>.
73 *
74 * <p>
75 * Like other locale-sensitive classes, <code>Calendar</code> provides a
76 * class method, <code>getInstance</code>, for getting a generally useful
77 * object of this type. <code>Calendar</code>'s <code>getInstance</code> method
78 * returns a <code>Calendar</code> object whose
79 * calendar fields have been initialized with the current date and time:
80 * <blockquote>
81 * <pre>
82 * Calendar rightNow = Calendar.getInstance();
83 * </pre>
84 * </blockquote>
85 *
86 * <p>A <code>Calendar</code> object can produce all the calendar field values
87 * needed to implement the date-time formatting for a particular language and
88 * calendar style (for example, Japanese-Gregorian, Japanese-Traditional).
89 * <code>Calendar</code> defines the range of values returned by
90 * certain calendar fields, as well as their meaning. For example,
91 * the first month of the calendar system has value <code>MONTH ==
92 * JANUARY</code> for all calendars. Other values are defined by the
93 * concrete subclass, such as <code>ERA</code>. See individual field
94 * documentation and subclass documentation for details.
95 *
96 * <h4>Getting and Setting Calendar Field Values</h4>
97 *
98 * <p>The calendar field values can be set by calling the <code>set</code>
99 * methods. Any field values set in a <code>Calendar</code> will not be
100 * interpreted until it needs to calculate its time value (milliseconds from
101 * the Epoch) or values of the calendar fields. Calling the
102 * <code>get</code>, <code>getTimeInMillis</code>, <code>getTime</code>,
103 * <code>add</code> and <code>roll</code> involves such calculation.
104 *
105 * <h4>Leniency</h4>
106 *
107 * <p><code>Calendar</code> has two modes for interpreting the calendar
108 * fields, <em>lenient</em> and <em>non-lenient</em>. When a
109 * <code>Calendar</code> is in lenient mode, it accepts a wider range of
110 * calendar field values than it produces. When a <code>Calendar</code>
111 * recomputes calendar field values for return by <code>get()</code>, all of
112 * the calendar fields are normalized. For example, a lenient
113 * <code>GregorianCalendar</code> interprets <code>MONTH == JANUARY</code>,
114 * <code>DAY_OF_MONTH == 32</code> as February 1.
115
116 * <p>When a <code>Calendar</code> is in non-lenient mode, it throws an
117 * exception if there is any inconsistency in its calendar fields. For
118 * example, a <code>GregorianCalendar</code> always produces
119 * <code>DAY_OF_MONTH</code> values between 1 and the length of the month. A
120 * non-lenient <code>GregorianCalendar</code> throws an exception upon
121 * calculating its time or calendar field values if any out-of-range field
122 * value has been set.
123 *
124 * <h4><a name="first_week">First Week</a></h4>
125 *
126 * <code>Calendar</code> defines a locale-specific seven day week using two
127 * parameters: the first day of the week and the minimal days in first week
128 * (from 1 to 7). These numbers are taken from the locale resource data when a
129 * <code>Calendar</code> is constructed. They may also be specified explicitly
130 * through the methods for setting their values.
131 *
132 * <p>When setting or getting the <code>WEEK_OF_MONTH</code> or
133 * <code>WEEK_OF_YEAR</code> fields, <code>Calendar</code> must determine the
134 * first week of the month or year as a reference point. The first week of a
135 * month or year is defined as the earliest seven day period beginning on
136 * <code>getFirstDayOfWeek()</code> and containing at least
137 * <code>getMinimalDaysInFirstWeek()</code> days of that month or year. Weeks
138 * numbered ..., -1, 0 precede the first week; weeks numbered 2, 3,... follow
139 * it. Note that the normalized numbering returned by <code>get()</code> may be
140 * different. For example, a specific <code>Calendar</code> subclass may
141 * designate the week before week 1 of a year as week <code><i>n</i></code> of
142 * the previous year.
143 *
144 * <h4>Calendar Fields Resolution</h4>
145 *
146 * When computing a date and time from the calendar fields, there
147 * may be insufficient information for the computation (such as only
148 * year and month with no day of month), or there may be inconsistent
149 * information (such as Tuesday, July 15, 1996 (Gregorian) -- July 15,
150 * 1996 is actually a Monday). <code>Calendar</code> will resolve
151 * calendar field values to determine the date and time in the
152 * following way.
153 *
154 * <p>If there is any conflict in calendar field values,
155 * <code>Calendar</code> gives priorities to calendar fields that have been set
156 * more recently. The following are the default combinations of the
157 * calendar fields. The most recent combination, as determined by the
158 * most recently set single field, will be used.
159 *
160 * <p><a name="date_resolution">For the date fields</a>:
161 * <blockquote>
162 * <pre>
163 * YEAR + MONTH + DAY_OF_MONTH
164 * YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
165 * YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
166 * YEAR + DAY_OF_YEAR
167 * YEAR + DAY_OF_WEEK + WEEK_OF_YEAR
168 * </pre></blockquote>
169 *
170 * <a name="time_resolution">For the time of day fields</a>:
171 * <blockquote>
172 * <pre>
173 * HOUR_OF_DAY
174 * AM_PM + HOUR
175 * </pre></blockquote>
176 *
177 * <p>If there are any calendar fields whose values haven't been set in the selected
178 * field combination, <code>Calendar</code> uses their default values. The default
179 * value of each field may vary by concrete calendar systems. For example, in
180 * <code>GregorianCalendar</code>, the default of a field is the same as that
181 * of the start of the Epoch: i.e., <code>YEAR = 1970</code>, <code>MONTH =
182 * JANUARY</code>, <code>DAY_OF_MONTH = 1</code>, etc.
183 *
184 * <p>
185 * <strong>Note:</strong> There are certain possible ambiguities in
186 * interpretation of certain singular times, which are resolved in the
187 * following ways:
188 * <ol>
189 * <li> 23:59 is the last minute of the day and 00:00 is the first
190 * minute of the next day. Thus, 23:59 on Dec 31, 1999 &lt; 00:00 on
191 * Jan 1, 2000 &lt; 00:01 on Jan 1, 2000.
192 *
193 * <li> Although historically not precise, midnight also belongs to "am",
194 * and noon belongs to "pm", so on the same day,
195 * 12:00 am (midnight) &lt; 12:01 am, and 12:00 pm (noon) &lt; 12:01 pm
196 * </ol>
197 *
198 * <p>
199 * The date or time format strings are not part of the definition of a
200 * calendar, as those must be modifiable or overridable by the user at
201 * runtime. Use {@link DateFormat}
202 * to format dates.
203 *
204 * <h4>Field Manipulation</h4>
205 *
206 * The calendar fields can be changed using three methods:
207 * <code>set()</code>, <code>add()</code>, and <code>roll()</code>.</p>
208 *
209 * <p><strong><code>set(f, value)</code></strong> changes calendar field
210 * <code>f</code> to <code>value</code>. In addition, it sets an
211 * internal member variable to indicate that calendar field <code>f</code> has
212 * been changed. Although calendar field <code>f</code> is changed immediately,
213 * the calendar's time value in milliseconds is not recomputed until the next call to
214 * <code>get()</code>, <code>getTime()</code>, <code>getTimeInMillis()</code>,
215 * <code>add()</code>, or <code>roll()</code> is made. Thus, multiple calls to
216 * <code>set()</code> do not trigger multiple, unnecessary
217 * computations. As a result of changing a calendar field using
218 * <code>set()</code>, other calendar fields may also change, depending on the
219 * calendar field, the calendar field value, and the calendar system. In addition,
220 * <code>get(f)</code> will not necessarily return <code>value</code> set by
221 * the call to the <code>set</code> method
222 * after the calendar fields have been recomputed. The specifics are determined by
223 * the concrete calendar class.</p>
224 *
225 * <p><em>Example</em>: Consider a <code>GregorianCalendar</code>
226 * originally set to August 31, 1999. Calling <code>set(Calendar.MONTH,
227 * Calendar.SEPTEMBER)</code> sets the date to September 31,
228 * 1999. This is a temporary internal representation that resolves to
229 * October 1, 1999 if <code>getTime()</code>is then called. However, a
230 * call to <code>set(Calendar.DAY_OF_MONTH, 30)</code> before the call to
231 * <code>getTime()</code> sets the date to September 30, 1999, since
232 * no recomputation occurs after <code>set()</code> itself.</p>
233 *
234 * <p><strong><code>add(f, delta)</code></strong> adds <code>delta</code>
235 * to field <code>f</code>. This is equivalent to calling <code>set(f,
236 * get(f) + delta)</code> with two adjustments:</p>
237 *
238 * <blockquote>
239 * <p><strong>Add rule 1</strong>. The value of field <code>f</code>
240 * after the call minus the value of field <code>f</code> before the
241 * call is <code>delta</code>, modulo any overflow that has occurred in
242 * field <code>f</code>. Overflow occurs when a field value exceeds its
243 * range and, as a result, the next larger field is incremented or
244 * decremented and the field value is adjusted back into its range.</p>
245 *
246 * <p><strong>Add rule 2</strong>. If a smaller field is expected to be
247 * invariant, but it is impossible for it to be equal to its
248 * prior value because of changes in its minimum or maximum after field
249 * <code>f</code> is changed or other constraints, such as time zone
250 * offset changes, then its value is adjusted to be as close
251 * as possible to its expected value. A smaller field represents a
252 * smaller unit of time. <code>HOUR</code> is a smaller field than
253 * <code>DAY_OF_MONTH</code>. No adjustment is made to smaller fields
254 * that are not expected to be invariant. The calendar system
255 * determines what fields are expected to be invariant.</p>
256 * </blockquote>
257 *
258 * <p>In addition, unlike <code>set()</code>, <code>add()</code> forces
259 * an immediate recomputation of the calendar's milliseconds and all
260 * fields.</p>
261 *
262 * <p><em>Example</em>: Consider a <code>GregorianCalendar</code>
263 * originally set to August 31, 1999. Calling <code>add(Calendar.MONTH,
264 * 13)</code> sets the calendar to September 30, 2000. <strong>Add rule
265 * 1</strong> sets the <code>MONTH</code> field to September, since
266 * adding 13 months to August gives September of the next year. Since
267 * <code>DAY_OF_MONTH</code> cannot be 31 in September in a
268 * <code>GregorianCalendar</code>, <strong>add rule 2</strong> sets the
269 * <code>DAY_OF_MONTH</code> to 30, the closest possible value. Although
270 * it is a smaller field, <code>DAY_OF_WEEK</code> is not adjusted by
271 * rule 2, since it is expected to change when the month changes in a
272 * <code>GregorianCalendar</code>.</p>
273 *
274 * <p><strong><code>roll(f, delta)</code></strong> adds
275 * <code>delta</code> to field <code>f</code> without changing larger
276 * fields. This is equivalent to calling <code>add(f, delta)</code> with
277 * the following adjustment:</p>
278 *
279 * <blockquote>
280 * <p><strong>Roll rule</strong>. Larger fields are unchanged after the
281 * call. A larger field represents a larger unit of
282 * time. <code>DAY_OF_MONTH</code> is a larger field than
283 * <code>HOUR</code>.</p>
284 * </blockquote>
285 *
286 * <p><em>Example</em>: See {@link java.util.GregorianCalendar#roll(int, int)}.
287 *
288 * <p><strong>Usage model</strong>. To motivate the behavior of
289 * <code>add()</code> and <code>roll()</code>, consider a user interface
290 * component with increment and decrement buttons for the month, day, and
291 * year, and an underlying <code>GregorianCalendar</code>. If the
292 * interface reads January 31, 1999 and the user presses the month
293 * increment button, what should it read? If the underlying
294 * implementation uses <code>set()</code>, it might read March 3, 1999. A
295 * better result would be February 28, 1999. Furthermore, if the user
296 * presses the month increment button again, it should read March 31,
297 * 1999, not March 28, 1999. By saving the original date and using either
298 * <code>add()</code> or <code>roll()</code>, depending on whether larger
299 * fields should be affected, the user interface can behave as most users
300 * will intuitively expect.</p>
301 *
302 * @see java.lang.System#currentTimeMillis()
303 * @see Date
304 * @see GregorianCalendar
305 * @see TimeZone
306 * @see java.text.DateFormat
307 * @author Mark Davis, David Goldsmith, Chen-Lieh Huang, Alan Liu
308 * @since JDK1.1
309 */
310public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> {
311
312 // Data flow in Calendar
313 // ---------------------
314
315 // The current time is represented in two ways by Calendar: as UTC
316 // milliseconds from the epoch (1 January 1970 0:00 UTC), and as local
317 // fields such as MONTH, HOUR, AM_PM, etc. It is possible to compute the
318 // millis from the fields, and vice versa. The data needed to do this
319 // conversion is encapsulated by a TimeZone object owned by the Calendar.
320 // The data provided by the TimeZone object may also be overridden if the
321 // user sets the ZONE_OFFSET and/or DST_OFFSET fields directly. The class
322 // keeps track of what information was most recently set by the caller, and
323 // uses that to compute any other information as needed.
324
325 // If the user sets the fields using set(), the data flow is as follows.
326 // This is implemented by the Calendar subclass's computeTime() method.
327 // During this process, certain fields may be ignored. The disambiguation
328 // algorithm for resolving which fields to pay attention to is described
329 // in the class documentation.
330
331 // local fields (YEAR, MONTH, DATE, HOUR, MINUTE, etc.)
332 // |
333 // | Using Calendar-specific algorithm
334 // V
335 // local standard millis
336 // |
337 // | Using TimeZone or user-set ZONE_OFFSET / DST_OFFSET
338 // V
339 // UTC millis (in time data member)
340
341 // If the user sets the UTC millis using setTime() or setTimeInMillis(),
342 // the data flow is as follows. This is implemented by the Calendar
343 // subclass's computeFields() method.
344
345 // UTC millis (in time data member)
346 // |
347 // | Using TimeZone getOffset()
348 // V
349 // local standard millis
350 // |
351 // | Using Calendar-specific algorithm
352 // V
353 // local fields (YEAR, MONTH, DATE, HOUR, MINUTE, etc.)
354
355 // In general, a round trip from fields, through local and UTC millis, and
356 // back out to fields is made when necessary. This is implemented by the
357 // complete() method. Resolving a partial set of fields into a UTC millis
358 // value allows all remaining fields to be generated from that value. If
359 // the Calendar is lenient, the fields are also renormalized to standard
360 // ranges when they are regenerated.
361
362 /**
363 * Field number for <code>get</code> and <code>set</code> indicating the
364 * era, e.g., AD or BC in the Julian calendar. This is a calendar-specific
365 * value; see subclass documentation.
366 *
367 * @see GregorianCalendar#AD
368 * @see GregorianCalendar#BC
369 */
370 public final static int ERA = 0;
371
372 /**
373 * Field number for <code>get</code> and <code>set</code> indicating the
374 * year. This is a calendar-specific value; see subclass documentation.
375 */
376 public final static int YEAR = 1;
377
378 /**
379 * Field number for <code>get</code> and <code>set</code> indicating the
380 * month. This is a calendar-specific value. The first month of
381 * the year in the Gregorian and Julian calendars is
382 * <code>JANUARY</code> which is 0; the last depends on the number
383 * of months in a year.
384 *
385 * @see #JANUARY
386 * @see #FEBRUARY
387 * @see #MARCH
388 * @see #APRIL
389 * @see #MAY
390 * @see #JUNE
391 * @see #JULY
392 * @see #AUGUST
393 * @see #SEPTEMBER
394 * @see #OCTOBER
395 * @see #NOVEMBER
396 * @see #DECEMBER
397 * @see #UNDECIMBER
398 */
399 public final static int MONTH = 2;
400
401 /**
402 * Field number for <code>get</code> and <code>set</code> indicating the
403 * week number within the current year. The first week of the year, as
404 * defined by <code>getFirstDayOfWeek()</code> and
405 * <code>getMinimalDaysInFirstWeek()</code>, has value 1. Subclasses define
406 * the value of <code>WEEK_OF_YEAR</code> for days before the first week of
407 * the year.
408 *
409 * @see #getFirstDayOfWeek
410 * @see #getMinimalDaysInFirstWeek
411 */
412 public final static int WEEK_OF_YEAR = 3;
413
414 /**
415 * Field number for <code>get</code> and <code>set</code> indicating the
416 * week number within the current month. The first week of the month, as
417 * defined by <code>getFirstDayOfWeek()</code> and
418 * <code>getMinimalDaysInFirstWeek()</code>, has value 1. Subclasses define
419 * the value of <code>WEEK_OF_MONTH</code> for days before the first week of
420 * the month.
421 *
422 * @see #getFirstDayOfWeek
423 * @see #getMinimalDaysInFirstWeek
424 */
425 public final static int WEEK_OF_MONTH = 4;
426
427 /**
428 * Field number for <code>get</code> and <code>set</code> indicating the
429 * day of the month. This is a synonym for <code>DAY_OF_MONTH</code>.
430 * The first day of the month has value 1.
431 *
432 * @see #DAY_OF_MONTH
433 */
434 public final static int DATE = 5;
435
436 /**
437 * Field number for <code>get</code> and <code>set</code> indicating the
438 * day of the month. This is a synonym for <code>DATE</code>.
439 * The first day of the month has value 1.
440 *
441 * @see #DATE
442 */
443 public final static int DAY_OF_MONTH = 5;
444
445 /**
446 * Field number for <code>get</code> and <code>set</code> indicating the day
447 * number within the current year. The first day of the year has value 1.
448 */
449 public final static int DAY_OF_YEAR = 6;
450
451 /**
452 * Field number for <code>get</code> and <code>set</code> indicating the day
453 * of the week. This field takes values <code>SUNDAY</code>,
454 * <code>MONDAY</code>, <code>TUESDAY</code>, <code>WEDNESDAY</code>,
455 * <code>THURSDAY</code>, <code>FRIDAY</code>, and <code>SATURDAY</code>.
456 *
457 * @see #SUNDAY
458 * @see #MONDAY
459 * @see #TUESDAY
460 * @see #WEDNESDAY
461 * @see #THURSDAY
462 * @see #FRIDAY
463 * @see #SATURDAY
464 */
465 public final static int DAY_OF_WEEK = 7;
466
467 /**
468 * Field number for <code>get</code> and <code>set</code> indicating the
469 * ordinal number of the day of the week within the current month. Together
470 * with the <code>DAY_OF_WEEK</code> field, this uniquely specifies a day
471 * within a month. Unlike <code>WEEK_OF_MONTH</code> and
472 * <code>WEEK_OF_YEAR</code>, this field's value does <em>not</em> depend on
473 * <code>getFirstDayOfWeek()</code> or
474 * <code>getMinimalDaysInFirstWeek()</code>. <code>DAY_OF_MONTH 1</code>
475 * through <code>7</code> always correspond to <code>DAY_OF_WEEK_IN_MONTH
476 * 1</code>; <code>8</code> through <code>14</code> correspond to
477 * <code>DAY_OF_WEEK_IN_MONTH 2</code>, and so on.
478 * <code>DAY_OF_WEEK_IN_MONTH 0</code> indicates the week before
479 * <code>DAY_OF_WEEK_IN_MONTH 1</code>. Negative values count back from the
480 * end of the month, so the last Sunday of a month is specified as
481 * <code>DAY_OF_WEEK = SUNDAY, DAY_OF_WEEK_IN_MONTH = -1</code>. Because
482 * negative values count backward they will usually be aligned differently
483 * within the month than positive values. For example, if a month has 31
484 * days, <code>DAY_OF_WEEK_IN_MONTH -1</code> will overlap
485 * <code>DAY_OF_WEEK_IN_MONTH 5</code> and the end of <code>4</code>.
486 *
487 * @see #DAY_OF_WEEK
488 * @see #WEEK_OF_MONTH
489 */
490 public final static int DAY_OF_WEEK_IN_MONTH = 8;
491
492 /**
493 * Field number for <code>get</code> and <code>set</code> indicating
494 * whether the <code>HOUR</code> is before or after noon.
495 * E.g., at 10:04:15.250 PM the <code>AM_PM</code> is <code>PM</code>.
496 *
497 * @see #AM
498 * @see #PM
499 * @see #HOUR
500 */
501 public final static int AM_PM = 9;
502
503 /**
504 * Field number for <code>get</code> and <code>set</code> indicating the
505 * hour of the morning or afternoon. <code>HOUR</code> is used for the
506 * 12-hour clock (0 - 11). Noon and midnight are represented by 0, not by 12.
507 * E.g., at 10:04:15.250 PM the <code>HOUR</code> is 10.
508 *
509 * @see #AM_PM
510 * @see #HOUR_OF_DAY
511 */
512 public final static int HOUR = 10;
513
514 /**
515 * Field number for <code>get</code> and <code>set</code> indicating the
516 * hour of the day. <code>HOUR_OF_DAY</code> is used for the 24-hour clock.
517 * E.g., at 10:04:15.250 PM the <code>HOUR_OF_DAY</code> is 22.
518 *
519 * @see #HOUR
520 */
521 public final static int HOUR_OF_DAY = 11;
522
523 /**
524 * Field number for <code>get</code> and <code>set</code> indicating the
525 * minute within the hour.
526 * E.g., at 10:04:15.250 PM the <code>MINUTE</code> is 4.
527 */
528 public final static int MINUTE = 12;
529
530 /**
531 * Field number for <code>get</code> and <code>set</code> indicating the
532 * second within the minute.
533 * E.g., at 10:04:15.250 PM the <code>SECOND</code> is 15.
534 */
535 public final static int SECOND = 13;
536
537 /**
538 * Field number for <code>get</code> and <code>set</code> indicating the
539 * millisecond within the second.
540 * E.g., at 10:04:15.250 PM the <code>MILLISECOND</code> is 250.
541 */
542 public final static int MILLISECOND = 14;
543
544 /**
545 * Field number for <code>get</code> and <code>set</code>
546 * indicating the raw offset from GMT in milliseconds.
547 * <p>
548 * This field reflects the correct GMT offset value of the time
549 * zone of this <code>Calendar</code> if the
550 * <code>TimeZone</code> implementation subclass supports
551 * historical GMT offset changes.
552 */
553 public final static int ZONE_OFFSET = 15;
554
555 /**
556 * Field number for <code>get</code> and <code>set</code> indicating the
557 * daylight saving offset in milliseconds.
558 * <p>
559 * This field reflects the correct daylight saving offset value of
560 * the time zone of this <code>Calendar</code> if the
561 * <code>TimeZone</code> implementation subclass supports
562 * historical Daylight Saving Time schedule changes.
563 */
564 public final static int DST_OFFSET = 16;
565
566 /**
567 * The number of distinct fields recognized by <code>get</code> and <code>set</code>.
568 * Field numbers range from <code>0..FIELD_COUNT-1</code>.
569 */
570 public final static int FIELD_COUNT = 17;
571
572 /**
573 * Value of the {@link #DAY_OF_WEEK} field indicating
574 * Sunday.
575 */
576 public final static int SUNDAY = 1;
577
578 /**
579 * Value of the {@link #DAY_OF_WEEK} field indicating
580 * Monday.
581 */
582 public final static int MONDAY = 2;
583
584 /**
585 * Value of the {@link #DAY_OF_WEEK} field indicating
586 * Tuesday.
587 */
588 public final static int TUESDAY = 3;
589
590 /**
591 * Value of the {@link #DAY_OF_WEEK} field indicating
592 * Wednesday.
593 */
594 public final static int WEDNESDAY = 4;
595
596 /**
597 * Value of the {@link #DAY_OF_WEEK} field indicating
598 * Thursday.
599 */
600 public final static int THURSDAY = 5;
601
602 /**
603 * Value of the {@link #DAY_OF_WEEK} field indicating
604 * Friday.
605 */
606 public final static int FRIDAY = 6;
607
608 /**
609 * Value of the {@link #DAY_OF_WEEK} field indicating
610 * Saturday.
611 */
612 public final static int SATURDAY = 7;
613
614 /**
615 * Value of the {@link #MONTH} field indicating the
616 * first month of the year in the Gregorian and Julian calendars.
617 */
618 public final static int JANUARY = 0;
619
620 /**
621 * Value of the {@link #MONTH} field indicating the
622 * second month of the year in the Gregorian and Julian calendars.
623 */
624 public final static int FEBRUARY = 1;
625
626 /**
627 * Value of the {@link #MONTH} field indicating the
628 * third month of the year in the Gregorian and Julian calendars.
629 */
630 public final static int MARCH = 2;
631
632 /**
633 * Value of the {@link #MONTH} field indicating the
634 * fourth month of the year in the Gregorian and Julian calendars.
635 */
636 public final static int APRIL = 3;
637
638 /**
639 * Value of the {@link #MONTH} field indicating the
640 * fifth month of the year in the Gregorian and Julian calendars.
641 */
642 public final static int MAY = 4;
643
644 /**
645 * Value of the {@link #MONTH} field indicating the
646 * sixth month of the year in the Gregorian and Julian calendars.
647 */
648 public final static int JUNE = 5;
649
650 /**
651 * Value of the {@link #MONTH} field indicating the
652 * seventh month of the year in the Gregorian and Julian calendars.
653 */
654 public final static int JULY = 6;
655
656 /**
657 * Value of the {@link #MONTH} field indicating the
658 * eighth month of the year in the Gregorian and Julian calendars.
659 */
660 public final static int AUGUST = 7;
661
662 /**
663 * Value of the {@link #MONTH} field indicating the
664 * ninth month of the year in the Gregorian and Julian calendars.
665 */
666 public final static int SEPTEMBER = 8;
667
668 /**
669 * Value of the {@link #MONTH} field indicating the
670 * tenth month of the year in the Gregorian and Julian calendars.
671 */
672 public final static int OCTOBER = 9;
673
674 /**
675 * Value of the {@link #MONTH} field indicating the
676 * eleventh month of the year in the Gregorian and Julian calendars.
677 */
678 public final static int NOVEMBER = 10;
679
680 /**
681 * Value of the {@link #MONTH} field indicating the
682 * twelfth month of the year in the Gregorian and Julian calendars.
683 */
684 public final static int DECEMBER = 11;
685
686 /**
687 * Value of the {@link #MONTH} field indicating the
688 * thirteenth month of the year. Although <code>GregorianCalendar</code>
689 * does not use this value, lunar calendars do.
690 */
691 public final static int UNDECIMBER = 12;
692
693 /**
694 * Value of the {@link #AM_PM} field indicating the
695 * period of the day from midnight to just before noon.
696 */
697 public final static int AM = 0;
698
699 /**
700 * Value of the {@link #AM_PM} field indicating the
701 * period of the day from noon to just before midnight.
702 */
703 public final static int PM = 1;
704
705 /**
706 * A style specifier for {@link #getDisplayNames(int, int, Locale)
707 * getDisplayNames} indicating names in all styles, such as
708 * "January" and "Jan".
709 *
710 * @see #SHORT
711 * @see #LONG
712 * @since 1.6
713 */
714 public static final int ALL_STYLES = 0;
715
716 /**
717 * A style specifier for {@link #getDisplayName(int, int, Locale)
718 * getDisplayName} and {@link #getDisplayNames(int, int, Locale)
719 * getDisplayNames} indicating a short name, such as "Jan".
720 *
721 * @see #LONG
722 * @since 1.6
723 */
724 public static final int SHORT = 1;
725
726 /**
727 * A style specifier for {@link #getDisplayName(int, int, Locale)
728 * getDisplayName} and {@link #getDisplayNames(int, int, Locale)
729 * getDisplayNames} indicating a long name, such as "January".
730 *
731 * @see #SHORT
732 * @since 1.6
733 */
734 public static final int LONG = 2;
735
736 // Internal notes:
737 // Calendar contains two kinds of time representations: current "time" in
738 // milliseconds, and a set of calendar "fields" representing the current time.
739 // The two representations are usually in sync, but can get out of sync
740 // as follows.
741 // 1. Initially, no fields are set, and the time is invalid.
742 // 2. If the time is set, all fields are computed and in sync.
743 // 3. If a single field is set, the time is invalid.
744 // Recomputation of the time and fields happens when the object needs
745 // to return a result to the user, or use a result for a computation.
746
747 /**
748 * The calendar field values for the currently set time for this calendar.
749 * This is an array of <code>FIELD_COUNT</code> integers, with index values
750 * <code>ERA</code> through <code>DST_OFFSET</code>.
751 * @serial
752 */
753 protected int fields[];
754
755 /**
756 * The flags which tell if a specified calendar field for the calendar is set.
757 * A new object has no fields set. After the first call to a method
758 * which generates the fields, they all remain set after that.
759 * This is an array of <code>FIELD_COUNT</code> booleans, with index values
760 * <code>ERA</code> through <code>DST_OFFSET</code>.
761 * @serial
762 */
763 protected boolean isSet[];
764
765 /**
766 * Pseudo-time-stamps which specify when each field was set. There
767 * are two special values, UNSET and COMPUTED. Values from
768 * MINIMUM_USER_SET to Integer.MAX_VALUE are legal user set values.
769 */
770 transient private int stamp[];
771
772 /**
773 * The currently set time for this calendar, expressed in milliseconds after
774 * January 1, 1970, 0:00:00 GMT.
775 * @see #isTimeSet
776 * @serial
777 */
778 protected long time;
779
780 /**
781 * True if then the value of <code>time</code> is valid.
782 * The time is made invalid by a change to an item of <code>field[]</code>.
783 * @see #time
784 * @serial
785 */
786 protected boolean isTimeSet;
787
788 /**
789 * True if <code>fields[]</code> are in sync with the currently set time.
790 * If false, then the next attempt to get the value of a field will
791 * force a recomputation of all fields from the current value of
792 * <code>time</code>.
793 * @serial
794 */
795 protected boolean areFieldsSet;
796
797 /**
798 * True if all fields have been set.
799 * @serial
800 */
801 transient boolean areAllFieldsSet;
802
803 /**
804 * <code>True</code> if this calendar allows out-of-range field values during computation
805 * of <code>time</code> from <code>fields[]</code>.
806 * @see #setLenient
807 * @see #isLenient
808 * @serial
809 */
810 private boolean lenient = true;
811
812 /**
813 * The <code>TimeZone</code> used by this calendar. <code>Calendar</code>
814 * uses the time zone data to translate between locale and GMT time.
815 * @serial
816 */
817 private TimeZone zone;
818
819 /**
820 * <code>True</code> if zone references to a shared TimeZone object.
821 */
822 transient private boolean sharedZone = false;
823
824 /**
825 * The first day of the week, with possible values <code>SUNDAY</code>,
826 * <code>MONDAY</code>, etc. This is a locale-dependent value.
827 * @serial
828 */
829 private int firstDayOfWeek;
830
831 /**
832 * The number of days required for the first week in a month or year,
833 * with possible values from 1 to 7. This is a locale-dependent value.
834 * @serial
835 */
836 private int minimalDaysInFirstWeek;
837
838 /**
839 * Cache to hold the firstDayOfWeek and minimalDaysInFirstWeek
840 * of a Locale.
841 */
842 private static final ConcurrentMap<Locale, int[]> cachedLocaleData
843 = new ConcurrentHashMap<Locale, int[]>(3);
844
845 // Special values of stamp[]
846 /**
847 * The corresponding fields[] has no value.
848 */
849 private static final int UNSET = 0;
850
851 /**
852 * The value of the corresponding fields[] has been calculated internally.
853 */
854 private static final int COMPUTED = 1;
855
856 /**
857 * The value of the corresponding fields[] has been set externally. Stamp
858 * values which are greater than 1 represents the (pseudo) time when the
859 * corresponding fields[] value was set.
860 */
861 private static final int MINIMUM_USER_STAMP = 2;
862
863 /**
864 * The mask value that represents all of the fields.
865 */
866 static final int ALL_FIELDS = (1 << FIELD_COUNT) - 1;
867
868 /**
869 * The next available value for <code>stamp[]</code>, an internal array.
870 * This actually should not be written out to the stream, and will probably
871 * be removed from the stream in the near future. In the meantime,
872 * a value of <code>MINIMUM_USER_STAMP</code> should be used.
873 * @serial
874 */
875 private int nextStamp = MINIMUM_USER_STAMP;
876
877 // the internal serial version which says which version was written
878 // - 0 (default) for version up to JDK 1.1.5
879 // - 1 for version from JDK 1.1.6, which writes a correct 'time' value
880 // as well as compatible values for other fields. This is a
881 // transitional format.
882 // - 2 (not implemented yet) a future version, in which fields[],
883 // areFieldsSet, and isTimeSet become transient, and isSet[] is
884 // removed. In JDK 1.1.6 we write a format compatible with version 2.
885 static final int currentSerialVersion = 1;
886
887 /**
888 * The version of the serialized data on the stream. Possible values:
889 * <dl>
890 * <dt><b>0</b> or not present on stream</dt>
891 * <dd>
892 * JDK 1.1.5 or earlier.
893 * </dd>
894 * <dt><b>1</b></dt>
895 * <dd>
896 * JDK 1.1.6 or later. Writes a correct 'time' value
897 * as well as compatible values for other fields. This is a
898 * transitional format.
899 * </dd>
900 * </dl>
901 * When streaming out this class, the most recent format
902 * and the highest allowable <code>serialVersionOnStream</code>
903 * is written.
904 * @serial
905 * @since JDK1.1.6
906 */
907 private int serialVersionOnStream = currentSerialVersion;
908
909 // Proclaim serialization compatibility with JDK 1.1
910 static final long serialVersionUID = -1807547505821590642L;
911
912 // Mask values for calendar fields
913 final static int ERA_MASK = (1 << ERA);
914 final static int YEAR_MASK = (1 << YEAR);
915 final static int MONTH_MASK = (1 << MONTH);
916 final static int WEEK_OF_YEAR_MASK = (1 << WEEK_OF_YEAR);
917 final static int WEEK_OF_MONTH_MASK = (1 << WEEK_OF_MONTH);
918 final static int DAY_OF_MONTH_MASK = (1 << DAY_OF_MONTH);
919 final static int DATE_MASK = DAY_OF_MONTH_MASK;
920 final static int DAY_OF_YEAR_MASK = (1 << DAY_OF_YEAR);
921 final static int DAY_OF_WEEK_MASK = (1 << DAY_OF_WEEK);
922 final static int DAY_OF_WEEK_IN_MONTH_MASK = (1 << DAY_OF_WEEK_IN_MONTH);
923 final static int AM_PM_MASK = (1 << AM_PM);
924 final static int HOUR_MASK = (1 << HOUR);
925 final static int HOUR_OF_DAY_MASK = (1 << HOUR_OF_DAY);
926 final static int MINUTE_MASK = (1 << MINUTE);
927 final static int SECOND_MASK = (1 << SECOND);
928 final static int MILLISECOND_MASK = (1 << MILLISECOND);
929 final static int ZONE_OFFSET_MASK = (1 << ZONE_OFFSET);
930 final static int DST_OFFSET_MASK = (1 << DST_OFFSET);
931
932 /**
933 * Constructs a Calendar with the default time zone
934 * and locale.
935 * @see TimeZone#getDefault
936 */
937 protected Calendar()
938 {
939 this(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
940 sharedZone = true;
941 }
942
943 /**
944 * Constructs a calendar with the specified time zone and locale.
945 *
946 * @param zone the time zone to use
947 * @param aLocale the locale for the week data
948 */
949 protected Calendar(TimeZone zone, Locale aLocale)
950 {
951 fields = new int[FIELD_COUNT];
952 isSet = new boolean[FIELD_COUNT];
953 stamp = new int[FIELD_COUNT];
954
955 this.zone = zone;
956 setWeekCountData(aLocale);
957 }
958
959 /**
960 * Gets a calendar using the default time zone and locale. The
961 * <code>Calendar</code> returned is based on the current time
962 * in the default time zone with the default locale.
963 *
964 * @return a Calendar.
965 */
966 public static Calendar getInstance()
967 {
968 Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
969 cal.sharedZone = true;
970 return cal;
971 }
972
973 /**
974 * Gets a calendar using the specified time zone and default locale.
975 * The <code>Calendar</code> returned is based on the current time
976 * in the given time zone with the default locale.
977 *
978 * @param zone the time zone to use
979 * @return a Calendar.
980 */
981 public static Calendar getInstance(TimeZone zone)
982 {
983 return createCalendar(zone, Locale.getDefault(Locale.Category.FORMAT));
984 }
985
986 /**
987 * Gets a calendar using the default time zone and specified locale.
988 * The <code>Calendar</code> returned is based on the current time
989 * in the default time zone with the given locale.
990 *
991 * @param aLocale the locale for the week data
992 * @return a Calendar.
993 */
994 public static Calendar getInstance(Locale aLocale)
995 {
996 Calendar cal = createCalendar(TimeZone.getDefaultRef(), aLocale);
997 cal.sharedZone = true;
998 return cal;
999 }
1000
1001 /**
1002 * Gets a calendar with the specified time zone and locale.
1003 * The <code>Calendar</code> returned is based on the current time
1004 * in the given time zone with the given locale.
1005 *
1006 * @param zone the time zone to use
1007 * @param aLocale the locale for the week data
1008 * @return a Calendar.
1009 */
1010 public static Calendar getInstance(TimeZone zone,
1011 Locale aLocale)
1012 {
1013 return createCalendar(zone, aLocale);
1014 }
1015
1016 private static Calendar createCalendar(TimeZone zone,
1017 Locale aLocale)
1018 {
1019 Calendar cal = null;
1020
1021 String caltype = aLocale.getUnicodeLocaleType("ca");
1022 if (caltype == null) {
1023 // Calendar type is not specified.
1024 // If the specified locale is a Thai locale,
1025 // returns a BuddhistCalendar instance.
1026 if ("th".equals(aLocale.getLanguage())
1027 && ("TH".equals(aLocale.getCountry()))) {
1028 cal = new BuddhistCalendar(zone, aLocale);
1029 } else {
1030 cal = new GregorianCalendar(zone, aLocale);
1031 }
1032 } else if (caltype.equals("japanese")) {
1033 cal = new JapaneseImperialCalendar(zone, aLocale);
1034 } else if (caltype.equals("buddhist")) {
1035 cal = new BuddhistCalendar(zone, aLocale);
1036 } else {
1037 // Unsupported calendar type.
1038 // Use Gregorian calendar as a fallback.
1039 cal = new GregorianCalendar(zone, aLocale);
1040 }
1041
1042 return cal;
1043 }
1044
1045 /**
1046 * Returns an array of all locales for which the <code>getInstance</code>
1047 * methods of this class can return localized instances.
1048 * The array returned must contain at least a <code>Locale</code>
1049 * instance equal to {@link java.util.Locale#US Locale.US}.
1050 *
1051 * @return An array of locales for which localized
1052 * <code>Calendar</code> instances are available.
1053 */
1054 public static synchronized Locale[] getAvailableLocales()
1055 {
1056 return DateFormat.getAvailableLocales();
1057 }
1058
1059 /**
1060 * Converts the current calendar field values in {@link #fields fields[]}
1061 * to the millisecond time value
1062 * {@link #time}.
1063 *
1064 * @see #complete()
1065 * @see #computeFields()
1066 */
1067 protected abstract void computeTime();
1068
1069 /**
1070 * Converts the current millisecond time value {@link #time}
1071 * to calendar field values in {@link #fields fields[]}.
1072 * This allows you to sync up the calendar field values with
1073 * a new time that is set for the calendar. The time is <em>not</em>
1074 * recomputed first; to recompute the time, then the fields, call the
1075 * {@link #complete()} method.
1076 *
1077 * @see #computeTime()
1078 */
1079 protected abstract void computeFields();
1080
1081 /**
1082 * Returns a <code>Date</code> object representing this
1083 * <code>Calendar</code>'s time value (millisecond offset from the <a
1084 * href="#Epoch">Epoch</a>").
1085 *
1086 * @return a <code>Date</code> representing the time value.
1087 * @see #setTime(Date)
1088 * @see #getTimeInMillis()
1089 */
1090 public final Date getTime() {
1091 return new Date(getTimeInMillis());
1092 }
1093
1094 /**
1095 * Sets this Calendar's time with the given <code>Date</code>.
1096 * <p>
1097 * Note: Calling <code>setTime()</code> with
1098 * <code>Date(Long.MAX_VALUE)</code> or <code>Date(Long.MIN_VALUE)</code>
1099 * may yield incorrect field values from <code>get()</code>.
1100 *
1101 * @param date the given Date.
1102 * @see #getTime()
1103 * @see #setTimeInMillis(long)
1104 */
1105 public final void setTime(Date date) {
1106 setTimeInMillis(date.getTime());
1107 }
1108
1109 /**
1110 * Returns this Calendar's time value in milliseconds.
1111 *
1112 * @return the current time as UTC milliseconds from the epoch.
1113 * @see #getTime()
1114 * @see #setTimeInMillis(long)
1115 */
1116 public long getTimeInMillis() {
1117 if (!isTimeSet) {
1118 updateTime();
1119 }
1120 return time;
1121 }
1122
1123 /**
1124 * Sets this Calendar's current time from the given long value.
1125 *
1126 * @param millis the new time in UTC milliseconds from the epoch.
1127 * @see #setTime(Date)
1128 * @see #getTimeInMillis()
1129 */
1130 public void setTimeInMillis(long millis) {
1131 // If we don't need to recalculate the calendar field values,
1132 // do nothing.
1133 if (time == millis && isTimeSet && areFieldsSet && areAllFieldsSet
1134 && (zone instanceof ZoneInfo) && !((ZoneInfo)zone).isDirty()) {
1135 return;
1136 }
1137 time = millis;
1138 isTimeSet = true;
1139 areFieldsSet = false;
1140 computeFields();
1141 areAllFieldsSet = areFieldsSet = true;
1142 }
1143
1144 /**
1145 * Returns the value of the given calendar field. In lenient mode,
1146 * all calendar fields are normalized. In non-lenient mode, all
1147 * calendar fields are validated and this method throws an
1148 * exception if any calendar fields have out-of-range values. The
1149 * normalization and validation are handled by the
1150 * {@link #complete()} method, which process is calendar
1151 * system dependent.
1152 *
1153 * @param field the given calendar field.
1154 * @return the value for the given calendar field.
1155 * @throws ArrayIndexOutOfBoundsException if the specified field is out of range
1156 * (<code>field &lt; 0 || field &gt;= FIELD_COUNT</code>).
1157 * @see #set(int,int)
1158 * @see #complete()
1159 */
1160 public int get(int field)
1161 {
1162 complete();
1163 return internalGet(field);
1164 }
1165
1166 /**
1167 * Returns the value of the given calendar field. This method does
1168 * not involve normalization or validation of the field value.
1169 *
1170 * @param field the given calendar field.
1171 * @return the value for the given calendar field.
1172 * @see #get(int)
1173 */
1174 protected final int internalGet(int field)
1175 {
1176 return fields[field];
1177 }
1178
1179 /**
1180 * Sets the value of the given calendar field. This method does
1181 * not affect any setting state of the field in this
1182 * <code>Calendar</code> instance.
1183 *
1184 * @throws IndexOutOfBoundsException if the specified field is out of range
1185 * (<code>field &lt; 0 || field &gt;= FIELD_COUNT</code>).
1186 * @see #areFieldsSet
1187 * @see #isTimeSet
1188 * @see #areAllFieldsSet
1189 * @see #set(int,int)
1190 */
1191 final void internalSet(int field, int value)
1192 {
1193 fields[field] = value;
1194 }
1195
1196 /**
1197 * Sets the given calendar field to the given value. The value is not
1198 * interpreted by this method regardless of the leniency mode.
1199 *
1200 * @param field the given calendar field.
1201 * @param value the value to be set for the given calendar field.
1202 * @throws ArrayIndexOutOfBoundsException if the specified field is out of range
1203 * (<code>field &lt; 0 || field &gt;= FIELD_COUNT</code>).
1204 * in non-lenient mode.
1205 * @see #set(int,int,int)
1206 * @see #set(int,int,int,int,int)
1207 * @see #set(int,int,int,int,int,int)
1208 * @see #get(int)
1209 */
1210 public void set(int field, int value)
1211 {
1212 // If the fields are partially normalized, calculate all the
1213 // fields before changing any fields.
1214 if (areFieldsSet && !areAllFieldsSet) {
1215 computeFields();
1216 }
1217 internalSet(field, value);
1218 isTimeSet = false;
1219 areFieldsSet = false;
1220 isSet[field] = true;
1221 stamp[field] = nextStamp++;
1222 if (nextStamp == Integer.MAX_VALUE) {
1223 adjustStamp();
1224 }
1225 }
1226
1227 /**
1228 * Sets the values for the calendar fields <code>YEAR</code>,
1229 * <code>MONTH</code>, and <code>DAY_OF_MONTH</code>.
1230 * Previous values of other calendar fields are retained. If this is not desired,
1231 * call {@link #clear()} first.
1232 *
1233 * @param year the value used to set the <code>YEAR</code> calendar field.
1234 * @param month the value used to set the <code>MONTH</code> calendar field.
1235 * Month value is 0-based. e.g., 0 for January.
1236 * @param date the value used to set the <code>DAY_OF_MONTH</code> calendar field.
1237 * @see #set(int,int)
1238 * @see #set(int,int,int,int,int)
1239 * @see #set(int,int,int,int,int,int)
1240 */
1241 public final void set(int year, int month, int date)
1242 {
1243 set(YEAR, year);
1244 set(MONTH, month);
1245 set(DATE, date);
1246 }
1247
1248 /**
1249 * Sets the values for the calendar fields <code>YEAR</code>,
1250 * <code>MONTH</code>, <code>DAY_OF_MONTH</code>,
1251 * <code>HOUR_OF_DAY</code>, and <code>MINUTE</code>.
1252 * Previous values of other fields are retained. If this is not desired,
1253 * call {@link #clear()} first.
1254 *
1255 * @param year the value used to set the <code>YEAR</code> calendar field.
1256 * @param month the value used to set the <code>MONTH</code> calendar field.
1257 * Month value is 0-based. e.g., 0 for January.
1258 * @param date the value used to set the <code>DAY_OF_MONTH</code> calendar field.
1259 * @param hourOfDay the value used to set the <code>HOUR_OF_DAY</code> calendar field.
1260 * @param minute the value used to set the <code>MINUTE</code> calendar field.
1261 * @see #set(int,int)
1262 * @see #set(int,int,int)
1263 * @see #set(int,int,int,int,int,int)
1264 */
1265 public final void set(int year, int month, int date, int hourOfDay, int minute)
1266 {
1267 set(YEAR, year);
1268 set(MONTH, month);
1269 set(DATE, date);
1270 set(HOUR_OF_DAY, hourOfDay);
1271 set(MINUTE, minute);
1272 }
1273
1274 /**
1275 * Sets the values for the fields <code>YEAR</code>, <code>MONTH</code>,
1276 * <code>DAY_OF_MONTH</code>, <code>HOUR</code>, <code>MINUTE</code>, and
1277 * <code>SECOND</code>.
1278 * Previous values of other fields are retained. If this is not desired,
1279 * call {@link #clear()} first.
1280 *
1281 * @param year the value used to set the <code>YEAR</code> calendar field.
1282 * @param month the value used to set the <code>MONTH</code> calendar field.
1283 * Month value is 0-based. e.g., 0 for January.
1284 * @param date the value used to set the <code>DAY_OF_MONTH</code> calendar field.
1285 * @param hourOfDay the value used to set the <code>HOUR_OF_DAY</code> calendar field.
1286 * @param minute the value used to set the <code>MINUTE</code> calendar field.
1287 * @param second the value used to set the <code>SECOND</code> calendar field.
1288 * @see #set(int,int)
1289 * @see #set(int,int,int)
1290 * @see #set(int,int,int,int,int)
1291 */
1292 public final void set(int year, int month, int date, int hourOfDay, int minute,
1293 int second)
1294 {
1295 set(YEAR, year);
1296 set(MONTH, month);
1297 set(DATE, date);
1298 set(HOUR_OF_DAY, hourOfDay);
1299 set(MINUTE, minute);
1300 set(SECOND, second);
1301 }
1302
1303 /**
1304 * Sets all the calendar field values and the time value
1305 * (millisecond offset from the <a href="#Epoch">Epoch</a>) of
1306 * this <code>Calendar</code> undefined. This means that {@link
1307 * #isSet(int) isSet()} will return <code>false</code> for all the
1308 * calendar fields, and the date and time calculations will treat
1309 * the fields as if they had never been set. A
1310 * <code>Calendar</code> implementation class may use its specific
1311 * default field values for date/time calculations. For example,
1312 * <code>GregorianCalendar</code> uses 1970 if the
1313 * <code>YEAR</code> field value is undefined.
1314 *
1315 * @see #clear(int)
1316 */
1317 public final void clear()
1318 {
1319 for (int i = 0; i < fields.length; ) {
1320 stamp[i] = fields[i] = 0; // UNSET == 0
1321 isSet[i++] = false;
1322 }
1323 areAllFieldsSet = areFieldsSet = false;
1324 isTimeSet = false;
1325 }
1326
1327 /**
1328 * Sets the given calendar field value and the time value
1329 * (millisecond offset from the <a href="#Epoch">Epoch</a>) of
1330 * this <code>Calendar</code> undefined. This means that {@link
1331 * #isSet(int) isSet(field)} will return <code>false</code>, and
1332 * the date and time calculations will treat the field as if it
1333 * had never been set. A <code>Calendar</code> implementation
1334 * class may use the field's specific default value for date and
1335 * time calculations.
1336 *
1337 * <p>The {@link #HOUR_OF_DAY}, {@link #HOUR} and {@link #AM_PM}
1338 * fields are handled independently and the <a
1339 * href="#time_resolution">the resolution rule for the time of
1340 * day</a> is applied. Clearing one of the fields doesn't reset
1341 * the hour of day value of this <code>Calendar</code>. Use {@link
1342 * #set(int,int) set(Calendar.HOUR_OF_DAY, 0)} to reset the hour
1343 * value.
1344 *
1345 * @param field the calendar field to be cleared.
1346 * @see #clear()
1347 */
1348 public final void clear(int field)
1349 {
1350 fields[field] = 0;
1351 stamp[field] = UNSET;
1352 isSet[field] = false;
1353
1354 areAllFieldsSet = areFieldsSet = false;
1355 isTimeSet = false;
1356 }
1357
1358 /**
1359 * Determines if the given calendar field has a value set,
1360 * including cases that the value has been set by internal fields
1361 * calculations triggered by a <code>get</code> method call.
1362 *
1363 * @return <code>true</code> if the given calendar field has a value set;
1364 * <code>false</code> otherwise.
1365 */
1366 public final boolean isSet(int field)
1367 {
1368 return stamp[field] != UNSET;
1369 }
1370
1371 /**
1372 * Returns the string representation of the calendar
1373 * <code>field</code> value in the given <code>style</code> and
1374 * <code>locale</code>. If no string representation is
1375 * applicable, <code>null</code> is returned. This method calls
1376 * {@link Calendar#get(int) get(field)} to get the calendar
1377 * <code>field</code> value if the string representation is
1378 * applicable to the given calendar <code>field</code>.
1379 *
1380 * <p>For example, if this <code>Calendar</code> is a
1381 * <code>GregorianCalendar</code> and its date is 2005-01-01, then
1382 * the string representation of the {@link #MONTH} field would be
1383 * "January" in the long style in an English locale or "Jan" in
1384 * the short style. However, no string representation would be
1385 * available for the {@link #DAY_OF_MONTH} field, and this method
1386 * would return <code>null</code>.
1387 *
1388 * <p>The default implementation supports the calendar fields for
1389 * which a {@link DateFormatSymbols} has names in the given
1390 * <code>locale</code>.
1391 *
1392 * @param field
1393 * the calendar field for which the string representation
1394 * is returned
1395 * @param style
1396 * the style applied to the string representation; one of
1397 * {@link #SHORT} or {@link #LONG}.
1398 * @param locale
1399 * the locale for the string representation
1400 * @return the string representation of the given
1401 * <code>field</code> in the given <code>style</code>, or
1402 * <code>null</code> if no string representation is
1403 * applicable.
1404 * @exception IllegalArgumentException
1405 * if <code>field</code> or <code>style</code> is invalid,
1406 * or if this <code>Calendar</code> is non-lenient and any
1407 * of the calendar fields have invalid values
1408 * @exception NullPointerException
1409 * if <code>locale</code> is null
1410 * @since 1.6
1411 */
1412 public String getDisplayName(int field, int style, Locale locale) {
1413 if (!checkDisplayNameParams(field, style, ALL_STYLES, LONG, locale,
1414 ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) {
1415 return null;
1416 }
1417
1418 DateFormatSymbols symbols = DateFormatSymbols.getInstance(locale);
1419 String[] strings = getFieldStrings(field, style, symbols);
1420 if (strings != null) {
1421 int fieldValue = get(field);
1422 if (fieldValue < strings.length) {
1423 return strings[fieldValue];
1424 }
1425 }
1426 return null;
1427 }
1428
1429 /**
1430 * Returns a <code>Map</code> containing all names of the calendar
1431 * <code>field</code> in the given <code>style</code> and
1432 * <code>locale</code> and their corresponding field values. For
1433 * example, if this <code>Calendar</code> is a {@link
1434 * GregorianCalendar}, the returned map would contain "Jan" to
1435 * {@link #JANUARY}, "Feb" to {@link #FEBRUARY}, and so on, in the
1436 * {@linkplain #SHORT short} style in an English locale.
1437 *
1438 * <p>The values of other calendar fields may be taken into
1439 * account to determine a set of display names. For example, if
1440 * this <code>Calendar</code> is a lunisolar calendar system and
1441 * the year value given by the {@link #YEAR} field has a leap
1442 * month, this method would return month names containing the leap
1443 * month name, and month names are mapped to their values specific
1444 * for the year.
1445 *
1446 * <p>The default implementation supports display names contained in
1447 * a {@link DateFormatSymbols}. For example, if <code>field</code>
1448 * is {@link #MONTH} and <code>style</code> is {@link
1449 * #ALL_STYLES}, this method returns a <code>Map</code> containing
1450 * all strings returned by {@link DateFormatSymbols#getShortMonths()}
1451 * and {@link DateFormatSymbols#getMonths()}.
1452 *
1453 * @param field
1454 * the calendar field for which the display names are returned
1455 * @param style
1456 * the style applied to the display names; one of {@link
1457 * #SHORT}, {@link #LONG}, or {@link #ALL_STYLES}.
1458 * @param locale
1459 * the locale for the display names
1460 * @return a <code>Map</code> containing all display names in
1461 * <code>style</code> and <code>locale</code> and their
1462 * field values, or <code>null</code> if no display names
1463 * are defined for <code>field</code>
1464 * @exception IllegalArgumentException
1465 * if <code>field</code> or <code>style</code> is invalid,
1466 * or if this <code>Calendar</code> is non-lenient and any
1467 * of the calendar fields have invalid values
1468 * @exception NullPointerException
1469 * if <code>locale</code> is null
1470 * @since 1.6
1471 */
1472 public Map<String, Integer> getDisplayNames(int field, int style, Locale locale) {
1473 if (!checkDisplayNameParams(field, style, ALL_STYLES, LONG, locale,
1474 ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) {
1475 return null;
1476 }
1477
1478 // ALL_STYLES
1479 if (style == ALL_STYLES) {
1480 Map<String,Integer> shortNames = getDisplayNamesImpl(field, SHORT, locale);
1481 if (field == ERA || field == AM_PM) {
1482 return shortNames;
1483 }
1484 Map<String,Integer> longNames = getDisplayNamesImpl(field, LONG, locale);
1485 if (shortNames == null) {
1486 return longNames;
1487 }
1488 if (longNames != null) {
1489 shortNames.putAll(longNames);
1490 }
1491 return shortNames;
1492 }
1493
1494 // SHORT or LONG
1495 return getDisplayNamesImpl(field, style, locale);
1496 }
1497
1498 private Map<String,Integer> getDisplayNamesImpl(int field, int style, Locale locale) {
1499 DateFormatSymbols symbols = DateFormatSymbols.getInstance(locale);
1500 String[] strings = getFieldStrings(field, style, symbols);
1501 if (strings != null) {
1502 Map<String,Integer> names = new HashMap<String,Integer>();
1503 for (int i = 0; i < strings.length; i++) {
1504 if (strings[i].length() == 0) {
1505 continue;
1506 }
1507 names.put(strings[i], i);
1508 }
1509 return names;
1510 }
1511 return null;
1512 }
1513
1514 boolean checkDisplayNameParams(int field, int style, int minStyle, int maxStyle,
1515 Locale locale, int fieldMask) {
1516 if (field < 0 || field >= fields.length ||
1517 style < minStyle || style > maxStyle) {
1518 throw new IllegalArgumentException();
1519 }
1520 if (locale == null) {
1521 throw new NullPointerException();
1522 }
1523 return isFieldSet(fieldMask, field);
1524 }
1525
1526 private String[] getFieldStrings(int field, int style, DateFormatSymbols symbols) {
1527 String[] strings = null;
1528 switch (field) {
1529 case ERA:
1530 strings = symbols.getEras();
1531 break;
1532
1533 case MONTH:
1534 strings = (style == LONG) ? symbols.getMonths() : symbols.getShortMonths();
1535 break;
1536
1537 case DAY_OF_WEEK:
1538 strings = (style == LONG) ? symbols.getWeekdays() : symbols.getShortWeekdays();
1539 break;
1540
1541 case AM_PM:
1542 strings = symbols.getAmPmStrings();
1543 break;
1544 }
1545 return strings;
1546 }
1547
1548 /**
1549 * Fills in any unset fields in the calendar fields. First, the {@link
1550 * #computeTime()} method is called if the time value (millisecond offset
1551 * from the <a href="#Epoch">Epoch</a>) has not been calculated from
1552 * calendar field values. Then, the {@link #computeFields()} method is
1553 * called to calculate all calendar field values.
1554 */
1555 protected void complete()
1556 {
1557 if (!isTimeSet)
1558 updateTime();
1559 if (!areFieldsSet || !areAllFieldsSet) {
1560 computeFields(); // fills in unset fields
1561 areAllFieldsSet = areFieldsSet = true;
1562 }
1563 }
1564
1565 /**
1566 * Returns whether the value of the specified calendar field has been set
1567 * externally by calling one of the setter methods rather than by the
1568 * internal time calculation.
1569 *
1570 * @return <code>true</code> if the field has been set externally,
1571 * <code>false</code> otherwise.
1572 * @exception IndexOutOfBoundsException if the specified
1573 * <code>field</code> is out of range
1574 * (<code>field &lt; 0 || field &gt;= FIELD_COUNT</code>).
1575 * @see #selectFields()
1576 * @see #setFieldsComputed(int)
1577 */
1578 final boolean isExternallySet(int field) {
1579 return stamp[field] >= MINIMUM_USER_STAMP;
1580 }
1581
1582 /**
1583 * Returns a field mask (bit mask) indicating all calendar fields that
1584 * have the state of externally or internally set.
1585 *
1586 * @return a bit mask indicating set state fields
1587 */
1588 final int getSetStateFields() {
1589 int mask = 0;
1590 for (int i = 0; i < fields.length; i++) {
1591 if (stamp[i] != UNSET) {
1592 mask |= 1 << i;
1593 }
1594 }
1595 return mask;
1596 }
1597
1598 /**
1599 * Sets the state of the specified calendar fields to
1600 * <em>computed</em>. This state means that the specified calendar fields
1601 * have valid values that have been set by internal time calculation
1602 * rather than by calling one of the setter methods.
1603 *
1604 * @param fieldMask the field to be marked as computed.
1605 * @exception IndexOutOfBoundsException if the specified
1606 * <code>field</code> is out of range
1607 * (<code>field &lt; 0 || field &gt;= FIELD_COUNT</code>).
1608 * @see #isExternallySet(int)
1609 * @see #selectFields()
1610 */
1611 final void setFieldsComputed(int fieldMask) {
1612 if (fieldMask == ALL_FIELDS) {
1613 for (int i = 0; i < fields.length; i++) {
1614 stamp[i] = COMPUTED;
1615 isSet[i] = true;
1616 }
1617 areFieldsSet = areAllFieldsSet = true;
1618 } else {
1619 for (int i = 0; i < fields.length; i++) {
1620 if ((fieldMask & 1) == 1) {
1621 stamp[i] = COMPUTED;
1622 isSet[i] = true;
1623 } else {
1624 if (areAllFieldsSet && !isSet[i]) {
1625 areAllFieldsSet = false;
1626 }
1627 }
1628 fieldMask >>>= 1;
1629 }
1630 }
1631 }
1632
1633 /**
1634 * Sets the state of the calendar fields that are <em>not</em> specified
1635 * by <code>fieldMask</code> to <em>unset</em>. If <code>fieldMask</code>
1636 * specifies all the calendar fields, then the state of this
1637 * <code>Calendar</code> becomes that all the calendar fields are in sync
1638 * with the time value (millisecond offset from the Epoch).
1639 *
1640 * @param fieldMask the field mask indicating which calendar fields are in
1641 * sync with the time value.
1642 * @exception IndexOutOfBoundsException if the specified
1643 * <code>field</code> is out of range
1644 * (<code>field &lt; 0 || field &gt;= FIELD_COUNT</code>).
1645 * @see #isExternallySet(int)
1646 * @see #selectFields()
1647 */
1648 final void setFieldsNormalized(int fieldMask) {
1649 if (fieldMask != ALL_FIELDS) {
1650 for (int i = 0; i < fields.length; i++) {
1651 if ((fieldMask & 1) == 0) {
1652 stamp[i] = fields[i] = 0; // UNSET == 0
1653 isSet[i] = false;
1654 }
1655 fieldMask >>= 1;
1656 }
1657 }
1658
1659 // Some or all of the fields are in sync with the
1660 // milliseconds, but the stamp values are not normalized yet.
1661 areFieldsSet = true;
1662 areAllFieldsSet = false;
1663 }
1664
1665 /**
1666 * Returns whether the calendar fields are partially in sync with the time
1667 * value or fully in sync but not stamp values are not normalized yet.
1668 */
1669 final boolean isPartiallyNormalized() {
1670 return areFieldsSet && !areAllFieldsSet;
1671 }
1672
1673 /**
1674 * Returns whether the calendar fields are fully in sync with the time
1675 * value.
1676 */
1677 final boolean isFullyNormalized() {
1678 return areFieldsSet && areAllFieldsSet;
1679 }
1680
1681 /**
1682 * Marks this Calendar as not sync'd.
1683 */
1684 final void setUnnormalized() {
1685 areFieldsSet = areAllFieldsSet = false;
1686 }
1687
1688 /**
1689 * Returns whether the specified <code>field</code> is on in the
1690 * <code>fieldMask</code>.
1691 */
1692 static final boolean isFieldSet(int fieldMask, int field) {
1693 return (fieldMask & (1 << field)) != 0;
1694 }
1695
1696 /**
1697 * Returns a field mask indicating which calendar field values
1698 * to be used to calculate the time value. The calendar fields are
1699 * returned as a bit mask, each bit of which corresponds to a field, i.e.,
1700 * the mask value of <code>field</code> is <code>(1 &lt;&lt;
1701 * field)</code>. For example, 0x26 represents the <code>YEAR</code>,
1702 * <code>MONTH</code>, and <code>DAY_OF_MONTH</code> fields (i.e., 0x26 is
1703 * equal to
1704 * <code>(1&lt;&lt;YEAR)|(1&lt;&lt;MONTH)|(1&lt;&lt;DAY_OF_MONTH))</code>.
1705 *
1706 * <p>This method supports the calendar fields resolution as described in
1707 * the class description. If the bit mask for a given field is on and its
1708 * field has not been set (i.e., <code>isSet(field)</code> is
1709 * <code>false</code>), then the default value of the field has to be
1710 * used, which case means that the field has been selected because the
1711 * selected combination involves the field.
1712 *
1713 * @return a bit mask of selected fields
1714 * @see #isExternallySet(int)
1715 * @see #setInternallySetState(int)
1716 */
1717 final int selectFields() {
1718 // This implementation has been taken from the GregorianCalendar class.
1719
1720 // The YEAR field must always be used regardless of its SET
1721 // state because YEAR is a mandatory field to determine the date
1722 // and the default value (EPOCH_YEAR) may change through the
1723 // normalization process.
1724 int fieldMask = YEAR_MASK;
1725
1726 if (stamp[ERA] != UNSET) {
1727 fieldMask |= ERA_MASK;
1728 }
1729 // Find the most recent group of fields specifying the day within
1730 // the year. These may be any of the following combinations:
1731 // MONTH + DAY_OF_MONTH
1732 // MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
1733 // MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
1734 // DAY_OF_YEAR
1735 // WEEK_OF_YEAR + DAY_OF_WEEK
1736 // We look for the most recent of the fields in each group to determine
1737 // the age of the group. For groups involving a week-related field such
1738 // as WEEK_OF_MONTH, DAY_OF_WEEK_IN_MONTH, or WEEK_OF_YEAR, both the
1739 // week-related field and the DAY_OF_WEEK must be set for the group as a
1740 // whole to be considered. (See bug 4153860 - liu 7/24/98.)
1741 int dowStamp = stamp[DAY_OF_WEEK];
1742 int monthStamp = stamp[MONTH];
1743 int domStamp = stamp[DAY_OF_MONTH];
1744 int womStamp = aggregateStamp(stamp[WEEK_OF_MONTH], dowStamp);
1745 int dowimStamp = aggregateStamp(stamp[DAY_OF_WEEK_IN_MONTH], dowStamp);
1746 int doyStamp = stamp[DAY_OF_YEAR];
1747 int woyStamp = aggregateStamp(stamp[WEEK_OF_YEAR], dowStamp);
1748
1749 int bestStamp = domStamp;
1750 if (womStamp > bestStamp) {
1751 bestStamp = womStamp;
1752 }
1753 if (dowimStamp > bestStamp) {
1754 bestStamp = dowimStamp;
1755 }
1756 if (doyStamp > bestStamp) {
1757 bestStamp = doyStamp;
1758 }
1759 if (woyStamp > bestStamp) {
1760 bestStamp = woyStamp;
1761 }
1762
1763 /* No complete combination exists. Look for WEEK_OF_MONTH,
1764 * DAY_OF_WEEK_IN_MONTH, or WEEK_OF_YEAR alone. Treat DAY_OF_WEEK alone
1765 * as DAY_OF_WEEK_IN_MONTH.
1766 */
1767 if (bestStamp == UNSET) {
1768 womStamp = stamp[WEEK_OF_MONTH];
1769 dowimStamp = Math.max(stamp[DAY_OF_WEEK_IN_MONTH], dowStamp);
1770 woyStamp = stamp[WEEK_OF_YEAR];
1771 bestStamp = Math.max(Math.max(womStamp, dowimStamp), woyStamp);
1772
1773 /* Treat MONTH alone or no fields at all as DAY_OF_MONTH. This may
1774 * result in bestStamp = domStamp = UNSET if no fields are set,
1775 * which indicates DAY_OF_MONTH.
1776 */
1777 if (bestStamp == UNSET) {
1778 bestStamp = domStamp = monthStamp;
1779 }
1780 }
1781
1782 if (bestStamp == domStamp ||
1783 (bestStamp == womStamp && stamp[WEEK_OF_MONTH] >= stamp[WEEK_OF_YEAR]) ||
1784 (bestStamp == dowimStamp && stamp[DAY_OF_WEEK_IN_MONTH] >= stamp[WEEK_OF_YEAR])) {
1785 fieldMask |= MONTH_MASK;
1786 if (bestStamp == domStamp) {
1787 fieldMask |= DAY_OF_MONTH_MASK;
1788 } else {
1789 assert (bestStamp == womStamp || bestStamp == dowimStamp);
1790 if (dowStamp != UNSET) {
1791 fieldMask |= DAY_OF_WEEK_MASK;
1792 }
1793 if (womStamp == dowimStamp) {
1794 // When they are equal, give the priority to
1795 // WEEK_OF_MONTH for compatibility.
1796 if (stamp[WEEK_OF_MONTH] >= stamp[DAY_OF_WEEK_IN_MONTH]) {
1797 fieldMask |= WEEK_OF_MONTH_MASK;
1798 } else {
1799 fieldMask |= DAY_OF_WEEK_IN_MONTH_MASK;
1800 }
1801 } else {
1802 if (bestStamp == womStamp) {
1803 fieldMask |= WEEK_OF_MONTH_MASK;
1804 } else {
1805 assert (bestStamp == dowimStamp);
1806 if (stamp[DAY_OF_WEEK_IN_MONTH] != UNSET) {
1807 fieldMask |= DAY_OF_WEEK_IN_MONTH_MASK;
1808 }
1809 }
1810 }
1811 }
1812 } else {
1813 assert (bestStamp == doyStamp || bestStamp == woyStamp ||
1814 bestStamp == UNSET);
1815 if (bestStamp == doyStamp) {
1816 fieldMask |= DAY_OF_YEAR_MASK;
1817 } else {
1818 assert (bestStamp == woyStamp);
1819 if (dowStamp != UNSET) {
1820 fieldMask |= DAY_OF_WEEK_MASK;
1821 }
1822 fieldMask |= WEEK_OF_YEAR_MASK;
1823 }
1824 }
1825
1826 // Find the best set of fields specifying the time of day. There
1827 // are only two possibilities here; the HOUR_OF_DAY or the
1828 // AM_PM and the HOUR.
1829 int hourOfDayStamp = stamp[HOUR_OF_DAY];
1830 int hourStamp = aggregateStamp(stamp[HOUR], stamp[AM_PM]);
1831 bestStamp = (hourStamp > hourOfDayStamp) ? hourStamp : hourOfDayStamp;
1832
1833 // if bestStamp is still UNSET, then take HOUR or AM_PM. (See 4846659)
1834 if (bestStamp == UNSET) {
1835 bestStamp = Math.max(stamp[HOUR], stamp[AM_PM]);
1836 }
1837
1838 // Hours
1839 if (bestStamp != UNSET) {
1840 if (bestStamp == hourOfDayStamp) {
1841 fieldMask |= HOUR_OF_DAY_MASK;
1842 } else {
1843 fieldMask |= HOUR_MASK;
1844 if (stamp[AM_PM] != UNSET) {
1845 fieldMask |= AM_PM_MASK;
1846 }
1847 }
1848 }
1849 if (stamp[MINUTE] != UNSET) {
1850 fieldMask |= MINUTE_MASK;
1851 }
1852 if (stamp[SECOND] != UNSET) {
1853 fieldMask |= SECOND_MASK;
1854 }
1855 if (stamp[MILLISECOND] != UNSET) {
1856 fieldMask |= MILLISECOND_MASK;
1857 }
1858 if (stamp[ZONE_OFFSET] >= MINIMUM_USER_STAMP) {
1859 fieldMask |= ZONE_OFFSET_MASK;
1860 }
1861 if (stamp[DST_OFFSET] >= MINIMUM_USER_STAMP) {
1862 fieldMask |= DST_OFFSET_MASK;
1863 }
1864
1865 return fieldMask;
1866 }
1867
1868 /**
1869 * Returns the pseudo-time-stamp for two fields, given their
1870 * individual pseudo-time-stamps. If either of the fields
1871 * is unset, then the aggregate is unset. Otherwise, the
1872 * aggregate is the later of the two stamps.
1873 */
1874 private static final int aggregateStamp(int stamp_a, int stamp_b) {
1875 if (stamp_a == UNSET || stamp_b == UNSET) {
1876 return UNSET;
1877 }
1878 return (stamp_a > stamp_b) ? stamp_a : stamp_b;
1879 }
1880
1881 /**
1882 * Compares this <code>Calendar</code> to the specified
1883 * <code>Object</code>. The result is <code>true</code> if and only if
1884 * the argument is a <code>Calendar</code> object of the same calendar
1885 * system that represents the same time value (millisecond offset from the
1886 * <a href="#Epoch">Epoch</a>) under the same
1887 * <code>Calendar</code> parameters as this object.
1888 *
1889 * <p>The <code>Calendar</code> parameters are the values represented
1890 * by the <code>isLenient</code>, <code>getFirstDayOfWeek</code>,
1891 * <code>getMinimalDaysInFirstWeek</code> and <code>getTimeZone</code>
1892 * methods. If there is any difference in those parameters
1893 * between the two <code>Calendar</code>s, this method returns
1894 * <code>false</code>.
1895 *
1896 * <p>Use the {@link #compareTo(Calendar) compareTo} method to
1897 * compare only the time values.
1898 *
1899 * @param obj the object to compare with.
1900 * @return <code>true</code> if this object is equal to <code>obj</code>;
1901 * <code>false</code> otherwise.
1902 */
1903 public boolean equals(Object obj) {
1904 if (this == obj)
1905 return true;
1906 try {
1907 Calendar that = (Calendar)obj;
1908 return compareTo(getMillisOf(that)) == 0 &&
1909 lenient == that.lenient &&
1910 firstDayOfWeek == that.firstDayOfWeek &&
1911 minimalDaysInFirstWeek == that.minimalDaysInFirstWeek &&
1912 zone.equals(that.zone);
1913 } catch (Exception e) {
1914 // Note: GregorianCalendar.computeTime throws
1915 // IllegalArgumentException if the ERA value is invalid
1916 // even it's in lenient mode.
1917 }
1918 return false;
1919 }
1920
1921 /**
1922 * Returns a hash code for this calendar.
1923 *
1924 * @return a hash code value for this object.
1925 * @since 1.2
1926 */
1927 public int hashCode() {
1928 // 'otheritems' represents the hash code for the previous versions.
1929 int otheritems = (lenient ? 1 : 0)
1930 | (firstDayOfWeek << 1)
1931 | (minimalDaysInFirstWeek << 4)
1932 | (zone.hashCode() << 7);
1933 long t = getMillisOf(this);
1934 return (int) t ^ (int)(t >> 32) ^ otheritems;
1935 }
1936
1937 /**
1938 * Returns whether this <code>Calendar</code> represents a time
1939 * before the time represented by the specified
1940 * <code>Object</code>. This method is equivalent to:
1941 * <pre><blockquote>
1942 * compareTo(when) < 0
1943 * </blockquote></pre>
1944 * if and only if <code>when</code> is a <code>Calendar</code>
1945 * instance. Otherwise, the method returns <code>false</code>.
1946 *
1947 * @param when the <code>Object</code> to be compared
1948 * @return <code>true</code> if the time of this
1949 * <code>Calendar</code> is before the time represented by
1950 * <code>when</code>; <code>false</code> otherwise.
1951 * @see #compareTo(Calendar)
1952 */
1953 public boolean before(Object when) {
1954 return when instanceof Calendar
1955 && compareTo((Calendar)when) < 0;
1956 }
1957
1958 /**
1959 * Returns whether this <code>Calendar</code> represents a time
1960 * after the time represented by the specified
1961 * <code>Object</code>. This method is equivalent to:
1962 * <pre><blockquote>
1963 * compareTo(when) > 0
1964 * </blockquote></pre>
1965 * if and only if <code>when</code> is a <code>Calendar</code>
1966 * instance. Otherwise, the method returns <code>false</code>.
1967 *
1968 * @param when the <code>Object</code> to be compared
1969 * @return <code>true</code> if the time of this <code>Calendar</code> is
1970 * after the time represented by <code>when</code>; <code>false</code>
1971 * otherwise.
1972 * @see #compareTo(Calendar)
1973 */
1974 public boolean after(Object when) {
1975 return when instanceof Calendar
1976 && compareTo((Calendar)when) > 0;
1977 }
1978
1979 /**
1980 * Compares the time values (millisecond offsets from the <a
1981 * href="#Epoch">Epoch</a>) represented by two
1982 * <code>Calendar</code> objects.
1983 *
1984 * @param anotherCalendar the <code>Calendar</code> to be compared.
1985 * @return the value <code>0</code> if the time represented by the argument
1986 * is equal to the time represented by this <code>Calendar</code>; a value
1987 * less than <code>0</code> if the time of this <code>Calendar</code> is
1988 * before the time represented by the argument; and a value greater than
1989 * <code>0</code> if the time of this <code>Calendar</code> is after the
1990 * time represented by the argument.
1991 * @exception NullPointerException if the specified <code>Calendar</code> is
1992 * <code>null</code>.
1993 * @exception IllegalArgumentException if the time value of the
1994 * specified <code>Calendar</code> object can't be obtained due to
1995 * any invalid calendar values.
1996 * @since 1.5
1997 */
1998 public int compareTo(Calendar anotherCalendar) {
1999 return compareTo(getMillisOf(anotherCalendar));
2000 }
2001
2002 /**
2003 * Adds or subtracts the specified amount of time to the given calendar field,
2004 * based on the calendar's rules. For example, to subtract 5 days from
2005 * the current time of the calendar, you can achieve it by calling:
2006 * <p><code>add(Calendar.DAY_OF_MONTH, -5)</code>.
2007 *
2008 * @param field the calendar field.
2009 * @param amount the amount of date or time to be added to the field.
2010 * @see #roll(int,int)
2011 * @see #set(int,int)
2012 */
2013 abstract public void add(int field, int amount);
2014
2015 /**
2016 * Adds or subtracts (up/down) a single unit of time on the given time
2017 * field without changing larger fields. For example, to roll the current
2018 * date up by one day, you can achieve it by calling:
2019 * <p>roll(Calendar.DATE, true).
2020 * When rolling on the year or Calendar.YEAR field, it will roll the year
2021 * value in the range between 1 and the value returned by calling
2022 * <code>getMaximum(Calendar.YEAR)</code>.
2023 * When rolling on the month or Calendar.MONTH field, other fields like
2024 * date might conflict and, need to be changed. For instance,
2025 * rolling the month on the date 01/31/96 will result in 02/29/96.
2026 * When rolling on the hour-in-day or Calendar.HOUR_OF_DAY field, it will
2027 * roll the hour value in the range between 0 and 23, which is zero-based.
2028 *
2029 * @param field the time field.
2030 * @param up indicates if the value of the specified time field is to be
2031 * rolled up or rolled down. Use true if rolling up, false otherwise.
2032 * @see Calendar#add(int,int)
2033 * @see Calendar#set(int,int)
2034 */
2035 abstract public void roll(int field, boolean up);
2036
2037 /**
2038 * Adds the specified (signed) amount to the specified calendar field
2039 * without changing larger fields. A negative amount means to roll
2040 * down.
2041 *
2042 * <p>NOTE: This default implementation on <code>Calendar</code> just repeatedly calls the
2043 * version of {@link #roll(int,boolean) roll()} that rolls by one unit. This may not
2044 * always do the right thing. For example, if the <code>DAY_OF_MONTH</code> field is 31,
2045 * rolling through February will leave it set to 28. The <code>GregorianCalendar</code>
2046 * version of this function takes care of this problem. Other subclasses
2047 * should also provide overrides of this function that do the right thing.
2048 *
2049 * @param field the calendar field.
2050 * @param amount the signed amount to add to the calendar <code>field</code>.
2051 * @since 1.2
2052 * @see #roll(int,boolean)
2053 * @see #add(int,int)
2054 * @see #set(int,int)
2055 */
2056 public void roll(int field, int amount)
2057 {
2058 while (amount > 0) {
2059 roll(field, true);
2060 amount--;
2061 }
2062 while (amount < 0) {
2063 roll(field, false);
2064 amount++;
2065 }
2066 }
2067
2068 /**
2069 * Sets the time zone with the given time zone value.
2070 *
2071 * @param value the given time zone.
2072 */
2073 public void setTimeZone(TimeZone value)
2074 {
2075 zone = value;
2076 sharedZone = false;
2077 /* Recompute the fields from the time using the new zone. This also
2078 * works if isTimeSet is false (after a call to set()). In that case
2079 * the time will be computed from the fields using the new zone, then
2080 * the fields will get recomputed from that. Consider the sequence of
2081 * calls: cal.setTimeZone(EST); cal.set(HOUR, 1); cal.setTimeZone(PST).
2082 * Is cal set to 1 o'clock EST or 1 o'clock PST? Answer: PST. More
2083 * generally, a call to setTimeZone() affects calls to set() BEFORE AND
2084 * AFTER it up to the next call to complete().
2085 */
2086 areAllFieldsSet = areFieldsSet = false;
2087 }
2088
2089 /**
2090 * Gets the time zone.
2091 *
2092 * @return the time zone object associated with this calendar.
2093 */
2094 public TimeZone getTimeZone()
2095 {
2096 // If the TimeZone object is shared by other Calendar instances, then
2097 // create a clone.
2098 if (sharedZone) {
2099 zone = (TimeZone) zone.clone();
2100 sharedZone = false;
2101 }
2102 return zone;
2103 }
2104
2105 /**
2106 * Returns the time zone (without cloning).
2107 */
2108 TimeZone getZone() {
2109 return zone;
2110 }
2111
2112 /**
2113 * Sets the sharedZone flag to <code>shared</code>.
2114 */
2115 void setZoneShared(boolean shared) {
2116 sharedZone = shared;
2117 }
2118
2119 /**
2120 * Specifies whether or not date/time interpretation is to be lenient. With
2121 * lenient interpretation, a date such as "February 942, 1996" will be
2122 * treated as being equivalent to the 941st day after February 1, 1996.
2123 * With strict (non-lenient) interpretation, such dates will cause an exception to be
2124 * thrown. The default is lenient.
2125 *
2126 * @param lenient <code>true</code> if the lenient mode is to be turned
2127 * on; <code>false</code> if it is to be turned off.
2128 * @see #isLenient()
2129 * @see java.text.DateFormat#setLenient
2130 */
2131 public void setLenient(boolean lenient)
2132 {
2133 this.lenient = lenient;
2134 }
2135
2136 /**
2137 * Tells whether date/time interpretation is to be lenient.
2138 *
2139 * @return <code>true</code> if the interpretation mode of this calendar is lenient;
2140 * <code>false</code> otherwise.
2141 * @see #setLenient(boolean)
2142 */
2143 public boolean isLenient()
2144 {
2145 return lenient;
2146 }
2147
2148 /**
2149 * Sets what the first day of the week is; e.g., <code>SUNDAY</code> in the U.S.,
2150 * <code>MONDAY</code> in France.
2151 *
2152 * @param value the given first day of the week.
2153 * @see #getFirstDayOfWeek()
2154 * @see #getMinimalDaysInFirstWeek()
2155 */
2156 public void setFirstDayOfWeek(int value)
2157 {
2158 if (firstDayOfWeek == value) {
2159 return;
2160 }
2161 firstDayOfWeek = value;
2162 invalidateWeekFields();
2163 }
2164
2165 /**
2166 * Gets what the first day of the week is; e.g., <code>SUNDAY</code> in the U.S.,
2167 * <code>MONDAY</code> in France.
2168 *
2169 * @return the first day of the week.
2170 * @see #setFirstDayOfWeek(int)
2171 * @see #getMinimalDaysInFirstWeek()
2172 */
2173 public int getFirstDayOfWeek()
2174 {
2175 return firstDayOfWeek;
2176 }
2177
2178 /**
2179 * Sets what the minimal days required in the first week of the year are;
2180 * For example, if the first week is defined as one that contains the first
2181 * day of the first month of a year, call this method with value 1. If it
2182 * must be a full week, use value 7.
2183 *
2184 * @param value the given minimal days required in the first week
2185 * of the year.
2186 * @see #getMinimalDaysInFirstWeek()
2187 */
2188 public void setMinimalDaysInFirstWeek(int value)
2189 {
2190 if (minimalDaysInFirstWeek == value) {
2191 return;
2192 }
2193 minimalDaysInFirstWeek = value;
2194 invalidateWeekFields();
2195 }
2196
2197 /**
2198 * Gets what the minimal days required in the first week of the year are;
2199 * e.g., if the first week is defined as one that contains the first day
2200 * of the first month of a year, this method returns 1. If
2201 * the minimal days required must be a full week, this method
2202 * returns 7.
2203 *
2204 * @return the minimal days required in the first week of the year.
2205 * @see #setMinimalDaysInFirstWeek(int)
2206 */
2207 public int getMinimalDaysInFirstWeek()
2208 {
2209 return minimalDaysInFirstWeek;
2210 }
2211
2212 /**
2213 * Returns whether this {@code Calendar} supports week dates.
2214 *
2215 * <p>The default implementation of this method returns {@code false}.
2216 *
2217 * @return {@code true} if this {@code Calendar} supports week dates;
2218 * {@code false} otherwise.
2219 * @see #getWeekYear()
2220 * @see #setWeekDate(int,int,int)
2221 * @see #getWeeksInWeekYear()
2222 * @since 1.7
2223 */
2224 public boolean isWeekDateSupported() {
2225 return false;
2226 }
2227
2228 /**
2229 * Returns the week year represented by this {@code Calendar}. The
2230 * week year is in sync with the week cycle. The {@linkplain
2231 * #getFirstDayOfWeek() first day of the first week} is the first
2232 * day of the week year.
2233 *
2234 * <p>The default implementation of this method throws an
2235 * {@link UnsupportedOperationException}.
2236 *
2237 * @return the week year of this {@code Calendar}
2238 * @exception UnsupportedOperationException
2239 * if any week year numbering isn't supported
2240 * in this {@code Calendar}.
2241 * @see #isWeekDateSupported()
2242 * @see #getFirstDayOfWeek()
2243 * @see #getMinimalDaysInFirstWeek()
2244 * @since 1.7
2245 */
2246 public int getWeekYear() {
2247 throw new UnsupportedOperationException();
2248 }
2249
2250 /**
2251 * Sets the date of this {@code Calendar} with the the given date
2252 * specifiers - week year, week of year, and day of week.
2253 *
2254 * <p>Unlike the {@code set} method, all of the calendar fields
2255 * and {@code time} values are calculated upon return.
2256 *
2257 * <p>If {@code weekOfYear} is out of the valid week-of-year range
2258 * in {@code weekYear}, the {@code weekYear} and {@code
2259 * weekOfYear} values are adjusted in lenient mode, or an {@code
2260 * IllegalArgumentException} is thrown in non-lenient mode.
2261 *
2262 * <p>The default implementation of this method throws an
2263 * {@code UnsupportedOperationException}.
2264 *
2265 * @param weekYear the week year
2266 * @param weekOfYear the week number based on {@code weekYear}
2267 * @param dayOfWeek the day of week value: one of the constants
2268 * for the {@link #DAY_OF_WEEK} field: {@link
2269 * #SUNDAY}, ..., {@link #SATURDAY}.
2270 * @exception IllegalArgumentException
2271 * if any of the given date specifiers is invalid
2272 * or any of the calendar fields are inconsistent
2273 * with the given date specifiers in non-lenient mode
2274 * @exception UnsupportedOperationException
2275 * if any week year numbering isn't supported in this
2276 * {@code Calendar}.
2277 * @see #isWeekDateSupported()
2278 * @see #getFirstDayOfWeek()
2279 * @see #getMinimalDaysInFirstWeek()
2280 * @since 1.7
2281 */
2282 public void setWeekDate(int weekYear, int weekOfYear, int dayOfWeek) {
2283 throw new UnsupportedOperationException();
2284 }
2285
2286 /**
2287 * Returns the number of weeks in the week year represented by this
2288 * {@code Calendar}.
2289 *
2290 * <p>The default implementation of this method throws an
2291 * {@code UnsupportedOperationException}.
2292 *
2293 * @return the number of weeks in the week year.
2294 * @exception UnsupportedOperationException
2295 * if any week year numbering isn't supported in this
2296 * {@code Calendar}.
2297 * @see #WEEK_OF_YEAR
2298 * @see #isWeekDateSupported()
2299 * @see #getWeekYear()
2300 * @see #getActualMaximum(int)
2301 * @since 1.7
2302 */
2303 public int getWeeksInWeekYear() {
2304 throw new UnsupportedOperationException();
2305 }
2306
2307 /**
2308 * Returns the minimum value for the given calendar field of this
2309 * <code>Calendar</code> instance. The minimum value is defined as
2310 * the smallest value returned by the {@link #get(int) get} method
2311 * for any possible time value. The minimum value depends on
2312 * calendar system specific parameters of the instance.
2313 *
2314 * @param field the calendar field.
2315 * @return the minimum value for the given calendar field.
2316 * @see #getMaximum(int)
2317 * @see #getGreatestMinimum(int)
2318 * @see #getLeastMaximum(int)
2319 * @see #getActualMinimum(int)
2320 * @see #getActualMaximum(int)
2321 */
2322 abstract public int getMinimum(int field);
2323
2324 /**
2325 * Returns the maximum value for the given calendar field of this
2326 * <code>Calendar</code> instance. The maximum value is defined as
2327 * the largest value returned by the {@link #get(int) get} method
2328 * for any possible time value. The maximum value depends on
2329 * calendar system specific parameters of the instance.
2330 *
2331 * @param field the calendar field.
2332 * @return the maximum value for the given calendar field.
2333 * @see #getMinimum(int)
2334 * @see #getGreatestMinimum(int)
2335 * @see #getLeastMaximum(int)
2336 * @see #getActualMinimum(int)
2337 * @see #getActualMaximum(int)
2338 */
2339 abstract public int getMaximum(int field);
2340
2341 /**
2342 * Returns the highest minimum value for the given calendar field
2343 * of this <code>Calendar</code> instance. The highest minimum
2344 * value is defined as the largest value returned by {@link
2345 * #getActualMinimum(int)} for any possible time value. The
2346 * greatest minimum value depends on calendar system specific
2347 * parameters of the instance.
2348 *
2349 * @param field the calendar field.
2350 * @return the highest minimum value for the given calendar field.
2351 * @see #getMinimum(int)
2352 * @see #getMaximum(int)
2353 * @see #getLeastMaximum(int)
2354 * @see #getActualMinimum(int)
2355 * @see #getActualMaximum(int)
2356 */
2357 abstract public int getGreatestMinimum(int field);
2358
2359 /**
2360 * Returns the lowest maximum value for the given calendar field
2361 * of this <code>Calendar</code> instance. The lowest maximum
2362 * value is defined as the smallest value returned by {@link
2363 * #getActualMaximum(int)} for any possible time value. The least
2364 * maximum value depends on calendar system specific parameters of
2365 * the instance. For example, a <code>Calendar</code> for the
2366 * Gregorian calendar system returns 28 for the
2367 * <code>DAY_OF_MONTH</code> field, because the 28th is the last
2368 * day of the shortest month of this calendar, February in a
2369 * common year.
2370 *
2371 * @param field the calendar field.
2372 * @return the lowest maximum value for the given calendar field.
2373 * @see #getMinimum(int)
2374 * @see #getMaximum(int)
2375 * @see #getGreatestMinimum(int)
2376 * @see #getActualMinimum(int)
2377 * @see #getActualMaximum(int)
2378 */
2379 abstract public int getLeastMaximum(int field);
2380
2381 /**
2382 * Returns the minimum value that the specified calendar field
2383 * could have, given the time value of this <code>Calendar</code>.
2384 *
2385 * <p>The default implementation of this method uses an iterative
2386 * algorithm to determine the actual minimum value for the
2387 * calendar field. Subclasses should, if possible, override this
2388 * with a more efficient implementation - in many cases, they can
2389 * simply return <code>getMinimum()</code>.
2390 *
2391 * @param field the calendar field
2392 * @return the minimum of the given calendar field for the time
2393 * value of this <code>Calendar</code>
2394 * @see #getMinimum(int)
2395 * @see #getMaximum(int)
2396 * @see #getGreatestMinimum(int)
2397 * @see #getLeastMaximum(int)
2398 * @see #getActualMaximum(int)
2399 * @since 1.2
2400 */
2401 public int getActualMinimum(int field) {
2402 int fieldValue = getGreatestMinimum(field);
2403 int endValue = getMinimum(field);
2404
2405 // if we know that the minimum value is always the same, just return it
2406 if (fieldValue == endValue) {
2407 return fieldValue;
2408 }
2409
2410 // clone the calendar so we don't mess with the real one, and set it to
2411 // accept anything for the field values
2412 Calendar work = (Calendar)this.clone();
2413 work.setLenient(true);
2414
2415 // now try each value from getLeastMaximum() to getMaximum() one by one until
2416 // we get a value that normalizes to another value. The last value that
2417 // normalizes to itself is the actual minimum for the current date
2418 int result = fieldValue;
2419
2420 do {
2421 work.set(field, fieldValue);
2422 if (work.get(field) != fieldValue) {
2423 break;
2424 } else {
2425 result = fieldValue;
2426 fieldValue--;
2427 }
2428 } while (fieldValue >= endValue);
2429
2430 return result;
2431 }
2432
2433 /**
2434 * Returns the maximum value that the specified calendar field
2435 * could have, given the time value of this
2436 * <code>Calendar</code>. For example, the actual maximum value of
2437 * the <code>MONTH</code> field is 12 in some years, and 13 in
2438 * other years in the Hebrew calendar system.
2439 *
2440 * <p>The default implementation of this method uses an iterative
2441 * algorithm to determine the actual maximum value for the
2442 * calendar field. Subclasses should, if possible, override this
2443 * with a more efficient implementation.
2444 *
2445 * @param field the calendar field
2446 * @return the maximum of the given calendar field for the time
2447 * value of this <code>Calendar</code>
2448 * @see #getMinimum(int)
2449 * @see #getMaximum(int)
2450 * @see #getGreatestMinimum(int)
2451 * @see #getLeastMaximum(int)
2452 * @see #getActualMinimum(int)
2453 * @since 1.2
2454 */
2455 public int getActualMaximum(int field) {
2456 int fieldValue = getLeastMaximum(field);
2457 int endValue = getMaximum(field);
2458
2459 // if we know that the maximum value is always the same, just return it.
2460 if (fieldValue == endValue) {
2461 return fieldValue;
2462 }
2463
2464 // clone the calendar so we don't mess with the real one, and set it to
2465 // accept anything for the field values.
2466 Calendar work = (Calendar)this.clone();
2467 work.setLenient(true);
2468
2469 // if we're counting weeks, set the day of the week to Sunday. We know the
2470 // last week of a month or year will contain the first day of the week.
2471 if (field == WEEK_OF_YEAR || field == WEEK_OF_MONTH)
2472 work.set(DAY_OF_WEEK, firstDayOfWeek);
2473
2474 // now try each value from getLeastMaximum() to getMaximum() one by one until
2475 // we get a value that normalizes to another value. The last value that
2476 // normalizes to itself is the actual maximum for the current date
2477 int result = fieldValue;
2478
2479 do {
2480 work.set(field, fieldValue);
2481 if (work.get(field) != fieldValue) {
2482 break;
2483 } else {
2484 result = fieldValue;
2485 fieldValue++;
2486 }
2487 } while (fieldValue <= endValue);
2488
2489 return result;
2490 }
2491
2492 /**
2493 * Creates and returns a copy of this object.
2494 *
2495 * @return a copy of this object.
2496 */
2497 public Object clone()
2498 {
2499 try {
2500 Calendar other = (Calendar) super.clone();
2501
2502 other.fields = new int[FIELD_COUNT];
2503 other.isSet = new boolean[FIELD_COUNT];
2504 other.stamp = new int[FIELD_COUNT];
2505 for (int i = 0; i < FIELD_COUNT; i++) {
2506 other.fields[i] = fields[i];
2507 other.stamp[i] = stamp[i];
2508 other.isSet[i] = isSet[i];
2509 }
2510 other.zone = (TimeZone) zone.clone();
2511 return other;
2512 }
2513 catch (CloneNotSupportedException e) {
2514 // this shouldn't happen, since we are Cloneable
2515 throw new InternalError();
2516 }
2517 }
2518
2519 private static final String[] FIELD_NAME = {
2520 "ERA", "YEAR", "MONTH", "WEEK_OF_YEAR", "WEEK_OF_MONTH", "DAY_OF_MONTH",
2521 "DAY_OF_YEAR", "DAY_OF_WEEK", "DAY_OF_WEEK_IN_MONTH", "AM_PM", "HOUR",
2522 "HOUR_OF_DAY", "MINUTE", "SECOND", "MILLISECOND", "ZONE_OFFSET",
2523 "DST_OFFSET"
2524 };
2525
2526 /**
2527 * Returns the name of the specified calendar field.
2528 *
2529 * @param field the calendar field
2530 * @return the calendar field name
2531 * @exception IndexOutOfBoundsException if <code>field</code> is negative,
2532 * equal to or greater then <code>FIELD_COUNT</code>.
2533 */
2534 static final String getFieldName(int field) {
2535 return FIELD_NAME[field];
2536 }
2537
2538 /**
2539 * Return a string representation of this calendar. This method
2540 * is intended to be used only for debugging purposes, and the
2541 * format of the returned string may vary between implementations.
2542 * The returned string may be empty but may not be <code>null</code>.
2543 *
2544 * @return a string representation of this calendar.
2545 */
2546 public String toString() {
2547 // NOTE: BuddhistCalendar.toString() interprets the string
2548 // produced by this method so that the Gregorian year number
2549 // is substituted by its B.E. year value. It relies on
2550 // "...,YEAR=<year>,..." or "...,YEAR=?,...".
2551 StringBuilder buffer = new StringBuilder(800);
2552 buffer.append(getClass().getName()).append('[');
2553 appendValue(buffer, "time", isTimeSet, time);
2554 buffer.append(",areFieldsSet=").append(areFieldsSet);
2555 buffer.append(",areAllFieldsSet=").append(areAllFieldsSet);
2556 buffer.append(",lenient=").append(lenient);
2557 buffer.append(",zone=").append(zone);
2558 appendValue(buffer, ",firstDayOfWeek", true, (long) firstDayOfWeek);
2559 appendValue(buffer, ",minimalDaysInFirstWeek", true, (long) minimalDaysInFirstWeek);
2560 for (int i = 0; i < FIELD_COUNT; ++i) {
2561 buffer.append(',');
2562 appendValue(buffer, FIELD_NAME[i], isSet(i), (long) fields[i]);
2563 }
2564 buffer.append(']');
2565 return buffer.toString();
2566 }
2567
2568 // =======================privates===============================
2569
2570 private static final void appendValue(StringBuilder sb, String item, boolean valid, long value) {
2571 sb.append(item).append('=');
2572 if (valid) {
2573 sb.append(value);
2574 } else {
2575 sb.append('?');
2576 }
2577 }
2578
2579 /**
2580 * Both firstDayOfWeek and minimalDaysInFirstWeek are locale-dependent.
2581 * They are used to figure out the week count for a specific date for
2582 * a given locale. These must be set when a Calendar is constructed.
2583 * @param desiredLocale the given locale.
2584 */
2585 private void setWeekCountData(Locale desiredLocale)
2586 {
2587 /* try to get the Locale data from the cache */
2588 int[] data = cachedLocaleData.get(desiredLocale);
2589 if (data == null) { /* cache miss */
2590 ResourceBundle bundle = LocaleData.getCalendarData(desiredLocale);
2591 data = new int[2];
2592 data[0] = Integer.parseInt(bundle.getString("firstDayOfWeek"));
2593 data[1] = Integer.parseInt(bundle.getString("minimalDaysInFirstWeek"));
2594 cachedLocaleData.putIfAbsent(desiredLocale, data);
2595 }
2596 firstDayOfWeek = data[0];
2597 minimalDaysInFirstWeek = data[1];
2598 }
2599
2600 /**
2601 * Recomputes the time and updates the status fields isTimeSet
2602 * and areFieldsSet. Callers should check isTimeSet and only
2603 * call this method if isTimeSet is false.
2604 */
2605 private void updateTime() {
2606 computeTime();
2607 // The areFieldsSet and areAllFieldsSet values are no longer
2608 // controlled here (as of 1.5).
2609 isTimeSet = true;
2610 }
2611
2612 private int compareTo(long t) {
2613 long thisTime = getMillisOf(this);
2614 return (thisTime > t) ? 1 : (thisTime == t) ? 0 : -1;
2615 }
2616
2617 private static final long getMillisOf(Calendar calendar) {
2618 if (calendar.isTimeSet) {
2619 return calendar.time;
2620 }
2621 Calendar cal = (Calendar) calendar.clone();
2622 cal.setLenient(true);
2623 return cal.getTimeInMillis();
2624 }
2625
2626 /**
2627 * Adjusts the stamp[] values before nextStamp overflow. nextStamp
2628 * is set to the next stamp value upon the return.
2629 */
2630 private final void adjustStamp() {
2631 int max = MINIMUM_USER_STAMP;
2632 int newStamp = MINIMUM_USER_STAMP;
2633
2634 for (;;) {
2635 int min = Integer.MAX_VALUE;
2636 for (int i = 0; i < stamp.length; i++) {
2637 int v = stamp[i];
2638 if (v >= newStamp && min > v) {
2639 min = v;
2640 }
2641 if (max < v) {
2642 max = v;
2643 }
2644 }
2645 if (max != min && min == Integer.MAX_VALUE) {
2646 break;
2647 }
2648 for (int i = 0; i < stamp.length; i++) {
2649 if (stamp[i] == min) {
2650 stamp[i] = newStamp;
2651 }
2652 }
2653 newStamp++;
2654 if (min == max) {
2655 break;
2656 }
2657 }
2658 nextStamp = newStamp;
2659 }
2660
2661 /**
2662 * Sets the WEEK_OF_MONTH and WEEK_OF_YEAR fields to new values with the
2663 * new parameter value if they have been calculated internally.
2664 */
2665 private void invalidateWeekFields()
2666 {
2667 if (stamp[WEEK_OF_MONTH] != COMPUTED &&
2668 stamp[WEEK_OF_YEAR] != COMPUTED) {
2669 return;
2670 }
2671
2672 // We have to check the new values of these fields after changing
2673 // firstDayOfWeek and/or minimalDaysInFirstWeek. If the field values
2674 // have been changed, then set the new values. (4822110)
2675 Calendar cal = (Calendar) clone();
2676 cal.setLenient(true);
2677 cal.clear(WEEK_OF_MONTH);
2678 cal.clear(WEEK_OF_YEAR);
2679
2680 if (stamp[WEEK_OF_MONTH] == COMPUTED) {
2681 int weekOfMonth = cal.get(WEEK_OF_MONTH);
2682 if (fields[WEEK_OF_MONTH] != weekOfMonth) {
2683 fields[WEEK_OF_MONTH] = weekOfMonth;
2684 }
2685 }
2686
2687 if (stamp[WEEK_OF_YEAR] == COMPUTED) {
2688 int weekOfYear = cal.get(WEEK_OF_YEAR);
2689 if (fields[WEEK_OF_YEAR] != weekOfYear) {
2690 fields[WEEK_OF_YEAR] = weekOfYear;
2691 }
2692 }
2693 }
2694
2695 /**
2696 * Save the state of this object to a stream (i.e., serialize it).
2697 *
2698 * Ideally, <code>Calendar</code> would only write out its state data and
2699 * the current time, and not write any field data out, such as
2700 * <code>fields[]</code>, <code>isTimeSet</code>, <code>areFieldsSet</code>,
2701 * and <code>isSet[]</code>. <code>nextStamp</code> also should not be part
2702 * of the persistent state. Unfortunately, this didn't happen before JDK 1.1
2703 * shipped. To be compatible with JDK 1.1, we will always have to write out
2704 * the field values and state flags. However, <code>nextStamp</code> can be
2705 * removed from the serialization stream; this will probably happen in the
2706 * near future.
2707 */
2708 private void writeObject(ObjectOutputStream stream)
2709 throws IOException
2710 {
2711 // Try to compute the time correctly, for the future (stream
2712 // version 2) in which we don't write out fields[] or isSet[].
2713 if (!isTimeSet) {
2714 try {
2715 updateTime();
2716 }
2717 catch (IllegalArgumentException e) {}
2718 }
2719
2720 // If this Calendar has a ZoneInfo, save it and set a
2721 // SimpleTimeZone equivalent (as a single DST schedule) for
2722 // backward compatibility.
2723 TimeZone savedZone = null;
2724 if (zone instanceof ZoneInfo) {
2725 SimpleTimeZone stz = ((ZoneInfo)zone).getLastRuleInstance();
2726 if (stz == null) {
2727 stz = new SimpleTimeZone(zone.getRawOffset(), zone.getID());
2728 }
2729 savedZone = zone;
2730 zone = stz;
2731 }
2732
2733 // Write out the 1.1 FCS object.
2734 stream.defaultWriteObject();
2735
2736 // Write out the ZoneInfo object
2737 // 4802409: we write out even if it is null, a temporary workaround
2738 // the real fix for bug 4844924 in corba-iiop
2739 stream.writeObject(savedZone);
2740 if (savedZone != null) {
2741 zone = savedZone;
2742 }
2743 }
2744
2745 private static class CalendarAccessControlContext {
2746 private static final AccessControlContext INSTANCE;
2747 static {
2748 RuntimePermission perm = new RuntimePermission("accessClassInPackage.sun.util.calendar");
2749 PermissionCollection perms = perm.newPermissionCollection();
2750 perms.add(perm);
2751 INSTANCE = new AccessControlContext(new ProtectionDomain[] {
2752 new ProtectionDomain(null, perms)
2753 });
2754 }
2755 }
2756
2757 /**
2758 * Reconstitutes this object from a stream (i.e., deserialize it).
2759 */
2760 private void readObject(ObjectInputStream stream)
2761 throws IOException, ClassNotFoundException
2762 {
2763 final ObjectInputStream input = stream;
2764 input.defaultReadObject();
2765
2766 stamp = new int[FIELD_COUNT];
2767
2768 // Starting with version 2 (not implemented yet), we expect that
2769 // fields[], isSet[], isTimeSet, and areFieldsSet may not be
2770 // streamed out anymore. We expect 'time' to be correct.
2771 if (serialVersionOnStream >= 2)
2772 {
2773 isTimeSet = true;
2774 if (fields == null) fields = new int[FIELD_COUNT];
2775 if (isSet == null) isSet = new boolean[FIELD_COUNT];
2776 }
2777 else if (serialVersionOnStream >= 0)
2778 {
2779 for (int i=0; i<FIELD_COUNT; ++i)
2780 stamp[i] = isSet[i] ? COMPUTED : UNSET;
2781 }
2782
2783 serialVersionOnStream = currentSerialVersion;
2784
2785 // If there's a ZoneInfo object, use it for zone.
2786 ZoneInfo zi = null;
2787 try {
2788 zi = AccessController.doPrivileged(
2789 new PrivilegedExceptionAction<ZoneInfo>() {
2790 public ZoneInfo run() throws Exception {
2791 return (ZoneInfo) input.readObject();
2792 }
2793 },
2794 CalendarAccessControlContext.INSTANCE);
2795 } catch (PrivilegedActionException pae) {
2796 Exception e = pae.getException();
2797 if (!(e instanceof OptionalDataException)) {
2798 if (e instanceof RuntimeException) {
2799 throw (RuntimeException) e;
2800 } else if (e instanceof IOException) {
2801 throw (IOException) e;
2802 } else if (e instanceof ClassNotFoundException) {
2803 throw (ClassNotFoundException) e;
2804 }
2805 throw new RuntimeException(e);
2806 }
2807 }
2808 if (zi != null) {
2809 zone = zi;
2810 }
2811
2812 // If the deserialized object has a SimpleTimeZone, try to
2813 // replace it with a ZoneInfo equivalent (as of 1.4) in order
2814 // to be compatible with the SimpleTimeZone-based
2815 // implementation as much as possible.
2816 if (zone instanceof SimpleTimeZone) {
2817 String id = zone.getID();
2818 TimeZone tz = TimeZone.getTimeZone(id);
2819 if (tz != null && tz.hasSameRules(zone) && tz.getID().equals(id)) {
2820 zone = tz;
2821 }
2822 }
2823 }
2824}
java/pkg/java/util/Collection.class+0−0

Binary file not shown.

java/pkg/java/util/Collection.java+456−0
@@ -0,0 +1,456 @@
1/*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.util;
27
28/**
29 * The root interface in the <i>collection hierarchy</i>. A collection
30 * represents a group of objects, known as its <i>elements</i>. Some
31 * collections allow duplicate elements and others do not. Some are ordered
32 * and others unordered. The JDK does not provide any <i>direct</i>
33 * implementations of this interface: it provides implementations of more
34 * specific subinterfaces like <tt>Set</tt> and <tt>List</tt>. This interface
35 * is typically used to pass collections around and manipulate them where
36 * maximum generality is desired.
37 *
38 * <p><i>Bags</i> or <i>multisets</i> (unordered collections that may contain
39 * duplicate elements) should implement this interface directly.
40 *
41 * <p>All general-purpose <tt>Collection</tt> implementation classes (which
42 * typically implement <tt>Collection</tt> indirectly through one of its
43 * subinterfaces) should provide two "standard" constructors: a void (no
44 * arguments) constructor, which creates an empty collection, and a
45 * constructor with a single argument of type <tt>Collection</tt>, which
46 * creates a new collection with the same elements as its argument. In
47 * effect, the latter constructor allows the user to copy any collection,
48 * producing an equivalent collection of the desired implementation type.
49 * There is no way to enforce this convention (as interfaces cannot contain
50 * constructors) but all of the general-purpose <tt>Collection</tt>
51 * implementations in the Java platform libraries comply.
52 *
53 * <p>The "destructive" methods contained in this interface, that is, the
54 * methods that modify the collection on which they operate, are specified to
55 * throw <tt>UnsupportedOperationException</tt> if this collection does not
56 * support the operation. If this is the case, these methods may, but are not
57 * required to, throw an <tt>UnsupportedOperationException</tt> if the
58 * invocation would have no effect on the collection. For example, invoking
59 * the {@link #addAll(Collection)} method on an unmodifiable collection may,
60 * but is not required to, throw the exception if the collection to be added
61 * is empty.
62 *
63 * <p><a name="optional-restrictions"/>
64 * Some collection implementations have restrictions on the elements that
65 * they may contain. For example, some implementations prohibit null elements,
66 * and some have restrictions on the types of their elements. Attempting to
67 * add an ineligible element throws an unchecked exception, typically
68 * <tt>NullPointerException</tt> or <tt>ClassCastException</tt>. Attempting
69 * to query the presence of an ineligible element may throw an exception,
70 * or it may simply return false; some implementations will exhibit the former
71 * behavior and some will exhibit the latter. More generally, attempting an
72 * operation on an ineligible element whose completion would not result in
73 * the insertion of an ineligible element into the collection may throw an
74 * exception or it may succeed, at the option of the implementation.
75 * Such exceptions are marked as "optional" in the specification for this
76 * interface.
77 *
78 * <p>It is up to each collection to determine its own synchronization
79 * policy. In the absence of a stronger guarantee by the
80 * implementation, undefined behavior may result from the invocation
81 * of any method on a collection that is being mutated by another
82 * thread; this includes direct invocations, passing the collection to
83 * a method that might perform invocations, and using an existing
84 * iterator to examine the collection.
85 *
86 * <p>Many methods in Collections Framework interfaces are defined in
87 * terms of the {@link Object#equals(Object) equals} method. For example,
88 * the specification for the {@link #contains(Object) contains(Object o)}
89 * method says: "returns <tt>true</tt> if and only if this collection
90 * contains at least one element <tt>e</tt> such that
91 * <tt>(o==null ? e==null : o.equals(e))</tt>." This specification should
92 * <i>not</i> be construed to imply that invoking <tt>Collection.contains</tt>
93 * with a non-null argument <tt>o</tt> will cause <tt>o.equals(e)</tt> to be
94 * invoked for any element <tt>e</tt>. Implementations are free to implement
95 * optimizations whereby the <tt>equals</tt> invocation is avoided, for
96 * example, by first comparing the hash codes of the two elements. (The
97 * {@link Object#hashCode()} specification guarantees that two objects with
98 * unequal hash codes cannot be equal.) More generally, implementations of
99 * the various Collections Framework interfaces are free to take advantage of
100 * the specified behavior of underlying {@link Object} methods wherever the
101 * implementor deems it appropriate.
102 *
103 * <p>This interface is a member of the
104 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
105 * Java Collections Framework</a>.
106 *
107 * @param <E> the type of elements in this collection
108 *
109 * @author Josh Bloch
110 * @author Neal Gafter
111 * @see Set
112 * @see List
113 * @see Map
114 * @see SortedSet
115 * @see SortedMap
116 * @see HashSet
117 * @see TreeSet
118 * @see ArrayList
119 * @see LinkedList
120 * @see Vector
121 * @see Collections
122 * @see Arrays
123 * @see AbstractCollection
124 * @since 1.2
125 */
126
127public interface Collection<E> extends Iterable<E> {
128 // Query Operations
129
130 /**
131 * Returns the number of elements in this collection. If this collection
132 * contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
133 * <tt>Integer.MAX_VALUE</tt>.
134 *
135 * @return the number of elements in this collection
136 */
137 int size();
138
139 /**
140 * Returns <tt>true</tt> if this collection contains no elements.
141 *
142 * @return <tt>true</tt> if this collection contains no elements
143 */
144 boolean isEmpty();
145
146 /**
147 * Returns <tt>true</tt> if this collection contains the specified element.
148 * More formally, returns <tt>true</tt> if and only if this collection
149 * contains at least one element <tt>e</tt> such that
150 * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
151 *
152 * @param o element whose presence in this collection is to be tested
153 * @return <tt>true</tt> if this collection contains the specified
154 * element
155 * @throws ClassCastException if the type of the specified element
156 * is incompatible with this collection
157 * (<a href="#optional-restrictions">optional</a>)
158 * @throws NullPointerException if the specified element is null and this
159 * collection does not permit null elements
160 * (<a href="#optional-restrictions">optional</a>)
161 */
162 boolean contains(Object o);
163
164 /**
165 * Returns an iterator over the elements in this collection. There are no
166 * guarantees concerning the order in which the elements are returned
167 * (unless this collection is an instance of some class that provides a
168 * guarantee).
169 *
170 * @return an <tt>Iterator</tt> over the elements in this collection
171 */
172 Iterator<E> iterator();
173
174 /**
175 * Returns an array containing all of the elements in this collection.
176 * If this collection makes any guarantees as to what order its elements
177 * are returned by its iterator, this method must return the elements in
178 * the same order.
179 *
180 * <p>The returned array will be "safe" in that no references to it are
181 * maintained by this collection. (In other words, this method must
182 * allocate a new array even if this collection is backed by an array).
183 * The caller is thus free to modify the returned array.
184 *
185 * <p>This method acts as bridge between array-based and collection-based
186 * APIs.
187 *
188 * @return an array containing all of the elements in this collection
189 */
190 Object[] toArray();
191
192 /**
193 * Returns an array containing all of the elements in this collection;
194 * the runtime type of the returned array is that of the specified array.
195 * If the collection fits in the specified array, it is returned therein.
196 * Otherwise, a new array is allocated with the runtime type of the
197 * specified array and the size of this collection.
198 *
199 * <p>If this collection fits in the specified array with room to spare
200 * (i.e., the array has more elements than this collection), the element
201 * in the array immediately following the end of the collection is set to
202 * <tt>null</tt>. (This is useful in determining the length of this
203 * collection <i>only</i> if the caller knows that this collection does
204 * not contain any <tt>null</tt> elements.)
205 *
206 * <p>If this collection makes any guarantees as to what order its elements
207 * are returned by its iterator, this method must return the elements in
208 * the same order.
209 *
210 * <p>Like the {@link #toArray()} method, this method acts as bridge between
211 * array-based and collection-based APIs. Further, this method allows
212 * precise control over the runtime type of the output array, and may,
213 * under certain circumstances, be used to save allocation costs.
214 *
215 * <p>Suppose <tt>x</tt> is a collection known to contain only strings.
216 * The following code can be used to dump the collection into a newly
217 * allocated array of <tt>String</tt>:
218 *
219 * <pre>
220 * String[] y = x.toArray(new String[0]);</pre>
221 *
222 * Note that <tt>toArray(new Object[0])</tt> is identical in function to
223 * <tt>toArray()</tt>.
224 *
225 * @param a the array into which the elements of this collection are to be
226 * stored, if it is big enough; otherwise, a new array of the same
227 * runtime type is allocated for this purpose.
228 * @return an array containing all of the elements in this collection
229 * @throws ArrayStoreException if the runtime type of the specified array
230 * is not a supertype of the runtime type of every element in
231 * this collection
232 * @throws NullPointerException if the specified array is null
233 */
234 <T> T[] toArray(T[] a);
235
236 // Modification Operations
237
238 /**
239 * Ensures that this collection contains the specified element (optional
240 * operation). Returns <tt>true</tt> if this collection changed as a
241 * result of the call. (Returns <tt>false</tt> if this collection does
242 * not permit duplicates and already contains the specified element.)<p>
243 *
244 * Collections that support this operation may place limitations on what
245 * elements may be added to this collection. In particular, some
246 * collections will refuse to add <tt>null</tt> elements, and others will
247 * impose restrictions on the type of elements that may be added.
248 * Collection classes should clearly specify in their documentation any
249 * restrictions on what elements may be added.<p>
250 *
251 * If a collection refuses to add a particular element for any reason
252 * other than that it already contains the element, it <i>must</i> throw
253 * an exception (rather than returning <tt>false</tt>). This preserves
254 * the invariant that a collection always contains the specified element
255 * after this call returns.
256 *
257 * @param e element whose presence in this collection is to be ensured
258 * @return <tt>true</tt> if this collection changed as a result of the
259 * call
260 * @throws UnsupportedOperationException if the <tt>add</tt> operation
261 * is not supported by this collection
262 * @throws ClassCastException if the class of the specified element
263 * prevents it from being added to this collection
264 * @throws NullPointerException if the specified element is null and this
265 * collection does not permit null elements
266 * @throws IllegalArgumentException if some property of the element
267 * prevents it from being added to this collection
268 * @throws IllegalStateException if the element cannot be added at this
269 * time due to insertion restrictions
270 */
271 boolean add(E e);
272
273 /**
274 * Removes a single instance of the specified element from this
275 * collection, if it is present (optional operation). More formally,
276 * removes an element <tt>e</tt> such that
277 * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>, if
278 * this collection contains one or more such elements. Returns
279 * <tt>true</tt> if this collection contained the specified element (or
280 * equivalently, if this collection changed as a result of the call).
281 *
282 * @param o element to be removed from this collection, if present
283 * @return <tt>true</tt> if an element was removed as a result of this call
284 * @throws ClassCastException if the type of the specified element
285 * is incompatible with this collection
286 * (<a href="#optional-restrictions">optional</a>)
287 * @throws NullPointerException if the specified element is null and this
288 * collection does not permit null elements
289 * (<a href="#optional-restrictions">optional</a>)
290 * @throws UnsupportedOperationException if the <tt>remove</tt> operation
291 * is not supported by this collection
292 */
293 boolean remove(Object o);
294
295
296 // Bulk Operations
297
298 /**
299 * Returns <tt>true</tt> if this collection contains all of the elements
300 * in the specified collection.
301 *
302 * @param c collection to be checked for containment in this collection
303 * @return <tt>true</tt> if this collection contains all of the elements
304 * in the specified collection
305 * @throws ClassCastException if the types of one or more elements
306 * in the specified collection are incompatible with this
307 * collection
308 * (<a href="#optional-restrictions">optional</a>)
309 * @throws NullPointerException if the specified collection contains one
310 * or more null elements and this collection does not permit null
311 * elements
312 * (<a href="#optional-restrictions">optional</a>),
313 * or if the specified collection is null.
314 * @see #contains(Object)
315 */
316 boolean containsAll(Collection<?> c);
317
318 /**
319 * Adds all of the elements in the specified collection to this collection
320 * (optional operation). The behavior of this operation is undefined if
321 * the specified collection is modified while the operation is in progress.
322 * (This implies that the behavior of this call is undefined if the
323 * specified collection is this collection, and this collection is
324 * nonempty.)
325 *
326 * @param c collection containing elements to be added to this collection
327 * @return <tt>true</tt> if this collection changed as a result of the call
328 * @throws UnsupportedOperationException if the <tt>addAll</tt> operation
329 * is not supported by this collection
330 * @throws ClassCastException if the class of an element of the specified
331 * collection prevents it from being added to this collection
332 * @throws NullPointerException if the specified collection contains a
333 * null element and this collection does not permit null elements,
334 * or if the specified collection is null
335 * @throws IllegalArgumentException if some property of an element of the
336 * specified collection prevents it from being added to this
337 * collection
338 * @throws IllegalStateException if not all the elements can be added at
339 * this time due to insertion restrictions
340 * @see #add(Object)
341 */
342 boolean addAll(Collection<? extends E> c);
343
344 /**
345 * Removes all of this collection's elements that are also contained in the
346 * specified collection (optional operation). After this call returns,
347 * this collection will contain no elements in common with the specified
348 * collection.
349 *
350 * @param c collection containing elements to be removed from this collection
351 * @return <tt>true</tt> if this collection changed as a result of the
352 * call
353 * @throws UnsupportedOperationException if the <tt>removeAll</tt> method
354 * is not supported by this collection
355 * @throws ClassCastException if the types of one or more elements
356 * in this collection are incompatible with the specified
357 * collection
358 * (<a href="#optional-restrictions">optional</a>)
359 * @throws NullPointerException if this collection contains one or more
360 * null elements and the specified collection does not support
361 * null elements
362 * (<a href="#optional-restrictions">optional</a>),
363 * or if the specified collection is null
364 * @see #remove(Object)
365 * @see #contains(Object)
366 */
367 boolean removeAll(Collection<?> c);
368
369 /**
370 * Retains only the elements in this collection that are contained in the
371 * specified collection (optional operation). In other words, removes from
372 * this collection all of its elements that are not contained in the
373 * specified collection.
374 *
375 * @param c collection containing elements to be retained in this collection
376 * @return <tt>true</tt> if this collection changed as a result of the call
377 * @throws UnsupportedOperationException if the <tt>retainAll</tt> operation
378 * is not supported by this collection
379 * @throws ClassCastException if the types of one or more elements
380 * in this collection are incompatible with the specified
381 * collection
382 * (<a href="#optional-restrictions">optional</a>)
383 * @throws NullPointerException if this collection contains one or more
384 * null elements and the specified collection does not permit null
385 * elements
386 * (<a href="#optional-restrictions">optional</a>),
387 * or if the specified collection is null
388 * @see #remove(Object)
389 * @see #contains(Object)
390 */
391 boolean retainAll(Collection<?> c);
392
393 /**
394 * Removes all of the elements from this collection (optional operation).
395 * The collection will be empty after this method returns.
396 *
397 * @throws UnsupportedOperationException if the <tt>clear</tt> operation
398 * is not supported by this collection
399 */
400 void clear();
401
402
403 // Comparison and hashing
404
405 /**
406 * Compares the specified object with this collection for equality. <p>
407 *
408 * While the <tt>Collection</tt> interface adds no stipulations to the
409 * general contract for the <tt>Object.equals</tt>, programmers who
410 * implement the <tt>Collection</tt> interface "directly" (in other words,
411 * create a class that is a <tt>Collection</tt> but is not a <tt>Set</tt>
412 * or a <tt>List</tt>) must exercise care if they choose to override the
413 * <tt>Object.equals</tt>. It is not necessary to do so, and the simplest
414 * course of action is to rely on <tt>Object</tt>'s implementation, but
415 * the implementor may wish to implement a "value comparison" in place of
416 * the default "reference comparison." (The <tt>List</tt> and
417 * <tt>Set</tt> interfaces mandate such value comparisons.)<p>
418 *
419 * The general contract for the <tt>Object.equals</tt> method states that
420 * equals must be symmetric (in other words, <tt>a.equals(b)</tt> if and
421 * only if <tt>b.equals(a)</tt>). The contracts for <tt>List.equals</tt>
422 * and <tt>Set.equals</tt> state that lists are only equal to other lists,
423 * and sets to other sets. Thus, a custom <tt>equals</tt> method for a
424 * collection class that implements neither the <tt>List</tt> nor
425 * <tt>Set</tt> interface must return <tt>false</tt> when this collection
426 * is compared to any list or set. (By the same logic, it is not possible
427 * to write a class that correctly implements both the <tt>Set</tt> and
428 * <tt>List</tt> interfaces.)
429 *
430 * @param o object to be compared for equality with this collection
431 * @return <tt>true</tt> if the specified object is equal to this
432 * collection
433 *
434 * @see Object#equals(Object)
435 * @see Set#equals(Object)
436 * @see List#equals(Object)
437 */
438 boolean equals(Object o);
439
440 /**
441 * Returns the hash code value for this collection. While the
442 * <tt>Collection</tt> interface adds no stipulations to the general
443 * contract for the <tt>Object.hashCode</tt> method, programmers should
444 * take note that any class that overrides the <tt>Object.equals</tt>
445 * method must also override the <tt>Object.hashCode</tt> method in order
446 * to satisfy the general contract for the <tt>Object.hashCode</tt> method.
447 * In particular, <tt>c1.equals(c2)</tt> implies that
448 * <tt>c1.hashCode()==c2.hashCode()</tt>.
449 *
450 * @return the hash code value for this collection
451 *
452 * @see Object#hashCode()
453 * @see Object#equals(Object)
454 */
455 int hashCode();
456}
java/pkg/java/util/Collections$1.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$2.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$AsLIFOQueue.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$CheckedCollection$1.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$CheckedCollection.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$CheckedList$1.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$CheckedList.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$CheckedMap$CheckedEntrySet$1.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$CheckedMap$CheckedEntrySet$CheckedEntry.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$CheckedMap$CheckedEntrySet.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$CheckedMap.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$CheckedRandomAccessList.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$CheckedSet.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$CheckedSortedMap.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$CheckedSortedSet.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$CopiesList.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$EmptyEnumeration.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$EmptyIterator.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$EmptyList.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$EmptyListIterator.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$EmptyMap.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$EmptySet.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$ReverseComparator.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$ReverseComparator2.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$SelfComparable.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$SetFromMap.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$SingletonList.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$SingletonMap.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$SingletonSet.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$SynchronizedCollection.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$SynchronizedList.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$SynchronizedMap.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$SynchronizedRandomAccessList.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$SynchronizedSet.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$SynchronizedSortedMap.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$SynchronizedSortedSet.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$UnmodifiableCollection$1.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$UnmodifiableCollection.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$UnmodifiableList$1.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$UnmodifiableList.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$1.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$UnmodifiableMap$UnmodifiableEntrySet.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$UnmodifiableMap.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$UnmodifiableRandomAccessList.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$UnmodifiableSet.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$UnmodifiableSortedMap.class+0−0

Binary file not shown.

java/pkg/java/util/Collections$UnmodifiableSortedSet.class+0−0

Binary file not shown.

java/pkg/java/util/Collections.class+0−0

Binary file not shown.

java/pkg/java/util/Collections.java+3966−0
@@ -0,0 +1,3966 @@
1/*
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.util;
27import java.io.Serializable;
28import java.io.ObjectOutputStream;
29import java.io.IOException;
30import java.lang.reflect.Array;
31
32/**
33 * This class consists exclusively of static methods that operate on or return
34 * collections. It contains polymorphic algorithms that operate on
35 * collections, "wrappers", which return a new collection backed by a
36 * specified collection, and a few other odds and ends.
37 *
38 * <p>The methods of this class all throw a <tt>NullPointerException</tt>
39 * if the collections or class objects provided to them are null.
40 *
41 * <p>The documentation for the polymorphic algorithms contained in this class
42 * generally includes a brief description of the <i>implementation</i>. Such
43 * descriptions should be regarded as <i>implementation notes</i>, rather than
44 * parts of the <i>specification</i>. Implementors should feel free to
45 * substitute other algorithms, so long as the specification itself is adhered
46 * to. (For example, the algorithm used by <tt>sort</tt> does not have to be
47 * a mergesort, but it does have to be <i>stable</i>.)
48 *
49 * <p>The "destructive" algorithms contained in this class, that is, the
50 * algorithms that modify the collection on which they operate, are specified
51 * to throw <tt>UnsupportedOperationException</tt> if the collection does not
52 * support the appropriate mutation primitive(s), such as the <tt>set</tt>
53 * method. These algorithms may, but are not required to, throw this
54 * exception if an invocation would have no effect on the collection. For
55 * example, invoking the <tt>sort</tt> method on an unmodifiable list that is
56 * already sorted may or may not throw <tt>UnsupportedOperationException</tt>.
57 *
58 * <p>This class is a member of the
59 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
60 * Java Collections Framework</a>.
61 *
62 * @author Josh Bloch
63 * @author Neal Gafter
64 * @see Collection
65 * @see Set
66 * @see List
67 * @see Map
68 * @since 1.2
69 */
70
71public class Collections {
72 // Suppresses default constructor, ensuring non-instantiability.
73 private Collections() {
74 }
75
76 // Algorithms
77
78 /*
79 * Tuning parameters for algorithms - Many of the List algorithms have
80 * two implementations, one of which is appropriate for RandomAccess
81 * lists, the other for "sequential." Often, the random access variant
82 * yields better performance on small sequential access lists. The
83 * tuning parameters below determine the cutoff point for what constitutes
84 * a "small" sequential access list for each algorithm. The values below
85 * were empirically determined to work well for LinkedList. Hopefully
86 * they should be reasonable for other sequential access List
87 * implementations. Those doing performance work on this code would
88 * do well to validate the values of these parameters from time to time.
89 * (The first word of each tuning parameter name is the algorithm to which
90 * it applies.)
91 */
92 private static final int BINARYSEARCH_THRESHOLD = 5000;
93 private static final int REVERSE_THRESHOLD = 18;
94 private static final int SHUFFLE_THRESHOLD = 5;
95 private static final int FILL_THRESHOLD = 25;
96 private static final int ROTATE_THRESHOLD = 100;
97 private static final int COPY_THRESHOLD = 10;
98 private static final int REPLACEALL_THRESHOLD = 11;
99 private static final int INDEXOFSUBLIST_THRESHOLD = 35;
100
101 /**
102 * Sorts the specified list into ascending order, according to the
103 * {@linkplain Comparable natural ordering} of its elements.
104 * All elements in the list must implement the {@link Comparable}
105 * interface. Furthermore, all elements in the list must be
106 * <i>mutually comparable</i> (that is, {@code e1.compareTo(e2)}
107 * must not throw a {@code ClassCastException} for any elements
108 * {@code e1} and {@code e2} in the list).
109 *
110 * <p>This sort is guaranteed to be <i>stable</i>: equal elements will
111 * not be reordered as a result of the sort.
112 *
113 * <p>The specified list must be modifiable, but need not be resizable.
114 *
115 * <p>Implementation note: This implementation is a stable, adaptive,
116 * iterative mergesort that requires far fewer than n lg(n) comparisons
117 * when the input array is partially sorted, while offering the
118 * performance of a traditional mergesort when the input array is
119 * randomly ordered. If the input array is nearly sorted, the
120 * implementation requires approximately n comparisons. Temporary
121 * storage requirements vary from a small constant for nearly sorted
122 * input arrays to n/2 object references for randomly ordered input
123 * arrays.
124 *
125 * <p>The implementation takes equal advantage of ascending and
126 * descending order in its input array, and can take advantage of
127 * ascending and descending order in different parts of the same
128 * input array. It is well-suited to merging two or more sorted arrays:
129 * simply concatenate the arrays and sort the resulting array.
130 *
131 * <p>The implementation was adapted from Tim Peters's list sort for Python
132 * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
133 * TimSort</a>). It uses techiques from Peter McIlroy's "Optimistic
134 * Sorting and Information Theoretic Complexity", in Proceedings of the
135 * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
136 * January 1993.
137 *
138 * <p>This implementation dumps the specified list into an array, sorts
139 * the array, and iterates over the list resetting each element
140 * from the corresponding position in the array. This avoids the
141 * n<sup>2</sup> log(n) performance that would result from attempting
142 * to sort a linked list in place.
143 *
144 * @param list the list to be sorted.
145 * @throws ClassCastException if the list contains elements that are not
146 * <i>mutually comparable</i> (for example, strings and integers).
147 * @throws UnsupportedOperationException if the specified list's
148 * list-iterator does not support the {@code set} operation.
149 * @throws IllegalArgumentException (optional) if the implementation
150 * detects that the natural ordering of the list elements is
151 * found to violate the {@link Comparable} contract
152 */
153 public static <T extends Comparable<? super T>> void sort(List<T> list) {
154 Object[] a = list.toArray();
155 Arrays.sort(a);
156 ListIterator<T> i = list.listIterator();
157 for (int j=0; j<a.length; j++) {
158 i.next();
159 i.set((T)a[j]);
160 }
161 }
162
163 /**
164 * Sorts the specified list according to the order induced by the
165 * specified comparator. All elements in the list must be <i>mutually
166 * comparable</i> using the specified comparator (that is,
167 * {@code c.compare(e1, e2)} must not throw a {@code ClassCastException}
168 * for any elements {@code e1} and {@code e2} in the list).
169 *
170 * <p>This sort is guaranteed to be <i>stable</i>: equal elements will
171 * not be reordered as a result of the sort.
172 *
173 * <p>The specified list must be modifiable, but need not be resizable.
174 *
175 * <p>Implementation note: This implementation is a stable, adaptive,
176 * iterative mergesort that requires far fewer than n lg(n) comparisons
177 * when the input array is partially sorted, while offering the
178 * performance of a traditional mergesort when the input array is
179 * randomly ordered. If the input array is nearly sorted, the
180 * implementation requires approximately n comparisons. Temporary
181 * storage requirements vary from a small constant for nearly sorted
182 * input arrays to n/2 object references for randomly ordered input
183 * arrays.
184 *
185 * <p>The implementation takes equal advantage of ascending and
186 * descending order in its input array, and can take advantage of
187 * ascending and descending order in different parts of the same
188 * input array. It is well-suited to merging two or more sorted arrays:
189 * simply concatenate the arrays and sort the resulting array.
190 *
191 * <p>The implementation was adapted from Tim Peters's list sort for Python
192 * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt">
193 * TimSort</a>). It uses techiques from Peter McIlroy's "Optimistic
194 * Sorting and Information Theoretic Complexity", in Proceedings of the
195 * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
196 * January 1993.
197 *
198 * <p>This implementation dumps the specified list into an array, sorts
199 * the array, and iterates over the list resetting each element
200 * from the corresponding position in the array. This avoids the
201 * n<sup>2</sup> log(n) performance that would result from attempting
202 * to sort a linked list in place.
203 *
204 * @param list the list to be sorted.
205 * @param c the comparator to determine the order of the list. A
206 * {@code null} value indicates that the elements' <i>natural
207 * ordering</i> should be used.
208 * @throws ClassCastException if the list contains elements that are not
209 * <i>mutually comparable</i> using the specified comparator.
210 * @throws UnsupportedOperationException if the specified list's
211 * list-iterator does not support the {@code set} operation.
212 * @throws IllegalArgumentException (optional) if the comparator is
213 * found to violate the {@link Comparator} contract
214 */
215 public static <T> void sort(List<T> list, Comparator<? super T> c) {
216 Object[] a = list.toArray();
217 Arrays.sort(a, (Comparator)c);
218 ListIterator i = list.listIterator();
219 for (int j=0; j<a.length; j++) {
220 i.next();
221 i.set(a[j]);
222 }
223 }
224
225
226 /**
227 * Searches the specified list for the specified object using the binary
228 * search algorithm. The list must be sorted into ascending order
229 * according to the {@linkplain Comparable natural ordering} of its
230 * elements (as by the {@link #sort(List)} method) prior to making this
231 * call. If it is not sorted, the results are undefined. If the list
232 * contains multiple elements equal to the specified object, there is no
233 * guarantee which one will be found.
234 *
235 * <p>This method runs in log(n) time for a "random access" list (which
236 * provides near-constant-time positional access). If the specified list
237 * does not implement the {@link RandomAccess} interface and is large,
238 * this method will do an iterator-based binary search that performs
239 * O(n) link traversals and O(log n) element comparisons.
240 *
241 * @param list the list to be searched.
242 * @param key the key to be searched for.
243 * @return the index of the search key, if it is contained in the list;
244 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
245 * <i>insertion point</i> is defined as the point at which the
246 * key would be inserted into the list: the index of the first
247 * element greater than the key, or <tt>list.size()</tt> if all
248 * elements in the list are less than the specified key. Note
249 * that this guarantees that the return value will be &gt;= 0 if
250 * and only if the key is found.
251 * @throws ClassCastException if the list contains elements that are not
252 * <i>mutually comparable</i> (for example, strings and
253 * integers), or the search key is not mutually comparable
254 * with the elements of the list.
255 */
256 public static <T>
257 int binarySearch(List<? extends Comparable<? super T>> list, T key) {
258 if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
259 return Collections.indexedBinarySearch(list, key);
260 else
261 return Collections.iteratorBinarySearch(list, key);
262 }
263
264 private static <T>
265 int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key)
266 {
267 int low = 0;
268 int high = list.size()-1;
269
270 while (low <= high) {
271 int mid = (low + high) >>> 1;
272 Comparable<? super T> midVal = list.get(mid);
273 int cmp = midVal.compareTo(key);
274
275 if (cmp < 0)
276 low = mid + 1;
277 else if (cmp > 0)
278 high = mid - 1;
279 else
280 return mid; // key found
281 }
282 return -(low + 1); // key not found
283 }
284
285 private static <T>
286 int iteratorBinarySearch(List<? extends Comparable<? super T>> list, T key)
287 {
288 int low = 0;
289 int high = list.size()-1;
290 ListIterator<? extends Comparable<? super T>> i = list.listIterator();
291
292 while (low <= high) {
293 int mid = (low + high) >>> 1;
294 Comparable<? super T> midVal = get(i, mid);
295 int cmp = midVal.compareTo(key);
296
297 if (cmp < 0)
298 low = mid + 1;
299 else if (cmp > 0)
300 high = mid - 1;
301 else
302 return mid; // key found
303 }
304 return -(low + 1); // key not found
305 }
306
307 /**
308 * Gets the ith element from the given list by repositioning the specified
309 * list listIterator.
310 */
311 private static <T> T get(ListIterator<? extends T> i, int index) {
312 T obj = null;
313 int pos = i.nextIndex();
314 if (pos <= index) {
315 do {
316 obj = i.next();
317 } while (pos++ < index);
318 } else {
319 do {
320 obj = i.previous();
321 } while (--pos > index);
322 }
323 return obj;
324 }
325
326 /**
327 * Searches the specified list for the specified object using the binary
328 * search algorithm. The list must be sorted into ascending order
329 * according to the specified comparator (as by the
330 * {@link #sort(List, Comparator) sort(List, Comparator)}
331 * method), prior to making this call. If it is
332 * not sorted, the results are undefined. If the list contains multiple
333 * elements equal to the specified object, there is no guarantee which one
334 * will be found.
335 *
336 * <p>This method runs in log(n) time for a "random access" list (which
337 * provides near-constant-time positional access). If the specified list
338 * does not implement the {@link RandomAccess} interface and is large,
339 * this method will do an iterator-based binary search that performs
340 * O(n) link traversals and O(log n) element comparisons.
341 *
342 * @param list the list to be searched.
343 * @param key the key to be searched for.
344 * @param c the comparator by which the list is ordered.
345 * A <tt>null</tt> value indicates that the elements'
346 * {@linkplain Comparable natural ordering} should be used.
347 * @return the index of the search key, if it is contained in the list;
348 * otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
349 * <i>insertion point</i> is defined as the point at which the
350 * key would be inserted into the list: the index of the first
351 * element greater than the key, or <tt>list.size()</tt> if all
352 * elements in the list are less than the specified key. Note
353 * that this guarantees that the return value will be &gt;= 0 if
354 * and only if the key is found.
355 * @throws ClassCastException if the list contains elements that are not
356 * <i>mutually comparable</i> using the specified comparator,
357 * or the search key is not mutually comparable with the
358 * elements of the list using this comparator.
359 */
360 public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) {
361 if (c==null)
362 return binarySearch((List) list, key);
363
364 if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
365 return Collections.indexedBinarySearch(list, key, c);
366 else
367 return Collections.iteratorBinarySearch(list, key, c);
368 }
369
370 private static <T> int indexedBinarySearch(List<? extends T> l, T key, Comparator<? super T> c) {
371 int low = 0;
372 int high = l.size()-1;
373
374 while (low <= high) {
375 int mid = (low + high) >>> 1;
376 T midVal = l.get(mid);
377 int cmp = c.compare(midVal, key);
378
379 if (cmp < 0)
380 low = mid + 1;
381 else if (cmp > 0)
382 high = mid - 1;
383 else
384 return mid; // key found
385 }
386 return -(low + 1); // key not found
387 }
388
389 private static <T> int iteratorBinarySearch(List<? extends T> l, T key, Comparator<? super T> c) {
390 int low = 0;
391 int high = l.size()-1;
392 ListIterator<? extends T> i = l.listIterator();
393
394 while (low <= high) {
395 int mid = (low + high) >>> 1;
396 T midVal = get(i, mid);
397 int cmp = c.compare(midVal, key);
398
399 if (cmp < 0)
400 low = mid + 1;
401 else if (cmp > 0)
402 high = mid - 1;
403 else
404 return mid; // key found
405 }
406 return -(low + 1); // key not found
407 }
408
409 private interface SelfComparable extends Comparable<SelfComparable> {}
410
411
412 /**
413 * Reverses the order of the elements in the specified list.<p>
414 *
415 * This method runs in linear time.
416 *
417 * @param list the list whose elements are to be reversed.
418 * @throws UnsupportedOperationException if the specified list or
419 * its list-iterator does not support the <tt>set</tt> operation.
420 */
421 public static void reverse(List<?> list) {
422 int size = list.size();
423 if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {
424 for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)
425 swap(list, i, j);
426 } else {
427 ListIterator fwd = list.listIterator();
428 ListIterator rev = list.listIterator(size);
429 for (int i=0, mid=list.size()>>1; i<mid; i++) {
430 Object tmp = fwd.next();
431 fwd.set(rev.previous());
432 rev.set(tmp);
433 }
434 }
435 }
436
437 /**
438 * Randomly permutes the specified list using a default source of
439 * randomness. All permutations occur with approximately equal
440 * likelihood.<p>
441 *
442 * The hedge "approximately" is used in the foregoing description because
443 * default source of randomness is only approximately an unbiased source
444 * of independently chosen bits. If it were a perfect source of randomly
445 * chosen bits, then the algorithm would choose permutations with perfect
446 * uniformity.<p>
447 *
448 * This implementation traverses the list backwards, from the last element
449 * up to the second, repeatedly swapping a randomly selected element into
450 * the "current position". Elements are randomly selected from the
451 * portion of the list that runs from the first element to the current
452 * position, inclusive.<p>
453 *
454 * This method runs in linear time. If the specified list does not
455 * implement the {@link RandomAccess} interface and is large, this
456 * implementation dumps the specified list into an array before shuffling
457 * it, and dumps the shuffled array back into the list. This avoids the
458 * quadratic behavior that would result from shuffling a "sequential
459 * access" list in place.
460 *
461 * @param list the list to be shuffled.
462 * @throws UnsupportedOperationException if the specified list or
463 * its list-iterator does not support the <tt>set</tt> operation.
464 */
465 public static void shuffle(List<?> list) {
466 Random rnd = r;
467 if (rnd == null)
468 r = rnd = new Random();
469 shuffle(list, rnd);
470 }
471 private static Random r;
472
473 /**
474 * Randomly permute the specified list using the specified source of
475 * randomness. All permutations occur with equal likelihood
476 * assuming that the source of randomness is fair.<p>
477 *
478 * This implementation traverses the list backwards, from the last element
479 * up to the second, repeatedly swapping a randomly selected element into
480 * the "current position". Elements are randomly selected from the
481 * portion of the list that runs from the first element to the current
482 * position, inclusive.<p>
483 *
484 * This method runs in linear time. If the specified list does not
485 * implement the {@link RandomAccess} interface and is large, this
486 * implementation dumps the specified list into an array before shuffling
487 * it, and dumps the shuffled array back into the list. This avoids the
488 * quadratic behavior that would result from shuffling a "sequential
489 * access" list in place.
490 *
491 * @param list the list to be shuffled.
492 * @param rnd the source of randomness to use to shuffle the list.
493 * @throws UnsupportedOperationException if the specified list or its
494 * list-iterator does not support the <tt>set</tt> operation.
495 */
496 public static void shuffle(List<?> list, Random rnd) {
497 int size = list.size();
498 if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
499 for (int i=size; i>1; i--)
500 swap(list, i-1, rnd.nextInt(i));
501 } else {
502 Object arr[] = list.toArray();
503
504 // Shuffle array
505 for (int i=size; i>1; i--)
506 swap(arr, i-1, rnd.nextInt(i));
507
508 // Dump array back into list
509 ListIterator it = list.listIterator();
510 for (int i=0; i<arr.length; i++) {
511 it.next();
512 it.set(arr[i]);
513 }
514 }
515 }
516
517 /**
518 * Swaps the elements at the specified positions in the specified list.
519 * (If the specified positions are equal, invoking this method leaves
520 * the list unchanged.)
521 *
522 * @param list The list in which to swap elements.
523 * @param i the index of one element to be swapped.
524 * @param j the index of the other element to be swapped.
525 * @throws IndexOutOfBoundsException if either <tt>i</tt> or <tt>j</tt>
526 * is out of range (i &lt; 0 || i &gt;= list.size()
527 * || j &lt; 0 || j &gt;= list.size()).
528 * @since 1.4
529 */
530 public static void swap(List<?> list, int i, int j) {
531 final List l = list;
532 l.set(i, l.set(j, l.get(i)));
533 }
534
535 /**
536 * Swaps the two specified elements in the specified array.
537 */
538 private static void swap(Object[] arr, int i, int j) {
539 Object tmp = arr[i];
540 arr[i] = arr[j];
541 arr[j] = tmp;
542 }
543
544 /**
545 * Replaces all of the elements of the specified list with the specified
546 * element. <p>
547 *
548 * This method runs in linear time.
549 *
550 * @param list the list to be filled with the specified element.
551 * @param obj The element with which to fill the specified list.
552 * @throws UnsupportedOperationException if the specified list or its
553 * list-iterator does not support the <tt>set</tt> operation.
554 */
555 public static <T> void fill(List<? super T> list, T obj) {
556 int size = list.size();
557
558 if (size < FILL_THRESHOLD || list instanceof RandomAccess) {
559 for (int i=0; i<size; i++)
560 list.set(i, obj);
561 } else {
562 ListIterator<? super T> itr = list.listIterator();
563 for (int i=0; i<size; i++) {
564 itr.next();
565 itr.set(obj);
566 }
567 }
568 }
569
570 /**
571 * Copies all of the elements from one list into another. After the
572 * operation, the index of each copied element in the destination list
573 * will be identical to its index in the source list. The destination
574 * list must be at least as long as the source list. If it is longer, the
575 * remaining elements in the destination list are unaffected. <p>
576 *
577 * This method runs in linear time.
578 *
579 * @param dest The destination list.
580 * @param src The source list.
581 * @throws IndexOutOfBoundsException if the destination list is too small
582 * to contain the entire source List.
583 * @throws UnsupportedOperationException if the destination list's
584 * list-iterator does not support the <tt>set</tt> operation.
585 */
586 public static <T> void copy(List<? super T> dest, List<? extends T> src) {
587 int srcSize = src.size();
588 if (srcSize > dest.size())
589 throw new IndexOutOfBoundsException("Source does not fit in dest");
590
591 if (srcSize < COPY_THRESHOLD ||
592 (src instanceof RandomAccess && dest instanceof RandomAccess)) {
593 for (int i=0; i<srcSize; i++)
594 dest.set(i, src.get(i));
595 } else {
596 ListIterator<? super T> di=dest.listIterator();
597 ListIterator<? extends T> si=src.listIterator();
598 for (int i=0; i<srcSize; i++) {
599 di.next();
600 di.set(si.next());
601 }
602 }
603 }
604
605 /**
606 * Returns the minimum element of the given collection, according to the
607 * <i>natural ordering</i> of its elements. All elements in the
608 * collection must implement the <tt>Comparable</tt> interface.
609 * Furthermore, all elements in the collection must be <i>mutually
610 * comparable</i> (that is, <tt>e1.compareTo(e2)</tt> must not throw a
611 * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
612 * <tt>e2</tt> in the collection).<p>
613 *
614 * This method iterates over the entire collection, hence it requires
615 * time proportional to the size of the collection.
616 *
617 * @param coll the collection whose minimum element is to be determined.
618 * @return the minimum element of the given collection, according
619 * to the <i>natural ordering</i> of its elements.
620 * @throws ClassCastException if the collection contains elements that are
621 * not <i>mutually comparable</i> (for example, strings and
622 * integers).
623 * @throws NoSuchElementException if the collection is empty.
624 * @see Comparable
625 */
626 public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) {
627 Iterator<? extends T> i = coll.iterator();
628 T candidate = i.next();
629
630 while (i.hasNext()) {
631 T next = i.next();
632 if (next.compareTo(candidate) < 0)
633 candidate = next;
634 }
635 return candidate;
636 }
637
638 /**
639 * Returns the minimum element of the given collection, according to the
640 * order induced by the specified comparator. All elements in the
641 * collection must be <i>mutually comparable</i> by the specified
642 * comparator (that is, <tt>comp.compare(e1, e2)</tt> must not throw a
643 * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
644 * <tt>e2</tt> in the collection).<p>
645 *
646 * This method iterates over the entire collection, hence it requires
647 * time proportional to the size of the collection.
648 *
649 * @param coll the collection whose minimum element is to be determined.
650 * @param comp the comparator with which to determine the minimum element.
651 * A <tt>null</tt> value indicates that the elements' <i>natural
652 * ordering</i> should be used.
653 * @return the minimum element of the given collection, according
654 * to the specified comparator.
655 * @throws ClassCastException if the collection contains elements that are
656 * not <i>mutually comparable</i> using the specified comparator.
657 * @throws NoSuchElementException if the collection is empty.
658 * @see Comparable
659 */
660 public static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp) {
661 if (comp==null)
662 return (T)min((Collection<SelfComparable>) (Collection) coll);
663
664 Iterator<? extends T> i = coll.iterator();
665 T candidate = i.next();
666
667 while (i.hasNext()) {
668 T next = i.next();
669 if (comp.compare(next, candidate) < 0)
670 candidate = next;
671 }
672 return candidate;
673 }
674
675 /**
676 * Returns the maximum element of the given collection, according to the
677 * <i>natural ordering</i> of its elements. All elements in the
678 * collection must implement the <tt>Comparable</tt> interface.
679 * Furthermore, all elements in the collection must be <i>mutually
680 * comparable</i> (that is, <tt>e1.compareTo(e2)</tt> must not throw a
681 * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
682 * <tt>e2</tt> in the collection).<p>
683 *
684 * This method iterates over the entire collection, hence it requires
685 * time proportional to the size of the collection.
686 *
687 * @param coll the collection whose maximum element is to be determined.
688 * @return the maximum element of the given collection, according
689 * to the <i>natural ordering</i> of its elements.
690 * @throws ClassCastException if the collection contains elements that are
691 * not <i>mutually comparable</i> (for example, strings and
692 * integers).
693 * @throws NoSuchElementException if the collection is empty.
694 * @see Comparable
695 */
696 public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
697 Iterator<? extends T> i = coll.iterator();
698 T candidate = i.next();
699
700 while (i.hasNext()) {
701 T next = i.next();
702 if (next.compareTo(candidate) > 0)
703 candidate = next;
704 }
705 return candidate;
706 }
707
708 /**
709 * Returns the maximum element of the given collection, according to the
710 * order induced by the specified comparator. All elements in the
711 * collection must be <i>mutually comparable</i> by the specified
712 * comparator (that is, <tt>comp.compare(e1, e2)</tt> must not throw a
713 * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
714 * <tt>e2</tt> in the collection).<p>
715 *
716 * This method iterates over the entire collection, hence it requires
717 * time proportional to the size of the collection.
718 *
719 * @param coll the collection whose maximum element is to be determined.
720 * @param comp the comparator with which to determine the maximum element.
721 * A <tt>null</tt> value indicates that the elements' <i>natural
722 * ordering</i> should be used.
723 * @return the maximum element of the given collection, according
724 * to the specified comparator.
725 * @throws ClassCastException if the collection contains elements that are
726 * not <i>mutually comparable</i> using the specified comparator.
727 * @throws NoSuchElementException if the collection is empty.
728 * @see Comparable
729 */
730 public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp) {
731 if (comp==null)
732 return (T)max((Collection<SelfComparable>) (Collection) coll);
733
734 Iterator<? extends T> i = coll.iterator();
735 T candidate = i.next();
736
737 while (i.hasNext()) {
738 T next = i.next();
739 if (comp.compare(next, candidate) > 0)
740 candidate = next;
741 }
742 return candidate;
743 }
744
745 /**
746 * Rotates the elements in the specified list by the specified distance.
747 * After calling this method, the element at index <tt>i</tt> will be
748 * the element previously at index <tt>(i - distance)</tt> mod
749 * <tt>list.size()</tt>, for all values of <tt>i</tt> between <tt>0</tt>
750 * and <tt>list.size()-1</tt>, inclusive. (This method has no effect on
751 * the size of the list.)
752 *
753 * <p>For example, suppose <tt>list</tt> comprises<tt> [t, a, n, k, s]</tt>.
754 * After invoking <tt>Collections.rotate(list, 1)</tt> (or
755 * <tt>Collections.rotate(list, -4)</tt>), <tt>list</tt> will comprise
756 * <tt>[s, t, a, n, k]</tt>.
757 *
758 * <p>Note that this method can usefully be applied to sublists to
759 * move one or more elements within a list while preserving the
760 * order of the remaining elements. For example, the following idiom
761 * moves the element at index <tt>j</tt> forward to position
762 * <tt>k</tt> (which must be greater than or equal to <tt>j</tt>):
763 * <pre>
764 * Collections.rotate(list.subList(j, k+1), -1);
765 * </pre>
766 * To make this concrete, suppose <tt>list</tt> comprises
767 * <tt>[a, b, c, d, e]</tt>. To move the element at index <tt>1</tt>
768 * (<tt>b</tt>) forward two positions, perform the following invocation:
769 * <pre>
770 * Collections.rotate(l.subList(1, 4), -1);
771 * </pre>
772 * The resulting list is <tt>[a, c, d, b, e]</tt>.
773 *
774 * <p>To move more than one element forward, increase the absolute value
775 * of the rotation distance. To move elements backward, use a positive
776 * shift distance.
777 *
778 * <p>If the specified list is small or implements the {@link
779 * RandomAccess} interface, this implementation exchanges the first
780 * element into the location it should go, and then repeatedly exchanges
781 * the displaced element into the location it should go until a displaced
782 * element is swapped into the first element. If necessary, the process
783 * is repeated on the second and successive elements, until the rotation
784 * is complete. If the specified list is large and doesn't implement the
785 * <tt>RandomAccess</tt> interface, this implementation breaks the
786 * list into two sublist views around index <tt>-distance mod size</tt>.
787 * Then the {@link #reverse(List)} method is invoked on each sublist view,
788 * and finally it is invoked on the entire list. For a more complete
789 * description of both algorithms, see Section 2.3 of Jon Bentley's
790 * <i>Programming Pearls</i> (Addison-Wesley, 1986).
791 *
792 * @param list the list to be rotated.
793 * @param distance the distance to rotate the list. There are no
794 * constraints on this value; it may be zero, negative, or
795 * greater than <tt>list.size()</tt>.
796 * @throws UnsupportedOperationException if the specified list or
797 * its list-iterator does not support the <tt>set</tt> operation.
798 * @since 1.4
799 */
800 public static void rotate(List<?> list, int distance) {
801 if (list instanceof RandomAccess || list.size() < ROTATE_THRESHOLD)
802 rotate1(list, distance);
803 else
804 rotate2(list, distance);
805 }
806
807 private static <T> void rotate1(List<T> list, int distance) {
808 int size = list.size();
809 if (size == 0)
810 return;
811 distance = distance % size;
812 if (distance < 0)
813 distance += size;
814 if (distance == 0)
815 return;
816
817 for (int cycleStart = 0, nMoved = 0; nMoved != size; cycleStart++) {
818 T displaced = list.get(cycleStart);
819 int i = cycleStart;
820 do {
821 i += distance;
822 if (i >= size)
823 i -= size;
824 displaced = list.set(i, displaced);
825 nMoved ++;
826 } while (i != cycleStart);
827 }
828 }
829
830 private static void rotate2(List<?> list, int distance) {
831 int size = list.size();
832 if (size == 0)
833 return;
834 int mid = -distance % size;
835 if (mid < 0)
836 mid += size;
837 if (mid == 0)
838 return;
839
840 reverse(list.subList(0, mid));
841 reverse(list.subList(mid, size));
842 reverse(list);
843 }
844
845 /**
846 * Replaces all occurrences of one specified value in a list with another.
847 * More formally, replaces with <tt>newVal</tt> each element <tt>e</tt>
848 * in <tt>list</tt> such that
849 * <tt>(oldVal==null ? e==null : oldVal.equals(e))</tt>.
850 * (This method has no effect on the size of the list.)
851 *
852 * @param list the list in which replacement is to occur.
853 * @param oldVal the old value to be replaced.
854 * @param newVal the new value with which <tt>oldVal</tt> is to be
855 * replaced.
856 * @return <tt>true</tt> if <tt>list</tt> contained one or more elements
857 * <tt>e</tt> such that
858 * <tt>(oldVal==null ? e==null : oldVal.equals(e))</tt>.
859 * @throws UnsupportedOperationException if the specified list or
860 * its list-iterator does not support the <tt>set</tt> operation.
861 * @since 1.4
862 */
863 public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal) {
864 boolean result = false;
865 int size = list.size();
866 if (size < REPLACEALL_THRESHOLD || list instanceof RandomAccess) {
867 if (oldVal==null) {
868 for (int i=0; i<size; i++) {
869 if (list.get(i)==null) {
870 list.set(i, newVal);
871 result = true;
872 }
873 }
874 } else {
875 for (int i=0; i<size; i++) {
876 if (oldVal.equals(list.get(i))) {
877 list.set(i, newVal);
878 result = true;
879 }
880 }
881 }
882 } else {
883 ListIterator<T> itr=list.listIterator();
884 if (oldVal==null) {
885 for (int i=0; i<size; i++) {
886 if (itr.next()==null) {
887 itr.set(newVal);
888 result = true;
889 }
890 }
891 } else {
892 for (int i=0; i<size; i++) {
893 if (oldVal.equals(itr.next())) {
894 itr.set(newVal);
895 result = true;
896 }
897 }
898 }
899 }
900 return result;
901 }
902
903 /**
904 * Returns the starting position of the first occurrence of the specified
905 * target list within the specified source list, or -1 if there is no
906 * such occurrence. More formally, returns the lowest index <tt>i</tt>
907 * such that <tt>source.subList(i, i+target.size()).equals(target)</tt>,
908 * or -1 if there is no such index. (Returns -1 if
909 * <tt>target.size() > source.size()</tt>.)
910 *
911 * <p>This implementation uses the "brute force" technique of scanning
912 * over the source list, looking for a match with the target at each
913 * location in turn.
914 *
915 * @param source the list in which to search for the first occurrence
916 * of <tt>target</tt>.
917 * @param target the list to search for as a subList of <tt>source</tt>.
918 * @return the starting position of the first occurrence of the specified
919 * target list within the specified source list, or -1 if there
920 * is no such occurrence.
921 * @since 1.4
922 */
923 public static int indexOfSubList(List<?> source, List<?> target) {
924 int sourceSize = source.size();
925 int targetSize = target.size();
926 int maxCandidate = sourceSize - targetSize;
927
928 if (sourceSize < INDEXOFSUBLIST_THRESHOLD ||
929 (source instanceof RandomAccess&&target instanceof RandomAccess)) {
930 nextCand:
931 for (int candidate = 0; candidate <= maxCandidate; candidate++) {
932 for (int i=0, j=candidate; i<targetSize; i++, j++)
933 if (!eq(target.get(i), source.get(j)))
934 continue nextCand; // Element mismatch, try next cand
935 return candidate; // All elements of candidate matched target
936 }
937 } else { // Iterator version of above algorithm
938 ListIterator<?> si = source.listIterator();
939 nextCand:
940 for (int candidate = 0; candidate <= maxCandidate; candidate++) {
941 ListIterator<?> ti = target.listIterator();
942 for (int i=0; i<targetSize; i++) {
943 if (!eq(ti.next(), si.next())) {
944 // Back up source iterator to next candidate
945 for (int j=0; j<i; j++)
946 si.previous();
947 continue nextCand;
948 }
949 }
950 return candidate;
951 }
952 }
953 return -1; // No candidate matched the target
954 }
955
956 /**
957 * Returns the starting position of the last occurrence of the specified
958 * target list within the specified source list, or -1 if there is no such
959 * occurrence. More formally, returns the highest index <tt>i</tt>
960 * such that <tt>source.subList(i, i+target.size()).equals(target)</tt>,
961 * or -1 if there is no such index. (Returns -1 if
962 * <tt>target.size() > source.size()</tt>.)
963 *
964 * <p>This implementation uses the "brute force" technique of iterating
965 * over the source list, looking for a match with the target at each
966 * location in turn.
967 *
968 * @param source the list in which to search for the last occurrence
969 * of <tt>target</tt>.
970 * @param target the list to search for as a subList of <tt>source</tt>.
971 * @return the starting position of the last occurrence of the specified
972 * target list within the specified source list, or -1 if there
973 * is no such occurrence.
974 * @since 1.4
975 */
976 public static int lastIndexOfSubList(List<?> source, List<?> target) {
977 int sourceSize = source.size();
978 int targetSize = target.size();
979 int maxCandidate = sourceSize - targetSize;
980
981 if (sourceSize < INDEXOFSUBLIST_THRESHOLD ||
982 source instanceof RandomAccess) { // Index access version
983 nextCand:
984 for (int candidate = maxCandidate; candidate >= 0; candidate--) {
985 for (int i=0, j=candidate; i<targetSize; i++, j++)
986 if (!eq(target.get(i), source.get(j)))
987 continue nextCand; // Element mismatch, try next cand
988 return candidate; // All elements of candidate matched target
989 }
990 } else { // Iterator version of above algorithm
991 if (maxCandidate < 0)
992 return -1;
993 ListIterator<?> si = source.listIterator(maxCandidate);
994 nextCand:
995 for (int candidate = maxCandidate; candidate >= 0; candidate--) {
996 ListIterator<?> ti = target.listIterator();
997 for (int i=0; i<targetSize; i++) {
998 if (!eq(ti.next(), si.next())) {
999 if (candidate != 0) {
1000 // Back up source iterator to next candidate
1001 for (int j=0; j<=i+1; j++)
1002 si.previous();
1003 }
1004 continue nextCand;
1005 }
1006 }
1007 return candidate;
1008 }
1009 }
1010 return -1; // No candidate matched the target
1011 }
1012
1013
1014 // Unmodifiable Wrappers
1015
1016 /**
1017 * Returns an unmodifiable view of the specified collection. This method
1018 * allows modules to provide users with "read-only" access to internal
1019 * collections. Query operations on the returned collection "read through"
1020 * to the specified collection, and attempts to modify the returned
1021 * collection, whether direct or via its iterator, result in an
1022 * <tt>UnsupportedOperationException</tt>.<p>
1023 *
1024 * The returned collection does <i>not</i> pass the hashCode and equals
1025 * operations through to the backing collection, but relies on
1026 * <tt>Object</tt>'s <tt>equals</tt> and <tt>hashCode</tt> methods. This
1027 * is necessary to preserve the contracts of these operations in the case
1028 * that the backing collection is a set or a list.<p>
1029 *
1030 * The returned collection will be serializable if the specified collection
1031 * is serializable.
1032 *
1033 * @param c the collection for which an unmodifiable view is to be
1034 * returned.
1035 * @return an unmodifiable view of the specified collection.
1036 */
1037 public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) {
1038 return new UnmodifiableCollection<>(c);
1039 }
1040
1041 /**
1042 * @serial include
1043 */
1044 static class UnmodifiableCollection<E> implements Collection<E>, Serializable {
1045 private static final long serialVersionUID = 1820017752578914078L;
1046
1047 final Collection<? extends E> c;
1048
1049 UnmodifiableCollection(Collection<? extends E> c) {
1050 if (c==null)
1051 throw new NullPointerException();
1052 this.c = c;
1053 }
1054
1055 public int size() {return c.size();}
1056 public boolean isEmpty() {return c.isEmpty();}
1057 public boolean contains(Object o) {return c.contains(o);}
1058 public Object[] toArray() {return c.toArray();}
1059 public <T> T[] toArray(T[] a) {return c.toArray(a);}
1060 public String toString() {return c.toString();}
1061
1062 public Iterator<E> iterator() {
1063 return new Iterator<E>() {
1064 private final Iterator<? extends E> i = c.iterator();
1065
1066 public boolean hasNext() {return i.hasNext();}
1067 public E next() {return i.next();}
1068 public void remove() {
1069 throw new UnsupportedOperationException();
1070 }
1071 };
1072 }
1073
1074 public boolean add(E e) {
1075 throw new UnsupportedOperationException();
1076 }
1077 public boolean remove(Object o) {
1078 throw new UnsupportedOperationException();
1079 }
1080
1081 public boolean containsAll(Collection<?> coll) {
1082 return c.containsAll(coll);
1083 }
1084 public boolean addAll(Collection<? extends E> coll) {
1085 throw new UnsupportedOperationException();
1086 }
1087 public boolean removeAll(Collection<?> coll) {
1088 throw new UnsupportedOperationException();
1089 }
1090 public boolean retainAll(Collection<?> coll) {
1091 throw new UnsupportedOperationException();
1092 }
1093 public void clear() {
1094 throw new UnsupportedOperationException();
1095 }
1096 }
1097
1098 /**
1099 * Returns an unmodifiable view of the specified set. This method allows
1100 * modules to provide users with "read-only" access to internal sets.
1101 * Query operations on the returned set "read through" to the specified
1102 * set, and attempts to modify the returned set, whether direct or via its
1103 * iterator, result in an <tt>UnsupportedOperationException</tt>.<p>
1104 *
1105 * The returned set will be serializable if the specified set
1106 * is serializable.
1107 *
1108 * @param s the set for which an unmodifiable view is to be returned.
1109 * @return an unmodifiable view of the specified set.
1110 */
1111 public static <T> Set<T> unmodifiableSet(Set<? extends T> s) {
1112 return new UnmodifiableSet<>(s);
1113 }
1114
1115 /**
1116 * @serial include
1117 */
1118 static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
1119 implements Set<E>, Serializable {
1120 private static final long serialVersionUID = -9215047833775013803L;
1121
1122 UnmodifiableSet(Set<? extends E> s) {super(s);}
1123 public boolean equals(Object o) {return o == this || c.equals(o);}
1124 public int hashCode() {return c.hashCode();}
1125 }
1126
1127 /**
1128 * Returns an unmodifiable view of the specified sorted set. This method
1129 * allows modules to provide users with "read-only" access to internal
1130 * sorted sets. Query operations on the returned sorted set "read
1131 * through" to the specified sorted set. Attempts to modify the returned
1132 * sorted set, whether direct, via its iterator, or via its
1133 * <tt>subSet</tt>, <tt>headSet</tt>, or <tt>tailSet</tt> views, result in
1134 * an <tt>UnsupportedOperationException</tt>.<p>
1135 *
1136 * The returned sorted set will be serializable if the specified sorted set
1137 * is serializable.
1138 *
1139 * @param s the sorted set for which an unmodifiable view is to be
1140 * returned.
1141 * @return an unmodifiable view of the specified sorted set.
1142 */
1143 public static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s) {
1144 return new UnmodifiableSortedSet<>(s);
1145 }
1146
1147 /**
1148 * @serial include
1149 */
1150 static class UnmodifiableSortedSet<E>
1151 extends UnmodifiableSet<E>
1152 implements SortedSet<E>, Serializable {
1153 private static final long serialVersionUID = -4929149591599911165L;
1154 private final SortedSet<E> ss;
1155
1156 UnmodifiableSortedSet(SortedSet<E> s) {super(s); ss = s;}
1157
1158 public Comparator<? super E> comparator() {return ss.comparator();}
1159
1160 public SortedSet<E> subSet(E fromElement, E toElement) {
1161 return new UnmodifiableSortedSet<>(ss.subSet(fromElement,toElement));
1162 }
1163 public SortedSet<E> headSet(E toElement) {
1164 return new UnmodifiableSortedSet<>(ss.headSet(toElement));
1165 }
1166 public SortedSet<E> tailSet(E fromElement) {
1167 return new UnmodifiableSortedSet<>(ss.tailSet(fromElement));
1168 }
1169
1170 public E first() {return ss.first();}
1171 public E last() {return ss.last();}
1172 }
1173
1174 /**
1175 * Returns an unmodifiable view of the specified list. This method allows
1176 * modules to provide users with "read-only" access to internal
1177 * lists. Query operations on the returned list "read through" to the
1178 * specified list, and attempts to modify the returned list, whether
1179 * direct or via its iterator, result in an
1180 * <tt>UnsupportedOperationException</tt>.<p>
1181 *
1182 * The returned list will be serializable if the specified list
1183 * is serializable. Similarly, the returned list will implement
1184 * {@link RandomAccess} if the specified list does.
1185 *
1186 * @param list the list for which an unmodifiable view is to be returned.
1187 * @return an unmodifiable view of the specified list.
1188 */
1189 public static <T> List<T> unmodifiableList(List<? extends T> list) {
1190 return (list instanceof RandomAccess ?
1191 new UnmodifiableRandomAccessList<>(list) :
1192 new UnmodifiableList<>(list));
1193 }
1194
1195 /**
1196 * @serial include
1197 */
1198 static class UnmodifiableList<E> extends UnmodifiableCollection<E>
1199 implements List<E> {
1200 private static final long serialVersionUID = -283967356065247728L;
1201 final List<? extends E> list;
1202
1203 UnmodifiableList(List<? extends E> list) {
1204 super(list);
1205 this.list = list;
1206 }
1207
1208 public boolean equals(Object o) {return o == this || list.equals(o);}
1209 public int hashCode() {return list.hashCode();}
1210
1211 public E get(int index) {return list.get(index);}
1212 public E set(int index, E element) {
1213 throw new UnsupportedOperationException();
1214 }
1215 public void add(int index, E element) {
1216 throw new UnsupportedOperationException();
1217 }
1218 public E remove(int index) {
1219 throw new UnsupportedOperationException();
1220 }
1221 public int indexOf(Object o) {return list.indexOf(o);}
1222 public int lastIndexOf(Object o) {return list.lastIndexOf(o);}
1223 public boolean addAll(int index, Collection<? extends E> c) {
1224 throw new UnsupportedOperationException();
1225 }
1226 public ListIterator<E> listIterator() {return listIterator(0);}
1227
1228 public ListIterator<E> listIterator(final int index) {
1229 return new ListIterator<E>() {
1230 private final ListIterator<? extends E> i
1231 = list.listIterator(index);
1232
1233 public boolean hasNext() {return i.hasNext();}
1234 public E next() {return i.next();}
1235 public boolean hasPrevious() {return i.hasPrevious();}
1236 public E previous() {return i.previous();}
1237 public int nextIndex() {return i.nextIndex();}
1238 public int previousIndex() {return i.previousIndex();}
1239
1240 public void remove() {
1241 throw new UnsupportedOperationException();
1242 }
1243 public void set(E e) {
1244 throw new UnsupportedOperationException();
1245 }
1246 public void add(E e) {
1247 throw new UnsupportedOperationException();
1248 }
1249 };
1250 }
1251
1252 public List<E> subList(int fromIndex, int toIndex) {
1253 return new UnmodifiableList<>(list.subList(fromIndex, toIndex));
1254 }
1255
1256 /**
1257 * UnmodifiableRandomAccessList instances are serialized as
1258 * UnmodifiableList instances to allow them to be deserialized
1259 * in pre-1.4 JREs (which do not have UnmodifiableRandomAccessList).
1260 * This method inverts the transformation. As a beneficial
1261 * side-effect, it also grafts the RandomAccess marker onto
1262 * UnmodifiableList instances that were serialized in pre-1.4 JREs.
1263 *
1264 * Note: Unfortunately, UnmodifiableRandomAccessList instances
1265 * serialized in 1.4.1 and deserialized in 1.4 will become
1266 * UnmodifiableList instances, as this method was missing in 1.4.
1267 */
1268 private Object readResolve() {
1269 return (list instanceof RandomAccess
1270 ? new UnmodifiableRandomAccessList<>(list)
1271 : this);
1272 }
1273 }
1274
1275 /**
1276 * @serial include
1277 */
1278 static class UnmodifiableRandomAccessList<E> extends UnmodifiableList<E>
1279 implements RandomAccess
1280 {
1281 UnmodifiableRandomAccessList(List<? extends E> list) {
1282 super(list);
1283 }
1284
1285 public List<E> subList(int fromIndex, int toIndex) {
1286 return new UnmodifiableRandomAccessList<>(
1287 list.subList(fromIndex, toIndex));
1288 }
1289
1290 private static final long serialVersionUID = -2542308836966382001L;
1291
1292 /**
1293 * Allows instances to be deserialized in pre-1.4 JREs (which do
1294 * not have UnmodifiableRandomAccessList). UnmodifiableList has
1295 * a readResolve method that inverts this transformation upon
1296 * deserialization.
1297 */
1298 private Object writeReplace() {
1299 return new UnmodifiableList<>(list);
1300 }
1301 }
1302
1303 /**
1304 * Returns an unmodifiable view of the specified map. This method
1305 * allows modules to provide users with "read-only" access to internal
1306 * maps. Query operations on the returned map "read through"
1307 * to the specified map, and attempts to modify the returned
1308 * map, whether direct or via its collection views, result in an
1309 * <tt>UnsupportedOperationException</tt>.<p>
1310 *
1311 * The returned map will be serializable if the specified map
1312 * is serializable.
1313 *
1314 * @param m the map for which an unmodifiable view is to be returned.
1315 * @return an unmodifiable view of the specified map.
1316 */
1317 public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m) {
1318 return new UnmodifiableMap<>(m);
1319 }
1320
1321 /**
1322 * @serial include
1323 */
1324 private static class UnmodifiableMap<K,V> implements Map<K,V>, Serializable {
1325 private static final long serialVersionUID = -1034234728574286014L;
1326
1327 private final Map<? extends K, ? extends V> m;
1328
1329 UnmodifiableMap(Map<? extends K, ? extends V> m) {
1330 if (m==null)
1331 throw new NullPointerException();
1332 this.m = m;
1333 }
1334
1335 public int size() {return m.size();}
1336 public boolean isEmpty() {return m.isEmpty();}
1337 public boolean containsKey(Object key) {return m.containsKey(key);}
1338 public boolean containsValue(Object val) {return m.containsValue(val);}
1339 public V get(Object key) {return m.get(key);}
1340
1341 public V put(K key, V value) {
1342 throw new UnsupportedOperationException();
1343 }
1344 public V remove(Object key) {
1345 throw new UnsupportedOperationException();
1346 }
1347 public void putAll(Map<? extends K, ? extends V> m) {
1348 throw new UnsupportedOperationException();
1349 }
1350 public void clear() {
1351 throw new UnsupportedOperationException();
1352 }
1353
1354 private transient Set<K> keySet = null;
1355 private transient Set<Map.Entry<K,V>> entrySet = null;
1356 private transient Collection<V> values = null;
1357
1358 public Set<K> keySet() {
1359 if (keySet==null)
1360 keySet = unmodifiableSet(m.keySet());
1361 return keySet;
1362 }
1363
1364 public Set<Map.Entry<K,V>> entrySet() {
1365 if (entrySet==null)
1366 entrySet = new UnmodifiableEntrySet<>(m.entrySet());
1367 return entrySet;
1368 }
1369
1370 public Collection<V> values() {
1371 if (values==null)
1372 values = unmodifiableCollection(m.values());
1373 return values;
1374 }
1375
1376 public boolean equals(Object o) {return o == this || m.equals(o);}
1377 public int hashCode() {return m.hashCode();}
1378 public String toString() {return m.toString();}
1379
1380 /**
1381 * We need this class in addition to UnmodifiableSet as
1382 * Map.Entries themselves permit modification of the backing Map
1383 * via their setValue operation. This class is subtle: there are
1384 * many possible attacks that must be thwarted.
1385 *
1386 * @serial include
1387 */
1388 static class UnmodifiableEntrySet<K,V>
1389 extends UnmodifiableSet<Map.Entry<K,V>> {
1390 private static final long serialVersionUID = 7854390611657943733L;
1391
1392 UnmodifiableEntrySet(Set<? extends Map.Entry<? extends K, ? extends V>> s) {
1393 super((Set)s);
1394 }
1395 public Iterator<Map.Entry<K,V>> iterator() {
1396 return new Iterator<Map.Entry<K,V>>() {
1397 private final Iterator<? extends Map.Entry<? extends K, ? extends V>> i = c.iterator();
1398
1399 public boolean hasNext() {
1400 return i.hasNext();
1401 }
1402 public Map.Entry<K,V> next() {
1403 return new UnmodifiableEntry<>(i.next());
1404 }
1405 public void remove() {
1406 throw new UnsupportedOperationException();
1407 }
1408 };
1409 }
1410
1411 public Object[] toArray() {
1412 Object[] a = c.toArray();
1413 for (int i=0; i<a.length; i++)
1414 a[i] = new UnmodifiableEntry<>((Map.Entry<K,V>)a[i]);
1415 return a;
1416 }
1417
1418 public <T> T[] toArray(T[] a) {
1419 // We don't pass a to c.toArray, to avoid window of
1420 // vulnerability wherein an unscrupulous multithreaded client
1421 // could get his hands on raw (unwrapped) Entries from c.
1422 Object[] arr = c.toArray(a.length==0 ? a : Arrays.copyOf(a, 0));
1423
1424 for (int i=0; i<arr.length; i++)
1425 arr[i] = new UnmodifiableEntry<>((Map.Entry<K,V>)arr[i]);
1426
1427 if (arr.length > a.length)
1428 return (T[])arr;
1429
1430 System.arraycopy(arr, 0, a, 0, arr.length);
1431 if (a.length > arr.length)
1432 a[arr.length] = null;
1433 return a;
1434 }
1435
1436 /**
1437 * This method is overridden to protect the backing set against
1438 * an object with a nefarious equals function that senses
1439 * that the equality-candidate is Map.Entry and calls its
1440 * setValue method.
1441 */
1442 public boolean contains(Object o) {
1443 if (!(o instanceof Map.Entry))
1444 return false;
1445 return c.contains(
1446 new UnmodifiableEntry<>((Map.Entry<?,?>) o));
1447 }
1448
1449 /**
1450 * The next two methods are overridden to protect against
1451 * an unscrupulous List whose contains(Object o) method senses
1452 * when o is a Map.Entry, and calls o.setValue.
1453 */
1454 public boolean containsAll(Collection<?> coll) {
1455 for (Object e : coll) {
1456 if (!contains(e)) // Invokes safe contains() above
1457 return false;
1458 }
1459 return true;
1460 }
1461 public boolean equals(Object o) {
1462 if (o == this)
1463 return true;
1464
1465 if (!(o instanceof Set))
1466 return false;
1467 Set s = (Set) o;
1468 if (s.size() != c.size())
1469 return false;
1470 return containsAll(s); // Invokes safe containsAll() above
1471 }
1472
1473 /**
1474 * This "wrapper class" serves two purposes: it prevents
1475 * the client from modifying the backing Map, by short-circuiting
1476 * the setValue method, and it protects the backing Map against
1477 * an ill-behaved Map.Entry that attempts to modify another
1478 * Map Entry when asked to perform an equality check.
1479 */
1480 private static class UnmodifiableEntry<K,V> implements Map.Entry<K,V> {
1481 private Map.Entry<? extends K, ? extends V> e;
1482
1483 UnmodifiableEntry(Map.Entry<? extends K, ? extends V> e) {this.e = e;}
1484
1485 public K getKey() {return e.getKey();}
1486 public V getValue() {return e.getValue();}
1487 public V setValue(V value) {
1488 throw new UnsupportedOperationException();
1489 }
1490 public int hashCode() {return e.hashCode();}
1491 public boolean equals(Object o) {
1492 if (!(o instanceof Map.Entry))
1493 return false;
1494 Map.Entry t = (Map.Entry)o;
1495 return eq(e.getKey(), t.getKey()) &&
1496 eq(e.getValue(), t.getValue());
1497 }
1498 public String toString() {return e.toString();}
1499 }
1500 }
1501 }
1502
1503 /**
1504 * Returns an unmodifiable view of the specified sorted map. This method
1505 * allows modules to provide users with "read-only" access to internal
1506 * sorted maps. Query operations on the returned sorted map "read through"
1507 * to the specified sorted map. Attempts to modify the returned
1508 * sorted map, whether direct, via its collection views, or via its
1509 * <tt>subMap</tt>, <tt>headMap</tt>, or <tt>tailMap</tt> views, result in
1510 * an <tt>UnsupportedOperationException</tt>.<p>
1511 *
1512 * The returned sorted map will be serializable if the specified sorted map
1513 * is serializable.
1514 *
1515 * @param m the sorted map for which an unmodifiable view is to be
1516 * returned.
1517 * @return an unmodifiable view of the specified sorted map.
1518 */
1519 public static <K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K, ? extends V> m) {
1520 return new UnmodifiableSortedMap<>(m);
1521 }
1522
1523 /**
1524 * @serial include
1525 */
1526 static class UnmodifiableSortedMap<K,V>
1527 extends UnmodifiableMap<K,V>
1528 implements SortedMap<K,V>, Serializable {
1529 private static final long serialVersionUID = -8806743815996713206L;
1530
1531 private final SortedMap<K, ? extends V> sm;
1532
1533 UnmodifiableSortedMap(SortedMap<K, ? extends V> m) {super(m); sm = m;}
1534
1535 public Comparator<? super K> comparator() {return sm.comparator();}
1536
1537 public SortedMap<K,V> subMap(K fromKey, K toKey) {
1538 return new UnmodifiableSortedMap<>(sm.subMap(fromKey, toKey));
1539 }
1540 public SortedMap<K,V> headMap(K toKey) {
1541 return new UnmodifiableSortedMap<>(sm.headMap(toKey));
1542 }
1543 public SortedMap<K,V> tailMap(K fromKey) {
1544 return new UnmodifiableSortedMap<>(sm.tailMap(fromKey));
1545 }
1546
1547 public K firstKey() {return sm.firstKey();}
1548 public K lastKey() {return sm.lastKey();}
1549 }
1550
1551
1552 // Synch Wrappers
1553
1554 /**
1555 * Returns a synchronized (thread-safe) collection backed by the specified
1556 * collection. In order to guarantee serial access, it is critical that
1557 * <strong>all</strong> access to the backing collection is accomplished
1558 * through the returned collection.<p>
1559 *
1560 * It is imperative that the user manually synchronize on the returned
1561 * collection when iterating over it:
1562 * <pre>
1563 * Collection c = Collections.synchronizedCollection(myCollection);
1564 * ...
1565 * synchronized (c) {
1566 * Iterator i = c.iterator(); // Must be in the synchronized block
1567 * while (i.hasNext())
1568 * foo(i.next());
1569 * }
1570 * </pre>
1571 * Failure to follow this advice may result in non-deterministic behavior.
1572 *
1573 * <p>The returned collection does <i>not</i> pass the <tt>hashCode</tt>
1574 * and <tt>equals</tt> operations through to the backing collection, but
1575 * relies on <tt>Object</tt>'s equals and hashCode methods. This is
1576 * necessary to preserve the contracts of these operations in the case
1577 * that the backing collection is a set or a list.<p>
1578 *
1579 * The returned collection will be serializable if the specified collection
1580 * is serializable.
1581 *
1582 * @param c the collection to be "wrapped" in a synchronized collection.
1583 * @return a synchronized view of the specified collection.
1584 */
1585 public static <T> Collection<T> synchronizedCollection(Collection<T> c) {
1586 return new SynchronizedCollection<>(c);
1587 }
1588
1589 static <T> Collection<T> synchronizedCollection(Collection<T> c, Object mutex) {
1590 return new SynchronizedCollection<>(c, mutex);
1591 }
1592
1593 /**
1594 * @serial include
1595 */
1596 static class SynchronizedCollection<E> implements Collection<E>, Serializable {
1597 private static final long serialVersionUID = 3053995032091335093L;
1598
1599 final Collection<E> c; // Backing Collection
1600 final Object mutex; // Object on which to synchronize
1601
1602 SynchronizedCollection(Collection<E> c) {
1603 if (c==null)
1604 throw new NullPointerException();
1605 this.c = c;
1606 mutex = this;
1607 }
1608 SynchronizedCollection(Collection<E> c, Object mutex) {
1609 this.c = c;
1610 this.mutex = mutex;
1611 }
1612
1613 public int size() {
1614 synchronized (mutex) {return c.size();}
1615 }
1616 public boolean isEmpty() {
1617 synchronized (mutex) {return c.isEmpty();}
1618 }
1619 public boolean contains(Object o) {
1620 synchronized (mutex) {return c.contains(o);}
1621 }
1622 public Object[] toArray() {
1623 synchronized (mutex) {return c.toArray();}
1624 }
1625 public <T> T[] toArray(T[] a) {
1626 synchronized (mutex) {return c.toArray(a);}
1627 }
1628
1629 public Iterator<E> iterator() {
1630 return c.iterator(); // Must be manually synched by user!
1631 }
1632
1633 public boolean add(E e) {
1634 synchronized (mutex) {return c.add(e);}
1635 }
1636 public boolean remove(Object o) {
1637 synchronized (mutex) {return c.remove(o);}
1638 }
1639
1640 public boolean containsAll(Collection<?> coll) {
1641 synchronized (mutex) {return c.containsAll(coll);}
1642 }
1643 public boolean addAll(Collection<? extends E> coll) {
1644 synchronized (mutex) {return c.addAll(coll);}
1645 }
1646 public boolean removeAll(Collection<?> coll) {
1647 synchronized (mutex) {return c.removeAll(coll);}
1648 }
1649 public boolean retainAll(Collection<?> coll) {
1650 synchronized (mutex) {return c.retainAll(coll);}
1651 }
1652 public void clear() {
1653 synchronized (mutex) {c.clear();}
1654 }
1655 public String toString() {
1656 synchronized (mutex) {return c.toString();}
1657 }
1658 private void writeObject(ObjectOutputStream s) throws IOException {
1659 synchronized (mutex) {s.defaultWriteObject();}
1660 }
1661 }
1662
1663 /**
1664 * Returns a synchronized (thread-safe) set backed by the specified
1665 * set. In order to guarantee serial access, it is critical that
1666 * <strong>all</strong> access to the backing set is accomplished
1667 * through the returned set.<p>
1668 *
1669 * It is imperative that the user manually synchronize on the returned
1670 * set when iterating over it:
1671 * <pre>
1672 * Set s = Collections.synchronizedSet(new HashSet());
1673 * ...
1674 * synchronized (s) {
1675 * Iterator i = s.iterator(); // Must be in the synchronized block
1676 * while (i.hasNext())
1677 * foo(i.next());
1678 * }
1679 * </pre>
1680 * Failure to follow this advice may result in non-deterministic behavior.
1681 *
1682 * <p>The returned set will be serializable if the specified set is
1683 * serializable.
1684 *
1685 * @param s the set to be "wrapped" in a synchronized set.
1686 * @return a synchronized view of the specified set.
1687 */
1688 public static <T> Set<T> synchronizedSet(Set<T> s) {
1689 return new SynchronizedSet<>(s);
1690 }
1691
1692 static <T> Set<T> synchronizedSet(Set<T> s, Object mutex) {
1693 return new SynchronizedSet<>(s, mutex);
1694 }
1695
1696 /**
1697 * @serial include
1698 */
1699 static class SynchronizedSet<E>
1700 extends SynchronizedCollection<E>
1701 implements Set<E> {
1702 private static final long serialVersionUID = 487447009682186044L;
1703
1704 SynchronizedSet(Set<E> s) {
1705 super(s);
1706 }
1707 SynchronizedSet(Set<E> s, Object mutex) {
1708 super(s, mutex);
1709 }
1710
1711 public boolean equals(Object o) {
1712 synchronized (mutex) {return c.equals(o);}
1713 }
1714 public int hashCode() {
1715 synchronized (mutex) {return c.hashCode();}
1716 }
1717 }
1718
1719 /**
1720 * Returns a synchronized (thread-safe) sorted set backed by the specified
1721 * sorted set. In order to guarantee serial access, it is critical that
1722 * <strong>all</strong> access to the backing sorted set is accomplished
1723 * through the returned sorted set (or its views).<p>
1724 *
1725 * It is imperative that the user manually synchronize on the returned
1726 * sorted set when iterating over it or any of its <tt>subSet</tt>,
1727 * <tt>headSet</tt>, or <tt>tailSet</tt> views.
1728 * <pre>
1729 * SortedSet s = Collections.synchronizedSortedSet(new TreeSet());
1730 * ...
1731 * synchronized (s) {
1732 * Iterator i = s.iterator(); // Must be in the synchronized block
1733 * while (i.hasNext())
1734 * foo(i.next());
1735 * }
1736 * </pre>
1737 * or:
1738 * <pre>
1739 * SortedSet s = Collections.synchronizedSortedSet(new TreeSet());
1740 * SortedSet s2 = s.headSet(foo);
1741 * ...
1742 * synchronized (s) { // Note: s, not s2!!!
1743 * Iterator i = s2.iterator(); // Must be in the synchronized block
1744 * while (i.hasNext())
1745 * foo(i.next());
1746 * }
1747 * </pre>
1748 * Failure to follow this advice may result in non-deterministic behavior.
1749 *
1750 * <p>The returned sorted set will be serializable if the specified
1751 * sorted set is serializable.
1752 *
1753 * @param s the sorted set to be "wrapped" in a synchronized sorted set.
1754 * @return a synchronized view of the specified sorted set.
1755 */
1756 public static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s) {
1757 return new SynchronizedSortedSet<>(s);
1758 }
1759
1760 /**
1761 * @serial include
1762 */
1763 static class SynchronizedSortedSet<E>
1764 extends SynchronizedSet<E>
1765 implements SortedSet<E>
1766 {
1767 private static final long serialVersionUID = 8695801310862127406L;
1768
1769 private final SortedSet<E> ss;
1770
1771 SynchronizedSortedSet(SortedSet<E> s) {
1772 super(s);
1773 ss = s;
1774 }
1775 SynchronizedSortedSet(SortedSet<E> s, Object mutex) {
1776 super(s, mutex);
1777 ss = s;
1778 }
1779
1780 public Comparator<? super E> comparator() {
1781 synchronized (mutex) {return ss.comparator();}
1782 }
1783
1784 public SortedSet<E> subSet(E fromElement, E toElement) {
1785 synchronized (mutex) {
1786 return new SynchronizedSortedSet<>(
1787 ss.subSet(fromElement, toElement), mutex);
1788 }
1789 }
1790 public SortedSet<E> headSet(E toElement) {
1791 synchronized (mutex) {
1792 return new SynchronizedSortedSet<>(ss.headSet(toElement), mutex);
1793 }
1794 }
1795 public SortedSet<E> tailSet(E fromElement) {
1796 synchronized (mutex) {
1797 return new SynchronizedSortedSet<>(ss.tailSet(fromElement),mutex);
1798 }
1799 }
1800
1801 public E first() {
1802 synchronized (mutex) {return ss.first();}
1803 }
1804 public E last() {
1805 synchronized (mutex) {return ss.last();}
1806 }
1807 }
1808
1809 /**
1810 * Returns a synchronized (thread-safe) list backed by the specified
1811 * list. In order to guarantee serial access, it is critical that
1812 * <strong>all</strong> access to the backing list is accomplished
1813 * through the returned list.<p>
1814 *
1815 * It is imperative that the user manually synchronize on the returned
1816 * list when iterating over it:
1817 * <pre>
1818 * List list = Collections.synchronizedList(new ArrayList());
1819 * ...
1820 * synchronized (list) {
1821 * Iterator i = list.iterator(); // Must be in synchronized block
1822 * while (i.hasNext())
1823 * foo(i.next());
1824 * }
1825 * </pre>
1826 * Failure to follow this advice may result in non-deterministic behavior.
1827 *
1828 * <p>The returned list will be serializable if the specified list is
1829 * serializable.
1830 *
1831 * @param list the list to be "wrapped" in a synchronized list.
1832 * @return a synchronized view of the specified list.
1833 */
1834 public static <T> List<T> synchronizedList(List<T> list) {
1835 return (list instanceof RandomAccess ?
1836 new SynchronizedRandomAccessList<>(list) :
1837 new SynchronizedList<>(list));
1838 }
1839
1840 static <T> List<T> synchronizedList(List<T> list, Object mutex) {
1841 return (list instanceof RandomAccess ?
1842 new SynchronizedRandomAccessList<>(list, mutex) :
1843 new SynchronizedList<>(list, mutex));
1844 }
1845
1846 /**
1847 * @serial include
1848 */
1849 static class SynchronizedList<E>
1850 extends SynchronizedCollection<E>
1851 implements List<E> {
1852 private static final long serialVersionUID = -7754090372962971524L;
1853
1854 final List<E> list;
1855
1856 SynchronizedList(List<E> list) {
1857 super(list);
1858 this.list = list;
1859 }
1860 SynchronizedList(List<E> list, Object mutex) {
1861 super(list, mutex);
1862 this.list = list;
1863 }
1864
1865 public boolean equals(Object o) {
1866 synchronized (mutex) {return list.equals(o);}
1867 }
1868 public int hashCode() {
1869 synchronized (mutex) {return list.hashCode();}
1870 }
1871
1872 public E get(int index) {
1873 synchronized (mutex) {return list.get(index);}
1874 }
1875 public E set(int index, E element) {
1876 synchronized (mutex) {return list.set(index, element);}
1877 }
1878 public void add(int index, E element) {
1879 synchronized (mutex) {list.add(index, element);}
1880 }
1881 public E remove(int index) {
1882 synchronized (mutex) {return list.remove(index);}
1883 }
1884
1885 public int indexOf(Object o) {
1886 synchronized (mutex) {return list.indexOf(o);}
1887 }
1888 public int lastIndexOf(Object o) {
1889 synchronized (mutex) {return list.lastIndexOf(o);}
1890 }
1891
1892 public boolean addAll(int index, Collection<? extends E> c) {
1893 synchronized (mutex) {return list.addAll(index, c);}
1894 }
1895
1896 public ListIterator<E> listIterator() {
1897 return list.listIterator(); // Must be manually synched by user
1898 }
1899
1900 public ListIterator<E> listIterator(int index) {
1901 return list.listIterator(index); // Must be manually synched by user
1902 }
1903
1904 public List<E> subList(int fromIndex, int toIndex) {
1905 synchronized (mutex) {
1906 return new SynchronizedList<>(list.subList(fromIndex, toIndex),
1907 mutex);
1908 }
1909 }
1910
1911 /**
1912 * SynchronizedRandomAccessList instances are serialized as
1913 * SynchronizedList instances to allow them to be deserialized
1914 * in pre-1.4 JREs (which do not have SynchronizedRandomAccessList).
1915 * This method inverts the transformation. As a beneficial
1916 * side-effect, it also grafts the RandomAccess marker onto
1917 * SynchronizedList instances that were serialized in pre-1.4 JREs.
1918 *
1919 * Note: Unfortunately, SynchronizedRandomAccessList instances
1920 * serialized in 1.4.1 and deserialized in 1.4 will become
1921 * SynchronizedList instances, as this method was missing in 1.4.
1922 */
1923 private Object readResolve() {
1924 return (list instanceof RandomAccess
1925 ? new SynchronizedRandomAccessList<>(list)
1926 : this);
1927 }
1928 }
1929
1930 /**
1931 * @serial include
1932 */
1933 static class SynchronizedRandomAccessList<E>
1934 extends SynchronizedList<E>
1935 implements RandomAccess {
1936
1937 SynchronizedRandomAccessList(List<E> list) {
1938 super(list);
1939 }
1940
1941 SynchronizedRandomAccessList(List<E> list, Object mutex) {
1942 super(list, mutex);
1943 }
1944
1945 public List<E> subList(int fromIndex, int toIndex) {
1946 synchronized (mutex) {
1947 return new SynchronizedRandomAccessList<>(
1948 list.subList(fromIndex, toIndex), mutex);
1949 }
1950 }
1951
1952 private static final long serialVersionUID = 1530674583602358482L;
1953
1954 /**
1955 * Allows instances to be deserialized in pre-1.4 JREs (which do
1956 * not have SynchronizedRandomAccessList). SynchronizedList has
1957 * a readResolve method that inverts this transformation upon
1958 * deserialization.
1959 */
1960 private Object writeReplace() {
1961 return new SynchronizedList<>(list);
1962 }
1963 }
1964
1965 /**
1966 * Returns a synchronized (thread-safe) map backed by the specified
1967 * map. In order to guarantee serial access, it is critical that
1968 * <strong>all</strong> access to the backing map is accomplished
1969 * through the returned map.<p>
1970 *
1971 * It is imperative that the user manually synchronize on the returned
1972 * map when iterating over any of its collection views:
1973 * <pre>
1974 * Map m = Collections.synchronizedMap(new HashMap());
1975 * ...
1976 * Set s = m.keySet(); // Needn't be in synchronized block
1977 * ...
1978 * synchronized (m) { // Synchronizing on m, not s!
1979 * Iterator i = s.iterator(); // Must be in synchronized block
1980 * while (i.hasNext())
1981 * foo(i.next());
1982 * }
1983 * </pre>
1984 * Failure to follow this advice may result in non-deterministic behavior.
1985 *
1986 * <p>The returned map will be serializable if the specified map is
1987 * serializable.
1988 *
1989 * @param m the map to be "wrapped" in a synchronized map.
1990 * @return a synchronized view of the specified map.
1991 */
1992 public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
1993 return new SynchronizedMap<>(m);
1994 }
1995
1996 /**
1997 * @serial include
1998 */
1999 private static class SynchronizedMap<K,V>
2000 implements Map<K,V>, Serializable {
2001 private static final long serialVersionUID = 1978198479659022715L;
2002
2003 private final Map<K,V> m; // Backing Map
2004 final Object mutex; // Object on which to synchronize
2005
2006 SynchronizedMap(Map<K,V> m) {
2007 if (m==null)
2008 throw new NullPointerException();
2009 this.m = m;
2010 mutex = this;
2011 }
2012
2013 SynchronizedMap(Map<K,V> m, Object mutex) {
2014 this.m = m;
2015 this.mutex = mutex;
2016 }
2017
2018 public int size() {
2019 synchronized (mutex) {return m.size();}
2020 }
2021 public boolean isEmpty() {
2022 synchronized (mutex) {return m.isEmpty();}
2023 }
2024 public boolean containsKey(Object key) {
2025 synchronized (mutex) {return m.containsKey(key);}
2026 }
2027 public boolean containsValue(Object value) {
2028 synchronized (mutex) {return m.containsValue(value);}
2029 }
2030 public V get(Object key) {
2031 synchronized (mutex) {return m.get(key);}
2032 }
2033
2034 public V put(K key, V value) {
2035 synchronized (mutex) {return m.put(key, value);}
2036 }
2037 public V remove(Object key) {
2038 synchronized (mutex) {return m.remove(key);}
2039 }
2040 public void putAll(Map<? extends K, ? extends V> map) {
2041 synchronized (mutex) {m.putAll(map);}
2042 }
2043 public void clear() {
2044 synchronized (mutex) {m.clear();}
2045 }
2046
2047 private transient Set<K> keySet = null;
2048 private transient Set<Map.Entry<K,V>> entrySet = null;
2049 private transient Collection<V> values = null;
2050
2051 public Set<K> keySet() {
2052 synchronized (mutex) {
2053 if (keySet==null)
2054 keySet = new SynchronizedSet<>(m.keySet(), mutex);
2055 return keySet;
2056 }
2057 }
2058
2059 public Set<Map.Entry<K,V>> entrySet() {
2060 synchronized (mutex) {
2061 if (entrySet==null)
2062 entrySet = new SynchronizedSet<>(m.entrySet(), mutex);
2063 return entrySet;
2064 }
2065 }
2066
2067 public Collection<V> values() {
2068 synchronized (mutex) {
2069 if (values==null)
2070 values = new SynchronizedCollection<>(m.values(), mutex);
2071 return values;
2072 }
2073 }
2074
2075 public boolean equals(Object o) {
2076 synchronized (mutex) {return m.equals(o);}
2077 }
2078 public int hashCode() {
2079 synchronized (mutex) {return m.hashCode();}
2080 }
2081 public String toString() {
2082 synchronized (mutex) {return m.toString();}
2083 }
2084 private void writeObject(ObjectOutputStream s) throws IOException {
2085 synchronized (mutex) {s.defaultWriteObject();}
2086 }
2087 }
2088
2089 /**
2090 * Returns a synchronized (thread-safe) sorted map backed by the specified
2091 * sorted map. In order to guarantee serial access, it is critical that
2092 * <strong>all</strong> access to the backing sorted map is accomplished
2093 * through the returned sorted map (or its views).<p>
2094 *
2095 * It is imperative that the user manually synchronize on the returned
2096 * sorted map when iterating over any of its collection views, or the
2097 * collections views of any of its <tt>subMap</tt>, <tt>headMap</tt> or
2098 * <tt>tailMap</tt> views.
2099 * <pre>
2100 * SortedMap m = Collections.synchronizedSortedMap(new TreeMap());
2101 * ...
2102 * Set s = m.keySet(); // Needn't be in synchronized block
2103 * ...
2104 * synchronized (m) { // Synchronizing on m, not s!
2105 * Iterator i = s.iterator(); // Must be in synchronized block
2106 * while (i.hasNext())
2107 * foo(i.next());
2108 * }
2109 * </pre>
2110 * or:
2111 * <pre>
2112 * SortedMap m = Collections.synchronizedSortedMap(new TreeMap());
2113 * SortedMap m2 = m.subMap(foo, bar);
2114 * ...
2115 * Set s2 = m2.keySet(); // Needn't be in synchronized block
2116 * ...
2117 * synchronized (m) { // Synchronizing on m, not m2 or s2!
2118 * Iterator i = s.iterator(); // Must be in synchronized block
2119 * while (i.hasNext())
2120 * foo(i.next());
2121 * }
2122 * </pre>
2123 * Failure to follow this advice may result in non-deterministic behavior.
2124 *
2125 * <p>The returned sorted map will be serializable if the specified
2126 * sorted map is serializable.
2127 *
2128 * @param m the sorted map to be "wrapped" in a synchronized sorted map.
2129 * @return a synchronized view of the specified sorted map.
2130 */
2131 public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m) {
2132 return new SynchronizedSortedMap<>(m);
2133 }
2134
2135
2136 /**
2137 * @serial include
2138 */
2139 static class SynchronizedSortedMap<K,V>
2140 extends SynchronizedMap<K,V>
2141 implements SortedMap<K,V>
2142 {
2143 private static final long serialVersionUID = -8798146769416483793L;
2144
2145 private final SortedMap<K,V> sm;
2146
2147 SynchronizedSortedMap(SortedMap<K,V> m) {
2148 super(m);
2149 sm = m;
2150 }
2151 SynchronizedSortedMap(SortedMap<K,V> m, Object mutex) {
2152 super(m, mutex);
2153 sm = m;
2154 }
2155
2156 public Comparator<? super K> comparator() {
2157 synchronized (mutex) {return sm.comparator();}
2158 }
2159
2160 public SortedMap<K,V> subMap(K fromKey, K toKey) {
2161 synchronized (mutex) {
2162 return new SynchronizedSortedMap<>(
2163 sm.subMap(fromKey, toKey), mutex);
2164 }
2165 }
2166 public SortedMap<K,V> headMap(K toKey) {
2167 synchronized (mutex) {
2168 return new SynchronizedSortedMap<>(sm.headMap(toKey), mutex);
2169 }
2170 }
2171 public SortedMap<K,V> tailMap(K fromKey) {
2172 synchronized (mutex) {
2173 return new SynchronizedSortedMap<>(sm.tailMap(fromKey),mutex);
2174 }
2175 }
2176
2177 public K firstKey() {
2178 synchronized (mutex) {return sm.firstKey();}
2179 }
2180 public K lastKey() {
2181 synchronized (mutex) {return sm.lastKey();}
2182 }
2183 }
2184
2185 // Dynamically typesafe collection wrappers
2186
2187 /**
2188 * Returns a dynamically typesafe view of the specified collection.
2189 * Any attempt to insert an element of the wrong type will result in an
2190 * immediate {@link ClassCastException}. Assuming a collection
2191 * contains no incorrectly typed elements prior to the time a
2192 * dynamically typesafe view is generated, and that all subsequent
2193 * access to the collection takes place through the view, it is
2194 * <i>guaranteed</i> that the collection cannot contain an incorrectly
2195 * typed element.
2196 *
2197 * <p>The generics mechanism in the language provides compile-time
2198 * (static) type checking, but it is possible to defeat this mechanism
2199 * with unchecked casts. Usually this is not a problem, as the compiler
2200 * issues warnings on all such unchecked operations. There are, however,
2201 * times when static type checking alone is not sufficient. For example,
2202 * suppose a collection is passed to a third-party library and it is
2203 * imperative that the library code not corrupt the collection by
2204 * inserting an element of the wrong type.
2205 *
2206 * <p>Another use of dynamically typesafe views is debugging. Suppose a
2207 * program fails with a {@code ClassCastException}, indicating that an
2208 * incorrectly typed element was put into a parameterized collection.
2209 * Unfortunately, the exception can occur at any time after the erroneous
2210 * element is inserted, so it typically provides little or no information
2211 * as to the real source of the problem. If the problem is reproducible,
2212 * one can quickly determine its source by temporarily modifying the
2213 * program to wrap the collection with a dynamically typesafe view.
2214 * For example, this declaration:
2215 * <pre> {@code
2216 * Collection<String> c = new HashSet<String>();
2217 * }</pre>
2218 * may be replaced temporarily by this one:
2219 * <pre> {@code
2220 * Collection<String> c = Collections.checkedCollection(
2221 * new HashSet<String>(), String.class);
2222 * }</pre>
2223 * Running the program again will cause it to fail at the point where
2224 * an incorrectly typed element is inserted into the collection, clearly
2225 * identifying the source of the problem. Once the problem is fixed, the
2226 * modified declaration may be reverted back to the original.
2227 *
2228 * <p>The returned collection does <i>not</i> pass the hashCode and equals
2229 * operations through to the backing collection, but relies on
2230 * {@code Object}'s {@code equals} and {@code hashCode} methods. This
2231 * is necessary to preserve the contracts of these operations in the case
2232 * that the backing collection is a set or a list.
2233 *
2234 * <p>The returned collection will be serializable if the specified
2235 * collection is serializable.
2236 *
2237 * <p>Since {@code null} is considered to be a value of any reference
2238 * type, the returned collection permits insertion of null elements
2239 * whenever the backing collection does.
2240 *
2241 * @param c the collection for which a dynamically typesafe view is to be
2242 * returned
2243 * @param type the type of element that {@code c} is permitted to hold
2244 * @return a dynamically typesafe view of the specified collection
2245 * @since 1.5
2246 */
2247 public static <E> Collection<E> checkedCollection(Collection<E> c,
2248 Class<E> type) {
2249 return new CheckedCollection<>(c, type);
2250 }
2251
2252 @SuppressWarnings("unchecked")
2253 static <T> T[] zeroLengthArray(Class<T> type) {
2254 return (T[]) Array.newInstance(type, 0);
2255 }
2256
2257 /**
2258 * @serial include
2259 */
2260 static class CheckedCollection<E> implements Collection<E>, Serializable {
2261 private static final long serialVersionUID = 1578914078182001775L;
2262
2263 final Collection<E> c;
2264 final Class<E> type;
2265
2266 void typeCheck(Object o) {
2267 if (o != null && !type.isInstance(o))
2268 throw new ClassCastException(badElementMsg(o));
2269 }
2270
2271 private String badElementMsg(Object o) {
2272 return "Attempt to insert " + o.getClass() +
2273 " element into collection with element type " + type;
2274 }
2275
2276 CheckedCollection(Collection<E> c, Class<E> type) {
2277 if (c==null || type == null)
2278 throw new NullPointerException();
2279 this.c = c;
2280 this.type = type;
2281 }
2282
2283 public int size() { return c.size(); }
2284 public boolean isEmpty() { return c.isEmpty(); }
2285 public boolean contains(Object o) { return c.contains(o); }
2286 public Object[] toArray() { return c.toArray(); }
2287 public <T> T[] toArray(T[] a) { return c.toArray(a); }
2288 public String toString() { return c.toString(); }
2289 public boolean remove(Object o) { return c.remove(o); }
2290 public void clear() { c.clear(); }
2291
2292 public boolean containsAll(Collection<?> coll) {
2293 return c.containsAll(coll);
2294 }
2295 public boolean removeAll(Collection<?> coll) {
2296 return c.removeAll(coll);
2297 }
2298 public boolean retainAll(Collection<?> coll) {
2299 return c.retainAll(coll);
2300 }
2301
2302 public Iterator<E> iterator() {
2303 final Iterator<E> it = c.iterator();
2304 return new Iterator<E>() {
2305 public boolean hasNext() { return it.hasNext(); }
2306 public E next() { return it.next(); }
2307 public void remove() { it.remove(); }};
2308 }
2309
2310 public boolean add(E e) {
2311 typeCheck(e);
2312 return c.add(e);
2313 }
2314
2315 private E[] zeroLengthElementArray = null; // Lazily initialized
2316
2317 private E[] zeroLengthElementArray() {
2318 return zeroLengthElementArray != null ? zeroLengthElementArray :
2319 (zeroLengthElementArray = zeroLengthArray(type));
2320 }
2321
2322 @SuppressWarnings("unchecked")
2323 Collection<E> checkedCopyOf(Collection<? extends E> coll) {
2324 Object[] a = null;
2325 try {
2326 E[] z = zeroLengthElementArray();
2327 a = coll.toArray(z);
2328 // Defend against coll violating the toArray contract
2329 if (a.getClass() != z.getClass())
2330 a = Arrays.copyOf(a, a.length, z.getClass());
2331 } catch (ArrayStoreException ignore) {
2332 // To get better and consistent diagnostics,
2333 // we call typeCheck explicitly on each element.
2334 // We call clone() to defend against coll retaining a
2335 // reference to the returned array and storing a bad
2336 // element into it after it has been type checked.
2337 a = coll.toArray().clone();
2338 for (Object o : a)
2339 typeCheck(o);
2340 }
2341 // A slight abuse of the type system, but safe here.
2342 return (Collection<E>) Arrays.asList(a);
2343 }
2344
2345 public boolean addAll(Collection<? extends E> coll) {
2346 // Doing things this way insulates us from concurrent changes
2347 // in the contents of coll and provides all-or-nothing
2348 // semantics (which we wouldn't get if we type-checked each
2349 // element as we added it)
2350 return c.addAll(checkedCopyOf(coll));
2351 }
2352 }
2353
2354 /**
2355 * Returns a dynamically typesafe view of the specified set.
2356 * Any attempt to insert an element of the wrong type will result in
2357 * an immediate {@link ClassCastException}. Assuming a set contains
2358 * no incorrectly typed elements prior to the time a dynamically typesafe
2359 * view is generated, and that all subsequent access to the set
2360 * takes place through the view, it is <i>guaranteed</i> that the
2361 * set cannot contain an incorrectly typed element.
2362 *
2363 * <p>A discussion of the use of dynamically typesafe views may be
2364 * found in the documentation for the {@link #checkedCollection
2365 * checkedCollection} method.
2366 *
2367 * <p>The returned set will be serializable if the specified set is
2368 * serializable.
2369 *
2370 * <p>Since {@code null} is considered to be a value of any reference
2371 * type, the returned set permits insertion of null elements whenever
2372 * the backing set does.
2373 *
2374 * @param s the set for which a dynamically typesafe view is to be
2375 * returned
2376 * @param type the type of element that {@code s} is permitted to hold
2377 * @return a dynamically typesafe view of the specified set
2378 * @since 1.5
2379 */
2380 public static <E> Set<E> checkedSet(Set<E> s, Class<E> type) {
2381 return new CheckedSet<>(s, type);
2382 }
2383
2384 /**
2385 * @serial include
2386 */
2387 static class CheckedSet<E> extends CheckedCollection<E>
2388 implements Set<E>, Serializable
2389 {
2390 private static final long serialVersionUID = 4694047833775013803L;
2391
2392 CheckedSet(Set<E> s, Class<E> elementType) { super(s, elementType); }
2393
2394 public boolean equals(Object o) { return o == this || c.equals(o); }
2395 public int hashCode() { return c.hashCode(); }
2396 }
2397
2398 /**
2399 * Returns a dynamically typesafe view of the specified sorted set.
2400 * Any attempt to insert an element of the wrong type will result in an
2401 * immediate {@link ClassCastException}. Assuming a sorted set
2402 * contains no incorrectly typed elements prior to the time a
2403 * dynamically typesafe view is generated, and that all subsequent
2404 * access to the sorted set takes place through the view, it is
2405 * <i>guaranteed</i> that the sorted set cannot contain an incorrectly
2406 * typed element.
2407 *
2408 * <p>A discussion of the use of dynamically typesafe views may be
2409 * found in the documentation for the {@link #checkedCollection
2410 * checkedCollection} method.
2411 *
2412 * <p>The returned sorted set will be serializable if the specified sorted
2413 * set is serializable.
2414 *
2415 * <p>Since {@code null} is considered to be a value of any reference
2416 * type, the returned sorted set permits insertion of null elements
2417 * whenever the backing sorted set does.
2418 *
2419 * @param s the sorted set for which a dynamically typesafe view is to be
2420 * returned
2421 * @param type the type of element that {@code s} is permitted to hold
2422 * @return a dynamically typesafe view of the specified sorted set
2423 * @since 1.5
2424 */
2425 public static <E> SortedSet<E> checkedSortedSet(SortedSet<E> s,
2426 Class<E> type) {
2427 return new CheckedSortedSet<>(s, type);
2428 }
2429
2430 /**
2431 * @serial include
2432 */
2433 static class CheckedSortedSet<E> extends CheckedSet<E>
2434 implements SortedSet<E>, Serializable
2435 {
2436 private static final long serialVersionUID = 1599911165492914959L;
2437 private final SortedSet<E> ss;
2438
2439 CheckedSortedSet(SortedSet<E> s, Class<E> type) {
2440 super(s, type);
2441 ss = s;
2442 }
2443
2444 public Comparator<? super E> comparator() { return ss.comparator(); }
2445 public E first() { return ss.first(); }
2446 public E last() { return ss.last(); }
2447
2448 public SortedSet<E> subSet(E fromElement, E toElement) {
2449 return checkedSortedSet(ss.subSet(fromElement,toElement), type);
2450 }
2451 public SortedSet<E> headSet(E toElement) {
2452 return checkedSortedSet(ss.headSet(toElement), type);
2453 }
2454 public SortedSet<E> tailSet(E fromElement) {
2455 return checkedSortedSet(ss.tailSet(fromElement), type);
2456 }
2457 }
2458
2459 /**
2460 * Returns a dynamically typesafe view of the specified list.
2461 * Any attempt to insert an element of the wrong type will result in
2462 * an immediate {@link ClassCastException}. Assuming a list contains
2463 * no incorrectly typed elements prior to the time a dynamically typesafe
2464 * view is generated, and that all subsequent access to the list
2465 * takes place through the view, it is <i>guaranteed</i> that the
2466 * list cannot contain an incorrectly typed element.
2467 *
2468 * <p>A discussion of the use of dynamically typesafe views may be
2469 * found in the documentation for the {@link #checkedCollection
2470 * checkedCollection} method.
2471 *
2472 * <p>The returned list will be serializable if the specified list
2473 * is serializable.
2474 *
2475 * <p>Since {@code null} is considered to be a value of any reference
2476 * type, the returned list permits insertion of null elements whenever
2477 * the backing list does.
2478 *
2479 * @param list the list for which a dynamically typesafe view is to be
2480 * returned
2481 * @param type the type of element that {@code list} is permitted to hold
2482 * @return a dynamically typesafe view of the specified list
2483 * @since 1.5
2484 */
2485 public static <E> List<E> checkedList(List<E> list, Class<E> type) {
2486 return (list instanceof RandomAccess ?
2487 new CheckedRandomAccessList<>(list, type) :
2488 new CheckedList<>(list, type));
2489 }
2490
2491 /**
2492 * @serial include
2493 */
2494 static class CheckedList<E>
2495 extends CheckedCollection<E>
2496 implements List<E>
2497 {
2498 private static final long serialVersionUID = 65247728283967356L;
2499 final List<E> list;
2500
2501 CheckedList(List<E> list, Class<E> type) {
2502 super(list, type);
2503 this.list = list;
2504 }
2505
2506 public boolean equals(Object o) { return o == this || list.equals(o); }
2507 public int hashCode() { return list.hashCode(); }
2508 public E get(int index) { return list.get(index); }
2509 public E remove(int index) { return list.remove(index); }
2510 public int indexOf(Object o) { return list.indexOf(o); }
2511 public int lastIndexOf(Object o) { return list.lastIndexOf(o); }
2512
2513 public E set(int index, E element) {
2514 typeCheck(element);
2515 return list.set(index, element);
2516 }
2517
2518 public void add(int index, E element) {
2519 typeCheck(element);
2520 list.add(index, element);
2521 }
2522
2523 public boolean addAll(int index, Collection<? extends E> c) {
2524 return list.addAll(index, checkedCopyOf(c));
2525 }
2526 public ListIterator<E> listIterator() { return listIterator(0); }
2527
2528 public ListIterator<E> listIterator(final int index) {
2529 final ListIterator<E> i = list.listIterator(index);
2530
2531 return new ListIterator<E>() {
2532 public boolean hasNext() { return i.hasNext(); }
2533 public E next() { return i.next(); }
2534 public boolean hasPrevious() { return i.hasPrevious(); }
2535 public E previous() { return i.previous(); }
2536 public int nextIndex() { return i.nextIndex(); }
2537 public int previousIndex() { return i.previousIndex(); }
2538 public void remove() { i.remove(); }
2539
2540 public void set(E e) {
2541 typeCheck(e);
2542 i.set(e);
2543 }
2544
2545 public void add(E e) {
2546 typeCheck(e);
2547 i.add(e);
2548 }
2549 };
2550 }
2551
2552 public List<E> subList(int fromIndex, int toIndex) {
2553 return new CheckedList<>(list.subList(fromIndex, toIndex), type);
2554 }
2555 }
2556
2557 /**
2558 * @serial include
2559 */
2560 static class CheckedRandomAccessList<E> extends CheckedList<E>
2561 implements RandomAccess
2562 {
2563 private static final long serialVersionUID = 1638200125423088369L;
2564
2565 CheckedRandomAccessList(List<E> list, Class<E> type) {
2566 super(list, type);
2567 }
2568
2569 public List<E> subList(int fromIndex, int toIndex) {
2570 return new CheckedRandomAccessList<>(
2571 list.subList(fromIndex, toIndex), type);
2572 }
2573 }
2574
2575 /**
2576 * Returns a dynamically typesafe view of the specified map.
2577 * Any attempt to insert a mapping whose key or value have the wrong
2578 * type will result in an immediate {@link ClassCastException}.
2579 * Similarly, any attempt to modify the value currently associated with
2580 * a key will result in an immediate {@link ClassCastException},
2581 * whether the modification is attempted directly through the map
2582 * itself, or through a {@link Map.Entry} instance obtained from the
2583 * map's {@link Map#entrySet() entry set} view.
2584 *
2585 * <p>Assuming a map contains no incorrectly typed keys or values
2586 * prior to the time a dynamically typesafe view is generated, and
2587 * that all subsequent access to the map takes place through the view
2588 * (or one of its collection views), it is <i>guaranteed</i> that the
2589 * map cannot contain an incorrectly typed key or value.
2590 *
2591 * <p>A discussion of the use of dynamically typesafe views may be
2592 * found in the documentation for the {@link #checkedCollection
2593 * checkedCollection} method.
2594 *
2595 * <p>The returned map will be serializable if the specified map is
2596 * serializable.
2597 *
2598 * <p>Since {@code null} is considered to be a value of any reference
2599 * type, the returned map permits insertion of null keys or values
2600 * whenever the backing map does.
2601 *
2602 * @param m the map for which a dynamically typesafe view is to be
2603 * returned
2604 * @param keyType the type of key that {@code m} is permitted to hold
2605 * @param valueType the type of value that {@code m} is permitted to hold
2606 * @return a dynamically typesafe view of the specified map
2607 * @since 1.5
2608 */
2609 public static <K, V> Map<K, V> checkedMap(Map<K, V> m,
2610 Class<K> keyType,
2611 Class<V> valueType) {
2612 return new CheckedMap<>(m, keyType, valueType);
2613 }
2614
2615
2616 /**
2617 * @serial include
2618 */
2619 private static class CheckedMap<K,V>
2620 implements Map<K,V>, Serializable
2621 {
2622 private static final long serialVersionUID = 5742860141034234728L;
2623
2624 private final Map<K, V> m;
2625 final Class<K> keyType;
2626 final Class<V> valueType;
2627
2628 private void typeCheck(Object key, Object value) {
2629 if (key != null && !keyType.isInstance(key))
2630 throw new ClassCastException(badKeyMsg(key));
2631
2632 if (value != null && !valueType.isInstance(value))
2633 throw new ClassCastException(badValueMsg(value));
2634 }
2635
2636 private String badKeyMsg(Object key) {
2637 return "Attempt to insert " + key.getClass() +
2638 " key into map with key type " + keyType;
2639 }
2640
2641 private String badValueMsg(Object value) {
2642 return "Attempt to insert " + value.getClass() +
2643 " value into map with value type " + valueType;
2644 }
2645
2646 CheckedMap(Map<K, V> m, Class<K> keyType, Class<V> valueType) {
2647 if (m == null || keyType == null || valueType == null)
2648 throw new NullPointerException();
2649 this.m = m;
2650 this.keyType = keyType;
2651 this.valueType = valueType;
2652 }
2653
2654 public int size() { return m.size(); }
2655 public boolean isEmpty() { return m.isEmpty(); }
2656 public boolean containsKey(Object key) { return m.containsKey(key); }
2657 public boolean containsValue(Object v) { return m.containsValue(v); }
2658 public V get(Object key) { return m.get(key); }
2659 public V remove(Object key) { return m.remove(key); }
2660 public void clear() { m.clear(); }
2661 public Set<K> keySet() { return m.keySet(); }
2662 public Collection<V> values() { return m.values(); }
2663 public boolean equals(Object o) { return o == this || m.equals(o); }
2664 public int hashCode() { return m.hashCode(); }
2665 public String toString() { return m.toString(); }
2666
2667 public V put(K key, V value) {
2668 typeCheck(key, value);
2669 return m.put(key, value);
2670 }
2671
2672 @SuppressWarnings("unchecked")
2673 public void putAll(Map<? extends K, ? extends V> t) {
2674 // Satisfy the following goals:
2675 // - good diagnostics in case of type mismatch
2676 // - all-or-nothing semantics
2677 // - protection from malicious t
2678 // - correct behavior if t is a concurrent map
2679 Object[] entries = t.entrySet().toArray();
2680 List<Map.Entry<K,V>> checked = new ArrayList<>(entries.length);
2681 for (Object o : entries) {
2682 Map.Entry<?,?> e = (Map.Entry<?,?>) o;
2683 Object k = e.getKey();
2684 Object v = e.getValue();
2685 typeCheck(k, v);
2686 checked.add(
2687 new AbstractMap.SimpleImmutableEntry<>((K) k, (V) v));
2688 }
2689 for (Map.Entry<K,V> e : checked)
2690 m.put(e.getKey(), e.getValue());
2691 }
2692
2693 private transient Set<Map.Entry<K,V>> entrySet = null;
2694
2695 public Set<Map.Entry<K,V>> entrySet() {
2696 if (entrySet==null)
2697 entrySet = new CheckedEntrySet<>(m.entrySet(), valueType);
2698 return entrySet;
2699 }
2700
2701 /**
2702 * We need this class in addition to CheckedSet as Map.Entry permits
2703 * modification of the backing Map via the setValue operation. This
2704 * class is subtle: there are many possible attacks that must be
2705 * thwarted.
2706 *
2707 * @serial exclude
2708 */
2709 static class CheckedEntrySet<K,V> implements Set<Map.Entry<K,V>> {
2710 private final Set<Map.Entry<K,V>> s;
2711 private final Class<V> valueType;
2712
2713 CheckedEntrySet(Set<Map.Entry<K, V>> s, Class<V> valueType) {
2714 this.s = s;
2715 this.valueType = valueType;
2716 }
2717
2718 public int size() { return s.size(); }
2719 public boolean isEmpty() { return s.isEmpty(); }
2720 public String toString() { return s.toString(); }
2721 public int hashCode() { return s.hashCode(); }
2722 public void clear() { s.clear(); }
2723
2724 public boolean add(Map.Entry<K, V> e) {
2725 throw new UnsupportedOperationException();
2726 }
2727 public boolean addAll(Collection<? extends Map.Entry<K, V>> coll) {
2728 throw new UnsupportedOperationException();
2729 }
2730
2731 public Iterator<Map.Entry<K,V>> iterator() {
2732 final Iterator<Map.Entry<K, V>> i = s.iterator();
2733 final Class<V> valueType = this.valueType;
2734
2735 return new Iterator<Map.Entry<K,V>>() {
2736 public boolean hasNext() { return i.hasNext(); }
2737 public void remove() { i.remove(); }
2738
2739 public Map.Entry<K,V> next() {
2740 return checkedEntry(i.next(), valueType);
2741 }
2742 };
2743 }
2744
2745 @SuppressWarnings("unchecked")
2746 public Object[] toArray() {
2747 Object[] source = s.toArray();
2748
2749 /*
2750 * Ensure that we don't get an ArrayStoreException even if
2751 * s.toArray returns an array of something other than Object
2752 */
2753 Object[] dest = (CheckedEntry.class.isInstance(
2754 source.getClass().getComponentType()) ? source :
2755 new Object[source.length]);
2756
2757 for (int i = 0; i < source.length; i++)
2758 dest[i] = checkedEntry((Map.Entry<K,V>)source[i],
2759 valueType);
2760 return dest;
2761 }
2762
2763 @SuppressWarnings("unchecked")
2764 public <T> T[] toArray(T[] a) {
2765 // We don't pass a to s.toArray, to avoid window of
2766 // vulnerability wherein an unscrupulous multithreaded client
2767 // could get his hands on raw (unwrapped) Entries from s.
2768 T[] arr = s.toArray(a.length==0 ? a : Arrays.copyOf(a, 0));
2769
2770 for (int i=0; i<arr.length; i++)
2771 arr[i] = (T) checkedEntry((Map.Entry<K,V>)arr[i],
2772 valueType);
2773 if (arr.length > a.length)
2774 return arr;
2775
2776 System.arraycopy(arr, 0, a, 0, arr.length);
2777 if (a.length > arr.length)
2778 a[arr.length] = null;
2779 return a;
2780 }
2781
2782 /**
2783 * This method is overridden to protect the backing set against
2784 * an object with a nefarious equals function that senses
2785 * that the equality-candidate is Map.Entry and calls its
2786 * setValue method.
2787 */
2788 public boolean contains(Object o) {
2789 if (!(o instanceof Map.Entry))
2790 return false;
2791 Map.Entry<?,?> e = (Map.Entry<?,?>) o;
2792 return s.contains(
2793 (e instanceof CheckedEntry) ? e : checkedEntry(e, valueType));
2794 }
2795
2796 /**
2797 * The bulk collection methods are overridden to protect
2798 * against an unscrupulous collection whose contains(Object o)
2799 * method senses when o is a Map.Entry, and calls o.setValue.
2800 */
2801 public boolean containsAll(Collection<?> c) {
2802 for (Object o : c)
2803 if (!contains(o)) // Invokes safe contains() above
2804 return false;
2805 return true;
2806 }
2807
2808 public boolean remove(Object o) {
2809 if (!(o instanceof Map.Entry))
2810 return false;
2811 return s.remove(new AbstractMap.SimpleImmutableEntry
2812 <>((Map.Entry<?,?>)o));
2813 }
2814
2815 public boolean removeAll(Collection<?> c) {
2816 return batchRemove(c, false);
2817 }
2818 public boolean retainAll(Collection<?> c) {
2819 return batchRemove(c, true);
2820 }
2821 private boolean batchRemove(Collection<?> c, boolean complement) {
2822 boolean modified = false;
2823 Iterator<Map.Entry<K,V>> it = iterator();
2824 while (it.hasNext()) {
2825 if (c.contains(it.next()) != complement) {
2826 it.remove();
2827 modified = true;
2828 }
2829 }
2830 return modified;
2831 }
2832
2833 public boolean equals(Object o) {
2834 if (o == this)
2835 return true;
2836 if (!(o instanceof Set))
2837 return false;
2838 Set<?> that = (Set<?>) o;
2839 return that.size() == s.size()
2840 && containsAll(that); // Invokes safe containsAll() above
2841 }
2842
2843 static <K,V,T> CheckedEntry<K,V,T> checkedEntry(Map.Entry<K,V> e,
2844 Class<T> valueType) {
2845 return new CheckedEntry<>(e, valueType);
2846 }
2847
2848 /**
2849 * This "wrapper class" serves two purposes: it prevents
2850 * the client from modifying the backing Map, by short-circuiting
2851 * the setValue method, and it protects the backing Map against
2852 * an ill-behaved Map.Entry that attempts to modify another
2853 * Map.Entry when asked to perform an equality check.
2854 */
2855 private static class CheckedEntry<K,V,T> implements Map.Entry<K,V> {
2856 private final Map.Entry<K, V> e;
2857 private final Class<T> valueType;
2858
2859 CheckedEntry(Map.Entry<K, V> e, Class<T> valueType) {
2860 this.e = e;
2861 this.valueType = valueType;
2862 }
2863
2864 public K getKey() { return e.getKey(); }
2865 public V getValue() { return e.getValue(); }
2866 public int hashCode() { return e.hashCode(); }
2867 public String toString() { return e.toString(); }
2868
2869 public V setValue(V value) {
2870 if (value != null && !valueType.isInstance(value))
2871 throw new ClassCastException(badValueMsg(value));
2872 return e.setValue(value);
2873 }
2874
2875 private String badValueMsg(Object value) {
2876 return "Attempt to insert " + value.getClass() +
2877 " value into map with value type " + valueType;
2878 }
2879
2880 public boolean equals(Object o) {
2881 if (o == this)
2882 return true;
2883 if (!(o instanceof Map.Entry))
2884 return false;
2885 return e.equals(new AbstractMap.SimpleImmutableEntry
2886 <>((Map.Entry<?,?>)o));
2887 }
2888 }
2889 }
2890 }
2891
2892 /**
2893 * Returns a dynamically typesafe view of the specified sorted map.
2894 * Any attempt to insert a mapping whose key or value have the wrong
2895 * type will result in an immediate {@link ClassCastException}.
2896 * Similarly, any attempt to modify the value currently associated with
2897 * a key will result in an immediate {@link ClassCastException},
2898 * whether the modification is attempted directly through the map
2899 * itself, or through a {@link Map.Entry} instance obtained from the
2900 * map's {@link Map#entrySet() entry set} view.
2901 *
2902 * <p>Assuming a map contains no incorrectly typed keys or values
2903 * prior to the time a dynamically typesafe view is generated, and
2904 * that all subsequent access to the map takes place through the view
2905 * (or one of its collection views), it is <i>guaranteed</i> that the
2906 * map cannot contain an incorrectly typed key or value.
2907 *
2908 * <p>A discussion of the use of dynamically typesafe views may be
2909 * found in the documentation for the {@link #checkedCollection
2910 * checkedCollection} method.
2911 *
2912 * <p>The returned map will be serializable if the specified map is
2913 * serializable.
2914 *
2915 * <p>Since {@code null} is considered to be a value of any reference
2916 * type, the returned map permits insertion of null keys or values
2917 * whenever the backing map does.
2918 *
2919 * @param m the map for which a dynamically typesafe view is to be
2920 * returned
2921 * @param keyType the type of key that {@code m} is permitted to hold
2922 * @param valueType the type of value that {@code m} is permitted to hold
2923 * @return a dynamically typesafe view of the specified map
2924 * @since 1.5
2925 */
2926 public static <K,V> SortedMap<K,V> checkedSortedMap(SortedMap<K, V> m,
2927 Class<K> keyType,
2928 Class<V> valueType) {
2929 return new CheckedSortedMap<>(m, keyType, valueType);
2930 }
2931
2932 /**
2933 * @serial include
2934 */
2935 static class CheckedSortedMap<K,V> extends CheckedMap<K,V>
2936 implements SortedMap<K,V>, Serializable
2937 {
2938 private static final long serialVersionUID = 1599671320688067438L;
2939
2940 private final SortedMap<K, V> sm;
2941
2942 CheckedSortedMap(SortedMap<K, V> m,
2943 Class<K> keyType, Class<V> valueType) {
2944 super(m, keyType, valueType);
2945 sm = m;
2946 }
2947
2948 public Comparator<? super K> comparator() { return sm.comparator(); }
2949 public K firstKey() { return sm.firstKey(); }
2950 public K lastKey() { return sm.lastKey(); }
2951
2952 public SortedMap<K,V> subMap(K fromKey, K toKey) {
2953 return checkedSortedMap(sm.subMap(fromKey, toKey),
2954 keyType, valueType);
2955 }
2956 public SortedMap<K,V> headMap(K toKey) {
2957 return checkedSortedMap(sm.headMap(toKey), keyType, valueType);
2958 }
2959 public SortedMap<K,V> tailMap(K fromKey) {
2960 return checkedSortedMap(sm.tailMap(fromKey), keyType, valueType);
2961 }
2962 }
2963
2964 // Empty collections
2965
2966 /**
2967 * Returns an iterator that has no elements. More precisely,
2968 *
2969 * <ul compact>
2970 *
2971 * <li>{@link Iterator#hasNext hasNext} always returns {@code
2972 * false}.
2973 *
2974 * <li>{@link Iterator#next next} always throws {@link
2975 * NoSuchElementException}.
2976 *
2977 * <li>{@link Iterator#remove remove} always throws {@link
2978 * IllegalStateException}.
2979 *
2980 * </ul>
2981 *
2982 * <p>Implementations of this method are permitted, but not
2983 * required, to return the same object from multiple invocations.
2984 *
2985 * @return an empty iterator
2986 * @since 1.7
2987 */
2988 @SuppressWarnings("unchecked")
2989 public static <T> Iterator<T> emptyIterator() {
2990 return (Iterator<T>) EmptyIterator.EMPTY_ITERATOR;
2991 }
2992
2993 private static class EmptyIterator<E> implements Iterator<E> {
2994 static final EmptyIterator<Object> EMPTY_ITERATOR
2995 = new EmptyIterator<>();
2996
2997 public boolean hasNext() { return false; }
2998 public E next() { throw new NoSuchElementException(); }
2999 public void remove() { throw new IllegalStateException(); }
3000 }
3001
3002 /**
3003 * Returns a list iterator that has no elements. More precisely,
3004 *
3005 * <ul compact>
3006 *
3007 * <li>{@link Iterator#hasNext hasNext} and {@link
3008 * ListIterator#hasPrevious hasPrevious} always return {@code
3009 * false}.
3010 *
3011 * <li>{@link Iterator#next next} and {@link ListIterator#previous
3012 * previous} always throw {@link NoSuchElementException}.
3013 *
3014 * <li>{@link Iterator#remove remove} and {@link ListIterator#set
3015 * set} always throw {@link IllegalStateException}.
3016 *
3017 * <li>{@link ListIterator#add add} always throws {@link
3018 * UnsupportedOperationException}.
3019 *
3020 * <li>{@link ListIterator#nextIndex nextIndex} always returns
3021 * {@code 0} .
3022 *
3023 * <li>{@link ListIterator#previousIndex previousIndex} always
3024 * returns {@code -1}.
3025 *
3026 * </ul>
3027 *
3028 * <p>Implementations of this method are permitted, but not
3029 * required, to return the same object from multiple invocations.
3030 *
3031 * @return an empty list iterator
3032 * @since 1.7
3033 */
3034 @SuppressWarnings("unchecked")
3035 public static <T> ListIterator<T> emptyListIterator() {
3036 return (ListIterator<T>) EmptyListIterator.EMPTY_ITERATOR;
3037 }
3038
3039 private static class EmptyListIterator<E>
3040 extends EmptyIterator<E>
3041 implements ListIterator<E>
3042 {
3043 static final EmptyListIterator<Object> EMPTY_ITERATOR
3044 = new EmptyListIterator<>();
3045
3046 public boolean hasPrevious() { return false; }
3047 public E previous() { throw new NoSuchElementException(); }
3048 public int nextIndex() { return 0; }
3049 public int previousIndex() { return -1; }
3050 public void set(E e) { throw new IllegalStateException(); }
3051 public void add(E e) { throw new UnsupportedOperationException(); }
3052 }
3053
3054 /**
3055 * Returns an enumeration that has no elements. More precisely,
3056 *
3057 * <ul compact>
3058 *
3059 * <li>{@link Enumeration#hasMoreElements hasMoreElements} always
3060 * returns {@code false}.
3061 *
3062 * <li> {@link Enumeration#nextElement nextElement} always throws
3063 * {@link NoSuchElementException}.
3064 *
3065 * </ul>
3066 *
3067 * <p>Implementations of this method are permitted, but not
3068 * required, to return the same object from multiple invocations.
3069 *
3070 * @return an empty enumeration
3071 * @since 1.7
3072 */
3073 @SuppressWarnings("unchecked")
3074 public static <T> Enumeration<T> emptyEnumeration() {
3075 return (Enumeration<T>) EmptyEnumeration.EMPTY_ENUMERATION;
3076 }
3077
3078 private static class EmptyEnumeration<E> implements Enumeration<E> {
3079 static final EmptyEnumeration<Object> EMPTY_ENUMERATION
3080 = new EmptyEnumeration<>();
3081
3082 public boolean hasMoreElements() { return false; }
3083 public E nextElement() { throw new NoSuchElementException(); }
3084 }
3085
3086 /**
3087 * The empty set (immutable). This set is serializable.
3088 *
3089 * @see #emptySet()
3090 */
3091 @SuppressWarnings("unchecked")
3092 public static final Set EMPTY_SET = new EmptySet<>();
3093
3094 /**
3095 * Returns the empty set (immutable). This set is serializable.
3096 * Unlike the like-named field, this method is parameterized.
3097 *
3098 * <p>This example illustrates the type-safe way to obtain an empty set:
3099 * <pre>
3100 * Set&lt;String&gt; s = Collections.emptySet();
3101 * </pre>
3102 * Implementation note: Implementations of this method need not
3103 * create a separate <tt>Set</tt> object for each call. Using this
3104 * method is likely to have comparable cost to using the like-named
3105 * field. (Unlike this method, the field does not provide type safety.)
3106 *
3107 * @see #EMPTY_SET
3108 * @since 1.5
3109 */
3110 @SuppressWarnings("unchecked")
3111 public static final <T> Set<T> emptySet() {
3112 return (Set<T>) EMPTY_SET;
3113 }
3114
3115 /**
3116 * @serial include
3117 */
3118 private static class EmptySet<E>
3119 extends AbstractSet<E>
3120 implements Serializable
3121 {
3122 private static final long serialVersionUID = 1582296315990362920L;
3123
3124 public Iterator<E> iterator() { return emptyIterator(); }
3125
3126 public int size() {return 0;}
3127 public boolean isEmpty() {return true;}
3128
3129 public boolean contains(Object obj) {return false;}
3130 public boolean containsAll(Collection<?> c) { return c.isEmpty(); }
3131
3132 public Object[] toArray() { return new Object[0]; }
3133
3134 public <T> T[] toArray(T[] a) {
3135 if (a.length > 0)
3136 a[0] = null;
3137 return a;
3138 }
3139
3140 // Preserves singleton property
3141 private Object readResolve() {
3142 return EMPTY_SET;
3143 }
3144 }
3145
3146 /**
3147 * The empty list (immutable). This list is serializable.
3148 *
3149 * @see #emptyList()
3150 */
3151 @SuppressWarnings("unchecked")
3152 public static final List EMPTY_LIST = new EmptyList<>();
3153
3154 /**
3155 * Returns the empty list (immutable). This list is serializable.
3156 *
3157 * <p>This example illustrates the type-safe way to obtain an empty list:
3158 * <pre>
3159 * List&lt;String&gt; s = Collections.emptyList();
3160 * </pre>
3161 * Implementation note: Implementations of this method need not
3162 * create a separate <tt>List</tt> object for each call. Using this
3163 * method is likely to have comparable cost to using the like-named
3164 * field. (Unlike this method, the field does not provide type safety.)
3165 *
3166 * @see #EMPTY_LIST
3167 * @since 1.5
3168 */
3169 @SuppressWarnings("unchecked")
3170 public static final <T> List<T> emptyList() {
3171 return (List<T>) EMPTY_LIST;
3172 }
3173
3174 /**
3175 * @serial include
3176 */
3177 private static class EmptyList<E>
3178 extends AbstractList<E>
3179 implements RandomAccess, Serializable {
3180 private static final long serialVersionUID = 8842843931221139166L;
3181
3182 public Iterator<E> iterator() {
3183 return emptyIterator();
3184 }
3185 public ListIterator<E> listIterator() {
3186 return emptyListIterator();
3187 }
3188
3189 public int size() {return 0;}
3190 public boolean isEmpty() {return true;}
3191
3192 public boolean contains(Object obj) {return false;}
3193 public boolean containsAll(Collection<?> c) { return c.isEmpty(); }
3194
3195 public Object[] toArray() { return new Object[0]; }
3196
3197 public <T> T[] toArray(T[] a) {
3198 if (a.length > 0)
3199 a[0] = null;
3200 return a;
3201 }
3202
3203 public E get(int index) {
3204 throw new IndexOutOfBoundsException("Index: "+index);
3205 }
3206
3207 public boolean equals(Object o) {
3208 return (o instanceof List) && ((List<?>)o).isEmpty();
3209 }
3210
3211 public int hashCode() { return 1; }
3212
3213 // Preserves singleton property
3214 private Object readResolve() {
3215 return EMPTY_LIST;
3216 }
3217 }
3218
3219 /**
3220 * The empty map (immutable). This map is serializable.
3221 *
3222 * @see #emptyMap()
3223 * @since 1.3
3224 */
3225 @SuppressWarnings("unchecked")
3226 public static final Map EMPTY_MAP = new EmptyMap<>();
3227
3228 /**
3229 * Returns the empty map (immutable). This map is serializable.
3230 *
3231 * <p>This example illustrates the type-safe way to obtain an empty set:
3232 * <pre>
3233 * Map&lt;String, Date&gt; s = Collections.emptyMap();
3234 * </pre>
3235 * Implementation note: Implementations of this method need not
3236 * create a separate <tt>Map</tt> object for each call. Using this
3237 * method is likely to have comparable cost to using the like-named
3238 * field. (Unlike this method, the field does not provide type safety.)
3239 *
3240 * @see #EMPTY_MAP
3241 * @since 1.5
3242 */
3243 @SuppressWarnings("unchecked")
3244 public static final <K,V> Map<K,V> emptyMap() {
3245 return (Map<K,V>) EMPTY_MAP;
3246 }
3247
3248 /**
3249 * @serial include
3250 */
3251 private static class EmptyMap<K,V>
3252 extends AbstractMap<K,V>
3253 implements Serializable
3254 {
3255 private static final long serialVersionUID = 6428348081105594320L;
3256
3257 public int size() {return 0;}
3258 public boolean isEmpty() {return true;}
3259 public boolean containsKey(Object key) {return false;}
3260 public boolean containsValue(Object value) {return false;}
3261 public V get(Object key) {return null;}
3262 public Set<K> keySet() {return emptySet();}
3263 public Collection<V> values() {return emptySet();}
3264 public Set<Map.Entry<K,V>> entrySet() {return emptySet();}
3265
3266 public boolean equals(Object o) {
3267 return (o instanceof Map) && ((Map<?,?>)o).isEmpty();
3268 }
3269
3270 public int hashCode() {return 0;}
3271
3272 // Preserves singleton property
3273 private Object readResolve() {
3274 return EMPTY_MAP;
3275 }
3276 }
3277
3278 // Singleton collections
3279
3280 /**
3281 * Returns an immutable set containing only the specified object.
3282 * The returned set is serializable.
3283 *
3284 * @param o the sole object to be stored in the returned set.
3285 * @return an immutable set containing only the specified object.
3286 */
3287 public static <T> Set<T> singleton(T o) {
3288 return new SingletonSet<>(o);
3289 }
3290
3291 static <E> Iterator<E> singletonIterator(final E e) {
3292 return new Iterator<E>() {
3293 private boolean hasNext = true;
3294 public boolean hasNext() {
3295 return hasNext;
3296 }
3297 public E next() {
3298 if (hasNext) {
3299 hasNext = false;
3300 return e;
3301 }
3302 throw new NoSuchElementException();
3303 }
3304 public void remove() {
3305 throw new UnsupportedOperationException();
3306 }
3307 };
3308 }
3309
3310 /**
3311 * @serial include
3312 */
3313 private static class SingletonSet<E>
3314 extends AbstractSet<E>
3315 implements Serializable
3316 {
3317 private static final long serialVersionUID = 3193687207550431679L;
3318
3319 private final E element;
3320
3321 SingletonSet(E e) {element = e;}
3322
3323 public Iterator<E> iterator() {
3324 return singletonIterator(element);
3325 }
3326
3327 public int size() {return 1;}
3328
3329 public boolean contains(Object o) {return eq(o, element);}
3330 }
3331
3332 /**
3333 * Returns an immutable list containing only the specified object.
3334 * The returned list is serializable.
3335 *
3336 * @param o the sole object to be stored in the returned list.
3337 * @return an immutable list containing only the specified object.
3338 * @since 1.3
3339 */
3340 public static <T> List<T> singletonList(T o) {
3341 return new SingletonList<>(o);
3342 }
3343
3344 /**
3345 * @serial include
3346 */
3347 private static class SingletonList<E>
3348 extends AbstractList<E>
3349 implements RandomAccess, Serializable {
3350
3351 private static final long serialVersionUID = 3093736618740652951L;
3352
3353 private final E element;
3354
3355 SingletonList(E obj) {element = obj;}
3356
3357 public Iterator<E> iterator() {
3358 return singletonIterator(element);
3359 }
3360
3361 public int size() {return 1;}
3362
3363 public boolean contains(Object obj) {return eq(obj, element);}
3364
3365 public E get(int index) {
3366 if (index != 0)
3367 throw new IndexOutOfBoundsException("Index: "+index+", Size: 1");
3368 return element;
3369 }
3370 }
3371
3372 /**
3373 * Returns an immutable map, mapping only the specified key to the
3374 * specified value. The returned map is serializable.
3375 *
3376 * @param key the sole key to be stored in the returned map.
3377 * @param value the value to which the returned map maps <tt>key</tt>.
3378 * @return an immutable map containing only the specified key-value
3379 * mapping.
3380 * @since 1.3
3381 */
3382 public static <K,V> Map<K,V> singletonMap(K key, V value) {
3383 return new SingletonMap<>(key, value);
3384 }
3385
3386 /**
3387 * @serial include
3388 */
3389 private static class SingletonMap<K,V>
3390 extends AbstractMap<K,V>
3391 implements Serializable {
3392 private static final long serialVersionUID = -6979724477215052911L;
3393
3394 private final K k;
3395 private final V v;
3396
3397 SingletonMap(K key, V value) {
3398 k = key;
3399 v = value;
3400 }
3401
3402 public int size() {return 1;}
3403
3404 public boolean isEmpty() {return false;}
3405
3406 public boolean containsKey(Object key) {return eq(key, k);}
3407
3408 public boolean containsValue(Object value) {return eq(value, v);}
3409
3410 public V get(Object key) {return (eq(key, k) ? v : null);}
3411
3412 private transient Set<K> keySet = null;
3413 private transient Set<Map.Entry<K,V>> entrySet = null;
3414 private transient Collection<V> values = null;
3415
3416 public Set<K> keySet() {
3417 if (keySet==null)
3418 keySet = singleton(k);
3419 return keySet;
3420 }
3421
3422 public Set<Map.Entry<K,V>> entrySet() {
3423 if (entrySet==null)
3424 entrySet = Collections.<Map.Entry<K,V>>singleton(
3425 new SimpleImmutableEntry<>(k, v));
3426 return entrySet;
3427 }
3428
3429 public Collection<V> values() {
3430 if (values==null)
3431 values = singleton(v);
3432 return values;
3433 }
3434
3435 }
3436
3437 // Miscellaneous
3438
3439 /**
3440 * Returns an immutable list consisting of <tt>n</tt> copies of the
3441 * specified object. The newly allocated data object is tiny (it contains
3442 * a single reference to the data object). This method is useful in
3443 * combination with the <tt>List.addAll</tt> method to grow lists.
3444 * The returned list is serializable.
3445 *
3446 * @param n the number of elements in the returned list.
3447 * @param o the element to appear repeatedly in the returned list.
3448 * @return an immutable list consisting of <tt>n</tt> copies of the
3449 * specified object.
3450 * @throws IllegalArgumentException if {@code n < 0}
3451 * @see List#addAll(Collection)
3452 * @see List#addAll(int, Collection)
3453 */
3454 public static <T> List<T> nCopies(int n, T o) {
3455 if (n < 0)
3456 throw new IllegalArgumentException("List length = " + n);
3457 return new CopiesList<>(n, o);
3458 }
3459
3460 /**
3461 * @serial include
3462 */
3463 private static class CopiesList<E>
3464 extends AbstractList<E>
3465 implements RandomAccess, Serializable
3466 {
3467 private static final long serialVersionUID = 2739099268398711800L;
3468
3469 final int n;
3470 final E element;
3471
3472 CopiesList(int n, E e) {
3473 assert n >= 0;
3474 this.n = n;
3475 element = e;
3476 }
3477
3478 public int size() {
3479 return n;
3480 }
3481
3482 public boolean contains(Object obj) {
3483 return n != 0 && eq(obj, element);
3484 }
3485
3486 public int indexOf(Object o) {
3487 return contains(o) ? 0 : -1;
3488 }
3489
3490 public int lastIndexOf(Object o) {
3491 return contains(o) ? n - 1 : -1;
3492 }
3493
3494 public E get(int index) {
3495 if (index < 0 || index >= n)
3496 throw new IndexOutOfBoundsException("Index: "+index+
3497 ", Size: "+n);
3498 return element;
3499 }
3500
3501 public Object[] toArray() {
3502 final Object[] a = new Object[n];
3503 if (element != null)
3504 Arrays.fill(a, 0, n, element);
3505 return a;
3506 }
3507
3508 public <T> T[] toArray(T[] a) {
3509 final int n = this.n;
3510 if (a.length < n) {
3511 a = (T[])java.lang.reflect.Array
3512 .newInstance(a.getClass().getComponentType(), n);
3513 if (element != null)
3514 Arrays.fill(a, 0, n, element);
3515 } else {
3516 Arrays.fill(a, 0, n, element);
3517 if (a.length > n)
3518 a[n] = null;
3519 }
3520 return a;
3521 }
3522
3523 public List<E> subList(int fromIndex, int toIndex) {
3524 if (fromIndex < 0)
3525 throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
3526 if (toIndex > n)
3527 throw new IndexOutOfBoundsException("toIndex = " + toIndex);
3528 if (fromIndex > toIndex)
3529 throw new IllegalArgumentException("fromIndex(" + fromIndex +
3530 ") > toIndex(" + toIndex + ")");
3531 return new CopiesList<>(toIndex - fromIndex, element);
3532 }
3533 }
3534
3535 /**
3536 * Returns a comparator that imposes the reverse of the <em>natural
3537 * ordering</em> on a collection of objects that implement the
3538 * {@code Comparable} interface. (The natural ordering is the ordering
3539 * imposed by the objects' own {@code compareTo} method.) This enables a
3540 * simple idiom for sorting (or maintaining) collections (or arrays) of
3541 * objects that implement the {@code Comparable} interface in
3542 * reverse-natural-order. For example, suppose {@code a} is an array of
3543 * strings. Then: <pre>
3544 * Arrays.sort(a, Collections.reverseOrder());
3545 * </pre> sorts the array in reverse-lexicographic (alphabetical) order.<p>
3546 *
3547 * The returned comparator is serializable.
3548 *
3549 * @return A comparator that imposes the reverse of the <i>natural
3550 * ordering</i> on a collection of objects that implement
3551 * the <tt>Comparable</tt> interface.
3552 * @see Comparable
3553 */
3554 public static <T> Comparator<T> reverseOrder() {
3555 return (Comparator<T>) ReverseComparator.REVERSE_ORDER;
3556 }
3557
3558 /**
3559 * @serial include
3560 */
3561 private static class ReverseComparator
3562 implements Comparator<Comparable<Object>>, Serializable {
3563
3564 private static final long serialVersionUID = 7207038068494060240L;
3565
3566 static final ReverseComparator REVERSE_ORDER
3567 = new ReverseComparator();
3568
3569 public int compare(Comparable<Object> c1, Comparable<Object> c2) {
3570 return c2.compareTo(c1);
3571 }
3572
3573 private Object readResolve() { return reverseOrder(); }
3574 }
3575
3576 /**
3577 * Returns a comparator that imposes the reverse ordering of the specified
3578 * comparator. If the specified comparator is {@code null}, this method is
3579 * equivalent to {@link #reverseOrder()} (in other words, it returns a
3580 * comparator that imposes the reverse of the <em>natural ordering</em> on
3581 * a collection of objects that implement the Comparable interface).
3582 *
3583 * <p>The returned comparator is serializable (assuming the specified
3584 * comparator is also serializable or {@code null}).
3585 *
3586 * @param cmp a comparator who's ordering is to be reversed by the returned
3587 * comparator or {@code null}
3588 * @return A comparator that imposes the reverse ordering of the
3589 * specified comparator.
3590 * @since 1.5
3591 */
3592 public static <T> Comparator<T> reverseOrder(Comparator<T> cmp) {
3593 if (cmp == null)
3594 return reverseOrder();
3595
3596 if (cmp instanceof ReverseComparator2)
3597 return ((ReverseComparator2<T>)cmp).cmp;
3598
3599 return new ReverseComparator2<>(cmp);
3600 }
3601
3602 /**
3603 * @serial include
3604 */
3605 private static class ReverseComparator2<T> implements Comparator<T>,
3606 Serializable
3607 {
3608 private static final long serialVersionUID = 4374092139857L;
3609
3610 /**
3611 * The comparator specified in the static factory. This will never
3612 * be null, as the static factory returns a ReverseComparator
3613 * instance if its argument is null.
3614 *
3615 * @serial
3616 */
3617 final Comparator<T> cmp;
3618
3619 ReverseComparator2(Comparator<T> cmp) {
3620 assert cmp != null;
3621 this.cmp = cmp;
3622 }
3623
3624 public int compare(T t1, T t2) {
3625 return cmp.compare(t2, t1);
3626 }
3627
3628 public boolean equals(Object o) {
3629 return (o == this) ||
3630 (o instanceof ReverseComparator2 &&
3631 cmp.equals(((ReverseComparator2)o).cmp));
3632 }
3633
3634 public int hashCode() {
3635 return cmp.hashCode() ^ Integer.MIN_VALUE;
3636 }
3637 }
3638
3639 /**
3640 * Returns an enumeration over the specified collection. This provides
3641 * interoperability with legacy APIs that require an enumeration
3642 * as input.
3643 *
3644 * @param c the collection for which an enumeration is to be returned.
3645 * @return an enumeration over the specified collection.
3646 * @see Enumeration
3647 */
3648 public static <T> Enumeration<T> enumeration(final Collection<T> c) {
3649 return new Enumeration<T>() {
3650 private final Iterator<T> i = c.iterator();
3651
3652 public boolean hasMoreElements() {
3653 return i.hasNext();
3654 }
3655
3656 public T nextElement() {
3657 return i.next();
3658 }
3659 };
3660 }
3661
3662 /**
3663 * Returns an array list containing the elements returned by the
3664 * specified enumeration in the order they are returned by the
3665 * enumeration. This method provides interoperability between
3666 * legacy APIs that return enumerations and new APIs that require
3667 * collections.
3668 *
3669 * @param e enumeration providing elements for the returned
3670 * array list
3671 * @return an array list containing the elements returned
3672 * by the specified enumeration.
3673 * @since 1.4
3674 * @see Enumeration
3675 * @see ArrayList
3676 */
3677 public static <T> ArrayList<T> list(Enumeration<T> e) {
3678 ArrayList<T> l = new ArrayList<>();
3679 while (e.hasMoreElements())
3680 l.add(e.nextElement());
3681 return l;
3682 }
3683
3684 /**
3685 * Returns true if the specified arguments are equal, or both null.
3686 */
3687 static boolean eq(Object o1, Object o2) {
3688 return o1==null ? o2==null : o1.equals(o2);
3689 }
3690
3691 /**
3692 * Returns the number of elements in the specified collection equal to the
3693 * specified object. More formally, returns the number of elements
3694 * <tt>e</tt> in the collection such that
3695 * <tt>(o == null ? e == null : o.equals(e))</tt>.
3696 *
3697 * @param c the collection in which to determine the frequency
3698 * of <tt>o</tt>
3699 * @param o the object whose frequency is to be determined
3700 * @throws NullPointerException if <tt>c</tt> is null
3701 * @since 1.5
3702 */
3703 public static int frequency(Collection<?> c, Object o) {
3704 int result = 0;
3705 if (o == null) {
3706 for (Object e : c)
3707 if (e == null)
3708 result++;
3709 } else {
3710 for (Object e : c)
3711 if (o.equals(e))
3712 result++;
3713 }
3714 return result;
3715 }
3716
3717 /**
3718 * Returns {@code true} if the two specified collections have no
3719 * elements in common.
3720 *
3721 * <p>Care must be exercised if this method is used on collections that
3722 * do not comply with the general contract for {@code Collection}.
3723 * Implementations may elect to iterate over either collection and test
3724 * for containment in the other collection (or to perform any equivalent
3725 * computation). If either collection uses a nonstandard equality test
3726 * (as does a {@link SortedSet} whose ordering is not <em>compatible with
3727 * equals</em>, or the key set of an {@link IdentityHashMap}), both
3728 * collections must use the same nonstandard equality test, or the
3729 * result of this method is undefined.
3730 *
3731 * <p>Care must also be exercised when using collections that have
3732 * restrictions on the elements that they may contain. Collection
3733 * implementations are allowed to throw exceptions for any operation
3734 * involving elements they deem ineligible. For absolute safety the
3735 * specified collections should contain only elements which are
3736 * eligible elements for both collections.
3737 *
3738 * <p>Note that it is permissible to pass the same collection in both
3739 * parameters, in which case the method will return {@code true} if and
3740 * only if the collection is empty.
3741 *
3742 * @param c1 a collection
3743 * @param c2 a collection
3744 * @return {@code true} if the two specified collections have no
3745 * elements in common.
3746 * @throws NullPointerException if either collection is {@code null}.
3747 * @throws NullPointerException if one collection contains a {@code null}
3748 * element and {@code null} is not an eligible element for the other collection.
3749 * (<a href="Collection.html#optional-restrictions">optional</a>)
3750 * @throws ClassCastException if one collection contains an element that is
3751 * of a type which is ineligible for the other collection.
3752 * (<a href="Collection.html#optional-restrictions">optional</a>)
3753 * @since 1.5
3754 */
3755 public static boolean disjoint(Collection<?> c1, Collection<?> c2) {
3756 // The collection to be used for contains(). Preference is given to
3757 // the collection who's contains() has lower O() complexity.
3758 Collection<?> contains = c2;
3759 // The collection to be iterated. If the collections' contains() impl
3760 // are of different O() complexity, the collection with slower
3761 // contains() will be used for iteration. For collections who's
3762 // contains() are of the same complexity then best performance is
3763 // achieved by iterating the smaller collection.
3764 Collection<?> iterate = c1;
3765
3766 // Performance optimization cases. The heuristics:
3767 // 1. Generally iterate over c1.
3768 // 2. If c1 is a Set then iterate over c2.
3769 // 3. If either collection is empty then result is always true.
3770 // 4. Iterate over the smaller Collection.
3771 if (c1 instanceof Set) {
3772 // Use c1 for contains as a Set's contains() is expected to perform
3773 // better than O(N/2)
3774 iterate = c2;
3775 contains = c1;
3776 } else if (!(c2 instanceof Set)) {
3777 // Both are mere Collections. Iterate over smaller collection.
3778 // Example: If c1 contains 3 elements and c2 contains 50 elements and
3779 // assuming contains() requires ceiling(N/2) comparisons then
3780 // checking for all c1 elements in c2 would require 75 comparisons
3781 // (3 * ceiling(50/2)) vs. checking all c2 elements in c1 requiring
3782 // 100 comparisons (50 * ceiling(3/2)).
3783 int c1size = c1.size();
3784 int c2size = c2.size();
3785 if (c1size == 0 || c2size == 0) {
3786 // At least one collection is empty. Nothing will match.
3787 return true;
3788 }
3789
3790 if (c1size > c2size) {
3791 iterate = c2;
3792 contains = c1;
3793 }
3794 }
3795
3796 for (Object e : iterate) {
3797 if (contains.contains(e)) {
3798 // Found a common element. Collections are not disjoint.
3799 return false;
3800 }
3801 }
3802
3803 // No common elements were found.
3804 return true;
3805 }
3806
3807 /**
3808 * Adds all of the specified elements to the specified collection.
3809 * Elements to be added may be specified individually or as an array.
3810 * The behavior of this convenience method is identical to that of
3811 * <tt>c.addAll(Arrays.asList(elements))</tt>, but this method is likely
3812 * to run significantly faster under most implementations.
3813 *
3814 * <p>When elements are specified individually, this method provides a
3815 * convenient way to add a few elements to an existing collection:
3816 * <pre>
3817 * Collections.addAll(flavors, "Peaches 'n Plutonium", "Rocky Racoon");
3818 * </pre>
3819 *
3820 * @param c the collection into which <tt>elements</tt> are to be inserted
3821 * @param elements the elements to insert into <tt>c</tt>
3822 * @return <tt>true</tt> if the collection changed as a result of the call
3823 * @throws UnsupportedOperationException if <tt>c</tt> does not support
3824 * the <tt>add</tt> operation
3825 * @throws NullPointerException if <tt>elements</tt> contains one or more
3826 * null values and <tt>c</tt> does not permit null elements, or
3827 * if <tt>c</tt> or <tt>elements</tt> are <tt>null</tt>
3828 * @throws IllegalArgumentException if some property of a value in
3829 * <tt>elements</tt> prevents it from being added to <tt>c</tt>
3830 * @see Collection#addAll(Collection)
3831 * @since 1.5
3832 */
3833 @SafeVarargs
3834 public static <T> boolean addAll(Collection<? super T> c, T... elements) {
3835 boolean result = false;
3836 for (T element : elements)
3837 result |= c.add(element);
3838 return result;
3839 }
3840
3841 /**
3842 * Returns a set backed by the specified map. The resulting set displays
3843 * the same ordering, concurrency, and performance characteristics as the
3844 * backing map. In essence, this factory method provides a {@link Set}
3845 * implementation corresponding to any {@link Map} implementation. There
3846 * is no need to use this method on a {@link Map} implementation that
3847 * already has a corresponding {@link Set} implementation (such as {@link
3848 * HashMap} or {@link TreeMap}).
3849 *
3850 * <p>Each method invocation on the set returned by this method results in
3851 * exactly one method invocation on the backing map or its <tt>keySet</tt>
3852 * view, with one exception. The <tt>addAll</tt> method is implemented
3853 * as a sequence of <tt>put</tt> invocations on the backing map.
3854 *
3855 * <p>The specified map must be empty at the time this method is invoked,
3856 * and should not be accessed directly after this method returns. These
3857 * conditions are ensured if the map is created empty, passed directly
3858 * to this method, and no reference to the map is retained, as illustrated
3859 * in the following code fragment:
3860 * <pre>
3861 * Set&lt;Object&gt; weakHashSet = Collections.newSetFromMap(
3862 * new WeakHashMap&lt;Object, Boolean&gt;());
3863 * </pre>
3864 *
3865 * @param map the backing map
3866 * @return the set backed by the map
3867 * @throws IllegalArgumentException if <tt>map</tt> is not empty
3868 * @since 1.6
3869 */
3870 public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {
3871 return new SetFromMap<>(map);
3872 }
3873
3874 /**
3875 * @serial include
3876 */
3877 private static class SetFromMap<E> extends AbstractSet<E>
3878 implements Set<E>, Serializable
3879 {
3880 private final Map<E, Boolean> m; // The backing map
3881 private transient Set<E> s; // Its keySet
3882
3883 SetFromMap(Map<E, Boolean> map) {
3884 if (!map.isEmpty())
3885 throw new IllegalArgumentException("Map is non-empty");
3886 m = map;
3887 s = map.keySet();
3888 }
3889
3890 public void clear() { m.clear(); }
3891 public int size() { return m.size(); }
3892 public boolean isEmpty() { return m.isEmpty(); }
3893 public boolean contains(Object o) { return m.containsKey(o); }
3894 public boolean remove(Object o) { return m.remove(o) != null; }
3895 public boolean add(E e) { return m.put(e, Boolean.TRUE) == null; }
3896 public Iterator<E> iterator() { return s.iterator(); }
3897 public Object[] toArray() { return s.toArray(); }
3898 public <T> T[] toArray(T[] a) { return s.toArray(a); }
3899 public String toString() { return s.toString(); }
3900 public int hashCode() { return s.hashCode(); }
3901 public boolean equals(Object o) { return o == this || s.equals(o); }
3902 public boolean containsAll(Collection<?> c) {return s.containsAll(c);}
3903 public boolean removeAll(Collection<?> c) {return s.removeAll(c);}
3904 public boolean retainAll(Collection<?> c) {return s.retainAll(c);}
3905 // addAll is the only inherited implementation
3906
3907 private static final long serialVersionUID = 2454657854757543876L;
3908
3909 private void readObject(java.io.ObjectInputStream stream)
3910 throws IOException, ClassNotFoundException
3911 {
3912 stream.defaultReadObject();
3913 s = m.keySet();
3914 }
3915 }
3916
3917 /**
3918 * Returns a view of a {@link Deque} as a Last-in-first-out (Lifo)
3919 * {@link Queue}. Method <tt>add</tt> is mapped to <tt>push</tt>,
3920 * <tt>remove</tt> is mapped to <tt>pop</tt> and so on. This
3921 * view can be useful when you would like to use a method
3922 * requiring a <tt>Queue</tt> but you need Lifo ordering.
3923 *
3924 * <p>Each method invocation on the queue returned by this method
3925 * results in exactly one method invocation on the backing deque, with
3926 * one exception. The {@link Queue#addAll addAll} method is
3927 * implemented as a sequence of {@link Deque#addFirst addFirst}
3928 * invocations on the backing deque.
3929 *
3930 * @param deque the deque
3931 * @return the queue
3932 * @since 1.6
3933 */
3934 public static <T> Queue<T> asLifoQueue(Deque<T> deque) {
3935 return new AsLIFOQueue<>(deque);
3936 }
3937
3938 /**
3939 * @serial include
3940 */
3941 static class AsLIFOQueue<E> extends AbstractQueue<E>
3942 implements Queue<E>, Serializable {
3943 private static final long serialVersionUID = 1802017725587941708L;
3944 private final Deque<E> q;
3945 AsLIFOQueue(Deque<E> q) { this.q = q; }
3946 public boolean add(E e) { q.addFirst(e); return true; }
3947 public boolean offer(E e) { return q.offerFirst(e); }
3948 public E poll() { return q.pollFirst(); }
3949 public E remove() { return q.removeFirst(); }
3950 public E peek() { return q.peekFirst(); }
3951 public E element() { return q.getFirst(); }
3952 public void clear() { q.clear(); }
3953 public int size() { return q.size(); }
3954 public boolean isEmpty() { return q.isEmpty(); }
3955 public boolean contains(Object o) { return q.contains(o); }
3956 public boolean remove(Object o) { return q.remove(o); }
3957 public Iterator<E> iterator() { return q.iterator(); }
3958 public Object[] toArray() { return q.toArray(); }
3959 public <T> T[] toArray(T[] a) { return q.toArray(a); }
3960 public String toString() { return q.toString(); }
3961 public boolean containsAll(Collection<?> c) {return q.containsAll(c);}
3962 public boolean removeAll(Collection<?> c) {return q.removeAll(c);}
3963 public boolean retainAll(Collection<?> c) {return q.retainAll(c);}
3964 // We use inherited addAll; forwarding addAll would be wrong
3965 }
3966}
java/pkg/java/util/ComparableTimSort.class+0−0

Binary file not shown.

java/pkg/java/util/ComparableTimSort.java+895−0
@@ -0,0 +1,895 @@
1/*
2 * Copyright 2009 Google Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.util;
27
28/**
29 * This is a near duplicate of {@link TimSort}, modified for use with
30 * arrays of objects that implement {@link Comparable}, instead of using
31 * explicit comparators.
32 *
33 * <p>If you are using an optimizing VM, you may find that ComparableTimSort
34 * offers no performance benefit over TimSort in conjunction with a
35 * comparator that simply returns {@code ((Comparable)first).compareTo(Second)}.
36 * If this is the case, you are better off deleting ComparableTimSort to
37 * eliminate the code duplication. (See Arrays.java for details.)
38 *
39 * @author Josh Bloch
40 */
41class ComparableTimSort {
42 /**
43 * This is the minimum sized sequence that will be merged. Shorter
44 * sequences will be lengthened by calling binarySort. If the entire
45 * array is less than this length, no merges will be performed.
46 *
47 * This constant should be a power of two. It was 64 in Tim Peter's C
48 * implementation, but 32 was empirically determined to work better in
49 * this implementation. In the unlikely event that you set this constant
50 * to be a number that's not a power of two, you'll need to change the
51 * {@link #minRunLength} computation.
52 *
53 * If you decrease this constant, you must change the stackLen
54 * computation in the TimSort constructor, or you risk an
55 * ArrayOutOfBounds exception. See listsort.txt for a discussion
56 * of the minimum stack length required as a function of the length
57 * of the array being sorted and the minimum merge sequence length.
58 */
59 private static final int MIN_MERGE = 32;
60
61 /**
62 * The array being sorted.
63 */
64 private final Object[] a;
65
66 /**
67 * When we get into galloping mode, we stay there until both runs win less
68 * often than MIN_GALLOP consecutive times.
69 */
70 private static final int MIN_GALLOP = 7;
71
72 /**
73 * This controls when we get *into* galloping mode. It is initialized
74 * to MIN_GALLOP. The mergeLo and mergeHi methods nudge it higher for
75 * random data, and lower for highly structured data.
76 */
77 private int minGallop = MIN_GALLOP;
78
79 /**
80 * Maximum initial size of tmp array, which is used for merging. The array
81 * can grow to accommodate demand.
82 *
83 * Unlike Tim's original C version, we do not allocate this much storage
84 * when sorting smaller arrays. This change was required for performance.
85 */
86 private static final int INITIAL_TMP_STORAGE_LENGTH = 256;
87
88 /**
89 * Temp storage for merges.
90 */
91 private Object[] tmp;
92
93 /**
94 * A stack of pending runs yet to be merged. Run i starts at
95 * address base[i] and extends for len[i] elements. It's always
96 * true (so long as the indices are in bounds) that:
97 *
98 * runBase[i] + runLen[i] == runBase[i + 1]
99 *
100 * so we could cut the storage for this, but it's a minor amount,
101 * and keeping all the info explicit simplifies the code.
102 */
103 private int stackSize = 0; // Number of pending runs on stack
104 private final int[] runBase;
105 private final int[] runLen;
106
107 /**
108 * Creates a TimSort instance to maintain the state of an ongoing sort.
109 *
110 * @param a the array to be sorted
111 */
112 private ComparableTimSort(Object[] a) {
113 this.a = a;
114
115 // Allocate temp storage (which may be increased later if necessary)
116 int len = a.length;
117 @SuppressWarnings({"unchecked", "UnnecessaryLocalVariable"})
118 Object[] newArray = new Object[len < 2 * INITIAL_TMP_STORAGE_LENGTH ?
119 len >>> 1 : INITIAL_TMP_STORAGE_LENGTH];
120 tmp = newArray;
121
122 /*
123 * Allocate runs-to-be-merged stack (which cannot be expanded). The
124 * stack length requirements are described in listsort.txt. The C
125 * version always uses the same stack length (85), but this was
126 * measured to be too expensive when sorting "mid-sized" arrays (e.g.,
127 * 100 elements) in Java. Therefore, we use smaller (but sufficiently
128 * large) stack lengths for smaller arrays. The "magic numbers" in the
129 * computation below must be changed if MIN_MERGE is decreased. See
130 * the MIN_MERGE declaration above for more information.
131 */
132 int stackLen = (len < 120 ? 5 :
133 len < 1542 ? 10 :
134 len < 119151 ? 19 : 40);
135 runBase = new int[stackLen];
136 runLen = new int[stackLen];
137 }
138
139 /*
140 * The next two methods (which are package private and static) constitute
141 * the entire API of this class. Each of these methods obeys the contract
142 * of the public method with the same signature in java.util.Arrays.
143 */
144
145 static void sort(Object[] a) {
146 sort(a, 0, a.length);
147 }
148
149 static void sort(Object[] a, int lo, int hi) {
150 rangeCheck(a.length, lo, hi);
151 int nRemaining = hi - lo;
152 if (nRemaining < 2)
153 return; // Arrays of size 0 and 1 are always sorted
154
155 // If array is small, do a "mini-TimSort" with no merges
156 if (nRemaining < MIN_MERGE) {
157 int initRunLen = countRunAndMakeAscending(a, lo, hi);
158 binarySort(a, lo, hi, lo + initRunLen);
159 return;
160 }
161
162 /**
163 * March over the array once, left to right, finding natural runs,
164 * extending short natural runs to minRun elements, and merging runs
165 * to maintain stack invariant.
166 */
167 ComparableTimSort ts = new ComparableTimSort(a);
168 int minRun = minRunLength(nRemaining);
169 do {
170 // Identify next run
171 int runLen = countRunAndMakeAscending(a, lo, hi);
172
173 // If run is short, extend to min(minRun, nRemaining)
174 if (runLen < minRun) {
175 int force = nRemaining <= minRun ? nRemaining : minRun;
176 binarySort(a, lo, lo + force, lo + runLen);
177 runLen = force;
178 }
179
180 // Push run onto pending-run stack, and maybe merge
181 ts.pushRun(lo, runLen);
182 ts.mergeCollapse();
183
184 // Advance to find next run
185 lo += runLen;
186 nRemaining -= runLen;
187 } while (nRemaining != 0);
188
189 // Merge all remaining runs to complete sort
190 assert lo == hi;
191 ts.mergeForceCollapse();
192 assert ts.stackSize == 1;
193 }
194
195 /**
196 * Sorts the specified portion of the specified array using a binary
197 * insertion sort. This is the best method for sorting small numbers
198 * of elements. It requires O(n log n) compares, but O(n^2) data
199 * movement (worst case).
200 *
201 * If the initial part of the specified range is already sorted,
202 * this method can take advantage of it: the method assumes that the
203 * elements from index {@code lo}, inclusive, to {@code start},
204 * exclusive are already sorted.
205 *
206 * @param a the array in which a range is to be sorted
207 * @param lo the index of the first element in the range to be sorted
208 * @param hi the index after the last element in the range to be sorted
209 * @param start the index of the first element in the range that is
210 * not already known to be sorted ({@code lo <= start <= hi})
211 */
212 @SuppressWarnings("fallthrough")
213 private static void binarySort(Object[] a, int lo, int hi, int start) {
214 assert lo <= start && start <= hi;
215 if (start == lo)
216 start++;
217 for ( ; start < hi; start++) {
218 @SuppressWarnings("unchecked")
219 Comparable<Object> pivot = (Comparable) a[start];
220
221 // Set left (and right) to the index where a[start] (pivot) belongs
222 int left = lo;
223 int right = start;
224 assert left <= right;
225 /*
226 * Invariants:
227 * pivot >= all in [lo, left).
228 * pivot < all in [right, start).
229 */
230 while (left < right) {
231 int mid = (left + right) >>> 1;
232 if (pivot.compareTo(a[mid]) < 0)
233 right = mid;
234 else
235 left = mid + 1;
236 }
237 assert left == right;
238
239 /*
240 * The invariants still hold: pivot >= all in [lo, left) and
241 * pivot < all in [left, start), so pivot belongs at left. Note
242 * that if there are elements equal to pivot, left points to the
243 * first slot after them -- that's why this sort is stable.
244 * Slide elements over to make room for pivot.
245 */
246 int n = start - left; // The number of elements to move
247 // Switch is just an optimization for arraycopy in default case
248 switch (n) {
249 case 2: a[left + 2] = a[left + 1];
250 case 1: a[left + 1] = a[left];
251 break;
252 default: System.arraycopy(a, left, a, left + 1, n);
253 }
254 a[left] = pivot;
255 }
256 }
257
258 /**
259 * Returns the length of the run beginning at the specified position in
260 * the specified array and reverses the run if it is descending (ensuring
261 * that the run will always be ascending when the method returns).
262 *
263 * A run is the longest ascending sequence with:
264 *
265 * a[lo] <= a[lo + 1] <= a[lo + 2] <= ...
266 *
267 * or the longest descending sequence with:
268 *
269 * a[lo] > a[lo + 1] > a[lo + 2] > ...
270 *
271 * For its intended use in a stable mergesort, the strictness of the
272 * definition of "descending" is needed so that the call can safely
273 * reverse a descending sequence without violating stability.
274 *
275 * @param a the array in which a run is to be counted and possibly reversed
276 * @param lo index of the first element in the run
277 * @param hi index after the last element that may be contained in the run.
278 It is required that {@code lo < hi}.
279 * @return the length of the run beginning at the specified position in
280 * the specified array
281 */
282 @SuppressWarnings("unchecked")
283 private static int countRunAndMakeAscending(Object[] a, int lo, int hi) {
284 assert lo < hi;
285 int runHi = lo + 1;
286 if (runHi == hi)
287 return 1;
288
289 // Find end of run, and reverse range if descending
290 if (((Comparable) a[runHi++]).compareTo(a[lo]) < 0) { // Descending
291 while (runHi < hi && ((Comparable) a[runHi]).compareTo(a[runHi - 1]) < 0)
292 runHi++;
293 reverseRange(a, lo, runHi);
294 } else { // Ascending
295 while (runHi < hi && ((Comparable) a[runHi]).compareTo(a[runHi - 1]) >= 0)
296 runHi++;
297 }
298
299 return runHi - lo;
300 }
301
302 /**
303 * Reverse the specified range of the specified array.
304 *
305 * @param a the array in which a range is to be reversed
306 * @param lo the index of the first element in the range to be reversed
307 * @param hi the index after the last element in the range to be reversed
308 */
309 private static void reverseRange(Object[] a, int lo, int hi) {
310 hi--;
311 while (lo < hi) {
312 Object t = a[lo];
313 a[lo++] = a[hi];
314 a[hi--] = t;
315 }
316 }
317
318 /**
319 * Returns the minimum acceptable run length for an array of the specified
320 * length. Natural runs shorter than this will be extended with
321 * {@link #binarySort}.
322 *
323 * Roughly speaking, the computation is:
324 *
325 * If n < MIN_MERGE, return n (it's too small to bother with fancy stuff).
326 * Else if n is an exact power of 2, return MIN_MERGE/2.
327 * Else return an int k, MIN_MERGE/2 <= k <= MIN_MERGE, such that n/k
328 * is close to, but strictly less than, an exact power of 2.
329 *
330 * For the rationale, see listsort.txt.
331 *
332 * @param n the length of the array to be sorted
333 * @return the length of the minimum run to be merged
334 */
335 private static int minRunLength(int n) {
336 assert n >= 0;
337 int r = 0; // Becomes 1 if any 1 bits are shifted off
338 while (n >= MIN_MERGE) {
339 r |= (n & 1);
340 n >>= 1;
341 }
342 return n + r;
343 }
344
345 /**
346 * Pushes the specified run onto the pending-run stack.
347 *
348 * @param runBase index of the first element in the run
349 * @param runLen the number of elements in the run
350 */
351 private void pushRun(int runBase, int runLen) {
352 this.runBase[stackSize] = runBase;
353 this.runLen[stackSize] = runLen;
354 stackSize++;
355 }
356
357 /**
358 * Examines the stack of runs waiting to be merged and merges adjacent runs
359 * until the stack invariants are reestablished:
360 *
361 * 1. runLen[i - 3] > runLen[i - 2] + runLen[i - 1]
362 * 2. runLen[i - 2] > runLen[i - 1]
363 *
364 * This method is called each time a new run is pushed onto the stack,
365 * so the invariants are guaranteed to hold for i < stackSize upon
366 * entry to the method.
367 */
368 private void mergeCollapse() {
369 while (stackSize > 1) {
370 int n = stackSize - 2;
371 if (n > 0 && runLen[n-1] <= runLen[n] + runLen[n+1]) {
372 if (runLen[n - 1] < runLen[n + 1])
373 n--;
374 mergeAt(n);
375 } else if (runLen[n] <= runLen[n + 1]) {
376 mergeAt(n);
377 } else {
378 break; // Invariant is established
379 }
380 }
381 }
382
383 /**
384 * Merges all runs on the stack until only one remains. This method is
385 * called once, to complete the sort.
386 */
387 private void mergeForceCollapse() {
388 while (stackSize > 1) {
389 int n = stackSize - 2;
390 if (n > 0 && runLen[n - 1] < runLen[n + 1])
391 n--;
392 mergeAt(n);
393 }
394 }
395
396 /**
397 * Merges the two runs at stack indices i and i+1. Run i must be
398 * the penultimate or antepenultimate run on the stack. In other words,
399 * i must be equal to stackSize-2 or stackSize-3.
400 *
401 * @param i stack index of the first of the two runs to merge
402 */
403 @SuppressWarnings("unchecked")
404 private void mergeAt(int i) {
405 assert stackSize >= 2;
406 assert i >= 0;
407 assert i == stackSize - 2 || i == stackSize - 3;
408
409 int base1 = runBase[i];
410 int len1 = runLen[i];
411 int base2 = runBase[i + 1];
412 int len2 = runLen[i + 1];
413 assert len1 > 0 && len2 > 0;
414 assert base1 + len1 == base2;
415
416 /*
417 * Record the length of the combined runs; if i is the 3rd-last
418 * run now, also slide over the last run (which isn't involved
419 * in this merge). The current run (i+1) goes away in any case.
420 */
421 runLen[i] = len1 + len2;
422 if (i == stackSize - 3) {
423 runBase[i + 1] = runBase[i + 2];
424 runLen[i + 1] = runLen[i + 2];
425 }
426 stackSize--;
427
428 /*
429 * Find where the first element of run2 goes in run1. Prior elements
430 * in run1 can be ignored (because they're already in place).
431 */
432 int k = gallopRight((Comparable<Object>) a[base2], a, base1, len1, 0);
433 assert k >= 0;
434 base1 += k;
435 len1 -= k;
436 if (len1 == 0)
437 return;
438
439 /*
440 * Find where the last element of run1 goes in run2. Subsequent elements
441 * in run2 can be ignored (because they're already in place).
442 */
443 len2 = gallopLeft((Comparable<Object>) a[base1 + len1 - 1], a,
444 base2, len2, len2 - 1);
445 assert len2 >= 0;
446 if (len2 == 0)
447 return;
448
449 // Merge remaining runs, using tmp array with min(len1, len2) elements
450 if (len1 <= len2)
451 mergeLo(base1, len1, base2, len2);
452 else
453 mergeHi(base1, len1, base2, len2);
454 }
455
456 /**
457 * Locates the position at which to insert the specified key into the
458 * specified sorted range; if the range contains an element equal to key,
459 * returns the index of the leftmost equal element.
460 *
461 * @param key the key whose insertion point to search for
462 * @param a the array in which to search
463 * @param base the index of the first element in the range
464 * @param len the length of the range; must be > 0
465 * @param hint the index at which to begin the search, 0 <= hint < n.
466 * The closer hint is to the result, the faster this method will run.
467 * @return the int k, 0 <= k <= n such that a[b + k - 1] < key <= a[b + k],
468 * pretending that a[b - 1] is minus infinity and a[b + n] is infinity.
469 * In other words, key belongs at index b + k; or in other words,
470 * the first k elements of a should precede key, and the last n - k
471 * should follow it.
472 */
473 private static int gallopLeft(Comparable<Object> key, Object[] a,
474 int base, int len, int hint) {
475 assert len > 0 && hint >= 0 && hint < len;
476
477 int lastOfs = 0;
478 int ofs = 1;
479 if (key.compareTo(a[base + hint]) > 0) {
480 // Gallop right until a[base+hint+lastOfs] < key <= a[base+hint+ofs]
481 int maxOfs = len - hint;
482 while (ofs < maxOfs && key.compareTo(a[base + hint + ofs]) > 0) {
483 lastOfs = ofs;
484 ofs = (ofs << 1) + 1;
485 if (ofs <= 0) // int overflow
486 ofs = maxOfs;
487 }
488 if (ofs > maxOfs)
489 ofs = maxOfs;
490
491 // Make offsets relative to base
492 lastOfs += hint;
493 ofs += hint;
494 } else { // key <= a[base + hint]
495 // Gallop left until a[base+hint-ofs] < key <= a[base+hint-lastOfs]
496 final int maxOfs = hint + 1;
497 while (ofs < maxOfs && key.compareTo(a[base + hint - ofs]) <= 0) {
498 lastOfs = ofs;
499 ofs = (ofs << 1) + 1;
500 if (ofs <= 0) // int overflow
501 ofs = maxOfs;
502 }
503 if (ofs > maxOfs)
504 ofs = maxOfs;
505
506 // Make offsets relative to base
507 int tmp = lastOfs;
508 lastOfs = hint - ofs;
509 ofs = hint - tmp;
510 }
511 assert -1 <= lastOfs && lastOfs < ofs && ofs <= len;
512
513 /*
514 * Now a[base+lastOfs] < key <= a[base+ofs], so key belongs somewhere
515 * to the right of lastOfs but no farther right than ofs. Do a binary
516 * search, with invariant a[base + lastOfs - 1] < key <= a[base + ofs].
517 */
518 lastOfs++;
519 while (lastOfs < ofs) {
520 int m = lastOfs + ((ofs - lastOfs) >>> 1);
521
522 if (key.compareTo(a[base + m]) > 0)
523 lastOfs = m + 1; // a[base + m] < key
524 else
525 ofs = m; // key <= a[base + m]
526 }
527 assert lastOfs == ofs; // so a[base + ofs - 1] < key <= a[base + ofs]
528 return ofs;
529 }
530
531 /**
532 * Like gallopLeft, except that if the range contains an element equal to
533 * key, gallopRight returns the index after the rightmost equal element.
534 *
535 * @param key the key whose insertion point to search for
536 * @param a the array in which to search
537 * @param base the index of the first element in the range
538 * @param len the length of the range; must be > 0
539 * @param hint the index at which to begin the search, 0 <= hint < n.
540 * The closer hint is to the result, the faster this method will run.
541 * @return the int k, 0 <= k <= n such that a[b + k - 1] <= key < a[b + k]
542 */
543 private static int gallopRight(Comparable<Object> key, Object[] a,
544 int base, int len, int hint) {
545 assert len > 0 && hint >= 0 && hint < len;
546
547 int ofs = 1;
548 int lastOfs = 0;
549 if (key.compareTo(a[base + hint]) < 0) {
550 // Gallop left until a[b+hint - ofs] <= key < a[b+hint - lastOfs]
551 int maxOfs = hint + 1;
552 while (ofs < maxOfs && key.compareTo(a[base + hint - ofs]) < 0) {
553 lastOfs = ofs;
554 ofs = (ofs << 1) + 1;
555 if (ofs <= 0) // int overflow
556 ofs = maxOfs;
557 }
558 if (ofs > maxOfs)
559 ofs = maxOfs;
560
561 // Make offsets relative to b
562 int tmp = lastOfs;
563 lastOfs = hint - ofs;
564 ofs = hint - tmp;
565 } else { // a[b + hint] <= key
566 // Gallop right until a[b+hint + lastOfs] <= key < a[b+hint + ofs]
567 int maxOfs = len - hint;
568 while (ofs < maxOfs && key.compareTo(a[base + hint + ofs]) >= 0) {
569 lastOfs = ofs;
570 ofs = (ofs << 1) + 1;
571 if (ofs <= 0) // int overflow
572 ofs = maxOfs;
573 }
574 if (ofs > maxOfs)
575 ofs = maxOfs;
576
577 // Make offsets relative to b
578 lastOfs += hint;
579 ofs += hint;
580 }
581 assert -1 <= lastOfs && lastOfs < ofs && ofs <= len;
582
583 /*
584 * Now a[b + lastOfs] <= key < a[b + ofs], so key belongs somewhere to
585 * the right of lastOfs but no farther right than ofs. Do a binary
586 * search, with invariant a[b + lastOfs - 1] <= key < a[b + ofs].
587 */
588 lastOfs++;
589 while (lastOfs < ofs) {
590 int m = lastOfs + ((ofs - lastOfs) >>> 1);
591
592 if (key.compareTo(a[base + m]) < 0)
593 ofs = m; // key < a[b + m]
594 else
595 lastOfs = m + 1; // a[b + m] <= key
596 }
597 assert lastOfs == ofs; // so a[b + ofs - 1] <= key < a[b + ofs]
598 return ofs;
599 }
600
601 /**
602 * Merges two adjacent runs in place, in a stable fashion. The first
603 * element of the first run must be greater than the first element of the
604 * second run (a[base1] > a[base2]), and the last element of the first run
605 * (a[base1 + len1-1]) must be greater than all elements of the second run.
606 *
607 * For performance, this method should be called only when len1 <= len2;
608 * its twin, mergeHi should be called if len1 >= len2. (Either method
609 * may be called if len1 == len2.)
610 *
611 * @param base1 index of first element in first run to be merged
612 * @param len1 length of first run to be merged (must be > 0)
613 * @param base2 index of first element in second run to be merged
614 * (must be aBase + aLen)
615 * @param len2 length of second run to be merged (must be > 0)
616 */
617 @SuppressWarnings("unchecked")
618 private void mergeLo(int base1, int len1, int base2, int len2) {
619 assert len1 > 0 && len2 > 0 && base1 + len1 == base2;
620
621 // Copy first run into temp array
622 Object[] a = this.a; // For performance
623 Object[] tmp = ensureCapacity(len1);
624 System.arraycopy(a, base1, tmp, 0, len1);
625
626 int cursor1 = 0; // Indexes into tmp array
627 int cursor2 = base2; // Indexes int a
628 int dest = base1; // Indexes int a
629
630 // Move first element of second run and deal with degenerate cases
631 a[dest++] = a[cursor2++];
632 if (--len2 == 0) {
633 System.arraycopy(tmp, cursor1, a, dest, len1);
634 return;
635 }
636 if (len1 == 1) {
637 System.arraycopy(a, cursor2, a, dest, len2);
638 a[dest + len2] = tmp[cursor1]; // Last elt of run 1 to end of merge
639 return;
640 }
641
642 int minGallop = this.minGallop; // Use local variable for performance
643 outer:
644 while (true) {
645 int count1 = 0; // Number of times in a row that first run won
646 int count2 = 0; // Number of times in a row that second run won
647
648 /*
649 * Do the straightforward thing until (if ever) one run starts
650 * winning consistently.
651 */
652 do {
653 assert len1 > 1 && len2 > 0;
654 if (((Comparable) a[cursor2]).compareTo(tmp[cursor1]) < 0) {
655 a[dest++] = a[cursor2++];
656 count2++;
657 count1 = 0;
658 if (--len2 == 0)
659 break outer;
660 } else {
661 a[dest++] = tmp[cursor1++];
662 count1++;
663 count2 = 0;
664 if (--len1 == 1)
665 break outer;
666 }
667 } while ((count1 | count2) < minGallop);
668
669 /*
670 * One run is winning so consistently that galloping may be a
671 * huge win. So try that, and continue galloping until (if ever)
672 * neither run appears to be winning consistently anymore.
673 */
674 do {
675 assert len1 > 1 && len2 > 0;
676 count1 = gallopRight((Comparable) a[cursor2], tmp, cursor1, len1, 0);
677 if (count1 != 0) {
678 System.arraycopy(tmp, cursor1, a, dest, count1);
679 dest += count1;
680 cursor1 += count1;
681 len1 -= count1;
682 if (len1 <= 1) // len1 == 1 || len1 == 0
683 break outer;
684 }
685 a[dest++] = a[cursor2++];
686 if (--len2 == 0)
687 break outer;
688
689 count2 = gallopLeft((Comparable) tmp[cursor1], a, cursor2, len2, 0);
690 if (count2 != 0) {
691 System.arraycopy(a, cursor2, a, dest, count2);
692 dest += count2;
693 cursor2 += count2;
694 len2 -= count2;
695 if (len2 == 0)
696 break outer;
697 }
698 a[dest++] = tmp[cursor1++];
699 if (--len1 == 1)
700 break outer;
701 minGallop--;
702 } while (count1 >= MIN_GALLOP | count2 >= MIN_GALLOP);
703 if (minGallop < 0)
704 minGallop = 0;
705 minGallop += 2; // Penalize for leaving gallop mode
706 } // End of "outer" loop
707 this.minGallop = minGallop < 1 ? 1 : minGallop; // Write back to field
708
709 if (len1 == 1) {
710 assert len2 > 0;
711 System.arraycopy(a, cursor2, a, dest, len2);
712 a[dest + len2] = tmp[cursor1]; // Last elt of run 1 to end of merge
713 } else if (len1 == 0) {
714 throw new IllegalArgumentException(
715 "Comparison method violates its general contract!");
716 } else {
717 assert len2 == 0;
718 assert len1 > 1;
719 System.arraycopy(tmp, cursor1, a, dest, len1);
720 }
721 }
722
723 /**
724 * Like mergeLo, except that this method should be called only if
725 * len1 >= len2; mergeLo should be called if len1 <= len2. (Either method
726 * may be called if len1 == len2.)
727 *
728 * @param base1 index of first element in first run to be merged
729 * @param len1 length of first run to be merged (must be > 0)
730 * @param base2 index of first element in second run to be merged
731 * (must be aBase + aLen)
732 * @param len2 length of second run to be merged (must be > 0)
733 */
734 @SuppressWarnings("unchecked")
735 private void mergeHi(int base1, int len1, int base2, int len2) {
736 assert len1 > 0 && len2 > 0 && base1 + len1 == base2;
737
738 // Copy second run into temp array
739 Object[] a = this.a; // For performance
740 Object[] tmp = ensureCapacity(len2);
741 System.arraycopy(a, base2, tmp, 0, len2);
742
743 int cursor1 = base1 + len1 - 1; // Indexes into a
744 int cursor2 = len2 - 1; // Indexes into tmp array
745 int dest = base2 + len2 - 1; // Indexes into a
746
747 // Move last element of first run and deal with degenerate cases
748 a[dest--] = a[cursor1--];
749 if (--len1 == 0) {
750 System.arraycopy(tmp, 0, a, dest - (len2 - 1), len2);
751 return;
752 }
753 if (len2 == 1) {
754 dest -= len1;
755 cursor1 -= len1;
756 System.arraycopy(a, cursor1 + 1, a, dest + 1, len1);
757 a[dest] = tmp[cursor2];
758 return;
759 }
760
761 int minGallop = this.minGallop; // Use local variable for performance
762 outer:
763 while (true) {
764 int count1 = 0; // Number of times in a row that first run won
765 int count2 = 0; // Number of times in a row that second run won
766
767 /*
768 * Do the straightforward thing until (if ever) one run
769 * appears to win consistently.
770 */
771 do {
772 assert len1 > 0 && len2 > 1;
773 if (((Comparable) tmp[cursor2]).compareTo(a[cursor1]) < 0) {
774 a[dest--] = a[cursor1--];
775 count1++;
776 count2 = 0;
777 if (--len1 == 0)
778 break outer;
779 } else {
780 a[dest--] = tmp[cursor2--];
781 count2++;
782 count1 = 0;
783 if (--len2 == 1)
784 break outer;
785 }
786 } while ((count1 | count2) < minGallop);
787
788 /*
789 * One run is winning so consistently that galloping may be a
790 * huge win. So try that, and continue galloping until (if ever)
791 * neither run appears to be winning consistently anymore.
792 */
793 do {
794 assert len1 > 0 && len2 > 1;
795 count1 = len1 - gallopRight((Comparable) tmp[cursor2], a, base1, len1, len1 - 1);
796 if (count1 != 0) {
797 dest -= count1;
798 cursor1 -= count1;
799 len1 -= count1;
800 System.arraycopy(a, cursor1 + 1, a, dest + 1, count1);
801 if (len1 == 0)
802 break outer;
803 }
804 a[dest--] = tmp[cursor2--];
805 if (--len2 == 1)
806 break outer;
807
808 count2 = len2 - gallopLeft((Comparable) a[cursor1], tmp, 0, len2, len2 - 1);
809 if (count2 != 0) {
810 dest -= count2;
811 cursor2 -= count2;
812 len2 -= count2;
813 System.arraycopy(tmp, cursor2 + 1, a, dest + 1, count2);
814 if (len2 <= 1)
815 break outer; // len2 == 1 || len2 == 0
816 }
817 a[dest--] = a[cursor1--];
818 if (--len1 == 0)
819 break outer;
820 minGallop--;
821 } while (count1 >= MIN_GALLOP | count2 >= MIN_GALLOP);
822 if (minGallop < 0)
823 minGallop = 0;
824 minGallop += 2; // Penalize for leaving gallop mode
825 } // End of "outer" loop
826 this.minGallop = minGallop < 1 ? 1 : minGallop; // Write back to field
827
828 if (len2 == 1) {
829 assert len1 > 0;
830 dest -= len1;
831 cursor1 -= len1;
832 System.arraycopy(a, cursor1 + 1, a, dest + 1, len1);
833 a[dest] = tmp[cursor2]; // Move first elt of run2 to front of merge
834 } else if (len2 == 0) {
835 throw new IllegalArgumentException(
836 "Comparison method violates its general contract!");
837 } else {
838 assert len1 == 0;
839 assert len2 > 0;
840 System.arraycopy(tmp, 0, a, dest - (len2 - 1), len2);
841 }
842 }
843
844 /**
845 * Ensures that the external array tmp has at least the specified
846 * number of elements, increasing its size if necessary. The size
847 * increases exponentially to ensure amortized linear time complexity.
848 *
849 * @param minCapacity the minimum required capacity of the tmp array
850 * @return tmp, whether or not it grew
851 */
852 private Object[] ensureCapacity(int minCapacity) {
853 if (tmp.length < minCapacity) {
854 // Compute smallest power of 2 > minCapacity
855 int newSize = minCapacity;
856 newSize |= newSize >> 1;
857 newSize |= newSize >> 2;
858 newSize |= newSize >> 4;
859 newSize |= newSize >> 8;
860 newSize |= newSize >> 16;
861 newSize++;
862
863 if (newSize < 0) // Not bloody likely!
864 newSize = minCapacity;
865 else
866 newSize = Math.min(newSize, a.length >>> 1);
867
868 @SuppressWarnings({"unchecked", "UnnecessaryLocalVariable"})
869 Object[] newArray = new Object[newSize];
870 tmp = newArray;
871 }
872 return tmp;
873 }
874
875 /**
876 * Checks that fromIndex and toIndex are in range, and throws an
877 * appropriate exception if they aren't.
878 *
879 * @param arrayLen the length of the array
880 * @param fromIndex the index of the first element of the range
881 * @param toIndex the index after the last element of the range
882 * @throws IllegalArgumentException if fromIndex > toIndex
883 * @throws ArrayIndexOutOfBoundsException if fromIndex < 0
884 * or toIndex > arrayLen
885 */
886 private static void rangeCheck(int arrayLen, int fromIndex, int toIndex) {
887 if (fromIndex > toIndex)
888 throw new IllegalArgumentException("fromIndex(" + fromIndex +
889 ") > toIndex(" + toIndex+")");
890 if (fromIndex < 0)
891 throw new ArrayIndexOutOfBoundsException(fromIndex);
892 if (toIndex > arrayLen)
893 throw new ArrayIndexOutOfBoundsException(toIndex);
894 }
895}
java/pkg/java/util/Comparator.class+0−0

Binary file not shown.

java/pkg/java/util/Comparator.java+168−0
@@ -0,0 +1,168 @@
1/*
2 * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.util;
27
28/**
29 * A comparison function, which imposes a <i>total ordering</i> on some
30 * collection of objects. Comparators can be passed to a sort method (such
31 * as {@link Collections#sort(List,Comparator) Collections.sort} or {@link
32 * Arrays#sort(Object[],Comparator) Arrays.sort}) to allow precise control
33 * over the sort order. Comparators can also be used to control the order of
34 * certain data structures (such as {@link SortedSet sorted sets} or {@link
35 * SortedMap sorted maps}), or to provide an ordering for collections of
36 * objects that don't have a {@link Comparable natural ordering}.<p>
37 *
38 * The ordering imposed by a comparator <tt>c</tt> on a set of elements
39 * <tt>S</tt> is said to be <i>consistent with equals</i> if and only if
40 * <tt>c.compare(e1, e2)==0</tt> has the same boolean value as
41 * <tt>e1.equals(e2)</tt> for every <tt>e1</tt> and <tt>e2</tt> in
42 * <tt>S</tt>.<p>
43 *
44 * Caution should be exercised when using a comparator capable of imposing an
45 * ordering inconsistent with equals to order a sorted set (or sorted map).
46 * Suppose a sorted set (or sorted map) with an explicit comparator <tt>c</tt>
47 * is used with elements (or keys) drawn from a set <tt>S</tt>. If the
48 * ordering imposed by <tt>c</tt> on <tt>S</tt> is inconsistent with equals,
49 * the sorted set (or sorted map) will behave "strangely." In particular the
50 * sorted set (or sorted map) will violate the general contract for set (or
51 * map), which is defined in terms of <tt>equals</tt>.<p>
52 *
53 * For example, suppose one adds two elements {@code a} and {@code b} such that
54 * {@code (a.equals(b) && c.compare(a, b) != 0)}
55 * to an empty {@code TreeSet} with comparator {@code c}.
56 * The second {@code add} operation will return
57 * true (and the size of the tree set will increase) because {@code a} and
58 * {@code b} are not equivalent from the tree set's perspective, even though
59 * this is contrary to the specification of the
60 * {@link Set#add Set.add} method.<p>
61 *
62 * Note: It is generally a good idea for comparators to also implement
63 * <tt>java.io.Serializable</tt>, as they may be used as ordering methods in
64 * serializable data structures (like {@link TreeSet}, {@link TreeMap}). In
65 * order for the data structure to serialize successfully, the comparator (if
66 * provided) must implement <tt>Serializable</tt>.<p>
67 *
68 * For the mathematically inclined, the <i>relation</i> that defines the
69 * <i>imposed ordering</i> that a given comparator <tt>c</tt> imposes on a
70 * given set of objects <tt>S</tt> is:<pre>
71 * {(x, y) such that c.compare(x, y) &lt;= 0}.
72 * </pre> The <i>quotient</i> for this total order is:<pre>
73 * {(x, y) such that c.compare(x, y) == 0}.
74 * </pre>
75 *
76 * It follows immediately from the contract for <tt>compare</tt> that the
77 * quotient is an <i>equivalence relation</i> on <tt>S</tt>, and that the
78 * imposed ordering is a <i>total order</i> on <tt>S</tt>. When we say that
79 * the ordering imposed by <tt>c</tt> on <tt>S</tt> is <i>consistent with
80 * equals</i>, we mean that the quotient for the ordering is the equivalence
81 * relation defined by the objects' {@link Object#equals(Object)
82 * equals(Object)} method(s):<pre>
83 * {(x, y) such that x.equals(y)}. </pre>
84 *
85 * <p>Unlike {@code Comparable}, a comparator may optionally permit
86 * comparison of null arguments, while maintaining the requirements for
87 * an equivalence relation.
88 *
89 * <p>This interface is a member of the
90 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
91 * Java Collections Framework</a>.
92 *
93 * @param <T> the type of objects that may be compared by this comparator
94 *
95 * @author Josh Bloch
96 * @author Neal Gafter
97 * @see Comparable
98 * @see java.io.Serializable
99 * @since 1.2
100 */
101
102public interface Comparator<T> {
103 /**
104 * Compares its two arguments for order. Returns a negative integer,
105 * zero, or a positive integer as the first argument is less than, equal
106 * to, or greater than the second.<p>
107 *
108 * In the foregoing description, the notation
109 * <tt>sgn(</tt><i>expression</i><tt>)</tt> designates the mathematical
110 * <i>signum</i> function, which is defined to return one of <tt>-1</tt>,
111 * <tt>0</tt>, or <tt>1</tt> according to whether the value of
112 * <i>expression</i> is negative, zero or positive.<p>
113 *
114 * The implementor must ensure that <tt>sgn(compare(x, y)) ==
115 * -sgn(compare(y, x))</tt> for all <tt>x</tt> and <tt>y</tt>. (This
116 * implies that <tt>compare(x, y)</tt> must throw an exception if and only
117 * if <tt>compare(y, x)</tt> throws an exception.)<p>
118 *
119 * The implementor must also ensure that the relation is transitive:
120 * <tt>((compare(x, y)&gt;0) &amp;&amp; (compare(y, z)&gt;0))</tt> implies
121 * <tt>compare(x, z)&gt;0</tt>.<p>
122 *
123 * Finally, the implementor must ensure that <tt>compare(x, y)==0</tt>
124 * implies that <tt>sgn(compare(x, z))==sgn(compare(y, z))</tt> for all
125 * <tt>z</tt>.<p>
126 *
127 * It is generally the case, but <i>not</i> strictly required that
128 * <tt>(compare(x, y)==0) == (x.equals(y))</tt>. Generally speaking,
129 * any comparator that violates this condition should clearly indicate
130 * this fact. The recommended language is "Note: this comparator
131 * imposes orderings that are inconsistent with equals."
132 *
133 * @param o1 the first object to be compared.
134 * @param o2 the second object to be compared.
135 * @return a negative integer, zero, or a positive integer as the
136 * first argument is less than, equal to, or greater than the
137 * second.
138 * @throws NullPointerException if an argument is null and this
139 * comparator does not permit null arguments
140 * @throws ClassCastException if the arguments' types prevent them from
141 * being compared by this comparator.
142 */
143 int compare(T o1, T o2);
144
145 /**
146 * Indicates whether some other object is &quot;equal to&quot; this
147 * comparator. This method must obey the general contract of
148 * {@link Object#equals(Object)}. Additionally, this method can return
149 * <tt>true</tt> <i>only</i> if the specified object is also a comparator
150 * and it imposes the same ordering as this comparator. Thus,
151 * <code>comp1.equals(comp2)</code> implies that <tt>sgn(comp1.compare(o1,
152 * o2))==sgn(comp2.compare(o1, o2))</tt> for every object reference
153 * <tt>o1</tt> and <tt>o2</tt>.<p>
154 *
155 * Note that it is <i>always</i> safe <i>not</i> to override
156 * <tt>Object.equals(Object)</tt>. However, overriding this method may,
157 * in some cases, improve performance by allowing programs to determine
158 * that two distinct comparators impose the same order.
159 *
160 * @param obj the reference object with which to compare.
161 * @return <code>true</code> only if the specified object is also
162 * a comparator and it imposes the same ordering as this
163 * comparator.
164 * @see Object#equals(Object)
165 * @see Object#hashCode()
166 */
167 boolean equals(Object obj);
168}
java/pkg/java/util/ConcurrentModificationException.class+0−0

Binary file not shown.

java/pkg/java/util/ConcurrentModificationException.java+123−0
@@ -0,0 +1,123 @@
1/*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.util;
27
28/**
29 * This exception may be thrown by methods that have detected concurrent
30 * modification of an object when such modification is not permissible.
31 * <p>
32 * For example, it is not generally permissible for one thread to modify a Collection
33 * while another thread is iterating over it. In general, the results of the
34 * iteration are undefined under these circumstances. Some Iterator
35 * implementations (including those of all the general purpose collection implementations
36 * provided by the JRE) may choose to throw this exception if this behavior is
37 * detected. Iterators that do this are known as <i>fail-fast</i> iterators,
38 * as they fail quickly and cleanly, rather that risking arbitrary,
39 * non-deterministic behavior at an undetermined time in the future.
40 * <p>
41 * Note that this exception does not always indicate that an object has
42 * been concurrently modified by a <i>different</i> thread. If a single
43 * thread issues a sequence of method invocations that violates the
44 * contract of an object, the object may throw this exception. For
45 * example, if a thread modifies a collection directly while it is
46 * iterating over the collection with a fail-fast iterator, the iterator
47 * will throw this exception.
48 *
49 * <p>Note that fail-fast behavior cannot be guaranteed as it is, generally
50 * speaking, impossible to make any hard guarantees in the presence of
51 * unsynchronized concurrent modification. Fail-fast operations
52 * throw {@code ConcurrentModificationException} on a best-effort basis.
53 * Therefore, it would be wrong to write a program that depended on this
54 * exception for its correctness: <i>{@code ConcurrentModificationException}
55 * should be used only to detect bugs.</i>
56 *
57 * @author Josh Bloch
58 * @see Collection
59 * @see Iterator
60 * @see ListIterator
61 * @see Vector
62 * @see LinkedList
63 * @see HashSet
64 * @see Hashtable
65 * @see TreeMap
66 * @see AbstractList
67 * @since 1.2
68 */
69public class ConcurrentModificationException extends RuntimeException {
70 private static final long serialVersionUID = -3666751008965953603L;
71
72 /**
73 * Constructs a ConcurrentModificationException with no
74 * detail message.
75 */
76 public ConcurrentModificationException() {
77 }
78
79 /**
80 * Constructs a {@code ConcurrentModificationException} with the
81 * specified detail message.
82 *
83 * @param message the detail message pertaining to this exception.
84 */
85 public ConcurrentModificationException(String message) {
86 super(message);
87 }
88
89 /**
90 * Constructs a new exception with the specified cause and a detail
91 * message of {@code (cause==null ? null : cause.toString())} (which
92 * typically contains the class and detail message of {@code cause}.
93 *
94 * @param cause the cause (which is saved for later retrieval by the
95 * {@link Throwable#getCause()} method). (A {@code null} value is
96 * permitted, and indicates that the cause is nonexistent or
97 * unknown.)
98 * @since 1.7
99 */
100 public ConcurrentModificationException(Throwable cause) {
101 super(cause);
102 }
103
104 /**
105 * Constructs a new exception with the specified detail message and
106 * cause.
107 *
108 * <p>Note that the detail message associated with <code>cause</code> is
109 * <i>not</i> automatically incorporated in this exception's detail
110 * message.
111 *
112 * @param message the detail message (which is saved for later retrieval
113 * by the {@link Throwable#getMessage()} method).
114 * @param cause the cause (which is saved for later retrieval by the
115 * {@link Throwable#getCause()} method). (A {@code null} value
116 * is permitted, and indicates that the cause is nonexistent or
117 * unknown.)
118 * @since 1.7
119 */
120 public ConcurrentModificationException(String message, Throwable cause) {
121 super(message, cause);
122 }
123}
java/pkg/java/util/Currency$1.class+0−0

Binary file not shown.

java/pkg/java/util/Currency$CurrencyNameGetter.class+0−0

Binary file not shown.

java/pkg/java/util/Currency.class+0−0

Binary file not shown.

java/pkg/java/util/Currency.java+741−0
@@ -0,0 +1,741 @@
1/*
2 * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.util;
27
28import java.io.BufferedInputStream;
29import java.io.DataInputStream;
30import java.io.File;
31import java.io.FileInputStream;
32import java.io.FileReader;
33import java.io.IOException;
34import java.io.Serializable;
35import java.security.AccessController;
36import java.security.PrivilegedAction;
37import java.util.logging.Level;
38import java.util.regex.Pattern;
39import java.util.regex.Matcher;
40import java.util.spi.CurrencyNameProvider;
41import java.util.spi.LocaleServiceProvider;
42import sun.util.LocaleServiceProviderPool;
43import sun.util.logging.PlatformLogger;
44import sun.util.resources.LocaleData;
45import sun.util.resources.OpenListResourceBundle;
46
47
48/**
49 * Represents a currency. Currencies are identified by their ISO 4217 currency
50 * codes. Visit the <a href="http://www.iso.org/iso/en/prods-services/popstds/currencycodes.html">
51 * ISO web site</a> for more information, including a table of
52 * currency codes.
53 * <p>
54 * The class is designed so that there's never more than one
55 * <code>Currency</code> instance for any given currency. Therefore, there's
56 * no public constructor. You obtain a <code>Currency</code> instance using
57 * the <code>getInstance</code> methods.
58 * <p>
59 * Users can supersede the Java runtime currency data by creating a properties
60 * file named <code>&lt;JAVA_HOME&gt;/lib/currency.properties</code>. The contents
61 * of the properties file are key/value pairs of the ISO 3166 country codes
62 * and the ISO 4217 currency data respectively. The value part consists of
63 * three ISO 4217 values of a currency, i.e., an alphabetic code, a numeric
64 * code, and a minor unit. Those three ISO 4217 values are separated by commas.
65 * The lines which start with '#'s are considered comment lines. For example,
66 * <p>
67 * <code>
68 * #Sample currency properties<br>
69 * JP=JPZ,999,0
70 * </code>
71 * <p>
72 * will supersede the currency data for Japan.
73 *
74 * @since 1.4
75 */
76public final class Currency implements Serializable {
77
78 private static final long serialVersionUID = -158308464356906721L;
79
80 /**
81 * ISO 4217 currency code for this currency.
82 *
83 * @serial
84 */
85 private final String currencyCode;
86
87 /**
88 * Default fraction digits for this currency.
89 * Set from currency data tables.
90 */
91 transient private final int defaultFractionDigits;
92
93 /**
94 * ISO 4217 numeric code for this currency.
95 * Set from currency data tables.
96 */
97 transient private final int numericCode;
98
99
100 // class data: instance map
101
102 private static HashMap<String, Currency> instances = new HashMap<String, Currency>(7);
103 private static HashSet<Currency> available;
104
105
106 // Class data: currency data obtained from currency.data file.
107 // Purpose:
108 // - determine valid country codes
109 // - determine valid currency codes
110 // - map country codes to currency codes
111 // - obtain default fraction digits for currency codes
112 //
113 // sc = special case; dfd = default fraction digits
114 // Simple countries are those where the country code is a prefix of the
115 // currency code, and there are no known plans to change the currency.
116 //
117 // table formats:
118 // - mainTable:
119 // - maps country code to 32-bit int
120 // - 26*26 entries, corresponding to [A-Z]*[A-Z]
121 // - \u007F -> not valid country
122 // - bits 18-31: unused
123 // - bits 8-17: numeric code (0 to 1023)
124 // - bit 7: 1 - special case, bits 0-4 indicate which one
125 // 0 - simple country, bits 0-4 indicate final char of currency code
126 // - bits 5-6: fraction digits for simple countries, 0 for special cases
127 // - bits 0-4: final char for currency code for simple country, or ID of special case
128 // - special case IDs:
129 // - 0: country has no currency
130 // - other: index into sc* arrays + 1
131 // - scCutOverTimes: cut-over time in millis as returned by
132 // System.currentTimeMillis for special case countries that are changing
133 // currencies; Long.MAX_VALUE for countries that are not changing currencies
134 // - scOldCurrencies: old currencies for special case countries
135 // - scNewCurrencies: new currencies for special case countries that are
136 // changing currencies; null for others
137 // - scOldCurrenciesDFD: default fraction digits for old currencies
138 // - scNewCurrenciesDFD: default fraction digits for new currencies, 0 for
139 // countries that are not changing currencies
140 // - otherCurrencies: concatenation of all currency codes that are not the
141 // main currency of a simple country, separated by "-"
142 // - otherCurrenciesDFD: decimal format digits for currencies in otherCurrencies, same order
143
144 static int formatVersion;
145 static int dataVersion;
146 static int[] mainTable;
147 static long[] scCutOverTimes;
148 static String[] scOldCurrencies;
149 static String[] scNewCurrencies;
150 static int[] scOldCurrenciesDFD;
151 static int[] scNewCurrenciesDFD;
152 static int[] scOldCurrenciesNumericCode;
153 static int[] scNewCurrenciesNumericCode;
154 static String otherCurrencies;
155 static int[] otherCurrenciesDFD;
156 static int[] otherCurrenciesNumericCode;
157
158 // handy constants - must match definitions in GenerateCurrencyData
159 // magic number
160 private static final int MAGIC_NUMBER = 0x43757244;
161 // number of characters from A to Z
162 private static final int A_TO_Z = ('Z' - 'A') + 1;
163 // entry for invalid country codes
164 private static final int INVALID_COUNTRY_ENTRY = 0x007F;
165 // entry for countries without currency
166 private static final int COUNTRY_WITHOUT_CURRENCY_ENTRY = 0x0080;
167 // mask for simple case country entries
168 private static final int SIMPLE_CASE_COUNTRY_MASK = 0x0000;
169 // mask for simple case country entry final character
170 private static final int SIMPLE_CASE_COUNTRY_FINAL_CHAR_MASK = 0x001F;
171 // mask for simple case country entry default currency digits
172 private static final int SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_MASK = 0x0060;
173 // shift count for simple case country entry default currency digits
174 private static final int SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_SHIFT = 5;
175 // mask for special case country entries
176 private static final int SPECIAL_CASE_COUNTRY_MASK = 0x0080;
177 // mask for special case country index
178 private static final int SPECIAL_CASE_COUNTRY_INDEX_MASK = 0x001F;
179 // delta from entry index component in main table to index into special case tables
180 private static final int SPECIAL_CASE_COUNTRY_INDEX_DELTA = 1;
181 // mask for distinguishing simple and special case countries
182 private static final int COUNTRY_TYPE_MASK = SIMPLE_CASE_COUNTRY_MASK | SPECIAL_CASE_COUNTRY_MASK;
183 // mask for the numeric code of the currency
184 private static final int NUMERIC_CODE_MASK = 0x0003FF00;
185 // shift count for the numeric code of the currency
186 private static final int NUMERIC_CODE_SHIFT = 8;
187
188 // Currency data format version
189 private static final int VALID_FORMAT_VERSION = 1;
190
191 static {
192 AccessController.doPrivileged(new PrivilegedAction() {
193 public Object run() {
194 String homeDir = System.getProperty("java.home");
195 try {
196 String dataFile = homeDir + File.separator +
197 "lib" + File.separator + "currency.data";
198 DataInputStream dis = new DataInputStream(
199 new BufferedInputStream(
200 new FileInputStream(dataFile)));
201 if (dis.readInt() != MAGIC_NUMBER) {
202 throw new InternalError("Currency data is possibly corrupted");
203 }
204 formatVersion = dis.readInt();
205 if (formatVersion != VALID_FORMAT_VERSION) {
206 throw new InternalError("Currency data format is incorrect");
207 }
208 dataVersion = dis.readInt();
209 mainTable = readIntArray(dis, A_TO_Z * A_TO_Z);
210 int scCount = dis.readInt();
211 scCutOverTimes = readLongArray(dis, scCount);
212 scOldCurrencies = readStringArray(dis, scCount);
213 scNewCurrencies = readStringArray(dis, scCount);
214 scOldCurrenciesDFD = readIntArray(dis, scCount);
215 scNewCurrenciesDFD = readIntArray(dis, scCount);
216 scOldCurrenciesNumericCode = readIntArray(dis, scCount);
217 scNewCurrenciesNumericCode = readIntArray(dis, scCount);
218 int ocCount = dis.readInt();
219 otherCurrencies = dis.readUTF();
220 otherCurrenciesDFD = readIntArray(dis, ocCount);
221 otherCurrenciesNumericCode = readIntArray(dis, ocCount);
222 dis.close();
223 } catch (IOException e) {
224 InternalError ie = new InternalError();
225 ie.initCause(e);
226 throw ie;
227 }
228
229 // look for the properties file for overrides
230 try {
231 File propFile = new File(homeDir + File.separator +
232 "lib" + File.separator +
233 "currency.properties");
234 if (propFile.exists()) {
235 Properties props = new Properties();
236 try (FileReader fr = new FileReader(propFile)) {
237 props.load(fr);
238 }
239 Set<String> keys = props.stringPropertyNames();
240 Pattern propertiesPattern =
241 Pattern.compile("([A-Z]{3})\\s*,\\s*(\\d{3})\\s*,\\s*([0-3])");
242 for (String key : keys) {
243 replaceCurrencyData(propertiesPattern,
244 key.toUpperCase(Locale.ROOT),
245 props.getProperty(key).toUpperCase(Locale.ROOT));
246 }
247 }
248 } catch (IOException e) {
249 info("currency.properties is ignored because of an IOException", e);
250 }
251 return null;
252 }
253 });
254 }
255
256 /**
257 * Constants for retrieving localized names from the name providers.
258 */
259 private static final int SYMBOL = 0;
260 private static final int DISPLAYNAME = 1;
261
262
263 /**
264 * Constructs a <code>Currency</code> instance. The constructor is private
265 * so that we can insure that there's never more than one instance for a
266 * given currency.
267 */
268 private Currency(String currencyCode, int defaultFractionDigits, int numericCode) {
269 this.currencyCode = currencyCode;
270 this.defaultFractionDigits = defaultFractionDigits;
271 this.numericCode = numericCode;
272 }
273
274 /**
275 * Returns the <code>Currency</code> instance for the given currency code.
276 *
277 * @param currencyCode the ISO 4217 code of the currency
278 * @return the <code>Currency</code> instance for the given currency code
279 * @exception NullPointerException if <code>currencyCode</code> is null
280 * @exception IllegalArgumentException if <code>currencyCode</code> is not
281 * a supported ISO 4217 code.
282 */
283 public static Currency getInstance(String currencyCode) {
284 return getInstance(currencyCode, Integer.MIN_VALUE, 0);
285 }
286
287 private static Currency getInstance(String currencyCode, int defaultFractionDigits,
288 int numericCode) {
289 synchronized (instances) {
290 // Try to look up the currency code in the instances table.
291 // This does the null pointer check as a side effect.
292 // Also, if there already is an entry, the currencyCode must be valid.
293 Currency instance = instances.get(currencyCode);
294 if (instance != null) {
295 return instance;
296 }
297
298 if (defaultFractionDigits == Integer.MIN_VALUE) {
299 // Currency code not internally generated, need to verify first
300 // A currency code must have 3 characters and exist in the main table
301 // or in the list of other currencies.
302 if (currencyCode.length() != 3) {
303 throw new IllegalArgumentException();
304 }
305 char char1 = currencyCode.charAt(0);
306 char char2 = currencyCode.charAt(1);
307 int tableEntry = getMainTableEntry(char1, char2);
308 if ((tableEntry & COUNTRY_TYPE_MASK) == SIMPLE_CASE_COUNTRY_MASK
309 && tableEntry != INVALID_COUNTRY_ENTRY
310 && currencyCode.charAt(2) - 'A' == (tableEntry & SIMPLE_CASE_COUNTRY_FINAL_CHAR_MASK)) {
311 defaultFractionDigits = (tableEntry & SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_MASK) >> SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_SHIFT;
312 numericCode = (tableEntry & NUMERIC_CODE_MASK) >> NUMERIC_CODE_SHIFT;
313 } else {
314 // Check for '-' separately so we don't get false hits in the table.
315 if (currencyCode.charAt(2) == '-') {
316 throw new IllegalArgumentException();
317 }
318 int index = otherCurrencies.indexOf(currencyCode);
319 if (index == -1) {
320 throw new IllegalArgumentException();
321 }
322 defaultFractionDigits = otherCurrenciesDFD[index / 4];
323 numericCode = otherCurrenciesNumericCode[index / 4];
324 }
325 }
326
327 instance = new Currency(currencyCode, defaultFractionDigits, numericCode);
328 instances.put(currencyCode, instance);
329 return instance;
330 }
331 }
332
333 /**
334 * Returns the <code>Currency</code> instance for the country of the
335 * given locale. The language and variant components of the locale
336 * are ignored. The result may vary over time, as countries change their
337 * currencies. For example, for the original member countries of the
338 * European Monetary Union, the method returns the old national currencies
339 * until December 31, 2001, and the Euro from January 1, 2002, local time
340 * of the respective countries.
341 * <p>
342 * The method returns <code>null</code> for territories that don't
343 * have a currency, such as Antarctica.
344 *
345 * @param locale the locale for whose country a <code>Currency</code>
346 * instance is needed
347 * @return the <code>Currency</code> instance for the country of the given
348 * locale, or null
349 * @exception NullPointerException if <code>locale</code> or its country
350 * code is null
351 * @exception IllegalArgumentException if the country of the given locale
352 * is not a supported ISO 3166 country code.
353 */
354 public static Currency getInstance(Locale locale) {
355 String country = locale.getCountry();
356 if (country == null) {
357 throw new NullPointerException();
358 }
359
360 if (country.length() != 2) {
361 throw new IllegalArgumentException();
362 }
363
364 char char1 = country.charAt(0);
365 char char2 = country.charAt(1);
366 int tableEntry = getMainTableEntry(char1, char2);
367 if ((tableEntry & COUNTRY_TYPE_MASK) == SIMPLE_CASE_COUNTRY_MASK
368 && tableEntry != INVALID_COUNTRY_ENTRY) {
369 char finalChar = (char) ((tableEntry & SIMPLE_CASE_COUNTRY_FINAL_CHAR_MASK) + 'A');
370 int defaultFractionDigits = (tableEntry & SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_MASK) >> SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_SHIFT;
371 int numericCode = (tableEntry & NUMERIC_CODE_MASK) >> NUMERIC_CODE_SHIFT;
372 StringBuffer sb = new StringBuffer(country);
373 sb.append(finalChar);
374 return getInstance(sb.toString(), defaultFractionDigits, numericCode);
375 } else {
376 // special cases
377 if (tableEntry == INVALID_COUNTRY_ENTRY) {
378 throw new IllegalArgumentException();
379 }
380 if (tableEntry == COUNTRY_WITHOUT_CURRENCY_ENTRY) {
381 return null;
382 } else {
383 int index = (tableEntry & SPECIAL_CASE_COUNTRY_INDEX_MASK) - SPECIAL_CASE_COUNTRY_INDEX_DELTA;
384 if (scCutOverTimes[index] == Long.MAX_VALUE || System.currentTimeMillis() < scCutOverTimes[index]) {
385 return getInstance(scOldCurrencies[index], scOldCurrenciesDFD[index],
386 scOldCurrenciesNumericCode[index]);
387 } else {
388 return getInstance(scNewCurrencies[index], scNewCurrenciesDFD[index],
389 scNewCurrenciesNumericCode[index]);
390 }
391 }
392 }
393 }
394
395 /**
396 * Gets the set of available currencies. The returned set of currencies
397 * contains all of the available currencies, which may include currencies
398 * that represent obsolete ISO 4217 codes. The set can be modified
399 * without affecting the available currencies in the runtime.
400 *
401 * @return the set of available currencies. If there is no currency
402 * available in the runtime, the returned set is empty.
403 * @since 1.7
404 */
405 public static Set<Currency> getAvailableCurrencies() {
406 synchronized(Currency.class) {
407 if (available == null) {
408 available = new HashSet<Currency>(256);
409
410 // Add simple currencies first
411 for (char c1 = 'A'; c1 <= 'Z'; c1 ++) {
412 for (char c2 = 'A'; c2 <= 'Z'; c2 ++) {
413 int tableEntry = getMainTableEntry(c1, c2);
414 if ((tableEntry & COUNTRY_TYPE_MASK) == SIMPLE_CASE_COUNTRY_MASK
415 && tableEntry != INVALID_COUNTRY_ENTRY) {
416 char finalChar = (char) ((tableEntry & SIMPLE_CASE_COUNTRY_FINAL_CHAR_MASK) + 'A');
417 int defaultFractionDigits = (tableEntry & SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_MASK) >> SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_SHIFT;
418 int numericCode = (tableEntry & NUMERIC_CODE_MASK) >> NUMERIC_CODE_SHIFT;
419 StringBuilder sb = new StringBuilder();
420 sb.append(c1);
421 sb.append(c2);
422 sb.append(finalChar);
423 available.add(getInstance(sb.toString(), defaultFractionDigits, numericCode));
424 }
425 }
426 }
427
428 // Now add other currencies
429 StringTokenizer st = new StringTokenizer(otherCurrencies, "-");
430 while (st.hasMoreElements()) {
431 available.add(getInstance((String)st.nextElement()));
432 }
433 }
434 }
435
436 return (Set<Currency>) available.clone();
437 }
438
439 /**
440 * Gets the ISO 4217 currency code of this currency.
441 *
442 * @return the ISO 4217 currency code of this currency.
443 */
444 public String getCurrencyCode() {
445 return currencyCode;
446 }
447
448 /**
449 * Gets the symbol of this currency for the default locale.
450 * For example, for the US Dollar, the symbol is "$" if the default
451 * locale is the US, while for other locales it may be "US$". If no
452 * symbol can be determined, the ISO 4217 currency code is returned.
453 *
454 * @return the symbol of this currency for the default locale
455 */
456 public String getSymbol() {
457 return getSymbol(Locale.getDefault(Locale.Category.DISPLAY));
458 }
459
460 /**
461 * Gets the symbol of this currency for the specified locale.
462 * For example, for the US Dollar, the symbol is "$" if the specified
463 * locale is the US, while for other locales it may be "US$". If no
464 * symbol can be determined, the ISO 4217 currency code is returned.
465 *
466 * @param locale the locale for which a display name for this currency is
467 * needed
468 * @return the symbol of this currency for the specified locale
469 * @exception NullPointerException if <code>locale</code> is null
470 */
471 public String getSymbol(Locale locale) {
472 try {
473 // Check whether a provider can provide an implementation that's closer
474 // to the requested locale than what the Java runtime itself can provide.
475 LocaleServiceProviderPool pool =
476 LocaleServiceProviderPool.getPool(CurrencyNameProvider.class);
477
478 if (pool.hasProviders()) {
479 // Assuming that all the country locales include necessary currency
480 // symbols in the Java runtime's resources, so there is no need to
481 // examine whether Java runtime's currency resource bundle is missing
482 // names. Therefore, no resource bundle is provided for calling this
483 // method.
484 String symbol = pool.getLocalizedObject(
485 CurrencyNameGetter.INSTANCE,
486 locale, (OpenListResourceBundle)null,
487 currencyCode, SYMBOL);
488 if (symbol != null) {
489 return symbol;
490 }
491 }
492
493 ResourceBundle bundle = LocaleData.getCurrencyNames(locale);
494 return bundle.getString(currencyCode);
495 } catch (MissingResourceException e) {
496 // use currency code as symbol of last resort
497 return currencyCode;
498 }
499 }
500
501 /**
502 * Gets the default number of fraction digits used with this currency.
503 * For example, the default number of fraction digits for the Euro is 2,
504 * while for the Japanese Yen it's 0.
505 * In the case of pseudo-currencies, such as IMF Special Drawing Rights,
506 * -1 is returned.
507 *
508 * @return the default number of fraction digits used with this currency
509 */
510 public int getDefaultFractionDigits() {
511 return defaultFractionDigits;
512 }
513
514 /**
515 * Returns the ISO 4217 numeric code of this currency.
516 *
517 * @return the ISO 4217 numeric code of this currency
518 * @since 1.7
519 */
520 public int getNumericCode() {
521 return numericCode;
522 }
523
524 /**
525 * Gets the name that is suitable for displaying this currency for
526 * the default locale. If there is no suitable display name found
527 * for the default locale, the ISO 4217 currency code is returned.
528 *
529 * @return the display name of this currency for the default locale
530 * @since 1.7
531 */
532 public String getDisplayName() {
533 return getDisplayName(Locale.getDefault(Locale.Category.DISPLAY));
534 }
535
536 /**
537 * Gets the name that is suitable for displaying this currency for
538 * the specified locale. If there is no suitable display name found
539 * for the specified locale, the ISO 4217 currency code is returned.
540 *
541 * @param locale the locale for which a display name for this currency is
542 * needed
543 * @return the display name of this currency for the specified locale
544 * @exception NullPointerException if <code>locale</code> is null
545 * @since 1.7
546 */
547 public String getDisplayName(Locale locale) {
548 try {
549 OpenListResourceBundle bundle = LocaleData.getCurrencyNames(locale);
550 String result = null;
551 String bundleKey = currencyCode.toLowerCase(Locale.ROOT);
552
553 // Check whether a provider can provide an implementation that's closer
554 // to the requested locale than what the Java runtime itself can provide.
555 LocaleServiceProviderPool pool =
556 LocaleServiceProviderPool.getPool(CurrencyNameProvider.class);
557 if (pool.hasProviders()) {
558 result = pool.getLocalizedObject(
559 CurrencyNameGetter.INSTANCE,
560 locale, bundleKey, bundle, currencyCode, DISPLAYNAME);
561 }
562
563 if (result == null) {
564 result = bundle.getString(bundleKey);
565 }
566
567 if (result != null) {
568 return result;
569 }
570 } catch (MissingResourceException e) {
571 // fall through
572 }
573
574 // use currency code as symbol of last resort
575 return currencyCode;
576 }
577
578 /**
579 * Returns the ISO 4217 currency code of this currency.
580 *
581 * @return the ISO 4217 currency code of this currency
582 */
583 public String toString() {
584 return currencyCode;
585 }
586
587 /**
588 * Resolves instances being deserialized to a single instance per currency.
589 */
590 private Object readResolve() {
591 return getInstance(currencyCode);
592 }
593
594 /**
595 * Gets the main table entry for the country whose country code consists
596 * of char1 and char2.
597 */
598 private static int getMainTableEntry(char char1, char char2) {
599 if (char1 < 'A' || char1 > 'Z' || char2 < 'A' || char2 > 'Z') {
600 throw new IllegalArgumentException();
601 }
602 return mainTable[(char1 - 'A') * A_TO_Z + (char2 - 'A')];
603 }
604
605 /**
606 * Sets the main table entry for the country whose country code consists
607 * of char1 and char2.
608 */
609 private static void setMainTableEntry(char char1, char char2, int entry) {
610 if (char1 < 'A' || char1 > 'Z' || char2 < 'A' || char2 > 'Z') {
611 throw new IllegalArgumentException();
612 }
613 mainTable[(char1 - 'A') * A_TO_Z + (char2 - 'A')] = entry;
614 }
615
616 /**
617 * Obtains a localized currency names from a CurrencyNameProvider
618 * implementation.
619 */
620 private static class CurrencyNameGetter
621 implements LocaleServiceProviderPool.LocalizedObjectGetter<CurrencyNameProvider,
622 String> {
623 private static final CurrencyNameGetter INSTANCE = new CurrencyNameGetter();
624
625 public String getObject(CurrencyNameProvider currencyNameProvider,
626 Locale locale,
627 String key,
628 Object... params) {
629 assert params.length == 1;
630 int type = (Integer)params[0];
631
632 switch(type) {
633 case SYMBOL:
634 return currencyNameProvider.getSymbol(key, locale);
635 case DISPLAYNAME:
636 return currencyNameProvider.getDisplayName(key, locale);
637 default:
638 assert false; // shouldn't happen
639 }
640
641 return null;
642 }
643 }
644
645 private static int[] readIntArray(DataInputStream dis, int count) throws IOException {
646 int[] ret = new int[count];
647 for (int i = 0; i < count; i++) {
648 ret[i] = dis.readInt();
649 }
650
651 return ret;
652 }
653
654 private static long[] readLongArray(DataInputStream dis, int count) throws IOException {
655 long[] ret = new long[count];
656 for (int i = 0; i < count; i++) {
657 ret[i] = dis.readLong();
658 }
659
660 return ret;
661 }
662
663 private static String[] readStringArray(DataInputStream dis, int count) throws IOException {
664 String[] ret = new String[count];
665 for (int i = 0; i < count; i++) {
666 ret[i] = dis.readUTF();
667 }
668
669 return ret;
670 }
671
672 /**
673 * Replaces currency data found in the currencydata.properties file
674 *
675 * @param pattern regex pattern for the properties
676 * @param ctry country code
677 * @param data currency data. This is a comma separated string that
678 * consists of "three-letter alphabet code", "three-digit numeric code",
679 * and "one-digit (0,1,2, or 3) default fraction digit".
680 * For example, "JPZ,392,0".
681 * @throws
682 */
683 private static void replaceCurrencyData(Pattern pattern, String ctry, String curdata) {
684
685 if (ctry.length() != 2) {
686 // ignore invalid country code
687 String message = new StringBuilder()
688 .append("The entry in currency.properties for ")
689 .append(ctry).append(" is ignored because of the invalid country code.")
690 .toString();
691 info(message, null);
692 return;
693 }
694
695 Matcher m = pattern.matcher(curdata);
696 if (!m.find()) {
697 // format is not recognized. ignore the data
698 String message = new StringBuilder()
699 .append("The entry in currency.properties for ")
700 .append(ctry)
701 .append(" is ignored because the value format is not recognized.")
702 .toString();
703 info(message, null);
704 return;
705 }
706
707 String code = m.group(1);
708 int numeric = Integer.parseInt(m.group(2));
709 int fraction = Integer.parseInt(m.group(3));
710 int entry = numeric << NUMERIC_CODE_SHIFT;
711
712 int index;
713 for (index = 0; index < scOldCurrencies.length; index++) {
714 if (scOldCurrencies[index].equals(code)) {
715 break;
716 }
717 }
718
719 if (index == scOldCurrencies.length) {
720 // simple case
721 entry |= (fraction << SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_SHIFT) |
722 (code.charAt(2) - 'A');
723 } else {
724 // special case
725 entry |= SPECIAL_CASE_COUNTRY_MASK |
726 (index + SPECIAL_CASE_COUNTRY_INDEX_DELTA);
727 }
728 setMainTableEntry(ctry.charAt(0), ctry.charAt(1), entry);
729 }
730
731 private static void info(String message, Throwable t) {
732 PlatformLogger logger = PlatformLogger.getLogger("java.util.Currency");
733 if (logger.isLoggable(PlatformLogger.INFO)) {
734 if (t != null) {
735 logger.info(message, t);
736 } else {
737 logger.info(message);
738 }
739 }
740 }
741}
java/pkg/java/util/CurrencyData.properties+586−0
@@ -0,0 +1,586 @@
1#
2# Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
3# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4#
5# This code is free software; you can redistribute it and/or modify it
6# under the terms of the GNU General Public License version 2 only, as
7# published by the Free Software Foundation. Oracle designates this
8# particular file as subject to the "Classpath" exception as provided
9# by Oracle in the LICENSE file that accompanied this code.
10#
11# This code is distributed in the hope that it will be useful, but WITHOUT
12# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14# version 2 for more details (a copy is included in the LICENSE file that
15# accompanied this code).
16#
17# You should have received a copy of the GNU General Public License version
18# 2 along with this work; if not, write to the Free Software Foundation,
19# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20#
21# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22# or visit www.oracle.com if you need additional information or have any
23# questions.
24#
25
26formatVersion=1
27
28# Version of the currency code information in this class.
29# It is a serial number that accompanies with each amendment, such as
30# 'MAxxx.doc'
31
32dataVersion=140
33
34# List of all valid ISO 4217 currency codes.
35# To ensure compatibility, do not remove codes.
36
37all=ADP020-AED784-AFA004-AFN971-ALL008-AMD051-ANG532-AOA973-ARS032-ATS040-AUD036-\
38 AWG533-AYM945-AZM031-AZN944-BAM977-BBD052-BDT050-BEF056-BGL100-BGN975-BHD048-BIF108-\
39 BMD060-BND096-BOB068-BOV984-BRL986-BSD044-BTN064-BWP072-BYB112-BYR974-\
40 BZD084-CAD124-CDF976-CHF756-CLF990-CLP152-CNY156-COP170-CRC188-CSD891-CUP192-\
41 CVE132-CYP196-CZK203-DEM276-DJF262-DKK208-DOP214-DZD012-EEK233-EGP818-\
42 ERN232-ESP724-ETB230-EUR978-FIM246-FJD242-FKP238-FRF250-GBP826-GEL981-\
43 GHC288-GHS936-GIP292-GMD270-GNF324-GRD300-GTQ320-GWP624-GYD328-HKD344-HNL340-\
44 HRK191-HTG332-HUF348-IDR360-IEP372-ILS376-INR356-IQD368-IRR364-ISK352-\
45 ITL380-JMD388-JOD400-JPY392-KES404-KGS417-KHR116-KMF174-KPW408-KRW410-\
46 KWD414-KYD136-KZT398-LAK418-LBP422-LKR144-LRD430-LSL426-LTL440-LUF442-\
47 LVL428-LYD434-MAD504-MDL498-MGA969-MGF450-MKD807-MMK104-MNT496-MOP446-MRO478-\
48 MTL470-MUR480-MVR462-MWK454-MXN484-MXV979-MYR458-MZM508-MZN943-NAD516-NGN566-\
49 NIO558-NLG528-NOK578-NPR524-NZD554-OMR512-PAB590-PEN604-PGK598-PHP608-\
50 PKR586-PLN985-PTE620-PYG600-QAR634-ROL946-RON946-RSD941-RUB643-RUR810-RWF646-SAR682-\
51 SBD090-SCR690-SDD736-SDG938-SEK752-SGD702-SHP654-SIT705-SKK703-SLL694-SOS706-\
52 SRD968-SRG740-STD678-SVC222-SYP760-SZL748-THB764-TJS972-TMM795-TND788-TOP776-\
53 TPE626-TRL792-TRY949-TTD780-TWD901-TZS834-UAH980-UGX800-USD840-USN997-USS998-\
54 UYU858-UZS860-VEB862-VEF937-VND704-VUV548-WST882-XAF950-XAG961-XAU959-XBA955-\
55 XBB956-XBC957-XBD958-XCD951-XDR960-XFO000-XFU000-XOF952-XPD964-XPF953-\
56 XPT962-XTS963-XXX999-YER886-YUM891-ZAR710-ZMK894-ZWD716-ZWN942
57
58
59# Mappings from ISO 3166 country codes to ISO 4217 currency codes.
60#
61# Three forms are used:
62# Form 1: <country code>=<currency code>
63# Form 2: <country code>=<currency code 1>;<time stamp>;<currency code 2>
64# Form 3: <country code>=
65# Form 1 is used if no future change in currency is known.
66# Form 2 indicates that before the specified time currency 1 is used, from
67# the specified time currency 2. The time is given in SimpleDateFormat's
68# yyyy-MM-dd-HH-mm-ss format in the GMT time zone.
69# Form 3 indicates the country doesn't have a currency (the entry is still
70# needed to verify that the country code is valid).
71#
72# The table is based on the following web sites:
73# http://www.din.de/gremien/nas/nabd/iso3166ma/codlstp1/db_en.html
74# http://www.bsi-global.com/iso4217currency
75# http://www.cia.gov/cia/publications/factbook/indexgeo.html
76
77# AFGHANISTAN
78AF=AFN
79# \u00c5LAND ISLANDS
80AX=EUR
81# ALBANIA
82AL=ALL
83# ALGERIA
84DZ=DZD
85# AMERICAN SAMOA
86AS=USD
87# ANDORRA
88AD=EUR
89# ANGOLA
90AO=AOA
91# ANGUILLA
92AI=XCD
93# ANTARCTICA
94AQ=
95# ANTIGUA AND BARBUDA
96AG=XCD
97# ARGENTINA
98AR=ARS
99# ARMENIA
100AM=AMD
101# ARUBA
102AW=AWG
103# AUSTRALIA
104AU=AUD
105# AUSTRIA
106AT=EUR
107# AZERBAIJAN
108AZ=AZM;2005-12-31-20-00-00;AZN
109# BAHAMAS
110BS=BSD
111# BAHRAIN
112BH=BHD
113# BANGLADESH
114BD=BDT
115# BARBADOS
116BB=BBD
117# BELARUS
118BY=BYR
119# BELGIUM
120BE=EUR
121# BELIZE
122BZ=BZD
123# BENIN
124BJ=XOF
125# BERMUDA
126BM=BMD
127# BHUTAN
128BT=BTN
129# BOLIVIA
130BO=BOB
131# BOSNIA AND HERZEGOVINA
132BA=BAM
133# BOTSWANA
134BW=BWP
135# BOUVET ISLAND
136BV=NOK
137# BRAZIL
138BR=BRL
139# BRITISH INDIAN OCEAN TERRITORY
140IO=USD
141# BRUNEI DARUSSALAM
142BN=BND
143# BULGARIA
144BG=BGN
145# BURKINA FASO
146BF=XOF
147# BURUNDI
148BI=BIF
149# CAMBODIA
150KH=KHR
151# CAMEROON
152CM=XAF
153# CANADA
154CA=CAD
155# CAPE VERDE
156CV=CVE
157# CAYMAN ISLANDS
158KY=KYD
159# CENTRAL AFRICAN REPUBLIC
160CF=XAF
161# CHAD
162TD=XAF
163# CHILE
164CL=CLP
165# CHINA
166CN=CNY
167# CHRISTMAS ISLAND
168CX=AUD
169# COCOS (KEELING) ISLANDS
170CC=AUD
171# COLOMBIA
172CO=COP
173# COMOROS
174KM=KMF
175# CONGO
176CG=XAF
177# CONGO, THE DEMOCRATIC REPUBLIC OF THE
178CD=CDF
179# COOK ISLANDS
180CK=NZD
181# COSTA RICA
182CR=CRC
183# COTE D'IVOIRE
184CI=XOF
185# CROATIA
186HR=HRK
187# CUBA
188CU=CUP
189# CYPRUS
190CY=EUR
191# CZECH REPUBLIC
192CZ=CZK
193# DENMARK
194DK=DKK
195# DJIBOUTI
196DJ=DJF
197# DOMINICA
198DM=XCD
199# DOMINICAN REPUBLIC
200DO=DOP
201# ECUADOR
202EC=USD
203# EGYPT
204EG=EGP
205# EL SALVADOR
206# USD is also legal currency as of 2001/01/01
207SV=SVC
208# EQUATORIAL GUINEA
209GQ=XAF
210# ERITREA
211ER=ERN
212# ESTONIA
213EE=EEK
214# ETHIOPIA
215ET=ETB
216# FALKLAND ISLANDS (MALVINAS)
217FK=FKP
218# FAROE ISLANDS
219FO=DKK
220# FIJI
221FJ=FJD
222# FINLAND
223FI=EUR
224# FRANCE
225FR=EUR
226# FRENCH GUIANA
227GF=EUR
228# FRENCH POLYNESIA
229PF=XPF
230# FRENCH SOUTHERN TERRITORIES
231TF=EUR
232# GABON
233GA=XAF
234# GAMBIA
235GM=GMD
236# GEORGIA
237GE=GEL
238# GERMANY
239DE=EUR
240# GHANA
241GH=GHS
242# GIBRALTAR
243GI=GIP
244# GREECE
245GR=EUR
246# GREENLAND
247GL=DKK
248# GRENADA
249GD=XCD
250# GUADELOUPE
251GP=EUR
252# GUAM
253GU=USD
254# GUATEMALA
255GT=GTQ
256# GUERNSEY
257GG=GBP
258# GUINEA
259GN=GNF
260# GUINEA-BISSAU
261GW=XOF
262# GUYANA
263GY=GYD
264# HAITI
265HT=HTG
266# HEARD ISLAND AND MCDONALD ISLANDS
267HM=AUD
268# HOLY SEE (VATICAN CITY STATE)
269VA=EUR
270# HONDURAS
271HN=HNL
272# HONG KONG
273HK=HKD
274# HUNGARY
275HU=HUF
276# ICELAND
277IS=ISK
278# INDIA
279IN=INR
280# INDONESIA
281ID=IDR
282# IRAN, ISLAMIC REPUBLIC OF
283IR=IRR
284# IRAQ
285IQ=IQD
286# IRELAND
287IE=EUR
288# ISLE OF MAN
289IM=GBP
290# ISRAEL
291IL=ILS
292# ITALY
293IT=EUR
294# JAMAICA
295JM=JMD
296# JAPAN
297JP=JPY
298# JERSEY
299JE=GBP
300# JORDAN
301JO=JOD
302# KAZAKSTAN
303KZ=KZT
304# KENYA
305KE=KES
306# KIRIBATI
307KI=AUD
308# KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF
309KP=KPW
310# KOREA, REPUBLIC OF
311KR=KRW
312# KUWAIT
313KW=KWD
314# KYRGYZSTAN
315KG=KGS
316# LAO PEOPLE'S DEMOCRATIC REPUBLIC
317LA=LAK
318# LATVIA
319LV=LVL
320# LEBANON
321LB=LBP
322# LESOTHO
323LS=LSL
324# LIBERIA
325LR=LRD
326# LIBYAN ARAB JAMAHIRIYA
327LY=LYD
328# LIECHTENSTEIN
329LI=CHF
330# LITHUANIA
331LT=LTL
332# LUXEMBOURG
333LU=EUR
334# MACAU
335MO=MOP
336# MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF
337MK=MKD
338# MADAGASCAR
339MG=MGA
340# MALAWI
341MW=MWK
342# MALAYSIA
343MY=MYR
344# MALDIVES
345MV=MVR
346# MALI
347ML=XOF
348# MALTA
349MT=EUR
350# MARSHALL ISLANDS
351MH=USD
352# MARTINIQUE
353MQ=EUR
354# MAURITANIA
355MR=MRO
356# MAURITIUS
357MU=MUR
358# MAYOTTE
359YT=EUR
360# MEXICO
361MX=MXN
362# MICRONESIA, FEDERATED STATES OF
363FM=USD
364# MOLDOVA, REPUBLIC OF
365MD=MDL
366# MONACO
367MC=EUR
368# MONGOLIA
369MN=MNT
370# MONTENEGRO
371ME=EUR
372# MONTSERRAT
373MS=XCD
374# MOROCCO
375MA=MAD
376# MOZAMBIQUE
377MZ=MZM;2006-06-30-22-00-00;MZN
378# MYANMAR
379MM=MMK
380# NAMIBIA
381NA=NAD
382# NAURU
383NR=AUD
384# NEPAL
385NP=NPR
386# NETHERLANDS
387NL=EUR
388# NETHERLANDS ANTILLES
389AN=ANG
390# NEW CALEDONIA
391NC=XPF
392# NEW ZEALAND
393NZ=NZD
394# NICARAGUA
395NI=NIO
396# NIGER
397NE=XOF
398# NIGERIA
399NG=NGN
400# NIUE
401NU=NZD
402# NORFOLK ISLAND
403NF=AUD
404# NORTHERN MARIANA ISLANDS
405MP=USD
406# NORWAY
407NO=NOK
408# OMAN
409OM=OMR
410# PAKISTAN
411PK=PKR
412# PALAU
413PW=USD
414# PALESTINIAN TERRITORY, OCCUPIED
415PS=ILS
416# PANAMA
417PA=PAB
418# PAPUA NEW GUINEA
419PG=PGK
420# PARAGUAY
421PY=PYG
422# PERU
423PE=PEN
424# PHILIPPINES
425PH=PHP
426# PITCAIRN
427PN=NZD
428# POLAND
429PL=PLN
430# PORTUGAL
431PT=EUR
432# PUERTO RICO
433PR=USD
434# QATAR
435QA=QAR
436# REUNION
437RE=EUR
438# ROMANIA
439RO=ROL;2005-06-30-21-00-00;RON
440# RUSSIAN FEDERATION
441RU=RUB
442# RWANDA
443RW=RWF
444# SAINT BARTHELEMY
445BL=EUR
446# SAINT HELENA
447SH=SHP
448# SAINT KITTS AND NEVIS
449KN=XCD
450# SAINT LUCIA
451LC=XCD
452# SAINT MARTIN
453MF=EUR
454# SAINT PIERRE AND MIQUELON
455PM=EUR
456# SAINT VINCENT AND THE GRENADINES
457VC=XCD
458# SAMOA
459WS=WST
460# SAN MARINO
461SM=EUR
462# SAO TOME AND PRINCIPE
463ST=STD
464# SAUDI ARABIA
465SA=SAR
466# SENEGAL
467SN=XOF
468# SERBIA
469RS=RSD
470# SERBIA AND MONTENEGRO
471CS=CSD
472# SEYCHELLES
473SC=SCR
474# SIERRA LEONE
475SL=SLL
476# SINGAPORE
477SG=SGD
478# SLOVAKIA
479SK=SKK
480# SLOVENIA
481SI=EUR
482# SOLOMON ISLANDS
483SB=SBD
484# SOMALIA
485SO=SOS
486# SOUTH AFRICA
487ZA=ZAR
488# SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS
489GS=GBP
490# SPAIN
491ES=EUR
492# SRI LANKA
493LK=LKR
494# SUDAN
495SD=SDG
496# SURINAME
497SR=SRD
498# SVALBARD AND JAN MAYEN
499SJ=NOK
500# SWAZILAND
501SZ=SZL
502# SWEDEN
503SE=SEK
504# SWITZERLAND
505CH=CHF
506# SYRIAN ARAB REPUBLIC
507SY=SYP
508# TAIWAN
509TW=TWD
510# TAJIKISTAN
511TJ=TJS
512# TANZANIA, UNITED REPUBLIC OF
513TZ=TZS
514# THAILAND
515TH=THB
516# TIMOR-LESTE
517TL=USD
518# TOGO
519TG=XOF
520# TOKELAU
521TK=NZD
522# TONGA
523TO=TOP
524# TRINIDAD AND TOBAGO
525TT=TTD
526# TUNISIA
527TN=TND
528# TURKEY
529TR=TRL;2004-12-31-22-00-00;TRY
530# TURKMENISTAN
531TM=TMM
532# TURKS AND CAICOS ISLANDS
533TC=USD
534# TUVALU
535TV=AUD
536# UGANDA
537UG=UGX
538# UKRAINE
539UA=UAH
540# UNITED ARAB EMIRATES
541AE=AED
542# UNITED KINGDOM
543GB=GBP
544# UNITED STATES
545US=USD
546# UNITED STATES MINOR OUTLYING ISLANDS
547UM=USD
548# URUGUAY
549UY=UYU
550# UZBEKISTAN
551UZ=UZS
552# VANUATU
553VU=VUV
554# VENEZUELA
555VE=VEB;2008-01-01-04-00-00;VEF
556# VIET NAM
557VN=VND
558# VIRGIN ISLANDS, BRITISH
559VG=USD
560# VIRGIN ISLANDS, U.S.
561VI=USD
562# WALLIS AND FUTUNA
563WF=XPF
564# WESTERN SAHARA
565EH=MAD
566# YEMEN
567YE=YER
568# ZAMBIA
569ZM=ZMK
570# ZIMBABWE
571ZW=ZWD
572
573
574# List of currencies with 0, 1, OR 3 decimals for minor units, or where there
575# are no minor units defined. All others use 2 decimals.
576
577minor0=\
578 ADP-BEF-BIF-BYB-BYR-CLF-CLP-DJF-ESP-GNF-\
579 GRD-ISK-ITL-JPY-KMF-KRW-LUF-MGF-PYG-PTE-RWF-\
580 TPE-TRL-VUV-XAF-XOF-XPF
581minor1=
582minor3=\
583 BHD-IQD-JOD-KWD-LYD-OMR-TND
584minorUndefined=\
585 XAG-XAU-XBA-XBB-XBC-XBD-XDR-XFO-XFU-XPD-\
586 XPT-XTS-XXX
java/pkg/java/util/Date.class+0−0

Binary file not shown.

java/pkg/java/util/Date.java+1331−0
@@ -0,0 +1,1331 @@
1/*
2 * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.util;
27
28import java.text.DateFormat;
29import java.io.IOException;
30import java.io.ObjectOutputStream;
31import java.io.ObjectInputStream;
32import java.lang.ref.SoftReference;
33import sun.util.calendar.BaseCalendar;
34import sun.util.calendar.CalendarDate;
35import sun.util.calendar.CalendarSystem;
36import sun.util.calendar.CalendarUtils;
37import sun.util.calendar.Era;
38import sun.util.calendar.Gregorian;
39import sun.util.calendar.ZoneInfo;
40
41/**
42 * The class <code>Date</code> represents a specific instant
43 * in time, with millisecond precision.
44 * <p>
45 * Prior to JDK&nbsp;1.1, the class <code>Date</code> had two additional
46 * functions. It allowed the interpretation of dates as year, month, day, hour,
47 * minute, and second values. It also allowed the formatting and parsing
48 * of date strings. Unfortunately, the API for these functions was not
49 * amenable to internationalization. As of JDK&nbsp;1.1, the
50 * <code>Calendar</code> class should be used to convert between dates and time
51 * fields and the <code>DateFormat</code> class should be used to format and
52 * parse date strings.
53 * The corresponding methods in <code>Date</code> are deprecated.
54 * <p>
55 * Although the <code>Date</code> class is intended to reflect
56 * coordinated universal time (UTC), it may not do so exactly,
57 * depending on the host environment of the Java Virtual Machine.
58 * Nearly all modern operating systems assume that 1&nbsp;day&nbsp;=
59 * 24&nbsp;&times;&nbsp;60&nbsp;&times;&nbsp;60&nbsp;= 86400 seconds
60 * in all cases. In UTC, however, about once every year or two there
61 * is an extra second, called a "leap second." The leap
62 * second is always added as the last second of the day, and always
63 * on December 31 or June 30. For example, the last minute of the
64 * year 1995 was 61 seconds long, thanks to an added leap second.
65 * Most computer clocks are not accurate enough to be able to reflect
66 * the leap-second distinction.
67 * <p>
68 * Some computer standards are defined in terms of Greenwich mean
69 * time (GMT), which is equivalent to universal time (UT). GMT is
70 * the "civil" name for the standard; UT is the
71 * "scientific" name for the same standard. The
72 * distinction between UTC and UT is that UTC is based on an atomic
73 * clock and UT is based on astronomical observations, which for all
74 * practical purposes is an invisibly fine hair to split. Because the
75 * earth's rotation is not uniform (it slows down and speeds up
76 * in complicated ways), UT does not always flow uniformly. Leap
77 * seconds are introduced as needed into UTC so as to keep UTC within
78 * 0.9 seconds of UT1, which is a version of UT with certain
79 * corrections applied. There are other time and date systems as
80 * well; for example, the time scale used by the satellite-based
81 * global positioning system (GPS) is synchronized to UTC but is
82 * <i>not</i> adjusted for leap seconds. An interesting source of
83 * further information is the U.S. Naval Observatory, particularly
84 * the Directorate of Time at:
85 * <blockquote><pre>
86 * <a href=http://tycho.usno.navy.mil>http://tycho.usno.navy.mil</a>
87 * </pre></blockquote>
88 * <p>
89 * and their definitions of "Systems of Time" at:
90 * <blockquote><pre>
91 * <a href=http://tycho.usno.navy.mil/systime.html>http://tycho.usno.navy.mil/systime.html</a>
92 * </pre></blockquote>
93 * <p>
94 * In all methods of class <code>Date</code> that accept or return
95 * year, month, date, hours, minutes, and seconds values, the
96 * following representations are used:
97 * <ul>
98 * <li>A year <i>y</i> is represented by the integer
99 * <i>y</i>&nbsp;<code>-&nbsp;1900</code>.
100 * <li>A month is represented by an integer from 0 to 11; 0 is January,
101 * 1 is February, and so forth; thus 11 is December.
102 * <li>A date (day of month) is represented by an integer from 1 to 31
103 * in the usual manner.
104 * <li>An hour is represented by an integer from 0 to 23. Thus, the hour
105 * from midnight to 1 a.m. is hour 0, and the hour from noon to 1
106 * p.m. is hour 12.
107 * <li>A minute is represented by an integer from 0 to 59 in the usual manner.
108 * <li>A second is represented by an integer from 0 to 61; the values 60 and
109 * 61 occur only for leap seconds and even then only in Java
110 * implementations that actually track leap seconds correctly. Because
111 * of the manner in which leap seconds are currently introduced, it is
112 * extremely unlikely that two leap seconds will occur in the same
113 * minute, but this specification follows the date and time conventions
114 * for ISO C.
115 * </ul>
116 * <p>
117 * In all cases, arguments given to methods for these purposes need
118 * not fall within the indicated ranges; for example, a date may be
119 * specified as January 32 and is interpreted as meaning February 1.
120 *
121 * @author James Gosling
122 * @author Arthur van Hoff
123 * @author Alan Liu
124 * @see java.text.DateFormat
125 * @see java.util.Calendar
126 * @see java.util.TimeZone
127 * @since JDK1.0
128 */
129public class Date
130 implements java.io.Serializable, Cloneable, Comparable<Date>
131{
132 private static final BaseCalendar gcal =
133 CalendarSystem.getGregorianCalendar();
134 private static BaseCalendar jcal;
135
136 private transient long fastTime;
137
138 /*
139 * If cdate is null, then fastTime indicates the time in millis.
140 * If cdate.isNormalized() is true, then fastTime and cdate are in
141 * synch. Otherwise, fastTime is ignored, and cdate indicates the
142 * time.
143 */
144 private transient BaseCalendar.Date cdate;
145
146 // Initialized just before the value is used. See parse().
147 private static int defaultCenturyStart;
148
149 /* use serialVersionUID from modified java.util.Date for
150 * interoperability with JDK1.1. The Date was modified to write
151 * and read only the UTC time.
152 */
153 private static final long serialVersionUID = 7523967970034938905L;
154
155 /**
156 * Allocates a <code>Date</code> object and initializes it so that
157 * it represents the time at which it was allocated, measured to the
158 * nearest millisecond.
159 *
160 * @see java.lang.System#currentTimeMillis()
161 */
162 public Date() {
163 this(System.currentTimeMillis());
164 }
165
166 /**
167 * Allocates a <code>Date</code> object and initializes it to
168 * represent the specified number of milliseconds since the
169 * standard base time known as "the epoch", namely January 1,
170 * 1970, 00:00:00 GMT.
171 *
172 * @param date the milliseconds since January 1, 1970, 00:00:00 GMT.
173 * @see java.lang.System#currentTimeMillis()
174 */
175 public Date(long date) {
176 fastTime = date;
177 }
178
179 /**
180 * Allocates a <code>Date</code> object and initializes it so that
181 * it represents midnight, local time, at the beginning of the day
182 * specified by the <code>year</code>, <code>month</code>, and
183 * <code>date</code> arguments.
184 *
185 * @param year the year minus 1900.
186 * @param month the month between 0-11.
187 * @param date the day of the month between 1-31.
188 * @see java.util.Calendar
189 * @deprecated As of JDK version 1.1,
190 * replaced by <code>Calendar.set(year + 1900, month, date)</code>
191 * or <code>GregorianCalendar(year + 1900, month, date)</code>.
192 */
193 @Deprecated
194 public Date(int year, int month, int date) {
195 this(year, month, date, 0, 0, 0);
196 }
197
198 /**
199 * Allocates a <code>Date</code> object and initializes it so that
200 * it represents the instant at the start of the minute specified by
201 * the <code>year</code>, <code>month</code>, <code>date</code>,
202 * <code>hrs</code>, and <code>min</code> arguments, in the local
203 * time zone.
204 *
205 * @param year the year minus 1900.
206 * @param month the month between 0-11.
207 * @param date the day of the month between 1-31.
208 * @param hrs the hours between 0-23.
209 * @param min the minutes between 0-59.
210 * @see java.util.Calendar
211 * @deprecated As of JDK version 1.1,
212 * replaced by <code>Calendar.set(year + 1900, month, date,
213 * hrs, min)</code> or <code>GregorianCalendar(year + 1900,
214 * month, date, hrs, min)</code>.
215 */
216 @Deprecated
217 public Date(int year, int month, int date, int hrs, int min) {
218 this(year, month, date, hrs, min, 0);
219 }
220
221 /**
222 * Allocates a <code>Date</code> object and initializes it so that
223 * it represents the instant at the start of the second specified
224 * by the <code>year</code>, <code>month</code>, <code>date</code>,
225 * <code>hrs</code>, <code>min</code>, and <code>sec</code> arguments,
226 * in the local time zone.
227 *
228 * @param year the year minus 1900.
229 * @param month the month between 0-11.
230 * @param date the day of the month between 1-31.
231 * @param hrs the hours between 0-23.
232 * @param min the minutes between 0-59.
233 * @param sec the seconds between 0-59.
234 * @see java.util.Calendar
235 * @deprecated As of JDK version 1.1,
236 * replaced by <code>Calendar.set(year + 1900, month, date,
237 * hrs, min, sec)</code> or <code>GregorianCalendar(year + 1900,
238 * month, date, hrs, min, sec)</code>.
239 */
240 @Deprecated
241 public Date(int year, int month, int date, int hrs, int min, int sec) {
242 int y = year + 1900;
243 // month is 0-based. So we have to normalize month to support Long.MAX_VALUE.
244 if (month >= 12) {
245 y += month / 12;
246 month %= 12;
247 } else if (month < 0) {
248 y += CalendarUtils.floorDivide(month, 12);
249 month = CalendarUtils.mod(month, 12);
250 }
251 BaseCalendar cal = getCalendarSystem(y);
252 cdate = (BaseCalendar.Date) cal.newCalendarDate(TimeZone.getDefaultRef());
253 cdate.setNormalizedDate(y, month + 1, date).setTimeOfDay(hrs, min, sec, 0);
254 getTimeImpl();
255 cdate = null;
256 }
257
258 /**
259 * Allocates a <code>Date</code> object and initializes it so that
260 * it represents the date and time indicated by the string
261 * <code>s</code>, which is interpreted as if by the
262 * {@link Date#parse} method.
263 *
264 * @param s a string representation of the date.
265 * @see java.text.DateFormat
266 * @see java.util.Date#parse(java.lang.String)
267 * @deprecated As of JDK version 1.1,
268 * replaced by <code>DateFormat.parse(String s)</code>.
269 */
270 @Deprecated
271 public Date(String s) {
272 this(parse(s));
273 }
274
275 /**
276 * Return a copy of this object.
277 */
278 public Object clone() {
279 Date d = null;
280 try {
281 d = (Date)super.clone();
282 if (cdate != null) {
283 d.cdate = (BaseCalendar.Date) cdate.clone();
284 }
285 } catch (CloneNotSupportedException e) {} // Won't happen
286 return d;
287 }
288
289 /**
290 * Determines the date and time based on the arguments. The
291 * arguments are interpreted as a year, month, day of the month,
292 * hour of the day, minute within the hour, and second within the
293 * minute, exactly as for the <tt>Date</tt> constructor with six
294 * arguments, except that the arguments are interpreted relative
295 * to UTC rather than to the local time zone. The time indicated is
296 * returned represented as the distance, measured in milliseconds,
297 * of that time from the epoch (00:00:00 GMT on January 1, 1970).
298 *
299 * @param year the year minus 1900.
300 * @param month the month between 0-11.
301 * @param date the day of the month between 1-31.
302 * @param hrs the hours between 0-23.
303 * @param min the minutes between 0-59.
304 * @param sec the seconds between 0-59.
305 * @return the number of milliseconds since January 1, 1970, 00:00:00 GMT for
306 * the date and time specified by the arguments.
307 * @see java.util.Calendar
308 * @deprecated As of JDK version 1.1,
309 * replaced by <code>Calendar.set(year + 1900, month, date,
310 * hrs, min, sec)</code> or <code>GregorianCalendar(year + 1900,
311 * month, date, hrs, min, sec)</code>, using a UTC
312 * <code>TimeZone</code>, followed by <code>Calendar.getTime().getTime()</code>.
313 */
314 @Deprecated
315 public static long UTC(int year, int month, int date,
316 int hrs, int min, int sec) {
317 int y = year + 1900;
318 // month is 0-based. So we have to normalize month to support Long.MAX_VALUE.
319 if (month >= 12) {
320 y += month / 12;
321 month %= 12;
322 } else if (month < 0) {
323 y += CalendarUtils.floorDivide(month, 12);
324 month = CalendarUtils.mod(month, 12);
325 }
326 int m = month + 1;
327 BaseCalendar cal = getCalendarSystem(y);
328 BaseCalendar.Date udate = (BaseCalendar.Date) cal.newCalendarDate(null);
329 udate.setNormalizedDate(y, m, date).setTimeOfDay(hrs, min, sec, 0);
330
331 // Use a Date instance to perform normalization. Its fastTime
332 // is the UTC value after the normalization.
333 Date d = new Date(0);
334 d.normalize(udate);
335 return d.fastTime;
336 }
337
338 /**
339 * Attempts to interpret the string <tt>s</tt> as a representation
340 * of a date and time. If the attempt is successful, the time
341 * indicated is returned represented as the distance, measured in
342 * milliseconds, of that time from the epoch (00:00:00 GMT on
343 * January 1, 1970). If the attempt fails, an
344 * <tt>IllegalArgumentException</tt> is thrown.
345 * <p>
346 * It accepts many syntaxes; in particular, it recognizes the IETF
347 * standard date syntax: "Sat, 12 Aug 1995 13:30:00 GMT". It also
348 * understands the continental U.S. time-zone abbreviations, but for
349 * general use, a time-zone offset should be used: "Sat, 12 Aug 1995
350 * 13:30:00 GMT+0430" (4 hours, 30 minutes west of the Greenwich
351 * meridian). If no time zone is specified, the local time zone is
352 * assumed. GMT and UTC are considered equivalent.
353 * <p>
354 * The string <tt>s</tt> is processed from left to right, looking for
355 * data of interest. Any material in <tt>s</tt> that is within the
356 * ASCII parenthesis characters <tt>(</tt> and <tt>)</tt> is ignored.
357 * Parentheses may be nested. Otherwise, the only characters permitted
358 * within <tt>s</tt> are these ASCII characters:
359 * <blockquote><pre>
360 * abcdefghijklmnopqrstuvwxyz
361 * ABCDEFGHIJKLMNOPQRSTUVWXYZ
362 * 0123456789,+-:/</pre></blockquote>
363 * and whitespace characters.<p>
364 * A consecutive sequence of decimal digits is treated as a decimal
365 * number:<ul>
366 * <li>If a number is preceded by <tt>+</tt> or <tt>-</tt> and a year
367 * has already been recognized, then the number is a time-zone
368 * offset. If the number is less than 24, it is an offset measured
369 * in hours. Otherwise, it is regarded as an offset in minutes,
370 * expressed in 24-hour time format without punctuation. A
371 * preceding <tt>-</tt> means a westward offset. Time zone offsets
372 * are always relative to UTC (Greenwich). Thus, for example,
373 * <tt>-5</tt> occurring in the string would mean "five hours west
374 * of Greenwich" and <tt>+0430</tt> would mean "four hours and
375 * thirty minutes east of Greenwich." It is permitted for the
376 * string to specify <tt>GMT</tt>, <tt>UT</tt>, or <tt>UTC</tt>
377 * redundantly-for example, <tt>GMT-5</tt> or <tt>utc+0430</tt>.
378 * <li>The number is regarded as a year number if one of the
379 * following conditions is true:
380 * <ul>
381 * <li>The number is equal to or greater than 70 and followed by a
382 * space, comma, slash, or end of string
383 * <li>The number is less than 70, and both a month and a day of
384 * the month have already been recognized</li>
385 * </ul>
386 * If the recognized year number is less than 100, it is
387 * interpreted as an abbreviated year relative to a century of
388 * which dates are within 80 years before and 19 years after
389 * the time when the Date class is initialized.
390 * After adjusting the year number, 1900 is subtracted from
391 * it. For example, if the current year is 1999 then years in
392 * the range 19 to 99 are assumed to mean 1919 to 1999, while
393 * years from 0 to 18 are assumed to mean 2000 to 2018. Note
394 * that this is slightly different from the interpretation of
395 * years less than 100 that is used in {@link java.text.SimpleDateFormat}.
396 * <li>If the number is followed by a colon, it is regarded as an hour,
397 * unless an hour has already been recognized, in which case it is
398 * regarded as a minute.
399 * <li>If the number is followed by a slash, it is regarded as a month
400 * (it is decreased by 1 to produce a number in the range <tt>0</tt>
401 * to <tt>11</tt>), unless a month has already been recognized, in
402 * which case it is regarded as a day of the month.
403 * <li>If the number is followed by whitespace, a comma, a hyphen, or
404 * end of string, then if an hour has been recognized but not a
405 * minute, it is regarded as a minute; otherwise, if a minute has
406 * been recognized but not a second, it is regarded as a second;
407 * otherwise, it is regarded as a day of the month. </ul><p>
408 * A consecutive sequence of letters is regarded as a word and treated
409 * as follows:<ul>
410 * <li>A word that matches <tt>AM</tt>, ignoring case, is ignored (but
411 * the parse fails if an hour has not been recognized or is less
412 * than <tt>1</tt> or greater than <tt>12</tt>).
413 * <li>A word that matches <tt>PM</tt>, ignoring case, adds <tt>12</tt>
414 * to the hour (but the parse fails if an hour has not been
415 * recognized or is less than <tt>1</tt> or greater than <tt>12</tt>).
416 * <li>Any word that matches any prefix of <tt>SUNDAY, MONDAY, TUESDAY,
417 * WEDNESDAY, THURSDAY, FRIDAY</tt>, or <tt>SATURDAY</tt>, ignoring
418 * case, is ignored. For example, <tt>sat, Friday, TUE</tt>, and
419 * <tt>Thurs</tt> are ignored.
420 * <li>Otherwise, any word that matches any prefix of <tt>JANUARY,
421 * FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER,
422 * OCTOBER, NOVEMBER</tt>, or <tt>DECEMBER</tt>, ignoring case, and
423 * considering them in the order given here, is recognized as
424 * specifying a month and is converted to a number (<tt>0</tt> to
425 * <tt>11</tt>). For example, <tt>aug, Sept, april</tt>, and
426 * <tt>NOV</tt> are recognized as months. So is <tt>Ma</tt>, which
427 * is recognized as <tt>MARCH</tt>, not <tt>MAY</tt>.
428 * <li>Any word that matches <tt>GMT, UT</tt>, or <tt>UTC</tt>, ignoring
429 * case, is treated as referring to UTC.
430 * <li>Any word that matches <tt>EST, CST, MST</tt>, or <tt>PST</tt>,
431 * ignoring case, is recognized as referring to the time zone in
432 * North America that is five, six, seven, or eight hours west of
433 * Greenwich, respectively. Any word that matches <tt>EDT, CDT,
434 * MDT</tt>, or <tt>PDT</tt>, ignoring case, is recognized as
435 * referring to the same time zone, respectively, during daylight
436 * saving time.</ul><p>
437 * Once the entire string s has been scanned, it is converted to a time
438 * result in one of two ways. If a time zone or time-zone offset has been
439 * recognized, then the year, month, day of month, hour, minute, and
440 * second are interpreted in UTC and then the time-zone offset is
441 * applied. Otherwise, the year, month, day of month, hour, minute, and
442 * second are interpreted in the local time zone.
443 *
444 * @param s a string to be parsed as a date.
445 * @return the number of milliseconds since January 1, 1970, 00:00:00 GMT
446 * represented by the string argument.
447 * @see java.text.DateFormat
448 * @deprecated As of JDK version 1.1,
449 * replaced by <code>DateFormat.parse(String s)</code>.
450 */
451 @Deprecated
452 public static long parse(String s) {
453 int year = Integer.MIN_VALUE;
454 int mon = -1;
455 int mday = -1;
456 int hour = -1;
457 int min = -1;
458 int sec = -1;
459 int millis = -1;
460 int c = -1;
461 int i = 0;
462 int n = -1;
463 int wst = -1;
464 int tzoffset = -1;
465 int prevc = 0;
466 syntax:
467 {
468 if (s == null)
469 break syntax;
470 int limit = s.length();
471 while (i < limit) {
472 c = s.charAt(i);
473 i++;
474 if (c <= ' ' || c == ',')
475 continue;
476 if (c == '(') { // skip comments
477 int depth = 1;
478 while (i < limit) {
479 c = s.charAt(i);
480 i++;
481 if (c == '(') depth++;
482 else if (c == ')')
483 if (--depth <= 0)
484 break;
485 }
486 continue;
487 }
488 if ('0' <= c && c <= '9') {
489 n = c - '0';
490 while (i < limit && '0' <= (c = s.charAt(i)) && c <= '9') {
491 n = n * 10 + c - '0';
492 i++;
493 }
494 if (prevc == '+' || prevc == '-' && year != Integer.MIN_VALUE) {
495 // timezone offset
496 if (n < 24)
497 n = n * 60; // EG. "GMT-3"
498 else
499 n = n % 100 + n / 100 * 60; // eg "GMT-0430"
500 if (prevc == '+') // plus means east of GMT
501 n = -n;
502 if (tzoffset != 0 && tzoffset != -1)
503 break syntax;
504 tzoffset = n;
505 } else if (n >= 70)
506 if (year != Integer.MIN_VALUE)
507 break syntax;
508 else if (c <= ' ' || c == ',' || c == '/' || i >= limit)
509 // year = n < 1900 ? n : n - 1900;
510 year = n;
511 else
512 break syntax;
513 else if (c == ':')
514 if (hour < 0)
515 hour = (byte) n;
516 else if (min < 0)
517 min = (byte) n;
518 else
519 break syntax;
520 else if (c == '/')
521 if (mon < 0)
522 mon = (byte) (n - 1);
523 else if (mday < 0)
524 mday = (byte) n;
525 else
526 break syntax;
527 else if (i < limit && c != ',' && c > ' ' && c != '-')
528 break syntax;
529 else if (hour >= 0 && min < 0)
530 min = (byte) n;
531 else if (min >= 0 && sec < 0)
532 sec = (byte) n;
533 else if (mday < 0)
534 mday = (byte) n;
535 // Handle two-digit years < 70 (70-99 handled above).
536 else if (year == Integer.MIN_VALUE && mon >= 0 && mday >= 0)
537 year = n;
538 else
539 break syntax;
540 prevc = 0;
541 } else if (c == '/' || c == ':' || c == '+' || c == '-')
542 prevc = c;
543 else {
544 int st = i - 1;
545 while (i < limit) {
546 c = s.charAt(i);
547 if (!('A' <= c && c <= 'Z' || 'a' <= c && c <= 'z'))
548 break;
549 i++;
550 }
551 if (i <= st + 1)
552 break syntax;
553 int k;
554 for (k = wtb.length; --k >= 0;)
555 if (wtb[k].regionMatches(true, 0, s, st, i - st)) {
556 int action = ttb[k];
557 if (action != 0) {
558 if (action == 1) { // pm
559 if (hour > 12 || hour < 1)
560 break syntax;
561 else if (hour < 12)
562 hour += 12;
563 } else if (action == 14) { // am
564 if (hour > 12 || hour < 1)
565 break syntax;
566 else if (hour == 12)
567 hour = 0;
568 } else if (action <= 13) { // month!
569 if (mon < 0)
570 mon = (byte) (action - 2);
571 else
572 break syntax;
573 } else {
574 tzoffset = action - 10000;
575 }
576 }
577 break;
578 }
579 if (k < 0)
580 break syntax;
581 prevc = 0;
582 }
583 }
584 if (year == Integer.MIN_VALUE || mon < 0 || mday < 0)
585 break syntax;
586 // Parse 2-digit years within the correct default century.
587 if (year < 100) {
588 synchronized (Date.class) {
589 if (defaultCenturyStart == 0) {
590 defaultCenturyStart = gcal.getCalendarDate().getYear() - 80;
591 }
592 }
593 year += (defaultCenturyStart / 100) * 100;
594 if (year < defaultCenturyStart) year += 100;
595 }
596 if (sec < 0)
597 sec = 0;
598 if (min < 0)
599 min = 0;
600 if (hour < 0)
601 hour = 0;
602 BaseCalendar cal = getCalendarSystem(year);
603 if (tzoffset == -1) { // no time zone specified, have to use local
604 BaseCalendar.Date ldate = (BaseCalendar.Date) cal.newCalendarDate(TimeZone.getDefaultRef());
605 ldate.setDate(year, mon + 1, mday);
606 ldate.setTimeOfDay(hour, min, sec, 0);
607 return cal.getTime(ldate);
608 }
609 BaseCalendar.Date udate = (BaseCalendar.Date) cal.newCalendarDate(null); // no time zone
610 udate.setDate(year, mon + 1, mday);
611 udate.setTimeOfDay(hour, min, sec, 0);
612 return cal.getTime(udate) + tzoffset * (60 * 1000);
613 }
614 // syntax error
615 throw new IllegalArgumentException();
616 }
617 private final static String wtb[] = {
618 "am", "pm",
619 "monday", "tuesday", "wednesday", "thursday", "friday",
620 "saturday", "sunday",
621 "january", "february", "march", "april", "may", "june",
622 "july", "august", "september", "october", "november", "december",
623 "gmt", "ut", "utc", "est", "edt", "cst", "cdt",
624 "mst", "mdt", "pst", "pdt"
625 };
626 private final static int ttb[] = {
627 14, 1, 0, 0, 0, 0, 0, 0, 0,
628 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
629 10000 + 0, 10000 + 0, 10000 + 0, // GMT/UT/UTC
630 10000 + 5 * 60, 10000 + 4 * 60, // EST/EDT
631 10000 + 6 * 60, 10000 + 5 * 60, // CST/CDT
632 10000 + 7 * 60, 10000 + 6 * 60, // MST/MDT
633 10000 + 8 * 60, 10000 + 7 * 60 // PST/PDT
634 };
635
636 /**
637 * Returns a value that is the result of subtracting 1900 from the
638 * year that contains or begins with the instant in time represented
639 * by this <code>Date</code> object, as interpreted in the local
640 * time zone.
641 *
642 * @return the year represented by this date, minus 1900.
643 * @see java.util.Calendar
644 * @deprecated As of JDK version 1.1,
645 * replaced by <code>Calendar.get(Calendar.YEAR) - 1900</code>.
646 */
647 @Deprecated
648 public int getYear() {
649 return normalize().getYear() - 1900;
650 }
651
652 /**
653 * Sets the year of this <tt>Date</tt> object to be the specified
654 * value plus 1900. This <code>Date</code> object is modified so
655 * that it represents a point in time within the specified year,
656 * with the month, date, hour, minute, and second the same as
657 * before, as interpreted in the local time zone. (Of course, if
658 * the date was February 29, for example, and the year is set to a
659 * non-leap year, then the new date will be treated as if it were
660 * on March 1.)
661 *
662 * @param year the year value.
663 * @see java.util.Calendar
664 * @deprecated As of JDK version 1.1,
665 * replaced by <code>Calendar.set(Calendar.YEAR, year + 1900)</code>.
666 */
667 @Deprecated
668 public void setYear(int year) {
669 getCalendarDate().setNormalizedYear(year + 1900);
670 }

661 more lines aren’t shown here.

java/pkg/java/util/Deque.class+0−0

Binary file not shown.

java/pkg/java/util/Deque.java+584−0

This diff is large: its 585 lines aren’t shown here.

java/pkg/java/util/Dictionary.class+0−0

Binary file not shown.

java/pkg/java/util/Dictionary.java+155−0

This diff is large: its 156 lines aren’t shown here.

java/pkg/java/util/DualPivotQuicksort.class+0−0

Binary file not shown.

java/pkg/java/util/DualPivotQuicksort.java+3018−0

This diff is large: its 3019 lines aren’t shown here.

java/pkg/java/util/DuplicateFormatFlagsException.class+0−0

Binary file not shown.

java/pkg/java/util/DuplicateFormatFlagsException.java+68−0

This diff is large: its 69 lines aren’t shown here.

java/pkg/java/util/EmptyStackException.class+0−0

Binary file not shown.

java/pkg/java/util/EmptyStackException.java+46−0

This diff is large: its 47 lines aren’t shown here.

java/pkg/java/util/EnumMap$1.class+0−0

Binary file not shown.

java/pkg/java/util/EnumMap$EntryIterator$Entry.class+0−0

Binary file not shown.

java/pkg/java/util/EnumMap$EntryIterator.class+0−0

Binary file not shown.

java/pkg/java/util/EnumMap$EntrySet.class+0−0

Binary file not shown.

java/pkg/java/util/EnumMap$EnumMapIterator.class+0−0

Binary file not shown.

java/pkg/java/util/EnumMap$KeyIterator.class+0−0

Binary file not shown.

java/pkg/java/util/EnumMap$KeySet.class+0−0

Binary file not shown.

java/pkg/java/util/EnumMap$ValueIterator.class+0−0

Binary file not shown.

java/pkg/java/util/EnumMap$Values.class+0−0

Binary file not shown.

java/pkg/java/util/EnumMap.class+0−0

Binary file not shown.

java/pkg/java/util/EnumMap.java+799−0

This diff is large: its 800 lines aren’t shown here.

java/pkg/java/util/EnumSet$SerializationProxy.class+0−0

Binary file not shown.

java/pkg/java/util/EnumSet.class+0−0

Binary file not shown.

java/pkg/java/util/EnumSet.java+443−0

This diff is large: its 444 lines aren’t shown here.

java/pkg/java/util/Enumeration.class+0−0

Binary file not shown.

java/pkg/java/util/Enumeration.java+79−0

This diff is large: its 80 lines aren’t shown here.

java/pkg/java/util/EventListener.class+0−0

Binary file not shown.

java/pkg/java/util/EventListener.java+33−0

This diff is large: its 34 lines aren’t shown here.

java/pkg/java/util/EventListenerProxy.class+0−0

Binary file not shown.

java/pkg/java/util/EventListenerProxy.java+75−0

This diff is large: its 76 lines aren’t shown here.

java/pkg/java/util/EventObject.class+0−0

Binary file not shown.

java/pkg/java/util/EventObject.java+78−0

This diff is large: its 79 lines aren’t shown here.

java/pkg/java/util/FormatFlagsConversionMismatchException.class+0−0

Binary file not shown.

java/pkg/java/util/FormatFlagsConversionMismatchException.java+84−0

This diff is large: its 85 lines aren’t shown here.

java/pkg/java/util/Formattable.class+0−0

Binary file not shown.

java/pkg/java/util/Formattable.java+164−0

This diff is large: its 165 lines aren’t shown here.

java/pkg/java/util/FormattableFlags.class+0−0

Binary file not shown.

java/pkg/java/util/FormattableFlags.java+75−0

This diff is large: its 76 lines aren’t shown here.

java/pkg/java/util/Formatter$BigDecimalLayoutForm.class+0−0

Binary file not shown.

java/pkg/java/util/Formatter$Conversion.class+0−0

Binary file not shown.

java/pkg/java/util/Formatter$DateTime.class+0−0

Binary file not shown.

java/pkg/java/util/Formatter$FixedString.class+0−0

Binary file not shown.

java/pkg/java/util/Formatter$Flags.class+0−0

Binary file not shown.

java/pkg/java/util/Formatter$FormatSpecifier$BigDecimalLayout.class+0−0

Binary file not shown.

java/pkg/java/util/Formatter$FormatSpecifier.class+0−0

Binary file not shown.

java/pkg/java/util/Formatter$FormatString.class+0−0

Binary file not shown.

java/pkg/java/util/Formatter.class+0−0

Binary file not shown.

java/pkg/java/util/Formatter.java+4441−0

This diff is large: its 4442 lines aren’t shown here.

java/pkg/java/util/FormatterClosedException.class+0−0

Binary file not shown.

java/pkg/java/util/FormatterClosedException.java+45−0

This diff is large: its 46 lines aren’t shown here.

java/pkg/java/util/GregorianCalendar.class+0−0

Binary file not shown.

java/pkg/java/util/GregorianCalendar.java+3179−0

This diff is large: its 3180 lines aren’t shown here.

java/pkg/java/util/HashMap$1.class+0−0

Binary file not shown.

java/pkg/java/util/HashMap$Entry.class+0−0

Binary file not shown.

java/pkg/java/util/HashMap$EntryIterator.class+0−0

Binary file not shown.

java/pkg/java/util/HashMap$EntrySet.class+0−0

Binary file not shown.

java/pkg/java/util/HashMap$HashIterator.class+0−0

Binary file not shown.

java/pkg/java/util/HashMap$KeyIterator.class+0−0

Binary file not shown.

java/pkg/java/util/HashMap$KeySet.class+0−0

Binary file not shown.

java/pkg/java/util/HashMap$ValueIterator.class+0−0

Binary file not shown.

java/pkg/java/util/HashMap$Values.class+0−0

Binary file not shown.

java/pkg/java/util/HashMap.class+0−0

Binary file not shown.

java/pkg/java/util/HashMap.java+1051−0

This diff is large: its 1052 lines aren’t shown here.

java/pkg/java/util/HashSet.class+0−0

Binary file not shown.

java/pkg/java/util/HashSet.java+312−0

This diff is large: its 313 lines aren’t shown here.

java/pkg/java/util/Hashtable$1.class+0−0

Binary file not shown.

java/pkg/java/util/Hashtable$Entry.class+0−0

Binary file not shown.

java/pkg/java/util/Hashtable$EntrySet.class+0−0

Binary file not shown.

java/pkg/java/util/Hashtable$Enumerator.class+0−0

Binary file not shown.

java/pkg/java/util/Hashtable$KeySet.class+0−0

Binary file not shown.

java/pkg/java/util/Hashtable$ValueCollection.class+0−0

Binary file not shown.

java/pkg/java/util/Hashtable.class+0−0

Binary file not shown.

java/pkg/java/util/Hashtable.java+1115−0

This diff is large: its 1116 lines aren’t shown here.

java/pkg/java/util/IdentityHashMap$1.class+0−0

Binary file not shown.

java/pkg/java/util/IdentityHashMap$EntryIterator$Entry.class+0−0

Binary file not shown.

java/pkg/java/util/IdentityHashMap$EntryIterator.class+0−0

Binary file not shown.

java/pkg/java/util/IdentityHashMap$EntrySet.class+0−0

Binary file not shown.

java/pkg/java/util/IdentityHashMap$IdentityHashMapIterator.class+0−0

Binary file not shown.

java/pkg/java/util/IdentityHashMap$KeyIterator.class+0−0

Binary file not shown.

java/pkg/java/util/IdentityHashMap$KeySet.class+0−0

Binary file not shown.

java/pkg/java/util/IdentityHashMap$ValueIterator.class+0−0

Binary file not shown.

java/pkg/java/util/IdentityHashMap$Values.class+0−0

Binary file not shown.

java/pkg/java/util/IdentityHashMap.class+0−0

Binary file not shown.

java/pkg/java/util/IdentityHashMap.java+1243−0

This diff is large: its 1244 lines aren’t shown here.

java/pkg/java/util/IllegalFormatCodePointException.class+0−0

Binary file not shown.

java/pkg/java/util/IllegalFormatCodePointException.java+69−0

This diff is large: its 70 lines aren’t shown here.

java/pkg/java/util/IllegalFormatConversionException.class+0−0

Binary file not shown.

java/pkg/java/util/IllegalFormatConversionException.java+84−0

This diff is large: its 85 lines aren’t shown here.

java/pkg/java/util/IllegalFormatException.class+0−0

Binary file not shown.

java/pkg/java/util/IllegalFormatException.java+42−0

This diff is large: its 43 lines aren’t shown here.

java/pkg/java/util/IllegalFormatFlagsException.class+0−0

Binary file not shown.

java/pkg/java/util/IllegalFormatFlagsException.java+67−0

This diff is large: its 68 lines aren’t shown here.

java/pkg/java/util/IllegalFormatPrecisionException.class+0−0

Binary file not shown.

java/pkg/java/util/IllegalFormatPrecisionException.java+63−0

This diff is large: its 64 lines aren’t shown here.

java/pkg/java/util/IllegalFormatWidthException.class+0−0

Binary file not shown.

java/pkg/java/util/IllegalFormatWidthException.java+62−0

This diff is large: its 63 lines aren’t shown here.

java/pkg/java/util/IllformedLocaleException.class+0−0

Binary file not shown.

java/pkg/java/util/IllformedLocaleException.java+90−0

This diff is large: its 91 lines aren’t shown here.

java/pkg/java/util/InputMismatchException.class+0−0

Binary file not shown.

java/pkg/java/util/InputMismatchException.java+59−0

This diff is large: its 60 lines aren’t shown here.

java/pkg/java/util/InvalidPropertiesFormatException.class+0−0

Binary file not shown.

java/pkg/java/util/InvalidPropertiesFormatException.java+90−0

This diff is large: its 91 lines aren’t shown here.

java/pkg/java/util/Iterator.class+0−0

Binary file not shown.

java/pkg/java/util/Iterator.java+87−0

This diff is large: its 88 lines aren’t shown here.

java/pkg/java/util/JapaneseImperialCalendar.class+0−0

Binary file not shown.

java/pkg/java/util/JapaneseImperialCalendar.java+2383−0

This diff is large: its 2384 lines aren’t shown here.

java/pkg/java/util/JumboEnumSet$EnumSetIterator.class+0−0

Binary file not shown.

java/pkg/java/util/JumboEnumSet.class+0−0

Binary file not shown.

java/pkg/java/util/JumboEnumSet.java+375−0

This diff is large: its 376 lines aren’t shown here.

java/pkg/java/util/LinkedHashMap$1.class+0−0

Binary file not shown.

java/pkg/java/util/LinkedHashMap$Entry.class+0−0

Binary file not shown.

java/pkg/java/util/LinkedHashMap$EntryIterator.class+0−0

Binary file not shown.

java/pkg/java/util/LinkedHashMap$KeyIterator.class+0−0

Binary file not shown.

java/pkg/java/util/LinkedHashMap$LinkedHashIterator.class+0−0

Binary file not shown.

java/pkg/java/util/LinkedHashMap$ValueIterator.class+0−0

Binary file not shown.

java/pkg/java/util/LinkedHashMap.class+0−0

Binary file not shown.

java/pkg/java/util/LinkedHashMap.java+491−0

This diff is large: its 492 lines aren’t shown here.

java/pkg/java/util/LinkedHashSet.class+0−0

Binary file not shown.

java/pkg/java/util/LinkedHashSet.java+171−0

This diff is large: its 172 lines aren’t shown here.

java/pkg/java/util/LinkedList$1.class+0−0

Binary file not shown.

java/pkg/java/util/LinkedList$DescendingIterator.class+0−0

Binary file not shown.

java/pkg/java/util/LinkedList$ListItr.class+0−0

Binary file not shown.

java/pkg/java/util/LinkedList$Node.class+0−0

Binary file not shown.

java/pkg/java/util/LinkedList.class+0−0

Binary file not shown.

java/pkg/java/util/LinkedList.java+1138−0

This diff is large: its 1139 lines aren’t shown here.

java/pkg/java/util/List.class+0−0

Binary file not shown.

java/pkg/java/util/List.java+600−0

This diff is large: its 601 lines aren’t shown here.

java/pkg/java/util/ListIterator.class+0−0

Binary file not shown.

java/pkg/java/util/ListIterator.java+195−0

This diff is large: its 196 lines aren’t shown here.

java/pkg/java/util/ListResourceBundle.class+0−0

Binary file not shown.

java/pkg/java/util/ListResourceBundle.java+204−0

This diff is large: its 205 lines aren’t shown here.

java/pkg/java/util/Locale$1.class+0−0

Binary file not shown.

java/pkg/java/util/Locale$Builder.class+0−0

Binary file not shown.

java/pkg/java/util/Locale$Cache.class+0−0

Binary file not shown.

java/pkg/java/util/Locale$Category.class+0−0

Binary file not shown.

java/pkg/java/util/Locale$LocaleKey.class+0−0

Binary file not shown.

java/pkg/java/util/Locale$LocaleNameGetter.class+0−0

Binary file not shown.

java/pkg/java/util/Locale.class+0−0

Binary file not shown.

java/pkg/java/util/Locale.java+2560−0

This diff is large: its 2561 lines aren’t shown here.

java/pkg/java/util/LocaleISOData.class+0−0

Binary file not shown.

java/pkg/java/util/LocaleISOData.java+478−0

This diff is large: its 479 lines aren’t shown here.

java/pkg/java/util/Map$Entry.class+0−0

Binary file not shown.

java/pkg/java/util/Map.class+0−0

Binary file not shown.

java/pkg/java/util/Map.java+478−0

This diff is large: its 479 lines aren’t shown here.

java/pkg/java/util/MissingFormatArgumentException.class+0−0

Binary file not shown.

java/pkg/java/util/MissingFormatArgumentException.java+70−0

This diff is large: its 71 lines aren’t shown here.

java/pkg/java/util/MissingFormatWidthException.class+0−0

Binary file not shown.

java/pkg/java/util/MissingFormatWidthException.java+68−0

This diff is large: its 69 lines aren’t shown here.

java/pkg/java/util/MissingResourceException.class+0−0

Binary file not shown.

java/pkg/java/util/MissingResourceException.java+124−0

This diff is large: its 125 lines aren’t shown here.

java/pkg/java/util/NavigableMap.class+0−0

Binary file not shown.

java/pkg/java/util/NavigableMap.java+424−0

This diff is large: its 425 lines aren’t shown here.

java/pkg/java/util/NavigableSet.class+0−0

Binary file not shown.

java/pkg/java/util/NavigableSet.java+319−0

This diff is large: its 320 lines aren’t shown here.

java/pkg/java/util/NoSuchElementException.class+0−0

Binary file not shown.

java/pkg/java/util/NoSuchElementException.java+60−0

This diff is large: its 61 lines aren’t shown here.

java/pkg/java/util/Objects.class+0−0

Binary file not shown.

java/pkg/java/util/Objects.java+229−0

This diff is large: its 230 lines aren’t shown here.

java/pkg/java/util/Observable.class+0−0

Binary file not shown.

java/pkg/java/util/Observable.java+213−0

This diff is large: its 214 lines aren’t shown here.

java/pkg/java/util/Observer.class+0−0

Binary file not shown.

java/pkg/java/util/Observer.java+47−0

This diff is large: its 48 lines aren’t shown here.

java/pkg/java/util/PriorityQueue$1.class+0−0

Binary file not shown.

java/pkg/java/util/PriorityQueue$Itr.class+0−0

Binary file not shown.

java/pkg/java/util/PriorityQueue.class+0−0

Binary file not shown.

java/pkg/java/util/PriorityQueue.java+775−0

This diff is large: its 776 lines aren’t shown here.

java/pkg/java/util/Properties$LineReader.class+0−0

Binary file not shown.

java/pkg/java/util/Properties.class+0−0

Binary file not shown.

java/pkg/java/util/Properties.java+1114−0

This diff is large: its 1115 lines aren’t shown here.

java/pkg/java/util/PropertyPermission.class+0−0

Binary file not shown.

java/pkg/java/util/PropertyPermission.java+667−0

This diff is large: its 668 lines aren’t shown here.

java/pkg/java/util/PropertyPermissionCollection.class+0−0

Binary file not shown.

java/pkg/java/util/PropertyResourceBundle.class+0−0

Binary file not shown.

java/pkg/java/util/PropertyResourceBundle.java+190−0

This diff is large: its 191 lines aren’t shown here.

java/pkg/java/util/Queue.class+0−0

Binary file not shown.

java/pkg/java/util/Queue.java+218−0

This diff is large: its 219 lines aren’t shown here.

java/pkg/java/util/Random.class+0−0

Binary file not shown.

java/pkg/java/util/Random.java+575−0

This diff is large: its 576 lines aren’t shown here.

java/pkg/java/util/RandomAccess.class+0−0

Binary file not shown.

java/pkg/java/util/RandomAccess.java+68−0

This diff is large: its 69 lines aren’t shown here.

java/pkg/java/util/RandomAccessSubList.class+0−0

Binary file not shown.

java/pkg/java/util/RegularEnumSet$EnumSetIterator.class+0−0

Binary file not shown.

java/pkg/java/util/RegularEnumSet.class+0−0

Binary file not shown.

java/pkg/java/util/RegularEnumSet.java+303−0

This diff is large: its 304 lines aren’t shown here.

java/pkg/java/util/ResourceBundle$1.class+0−0

Binary file not shown.

java/pkg/java/util/ResourceBundle$BundleReference.class+0−0

Binary file not shown.

java/pkg/java/util/ResourceBundle$CacheKey.class+0−0

Binary file not shown.

java/pkg/java/util/ResourceBundle$CacheKeyReference.class+0−0

Binary file not shown.

java/pkg/java/util/ResourceBundle$Control$1.class+0−0

Binary file not shown.

java/pkg/java/util/ResourceBundle$Control$CandidateListCache.class+0−0

Binary file not shown.

java/pkg/java/util/ResourceBundle$Control.class+0−0

Binary file not shown.

java/pkg/java/util/ResourceBundle$LoaderReference.class+0−0

Binary file not shown.

java/pkg/java/util/ResourceBundle$NoFallbackControl.class+0−0

Binary file not shown.

java/pkg/java/util/ResourceBundle$RBClassLoader$1.class+0−0

Binary file not shown.

java/pkg/java/util/ResourceBundle$RBClassLoader.class+0−0

Binary file not shown.

java/pkg/java/util/ResourceBundle$SingleFormatControl.class+0−0

Binary file not shown.

java/pkg/java/util/ResourceBundle.class+0−0

Binary file not shown.

java/pkg/java/util/ResourceBundle.java+2911−0

This diff is large: its 2912 lines aren’t shown here.

java/pkg/java/util/Scanner$1.class+0−0

Binary file not shown.

java/pkg/java/util/Scanner.class+0−0

Binary file not shown.

java/pkg/java/util/Scanner.java+2660−0

This diff is large: its 2661 lines aren’t shown here.

java/pkg/java/util/ServiceConfigurationError.class+0−0

Binary file not shown.

java/pkg/java/util/ServiceConfigurationError.java+87−0

This diff is large: its 88 lines aren’t shown here.

java/pkg/java/util/ServiceLoader$1.class+0−0

Binary file not shown.

java/pkg/java/util/ServiceLoader$LazyIterator.class+0−0

Binary file not shown.

java/pkg/java/util/ServiceLoader.class+0−0

Binary file not shown.

java/pkg/java/util/ServiceLoader.java+538−0

This diff is large: its 539 lines aren’t shown here.

java/pkg/java/util/Set.class+0−0

Binary file not shown.

java/pkg/java/util/Set.java+385−0

This diff is large: its 386 lines aren’t shown here.

java/pkg/java/util/SimpleTimeZone.class+0−0

Binary file not shown.

java/pkg/java/util/SimpleTimeZone.java+1706−0

This diff is large: its 1707 lines aren’t shown here.

java/pkg/java/util/SortedMap.class+0−0

Binary file not shown.

java/pkg/java/util/SortedMap.java+284−0

This diff is large: its 285 lines aren’t shown here.

java/pkg/java/util/SortedSet.class+0−0

Binary file not shown.

java/pkg/java/util/SortedSet.java+222−0

This diff is large: its 223 lines aren’t shown here.

java/pkg/java/util/Stack.class+0−0

Binary file not shown.

java/pkg/java/util/Stack.java+141−0

This diff is large: its 142 lines aren’t shown here.

java/pkg/java/util/StringTokenizer.class+0−0

Binary file not shown.

java/pkg/java/util/StringTokenizer.java+431−0

This diff is large: its 432 lines aren’t shown here.

java/pkg/java/util/SubList$1.class+0−0

Binary file not shown.

java/pkg/java/util/SubList.class+0−0

Binary file not shown.

java/pkg/java/util/TaskQueue.class+0−0

Binary file not shown.

java/pkg/java/util/TimSort.class+0−0

Binary file not shown.

java/pkg/java/util/TimSort.java+928−0

This diff is large: its 929 lines aren’t shown here.

java/pkg/java/util/TimeZone$1.class+0−0

Binary file not shown.

java/pkg/java/util/TimeZone$DisplayNames.class+0−0

Binary file not shown.

java/pkg/java/util/TimeZone.class+0−0

Binary file not shown.

java/pkg/java/util/TimeZone.java+864−0

This diff is large: its 865 lines aren’t shown here.

java/pkg/java/util/Timer$1.class+0−0

Binary file not shown.

java/pkg/java/util/Timer.class+0−0

Binary file not shown.

java/pkg/java/util/Timer.java+720−0

This diff is large: its 721 lines aren’t shown here.

java/pkg/java/util/TimerTask.class+0−0

Binary file not shown.

java/pkg/java/util/TimerTask.java+158−0

This diff is large: its 159 lines aren’t shown here.

java/pkg/java/util/TimerThread.class+0−0

Binary file not shown.

java/pkg/java/util/TooManyListenersException.class+0−0

Binary file not shown.

java/pkg/java/util/TooManyListenersException.java+71−0

This diff is large: its 72 lines aren’t shown here.

java/pkg/java/util/TreeMap$AscendingSubMap$AscendingEntrySetView.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$AscendingSubMap.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$DescendingKeyIterator.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$DescendingSubMap$DescendingEntrySetView.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$DescendingSubMap.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$Entry.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$EntryIterator.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$EntrySet.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$KeyIterator.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$KeySet.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$NavigableSubMap$DescendingSubMapEntryIterator.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$NavigableSubMap$DescendingSubMapKeyIterator.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$NavigableSubMap$EntrySetView.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$NavigableSubMap$SubMapEntryIterator.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$NavigableSubMap$SubMapIterator.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$NavigableSubMap$SubMapKeyIterator.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$NavigableSubMap.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$PrivateEntryIterator.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$SubMap.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$ValueIterator.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap$Values.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap.class+0−0

Binary file not shown.

java/pkg/java/util/TreeMap.java+2442−0

This diff is large: its 2443 lines aren’t shown here.

java/pkg/java/util/TreeSet.class+0−0

Binary file not shown.

java/pkg/java/util/TreeSet.java+539−0

This diff is large: its 540 lines aren’t shown here.

java/pkg/java/util/UUID.class+0−0

Binary file not shown.

java/pkg/java/util/UUID.java+443−0

This diff is large: its 444 lines aren’t shown here.

java/pkg/java/util/UnknownFormatConversionException.class+0−0

Binary file not shown.

java/pkg/java/util/UnknownFormatConversionException.java+68−0

This diff is large: its 69 lines aren’t shown here.

java/pkg/java/util/UnknownFormatFlagsException.class+0−0

Binary file not shown.

java/pkg/java/util/UnknownFormatFlagsException.java+68−0

This diff is large: its 69 lines aren’t shown here.

java/pkg/java/util/Vector$1.class+0−0

Binary file not shown.

java/pkg/java/util/Vector$Itr.class+0−0

Binary file not shown.

java/pkg/java/util/Vector$ListItr.class+0−0

Binary file not shown.

java/pkg/java/util/Vector.class+0−0

Binary file not shown.

java/pkg/java/util/Vector.java+1212−0

This diff is large: its 1213 lines aren’t shown here.

java/pkg/java/util/WeakHashMap$1.class+0−0

Binary file not shown.

java/pkg/java/util/WeakHashMap$Entry.class+0−0

Binary file not shown.

java/pkg/java/util/WeakHashMap$EntryIterator.class+0−0

Binary file not shown.

java/pkg/java/util/WeakHashMap$EntrySet.class+0−0

Binary file not shown.

java/pkg/java/util/WeakHashMap$HashIterator.class+0−0

Binary file not shown.

java/pkg/java/util/WeakHashMap$KeyIterator.class+0−0

Binary file not shown.

java/pkg/java/util/WeakHashMap$KeySet.class+0−0

Binary file not shown.

java/pkg/java/util/WeakHashMap$ValueIterator.class+0−0

Binary file not shown.

java/pkg/java/util/WeakHashMap$Values.class+0−0

Binary file not shown.

java/pkg/java/util/WeakHashMap.class+0−0

Binary file not shown.

java/pkg/java/util/WeakHashMap.java+972−0

This diff is large: its 973 lines aren’t shown here.

java/pkg/java/util/XMLUtils$1.class+0−0

Binary file not shown.

java/pkg/java/util/XMLUtils$EH.class+0−0

Binary file not shown.

java/pkg/java/util/XMLUtils$Resolver.class+0−0

Binary file not shown.

java/pkg/java/util/XMLUtils.class+0−0

Binary file not shown.

java/pkg/java/util/XMLUtils.java+206−0

This diff is large: its 207 lines aren’t shown here.

java/pkg/java/util/concurrent/AbstractExecutorService.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/AbstractExecutorService.java+309−0

This diff is large: its 310 lines aren’t shown here.

java/pkg/java/util/concurrent/ArrayBlockingQueue$Itr.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ArrayBlockingQueue.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ArrayBlockingQueue.java+805−0

This diff is large: its 806 lines aren’t shown here.

java/pkg/java/util/concurrent/BlockingDeque.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/BlockingDeque.java+650−0

This diff is large: its 651 lines aren’t shown here.

java/pkg/java/util/concurrent/BlockingQueue.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/BlockingQueue.java+377−0

This diff is large: its 378 lines aren’t shown here.

java/pkg/java/util/concurrent/BrokenBarrierException.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/BrokenBarrierException.java+67−0

This diff is large: its 68 lines aren’t shown here.

java/pkg/java/util/concurrent/Callable.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Callable.java+65−0

This diff is large: its 66 lines aren’t shown here.

java/pkg/java/util/concurrent/CancellationException.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/CancellationException.java+63−0

This diff is large: its 64 lines aren’t shown here.

java/pkg/java/util/concurrent/CompletionService.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/CompletionService.java+126−0

This diff is large: its 127 lines aren’t shown here.

java/pkg/java/util/concurrent/ConcurrentHashMap$EntryIterator.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentHashMap$EntrySet.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentHashMap$HashEntry.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentHashMap$HashIterator.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentHashMap$KeyIterator.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentHashMap$KeySet.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentHashMap$Segment.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentHashMap$ValueIterator.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentHashMap$Values.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentHashMap$WriteThroughEntry.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentHashMap.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentHashMap.java+1522−0

This diff is large: its 1523 lines aren’t shown here.

java/pkg/java/util/concurrent/ConcurrentLinkedDeque$1.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentLinkedDeque$AbstractItr.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentLinkedDeque$DescendingItr.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentLinkedDeque$Itr.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentLinkedDeque$Node.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentLinkedDeque.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentLinkedDeque.java+1469−0

This diff is large: its 1470 lines aren’t shown here.

java/pkg/java/util/concurrent/ConcurrentLinkedQueue$Itr.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentLinkedQueue$Node.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentLinkedQueue.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentLinkedQueue.java+835−0

This diff is large: its 836 lines aren’t shown here.

java/pkg/java/util/concurrent/ConcurrentMap.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentMap.java+165−0

This diff is large: its 166 lines aren’t shown here.

java/pkg/java/util/concurrent/ConcurrentNavigableMap.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentNavigableMap.java+177−0

This diff is large: its 178 lines aren’t shown here.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$ComparableUsingComparator.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$EntryIterator.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$EntrySet.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$HeadIndex.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$Index.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$Iter.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$KeyIterator.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$KeySet.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$Node.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$SubMap$SubMapEntryIterator.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$SubMap$SubMapIter.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$SubMap$SubMapKeyIterator.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$SubMap$SubMapValueIterator.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$SubMap.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$ValueIterator.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap$Values.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListMap.java+3119−0

This diff is large: its 3120 lines aren’t shown here.

java/pkg/java/util/concurrent/ConcurrentSkipListSet.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ConcurrentSkipListSet.java+491−0

This diff is large: its 492 lines aren’t shown here.

java/pkg/java/util/concurrent/CopyOnWriteArrayList$1.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/CopyOnWriteArrayList$COWIterator.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/CopyOnWriteArrayList$COWSubList.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/CopyOnWriteArrayList$COWSubListIterator.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/CopyOnWriteArrayList.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/CopyOnWriteArrayList.java+1340−0

This diff is large: its 1341 lines aren’t shown here.

java/pkg/java/util/concurrent/CopyOnWriteArraySet.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/CopyOnWriteArraySet.java+392−0

This diff is large: its 393 lines aren’t shown here.

java/pkg/java/util/concurrent/CountDownLatch$Sync.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/CountDownLatch.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/CountDownLatch.java+320−0

This diff is large: its 321 lines aren’t shown here.

java/pkg/java/util/concurrent/CyclicBarrier$1.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/CyclicBarrier$Generation.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/CyclicBarrier.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/CyclicBarrier.java+483−0

This diff is large: its 484 lines aren’t shown here.

java/pkg/java/util/concurrent/DelayQueue$Itr.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/DelayQueue.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/DelayQueue.java+546−0

This diff is large: its 547 lines aren’t shown here.

java/pkg/java/util/concurrent/Delayed.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Delayed.java+62−0

This diff is large: its 63 lines aren’t shown here.

java/pkg/java/util/concurrent/Exchanger$1.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Exchanger$Node.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Exchanger$Slot.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Exchanger.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Exchanger.java+687−0

This diff is large: its 688 lines aren’t shown here.

java/pkg/java/util/concurrent/ExecutionException.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ExecutionException.java+94−0

This diff is large: its 95 lines aren’t shown here.

java/pkg/java/util/concurrent/Executor.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executor.java+141−0

This diff is large: its 142 lines aren’t shown here.

java/pkg/java/util/concurrent/ExecutorCompletionService$QueueingFuture.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ExecutorCompletionService.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ExecutorCompletionService.java+205−0

This diff is large: its 206 lines aren’t shown here.

java/pkg/java/util/concurrent/ExecutorService.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ExecutorService.java+370−0

This diff is large: its 371 lines aren’t shown here.

java/pkg/java/util/concurrent/Executors$1.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executors$2.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executors$DefaultThreadFactory.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executors$DelegatedExecutorService.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executors$DelegatedScheduledExecutorService.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executors$FinalizableDelegatedExecutorService.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executors$PrivilegedCallable$1.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executors$PrivilegedCallable.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executors$PrivilegedCallableUsingCurrentClassLoader$1.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executors$PrivilegedCallableUsingCurrentClassLoader.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executors$PrivilegedThreadFactory$1$1.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executors$PrivilegedThreadFactory$1.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executors$PrivilegedThreadFactory.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executors$RunnableAdapter.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executors.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Executors.java+706−0

This diff is large: its 707 lines aren’t shown here.

java/pkg/java/util/concurrent/ForkJoinPool$DefaultForkJoinWorkerThreadFactory.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ForkJoinPool$InvokeAll.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ForkJoinPool$ManagedBlocker.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ForkJoinPool.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ForkJoinPool.java+2177−0

This diff is large: its 2178 lines aren’t shown here.

java/pkg/java/util/concurrent/ForkJoinTask$AdaptedCallable.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ForkJoinTask$AdaptedRunnable.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ForkJoinTask$ExceptionNode.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ForkJoinTask.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ForkJoinTask.java+1386−0

This diff is large: its 1387 lines aren’t shown here.

java/pkg/java/util/concurrent/ForkJoinWorkerThread.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ForkJoinWorkerThread.java+998−0

This diff is large: its 999 lines aren’t shown here.

java/pkg/java/util/concurrent/Future.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Future.java+169−0

This diff is large: its 170 lines aren’t shown here.

java/pkg/java/util/concurrent/FutureTask$Sync.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/FutureTask.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/FutureTask.java+360−0

This diff is large: its 361 lines aren’t shown here.

java/pkg/java/util/concurrent/LinkedBlockingDeque$1.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/LinkedBlockingDeque$AbstractItr.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/LinkedBlockingDeque$DescendingItr.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/LinkedBlockingDeque$Itr.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/LinkedBlockingDeque$Node.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/LinkedBlockingDeque.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/LinkedBlockingDeque.java+1198−0

This diff is large: its 1199 lines aren’t shown here.

java/pkg/java/util/concurrent/LinkedBlockingQueue$Itr.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/LinkedBlockingQueue$Node.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/LinkedBlockingQueue.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/LinkedBlockingQueue.java+910−0

This diff is large: its 911 lines aren’t shown here.

java/pkg/java/util/concurrent/LinkedTransferQueue$Itr.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/LinkedTransferQueue$Node.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/LinkedTransferQueue.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/LinkedTransferQueue.java+1351−0

This diff is large: its 1352 lines aren’t shown here.

java/pkg/java/util/concurrent/Phaser$QNode.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Phaser.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Phaser.java+1152−0

This diff is large: its 1153 lines aren’t shown here.

java/pkg/java/util/concurrent/PriorityBlockingQueue$Itr.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/PriorityBlockingQueue.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/PriorityBlockingQueue.java+978−0

This diff is large: its 979 lines aren’t shown here.

java/pkg/java/util/concurrent/RecursiveAction.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/RecursiveAction.java+181−0

This diff is large: its 182 lines aren’t shown here.

java/pkg/java/util/concurrent/RecursiveTask.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/RecursiveTask.java+97−0

This diff is large: its 98 lines aren’t shown here.

java/pkg/java/util/concurrent/RejectedExecutionException.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/RejectedExecutionException.java+91−0

This diff is large: its 92 lines aren’t shown here.

java/pkg/java/util/concurrent/RejectedExecutionHandler.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/RejectedExecutionHandler.java+62−0

This diff is large: its 63 lines aren’t shown here.

java/pkg/java/util/concurrent/RunnableFuture.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/RunnableFuture.java+54−0

This diff is large: its 55 lines aren’t shown here.

java/pkg/java/util/concurrent/RunnableScheduledFuture.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/RunnableScheduledFuture.java+58−0

This diff is large: its 59 lines aren’t shown here.

java/pkg/java/util/concurrent/ScheduledExecutorService.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ScheduledExecutorService.java+187−0

This diff is large: its 188 lines aren’t shown here.

java/pkg/java/util/concurrent/ScheduledFuture.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ScheduledFuture.java+48−0

This diff is large: its 49 lines aren’t shown here.

java/pkg/java/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue$Itr.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ScheduledThreadPoolExecutor.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ScheduledThreadPoolExecutor.java+1277−0

This diff is large: its 1278 lines aren’t shown here.

java/pkg/java/util/concurrent/Semaphore$FairSync.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Semaphore$NonfairSync.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Semaphore$Sync.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Semaphore.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/Semaphore.java+713−0

This diff is large: its 714 lines aren’t shown here.

java/pkg/java/util/concurrent/SynchronousQueue$FifoWaitQueue.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/SynchronousQueue$LifoWaitQueue.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/SynchronousQueue$TransferQueue$QNode.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/SynchronousQueue$TransferQueue.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/SynchronousQueue$TransferStack$SNode.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/SynchronousQueue$TransferStack.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/SynchronousQueue$Transferer.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/SynchronousQueue$WaitQueue.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/SynchronousQueue.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/SynchronousQueue.java+1196−0

This diff is large: its 1197 lines aren’t shown here.

java/pkg/java/util/concurrent/ThreadFactory.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ThreadFactory.java+70−0

This diff is large: its 71 lines aren’t shown here.

java/pkg/java/util/concurrent/ThreadLocalRandom$1.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ThreadLocalRandom.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ThreadLocalRandom.java+226−0

This diff is large: its 227 lines aren’t shown here.

java/pkg/java/util/concurrent/ThreadPoolExecutor$AbortPolicy.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ThreadPoolExecutor$CallerRunsPolicy.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ThreadPoolExecutor$DiscardOldestPolicy.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ThreadPoolExecutor$DiscardPolicy.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ThreadPoolExecutor$Worker.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ThreadPoolExecutor.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/ThreadPoolExecutor.java+2054−0

This diff is large: its 2055 lines aren’t shown here.

java/pkg/java/util/concurrent/TimeUnit$1.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/TimeUnit$2.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/TimeUnit$3.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/TimeUnit$4.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/TimeUnit$5.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/TimeUnit$6.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/TimeUnit$7.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/TimeUnit.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/TimeUnit.java+364−0

This diff is large: its 365 lines aren’t shown here.

java/pkg/java/util/concurrent/TimeoutException.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/TimeoutException.java+67−0

This diff is large: its 68 lines aren’t shown here.

java/pkg/java/util/concurrent/TransferQueue.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/TransferQueue.java+161−0

This diff is large: its 162 lines aren’t shown here.

java/pkg/java/util/concurrent/atomic/AtomicBoolean.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicBoolean.java+164−0

This diff is large: its 165 lines aren’t shown here.

java/pkg/java/util/concurrent/atomic/AtomicInteger.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicInteger.java+265−0

This diff is large: its 266 lines aren’t shown here.

java/pkg/java/util/concurrent/atomic/AtomicIntegerArray.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicIntegerArray.java+284−0

This diff is large: its 285 lines aren’t shown here.

java/pkg/java/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicIntegerFieldUpdater.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicIntegerFieldUpdater.java+346−0

This diff is large: its 347 lines aren’t shown here.

java/pkg/java/util/concurrent/atomic/AtomicLong.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicLong.java+279−0

This diff is large: its 280 lines aren’t shown here.

java/pkg/java/util/concurrent/atomic/AtomicLongArray.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicLongArray.java+284−0

This diff is large: its 285 lines aren’t shown here.

java/pkg/java/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicLongFieldUpdater$LockedUpdater.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicLongFieldUpdater.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicLongFieldUpdater.java+436−0

This diff is large: its 437 lines aren’t shown here.

java/pkg/java/util/concurrent/atomic/AtomicMarkableReference$Pair.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicMarkableReference.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicMarkableReference.java+212−0

This diff is large: its 213 lines aren’t shown here.

java/pkg/java/util/concurrent/atomic/AtomicReference.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicReference.java+155−0

This diff is large: its 156 lines aren’t shown here.

java/pkg/java/util/concurrent/atomic/AtomicReferenceArray.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicReferenceArray.java+213−0

This diff is large: its 214 lines aren’t shown here.

java/pkg/java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java+304−0

This diff is large: its 305 lines aren’t shown here.

java/pkg/java/util/concurrent/atomic/AtomicStampedReference$Pair.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicStampedReference.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/atomic/AtomicStampedReference.java+213−0

This diff is large: its 214 lines aren’t shown here.

java/pkg/java/util/concurrent/atomic/mkfile+20−0

This diff is large: its 21 lines aren’t shown here.

java/pkg/java/util/concurrent/atomic/package-info.java+199−0

This diff is large: its 200 lines aren’t shown here.

java/pkg/java/util/concurrent/locks/AbstractOwnableSynchronizer.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/AbstractOwnableSynchronizer.java+86−0

This diff is large: its 87 lines aren’t shown here.

java/pkg/java/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/AbstractQueuedLongSynchronizer$Node.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java+2109−0

This diff is large: its 2110 lines aren’t shown here.

java/pkg/java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/AbstractQueuedSynchronizer$Node.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/AbstractQueuedSynchronizer.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/AbstractQueuedSynchronizer.java+2330−0

This diff is large: its 2331 lines aren’t shown here.

java/pkg/java/util/concurrent/locks/Condition.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/Condition.java+488−0

This diff is large: its 489 lines aren’t shown here.

java/pkg/java/util/concurrent/locks/Lock.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/Lock.java+356−0

This diff is large: its 357 lines aren’t shown here.

java/pkg/java/util/concurrent/locks/LockSupport.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/LockSupport.java+385−0

This diff is large: its 386 lines aren’t shown here.

java/pkg/java/util/concurrent/locks/ReadWriteLock.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/ReadWriteLock.java+133−0

This diff is large: its 134 lines aren’t shown here.

java/pkg/java/util/concurrent/locks/ReentrantLock$FairSync.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/ReentrantLock$NonfairSync.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/ReentrantLock$Sync.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/ReentrantLock.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/ReentrantLock.java+770−0

This diff is large: its 771 lines aren’t shown here.

java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock$FairSync.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock$ReadLock.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock$Sync$HoldCounter.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock$Sync.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock$WriteLock.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock.class+0−0

Binary file not shown.

java/pkg/java/util/concurrent/locks/ReentrantReadWriteLock.java+1486−0

This diff is large: its 1487 lines aren’t shown here.

java/pkg/java/util/concurrent/locks/mkfile+17−0

This diff is large: its 18 lines aren’t shown here.

java/pkg/java/util/concurrent/locks/package-info.java+79−0

This diff is large: its 80 lines aren’t shown here.

java/pkg/java/util/concurrent/mkfile+67−0

This diff is large: its 68 lines aren’t shown here.

java/pkg/java/util/concurrent/package-info.java+300−0

This diff is large: its 301 lines aren’t shown here.

java/pkg/java/util/jar/Attributes$Name.class+0−0

Binary file not shown.

java/pkg/java/util/jar/Attributes.class+0−0

Binary file not shown.

java/pkg/java/util/jar/Attributes.java+663−0

This diff is large: its 664 lines aren’t shown here.

java/pkg/java/util/jar/JarEntry.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarEntry.java+128−0

This diff is large: its 129 lines aren’t shown here.

java/pkg/java/util/jar/JarException.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarException.java+52−0

This diff is large: its 53 lines aren’t shown here.

java/pkg/java/util/jar/JarFile$1.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarFile$2.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarFile$3.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarFile$4.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarFile$JarFileEntry.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarFile.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarFile.java+736−0

This diff is large: its 737 lines aren’t shown here.

java/pkg/java/util/jar/JarInputStream.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarInputStream.java+233−0

This diff is large: its 234 lines aren’t shown here.

java/pkg/java/util/jar/JarOutputStream.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarOutputStream.java+149−0

This diff is large: its 150 lines aren’t shown here.

java/pkg/java/util/jar/JarVerifier$1.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarVerifier$2.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarVerifier$3.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarVerifier$4.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarVerifier$VerifierCodeSource.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarVerifier$VerifierStream.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarVerifier.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JarVerifier.java+882−0

This diff is large: its 883 lines aren’t shown here.

java/pkg/java/util/jar/JavaUtilJarAccessImpl.class+0−0

Binary file not shown.

java/pkg/java/util/jar/JavaUtilJarAccessImpl.java+63−0

This diff is large: its 64 lines aren’t shown here.

java/pkg/java/util/jar/Manifest$FastInputStream.class+0−0

Binary file not shown.

java/pkg/java/util/jar/Manifest.class+0−0

Binary file not shown.

java/pkg/java/util/jar/Manifest.java+445−0

This diff is large: its 446 lines aren’t shown here.

java/pkg/java/util/jar/Pack200$Packer.class+0−0

Binary file not shown.

java/pkg/java/util/jar/Pack200$Unpacker.class+0−0

Binary file not shown.

java/pkg/java/util/jar/Pack200.class+0−0

Binary file not shown.

java/pkg/java/util/jar/Pack200.java+764−0

This diff is large: its 765 lines aren’t shown here.

java/pkg/java/util/jar/mkfile+17−0

This diff is large: its 18 lines aren’t shown here.

java/pkg/java/util/jar/package.html+63−0

This diff is large: its 64 lines aren’t shown here.

java/pkg/java/util/logging/ConsoleHandler.class+0−0

Binary file not shown.

java/pkg/java/util/logging/ConsoleHandler.java+117−0

This diff is large: its 118 lines aren’t shown here.

java/pkg/java/util/logging/ErrorManager.class+0−0

Binary file not shown.

java/pkg/java/util/logging/ErrorManager.java+99−0

This diff is large: its 100 lines aren’t shown here.

java/pkg/java/util/logging/FileHandler$1.class+0−0

Binary file not shown.

java/pkg/java/util/logging/FileHandler$InitializationErrorManager.class+0−0

Binary file not shown.

java/pkg/java/util/logging/FileHandler$MeteredStream.class+0−0

Binary file not shown.

java/pkg/java/util/logging/FileHandler.class+0−0

Binary file not shown.

java/pkg/java/util/logging/FileHandler.java+628−0

This diff is large: its 629 lines aren’t shown here.

java/pkg/java/util/logging/Filter.class+0−0

Binary file not shown.

java/pkg/java/util/logging/Filter.java+50−0

This diff is large: its 51 lines aren’t shown here.

java/pkg/java/util/logging/Formatter.class+0−0

Binary file not shown.

java/pkg/java/util/logging/Formatter.java+147−0

This diff is large: its 148 lines aren’t shown here.

java/pkg/java/util/logging/Handler.class+0−0

Binary file not shown.

java/pkg/java/util/logging/Handler.java+304−0

This diff is large: its 305 lines aren’t shown here.

java/pkg/java/util/logging/Level.class+0−0

Binary file not shown.

java/pkg/java/util/logging/Level.java+378−0

This diff is large: its 379 lines aren’t shown here.

java/pkg/java/util/logging/LogManager$1.class+0−0

Binary file not shown.

java/pkg/java/util/logging/LogManager$2.class+0−0

Binary file not shown.

java/pkg/java/util/logging/LogManager$3.class+0−0

Binary file not shown.

java/pkg/java/util/logging/LogManager$4.class+0−0

Binary file not shown.

java/pkg/java/util/logging/LogManager$5.class+0−0

Binary file not shown.

java/pkg/java/util/logging/LogManager$Cleaner.class+0−0

Binary file not shown.

java/pkg/java/util/logging/LogManager$LogNode.class+0−0

Binary file not shown.

java/pkg/java/util/logging/LogManager$LoggerWeakRef.class+0−0

Binary file not shown.

java/pkg/java/util/logging/LogManager$RootLogger.class+0−0

Binary file not shown.

java/pkg/java/util/logging/LogManager.class+0−0

Binary file not shown.

java/pkg/java/util/logging/LogManager.java+1225−0

This diff is large: its 1226 lines aren’t shown here.

java/pkg/java/util/logging/LogRecord.class+0−0

Binary file not shown.

java/pkg/java/util/logging/LogRecord.java+566−0

This diff is large: its 567 lines aren’t shown here.

java/pkg/java/util/logging/Logger.class+0−0

Binary file not shown.

java/pkg/java/util/logging/Logger.java+1530−0

This diff is large: its 1531 lines aren’t shown here.

java/pkg/java/util/logging/Logging.class+0−0

Binary file not shown.

java/pkg/java/util/logging/Logging.java+117−0

This diff is large: its 118 lines aren’t shown here.

java/pkg/java/util/logging/LoggingMXBean.class+0−0

Binary file not shown.

java/pkg/java/util/logging/LoggingMXBean.java+139−0

This diff is large: its 140 lines aren’t shown here.

java/pkg/java/util/logging/LoggingPermission.class+0−0

Binary file not shown.

java/pkg/java/util/logging/LoggingPermission.java+78−0

This diff is large: its 79 lines aren’t shown here.

java/pkg/java/util/logging/LoggingProxyImpl.class+0−0

Binary file not shown.

java/pkg/java/util/logging/LoggingProxyImpl.java+107−0

This diff is large: its 108 lines aren’t shown here.

java/pkg/java/util/logging/MemoryHandler.class+0−0

Binary file not shown.

java/pkg/java/util/logging/MemoryHandler.java+270−0

This diff is large: its 271 lines aren’t shown here.

java/pkg/java/util/logging/SimpleFormatter.class+0−0

Binary file not shown.

java/pkg/java/util/logging/SimpleFormatter.java+169−0

This diff is large: its 170 lines aren’t shown here.

java/pkg/java/util/logging/SocketHandler.class+0−0

Binary file not shown.

java/pkg/java/util/logging/SocketHandler.java+191−0

This diff is large: its 192 lines aren’t shown here.

java/pkg/java/util/logging/StreamHandler.class+0−0

Binary file not shown.

java/pkg/java/util/logging/StreamHandler.java+286−0

This diff is large: its 287 lines aren’t shown here.

java/pkg/java/util/logging/XMLFormatter.class+0−0

Binary file not shown.

java/pkg/java/util/logging/XMLFormatter.java+268−0

This diff is large: its 269 lines aren’t shown here.

java/pkg/java/util/logging/mkfile+26−0

This diff is large: its 27 lines aren’t shown here.

java/pkg/java/util/logging/package.html+134−0

This diff is large: its 135 lines aren’t shown here.

java/pkg/java/util/mkfile+117−0

This diff is large: its 118 lines aren’t shown here.

java/pkg/java/util/package.html+55−0

This diff is large: its 56 lines aren’t shown here.

java/pkg/java/util/prefs/AbstractPreferences$1.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/AbstractPreferences$EventDispatchThread.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/AbstractPreferences$NodeAddedEvent.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/AbstractPreferences$NodeRemovedEvent.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/AbstractPreferences.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/AbstractPreferences.java+1613−0

This diff is large: its 1614 lines aren’t shown here.

java/pkg/java/util/prefs/BackingStoreException.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/BackingStoreException.java+58−0

This diff is large: its 59 lines aren’t shown here.

java/pkg/java/util/prefs/Base64.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/Base64.java+261−0

This diff is large: its 262 lines aren’t shown here.

java/pkg/java/util/prefs/InvalidPreferencesFormatException.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/InvalidPreferencesFormatException.java+77−0

This diff is large: its 78 lines aren’t shown here.

java/pkg/java/util/prefs/NodeChangeEvent.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/NodeChangeEvent.java+104−0

This diff is large: its 105 lines aren’t shown here.

java/pkg/java/util/prefs/NodeChangeListener.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/NodeChangeListener.java+54−0

This diff is large: its 55 lines aren’t shown here.

java/pkg/java/util/prefs/PreferenceChangeEvent.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/PreferenceChangeEvent.java+125−0

This diff is large: its 126 lines aren’t shown here.

java/pkg/java/util/prefs/PreferenceChangeListener.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/PreferenceChangeListener.java+46−0

This diff is large: its 47 lines aren’t shown here.

java/pkg/java/util/prefs/Preferences$1.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/Preferences$2.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/Preferences.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/Preferences.java+1256−0

This diff is large: its 1257 lines aren’t shown here.

java/pkg/java/util/prefs/PreferencesFactory.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/PreferencesFactory.java+57−0

This diff is large: its 58 lines aren’t shown here.

java/pkg/java/util/prefs/XmlSupport$1.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/XmlSupport$EH.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/XmlSupport$Resolver.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/XmlSupport.class+0−0

Binary file not shown.

java/pkg/java/util/prefs/XmlSupport.java+421−0

This diff is large: its 422 lines aren’t shown here.

java/pkg/java/util/prefs/mkfile+18−0

This diff is large: its 19 lines aren’t shown here.

java/pkg/java/util/prefs/package.html+44−0

This diff is large: its 45 lines aren’t shown here.

java/pkg/java/util/regex/ASCII.class+0−0

Binary file not shown.

java/pkg/java/util/regex/ASCII.java+274−0

This diff is large: its 275 lines aren’t shown here.

java/pkg/java/util/regex/MatchResult.class+0−0

Binary file not shown.

java/pkg/java/util/regex/MatchResult.java+188−0

This diff is large: its 189 lines aren’t shown here.

java/pkg/java/util/regex/Matcher.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Matcher.java+1256−0

This diff is large: its 1257 lines aren’t shown here.

java/pkg/java/util/regex/Pattern$1.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$2.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$3.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$4.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$5.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$6.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$7.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$All.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$BackRef.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Begin.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Behind.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$BehindS.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$BitClass.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Block.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$BmpCharProperty.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$BnM.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$BnMS.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Bound.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Branch.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$BranchConn.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CIBackRef.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Caret.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Category.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharProperty$1.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharProperty.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$1.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$10.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$11.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$12.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$13.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$14.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$15.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$16.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$17.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$18.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$19.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$2.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$20.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$21.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$22.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$23.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$3.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$4.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$5.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$6.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$7.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$8.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$9.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$CharPropertyFactory.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames$CloneableProperty.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$CharPropertyNames.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Conditional.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Ctype.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Curly.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Dollar.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Dot.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$End.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$First.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$GroupCurly.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$GroupHead.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$GroupRef.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$GroupTail.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$LastMatch.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$LastNode.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$LazyLoop.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Loop.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Neg.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Node.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$NotBehind.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$NotBehindS.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Pos.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Prolog.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Ques.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Script.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Single.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$SingleI.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$SingleS.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$SingleU.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Slice.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$SliceI.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$SliceIS.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$SliceNode.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$SliceS.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$SliceU.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$SliceUS.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Start.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$StartS.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$TreeInfo.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$UnixCaret.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$UnixDollar.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$UnixDot.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern$Utype.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern.class+0−0

Binary file not shown.

java/pkg/java/util/regex/Pattern.java+5648−0

This diff is large: its 5649 lines aren’t shown here.

java/pkg/java/util/regex/PatternSyntaxException.class+0−0

Binary file not shown.

java/pkg/java/util/regex/PatternSyntaxException.java+124−0

This diff is large: its 125 lines aren’t shown here.

java/pkg/java/util/regex/UnicodeProp$1.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$10.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$11.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$12.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$13.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$14.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$15.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$16.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$17.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$18.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$2.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$3.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$4.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$5.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$6.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$7.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$8.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp$9.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp.class+0−0

Binary file not shown.

java/pkg/java/util/regex/UnicodeProp.java+236−0

This diff is large: its 237 lines aren’t shown here.

java/pkg/java/util/regex/mkfile+13−0

This diff is large: its 14 lines aren’t shown here.

java/pkg/java/util/regex/package.html+66−0

This diff is large: its 67 lines aren’t shown here.

java/pkg/java/util/spi/CurrencyNameProvider.class+0−0

Binary file not shown.

java/pkg/java/util/spi/CurrencyNameProvider.java+119−0

This diff is large: its 120 lines aren’t shown here.

java/pkg/java/util/spi/LocaleNameProvider.class+0−0

Binary file not shown.

java/pkg/java/util/spi/LocaleNameProvider.java+144−0

This diff is large: its 145 lines aren’t shown here.

java/pkg/java/util/spi/LocaleServiceProvider.class+0−0

Binary file not shown.

java/pkg/java/util/spi/LocaleServiceProvider.java+138−0

This diff is large: its 139 lines aren’t shown here.

java/pkg/java/util/spi/TimeZoneNameProvider.class+0−0

Binary file not shown.

java/pkg/java/util/spi/TimeZoneNameProvider.java+80−0

This diff is large: its 81 lines aren’t shown here.

java/pkg/java/util/spi/mkfile+11−0

This diff is large: its 12 lines aren’t shown here.

java/pkg/java/util/spi/package.html+50−0

This diff is large: its 51 lines aren’t shown here.

java/pkg/java/util/zip/Adler32.class+0−0

Binary file not shown.

java/pkg/java/util/zip/Adler32.java+95−0

This diff is large: its 96 lines aren’t shown here.

java/pkg/java/util/zip/CRC32.class+0−0

Binary file not shown.

java/pkg/java/util/zip/CRC32.java+93−0

This diff is large: its 94 lines aren’t shown here.

java/pkg/java/util/zip/CheckedInputStream.class+0−0

Binary file not shown.

java/pkg/java/util/zip/CheckedInputStream.java+116−0

This diff is large: its 117 lines aren’t shown here.

java/pkg/java/util/zip/CheckedOutputStream.class+0−0

Binary file not shown.

java/pkg/java/util/zip/CheckedOutputStream.java+84−0

This diff is large: its 85 lines aren’t shown here.

java/pkg/java/util/zip/Checksum.class+0−0

Binary file not shown.

java/pkg/java/util/zip/Checksum.java+60−0

This diff is large: its 61 lines aren’t shown here.

java/pkg/java/util/zip/DataFormatException.class+0−0

Binary file not shown.

java/pkg/java/util/zip/DataFormatException.java+52−0

This diff is large: its 53 lines aren’t shown here.

java/pkg/java/util/zip/Deflater.class+0−0

Binary file not shown.

java/pkg/java/util/zip/Deflater.java+550−0

This diff is large: its 551 lines aren’t shown here.

java/pkg/java/util/zip/DeflaterInputStream.class+0−0

Binary file not shown.

java/pkg/java/util/zip/DeflaterInputStream.java+294−0

This diff is large: its 295 lines aren’t shown here.

java/pkg/java/util/zip/DeflaterOutputStream.class+0−0

Binary file not shown.

java/pkg/java/util/zip/DeflaterOutputStream.java+284−0

This diff is large: its 285 lines aren’t shown here.

java/pkg/java/util/zip/GZIPInputStream.class+0−0

Binary file not shown.

java/pkg/java/util/zip/GZIPInputStream.java+289−0

This diff is large: its 290 lines aren’t shown here.

java/pkg/java/util/zip/GZIPOutputStream.class+0−0

Binary file not shown.

java/pkg/java/util/zip/GZIPOutputStream.java+223−0

This diff is large: its 224 lines aren’t shown here.

java/pkg/java/util/zip/Inflater.class+0−0

Binary file not shown.

java/pkg/java/util/zip/Inflater.java+402−0

This diff is large: its 403 lines aren’t shown here.

java/pkg/java/util/zip/InflaterInputStream.class+0−0

Binary file not shown.

java/pkg/java/util/zip/InflaterInputStream.java+288−0

This diff is large: its 289 lines aren’t shown here.

java/pkg/java/util/zip/InflaterOutputStream.class+0−0

Binary file not shown.

java/pkg/java/util/zip/InflaterOutputStream.java+276−0

This diff is large: its 277 lines aren’t shown here.

java/pkg/java/util/zip/ZStreamRef.class+0−0

Binary file not shown.

java/pkg/java/util/zip/ZStreamRef.java+46−0

This diff is large: its 47 lines aren’t shown here.

java/pkg/java/util/zip/ZipCoder.class+0−0

Binary file not shown.

java/pkg/java/util/zip/ZipCoder.java+159−0

This diff is large: its 160 lines aren’t shown here.

java/pkg/java/util/zip/ZipConstants.class+0−0

Binary file not shown.

java/pkg/java/util/zip/ZipConstants.java+98−0

This diff is large: its 99 lines aren’t shown here.

java/pkg/java/util/zip/ZipConstants64.class+0−0

Binary file not shown.

java/pkg/java/util/zip/ZipConstants64.java+84−0

This diff is large: its 85 lines aren’t shown here.

java/pkg/java/util/zip/ZipEntry.class+0−0

Binary file not shown.

java/pkg/java/util/zip/ZipEntry.java+327−0

This diff is large: its 328 lines aren’t shown here.

java/pkg/java/util/zip/ZipError.class+0−0

Binary file not shown.

java/pkg/java/util/zip/ZipError.java+44−0

This diff is large: its 45 lines aren’t shown here.

java/pkg/java/util/zip/ZipException.class+0−0

Binary file not shown.

java/pkg/java/util/zip/ZipException.java+60−0

This diff is large: its 61 lines aren’t shown here.

java/pkg/java/util/zip/ZipFile$1.class+0−0

Binary file not shown.

java/pkg/java/util/zip/ZipFile$ZipFileInflaterInputStream.class+0−0

Binary file not shown.

java/pkg/java/util/zip/ZipFile$ZipFileInputStream.class+0−0

Binary file not shown.

java/pkg/java/util/zip/ZipFile.class+0−0

Binary file not shown.

java/pkg/java/util/zip/ZipFile.java+762−0

This diff is large: its 763 lines aren’t shown here.

java/pkg/java/util/zip/ZipInputStream.class+0−0

Binary file not shown.

java/pkg/java/util/zip/ZipInputStream.java+456−0

This diff is large: its 457 lines aren’t shown here.

java/pkg/java/util/zip/ZipOutputStream$XEntry.class+0−0

Binary file not shown.

java/pkg/java/util/zip/ZipOutputStream.class+0−0

Binary file not shown.

java/pkg/java/util/zip/ZipOutputStream.java+620−0

This diff is large: its 621 lines aren’t shown here.

java/pkg/java/util/zip/mkfile+31−0

This diff is large: its 32 lines aren’t shown here.

java/pkg/java/util/zip/package.html+98−0

This diff is large: its 99 lines aren’t shown here.