当前位置: 首页 > news >正文

大鹏网站建设建站好不好免费网站源码

大鹏网站建设建站好不好,免费网站源码,无极,挪车网站开发第九章#xff1a;Java集合 9.1#xff1a;Java集合框架概述 数组、集合都是对多个数据进行存储(内存层面#xff0c;不涉及持久化)操作的结构#xff0c;简称Java容器。 数组存储多个数据方面的特点 一旦初始化以后#xff0c;其长度就确定了。数组一旦定义好#xff…第九章Java集合 9.1Java集合框架概述 数组、集合都是对多个数据进行存储(内存层面不涉及持久化)操作的结构简称Java容器。 数组存储多个数据方面的特点 一旦初始化以后其长度就确定了。数组一旦定义好其元素的类型也就确定了。我们也就只能操作指定类型的数据了。 数组在存储多个数据方面的缺点 一旦初始化以后其长度就不可修改。数组中提供的方法非常有限对于添加、删除、插入数据等操作非常不便同时效率不搞。获取数据中实际元素的个数的需求数组没有现成的属性或方法可用。数组存储数据的特点有序、可重复。对于无序、不可重复的需求不能满足。 Java集合可分为Collection和Map两种体系 Collection接口单列数据定义了存储一组对象的方法的集合。 List元素有序可重复的集合。Set元素无序不可重复的集合。 Map接口双列数据保存具有映射关系key - value对的集合。 9.2Collection接口方法 add(Object obj)将元素obj添加到集合中。 addAll(Collection coll)将coll集合中的元素添加到当前的集合中。 int size()获取添加的元素的个数。 void clear()清空集合元素。 isEmpty()判断当前集合是否为空。 Collection coll new ArrayList();coll.add(AA); coll.add(BB); coll.add(123);//自动装箱 coll.add(new Date());System.out.println(coll.size());//4Collection coll1 new ArrayList(); coll1.add(456); coll1.add(CC); coll.addAll(coll1);System.out.println(coll.size());//6coll.clear();System.out.println(coll.isEmpty());// trueboolean contains(Object obj)判断当前集合是否包含obj。 boolean containsAll(Collection c)判断形参c中的所有元素是否都存在于当前集合中。 Collection coll new ArrayList();coll.add(123); coll.add(456); coll.add(new String(Tom)); coll.add(false);boolean contains coll.contains(123); System.out.println(contains); // true System.out.println(coll.contains(new String(Tom))); // trueCollection coll1 Arrays.asList(123,4567); System.out.println(coll.containsAll(coll1)); // false注意如果判断的对象是自定义类则需要重写equals()方法。 boolean remove(Object obj)从当前集合中移除obj元素。 boolean removeAll(Collection coll)从当前集合中移除coll中所有的元素。 Collection coll new ArrayList(); coll.add(123); coll.add(456); coll.add(new String(Tom)); coll.add(false);coll.remove(1234); System.out.println(coll); // [123, 456, Tom, false]Collection coll1 Arrays.asList(123,456); coll.removeAll(coll1); System.out.println(coll); // [Tom, false]boolean retainAll(Collection c)获取当前集合和C集合的交集并返回给当前集合。 Collection coll new ArrayList(); coll.add(123); coll.add(456); coll.add(new String(Tom)); coll.add(false);Collection coll1 Arrays.asList(123,456,789); coll.retainAll(coll1); System.out.println(coll); // [123, 456]boolean equals(Object obj)想要返回true需要当前集合和形参集合的元素的相同。 Collection coll new ArrayList(); coll.add(123); coll.add(456); coll.add(new Person(Jerry,20)); coll.add(new String(Tom)); coll.add(false);Collection coll1 new ArrayList(); coll1.add(456); coll1.add(123); coll1.add(new Person(Jerry,20)); coll1.add(new String(Tom)); coll1.add(false);System.out.println(coll.equals(coll1)); // falseObject[] toAttay()转成对象数组。 hashCode()返回对象的哈希值。 iterator()返回Iterator接口的实例用于遍历集合。 Collection coll new ArrayList(); coll.add(123); coll.add(456); coll.add(new String(Tom)); coll.add(false);System.out.println(coll.hashCode()); // -1579892151Object[] arr coll.toArray(); for(int i 0;i arr.length;i){System.out.print(arr[i] \t); // 123 456 Tom false }9.3Iterator迭代器接口 ​ Iterator对象称为迭代器(设计模式的一种)主要用于遍历Collection集合中的元素。 ​ GOF给迭代器模式的定义为提供一种方法访问一个容器(container)对象中各个元素而有不需暴露该对象的内部细节。迭代器模式就是为容器而生。 内部方法 hasNext()判断是否还有下一个元素。 next()指针下移将下移以后集合位置上的元素返回。 Collection coll new ArrayList(); coll.add(123); coll.add(456); coll.add(new String(Tom)); coll.add(false);Iterator iterator coll.iterator();while(iterator.hasNext()){System.out.print(iterator.next() \t); // 123 456 Tom false }说明 Iterator仅用于遍历集合Iterator本身并不提供承装对象的能力。如果需要创建Itertor对象则必须有一个被迭代的集合。集合对象每次调用iterator()方法到得到一个全新的迭代器对象默认游标都在集合的第一个元素之前。在调用next()方法之前必须要调用hasNext()进行检测。若不调用且下一条记录记录无效直接调用next()会抛出NoSuchElementException异常。 remove()可以在遍历的时候删除集合中的元素。此方法不同于集合直接调用remove()。 Collection coll new ArrayList(); coll.add(123); coll.add(456); coll.add(new String(Tom)); coll.add(false);Iterator iterator coll.iterator(); while(iterator.hasNext()) {Object obj iterator.next();if(Tom.equals(obj)) {iterator.remove();} }iterator coll.iterator(); while(iterator.hasNext()) {System.out.print(iterator.next() \t); // 123 456 false }说明 Iterator可以删除集合的元素但是是遍历过程中通过迭代器对象的remove方法不是集合对象的remove方法。如果还为调用next()或在上一次调用next方法之后已经调用remove方法再调用remove都会报IllegalStateException。 使用foreach循环遍历集合元素 Java 5.0提供了foreach循环迭代访问Collection和数组。遍历操作不需要获取Collection或数组的长度无需使用索引访问元素。遍历集合的底层调用Iterator完成操作。foreach还可以用来遍历数组。 Collection coll new ArrayList(); coll.add(123); coll.add(456); coll.add(new Person(Jerry, 20)); coll.add(new String(Tom)); coll.add(false); //for(集合元素的类型 局部变量 : 集合对象) for(Object obj: coll) {System.out.println(obj); }9.4List接口 ​ List集合类中元素有序且可重复集合中的每个元素都有其对应的顺序索引。JDK API中List接口的实现类常用的有ArrayList、LinkedList、Vector。 ArrayList源码分析 作为List接口的主要实现类线程不安全的效率高底层使用Object[]存储。 JDK 7情况下 // 空参构造器底层创建了长度是10的Object[]数组 public ArrayList() {this(10); }// 添加操作 public boolean add(E e) {ensureCapacityInternal(size 1);elementData[size] e;return true; } // 判断索引是否超出Object[]的长度 private void ensureCapacityInternal(int minCapacity) {modCount;if (minCapacity - elementData.length 0)grow(minCapacity); } // 超出长度进行扩容且扩容为原来容量的1.5倍同时需要将原有数组中的数据复制到新的数组中 private void grow(int minCapacity) {int oldCapacity elementData.length;int newCapacity oldCapacity (oldCapacity 1);if (newCapacity - minCapacity 0)newCapacity minCapacity;if (newCapacity - MAX_ARRAY_SIZE 0)newCapacity hugeCapacity(minCapacity);elementData Arrays.copyOf(elementData, newCapacity); }说明建议开发中使用带参的构造器ArrayList list new ArrayList(int capacity) JDK 8情况下 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA {}; // 空参构造器对Object[] 进行初始化 public ArrayList() {this.elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }// 添加操作 public boolean add(E e) {ensureCapacityInternal(size 1);elementData[size] e;return true; } // 判断是不是第一次进行添加操作 private void ensureCapacityInternal(int minCapacity) {if (elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {minCapacity Math.max(DEFAULT_CAPACITY, minCapacity);}ensureExplicitCapacity(minCapacity); } // 判断索引是否超出Object[]的长度 private void ensureExplicitCapacity(int minCapacity) {modCount;if (minCapacity - elementData.length 0)grow(minCapacity); } // 超出长度进行扩容且扩容为原来容量的1.5倍同时需要将原有数组中的数据复制到新的数组中 private void grow(int minCapacity) {int oldCapacity elementData.length;int newCapacity oldCapacity (oldCapacity 1);if (newCapacity - minCapacity 0)newCapacity minCapacity;if (newCapacity - MAX_ARRAY_SIZE 0)newCapacity hugeCapacity(minCapacity);elementData Arrays.copyOf(elementData, newCapacity); }总结jdk7中的ArrayList的对象创建类似于单例的饿汉式而jdk8中的ArrayList的对象创建类似于单例的懒汉式延迟了数组的创建节省内存。 LinkedList的源码分析 对于频繁的插入、删除操作使用此类效率比ArrayList高底层使用双向链表存储。 transient NodeE first; transient NodeE last;// Node定义体现了LinkedList的双向链表的说法 private static class NodeE {E item;NodeE next;NodeE prev;Node(NodeE prev, E element, NodeE next) {this.item element;this.next next;this.prev prev;} }Vector源码分析 作为List接口的古老实现类线程安全的效率低底层使用Object[]数组存储。 // 空参构造器底层创建了长度是10的Object[]数组 public Vector() {this(10); } // 添加操作 public synchronized boolean add(E e) {modCount;ensureCapacityHelper(elementCount 1);elementData[elementCount] e;return true; } // 判断索引是否超出Object[]的长度 private void ensureCapacityHelper(int minCapacity) {if (minCapacity - elementData.length 0)grow(minCapacity); } // 超出长度进行扩容且扩容为原来容量的2倍同时需要将原有数组中的数据复制到新的数组中 private void grow(int minCapacity) {int oldCapacity elementData.length;int newCapacity oldCapacity ((capacityIncrement 0) ?capacityIncrement : oldCapacity);if (newCapacity - minCapacity 0)newCapacity minCapacity;if (newCapacity - MAX_ARRAY_SIZE 0)newCapacity hugeCapacity(minCapacity);elementData Arrays.copyOf(elementData, newCapacity); }List接口方法 void add(int index, Object ele)在index位置插入ele元素。boolean addAll(int index, Collection eles)从index位置开始将eles中的素有元素添加进来。Object get(int index)获取指定index位置的元素。 ArrayList list new ArrayList(); list.add(123); list.add(456); list.add(AA); list.add(new Person(Tom, 12)); list.add(456); System.out.println(list); // [123, 456, AA, Person{nameTom, age12}, 456]list.add(1, BB); System.out.println(list); // [123, BB, 456, AA, Person{nameTom, age12}, 456]List list1 Arrays.asList(1, 2, 3); list.addAll(list1); System.out.println(list.size()); // 9System.out.println(list.get(0)); // 123int indexOf(Object obj)返回obj在集合中首次出现的位置集合中没有则返回-1。int lastIndexOf(Object obj)返回obj在当前集合中末次出现的位置集合中没有则返回-1。Object remove(int index)移除指定的index位置的元素并返回此元素。Object set(int index, Object ele)设置指定index位置的元素为ele。List subList(int formIndex, int toIndex)返回从fromIndex到toIndex位置的子集合。 ArrayList list new ArrayList(); list.add(123); list.add(456); list.add(AA); list.add(new Person(Tom, 12)); list.add(456);int index list.indexOf(4567); System.out.println(index); // -1System.out.println(list.lastIndexOf(456)); // 4Object obj list.remove(0); System.out.println(obj); // 123 System.out.println(list); // [456, AA, Person{nameTom, age12}, 456]list.set(1, CC); System.out.println(list); // [456, CC, Person{nameTom, age12}, 456]List subList list.subList(2, 4); System.out.println(subList); // [Person{nameTom, age12}, 456] System.out.println(list); // [456, CC, Person{nameTom, age12}, 456]9.5Set接口 ​ Set接口存储无序的、不可重复的数据。set接口没有提供额外的方法。JDK API中Set接口的实现类常用的有HashSet、LinkedHashSet、TreeSet。 ​ 无序性不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加而是根据数据的哈希值决定的。 ​ 不可重复性保证添加的元素按照equals()判断时不能返回true。即相同的元素只能添加一个。 HashSet 作为Set接口的主要实现类线程不安全的可以存储null值。 添加元素的过程 我们向HashSet中添加元素a首先调用元素a所在类的hashCode()方法计算机元素a的哈希值此哈希值接着通过某种算法计算出HashSet底层数组中的存放位置(即为索引位置)。判断数组此位置上是否已经有元素。如果此位置上没有其他元素则元素a添加成功。如果此位置上有其他元素b(或以链表形式存在的多个元素)则比较元素a与元素b的hash值。如果hash值不相同则元素a添加成功如果hash值相同进而需要调用元素a所在类的equals()方法。equals()返回true元素a添加失败。equals()返回false则元素a添加成功。 注意对于索引位置已有元素然后还添加成功的而已元素a与已经存在指定索引位置上数据以链表的方式存储。 jdk 7元素a放到数组中指向原来的元素。jdk 8原来的元素在数组中指向元素a。 LinkedHashSet ​ 作为HashSet的子类遍历其内部数据时可以按照添加的顺序遍历。在添加数据还维护了两个引用记录此数据前一个数据和后一个数据对于频繁的遍历操作LinkedHashSet效率高于HashSet。 TreeSet TreeSet底层使用红黑树结构存储数据。 向TreeSet中添加的数据要求是相同的对象。 TreeSet可以确保集合元素处于排序状态。就必须得实现Comparable或者Comparator。 在比较两个对象是否相同的标准为compareTo()或者compare()返回0不再是equals()。 9.6Map接口 ​ map与Collection并列存在。用于保存具有映射关系的数据。Map存储的是双列数据存储key-value对的数据。Map中的**key用Set来存放不允许重复**即同一个Map对象所对应的类须重写hashCode()和equals()方法。Map接口的常用实现类HashMap、TreeMap、LinkedHashMap和Properties。 HashMap 作为Map的主要实现类线程不安全效率高能存储null的key和value。 Map结构的理解 Map中的key无序的、不可重复的使用Set存储所有的key。Map中的value无序的、可重复的使用Collection存储所有的value。Map中的entrykey-value构成了一个Entry对象。无序的不可重复的使用Set存储所有的entry。 HashMap的底层实现原理 jdk 7 HashMap map new HashMap(); // 实例化以后底层创建了长度是16的一维数组Entry[] table map.put(key1, value1);首先调用key1所在类的hashCode()计算key1哈希值此哈希值经过某种算法计算以后得到在Entry数组中的存在位置。如果此位置上的数据为空此时的key1-value添加成功。如果此位置上的数据不为空比较key1和已经存在的一个或多个数据的哈希值。如果key1的哈希值与已经存在的数据的哈希值都不相同此时key1-value1添加成功。如果key1的哈希值和已经存在的某一个数据key2-value2的哈希值相同继续比较调用key1所在类类的equals(key2)方法。如果equals()返回false此时key-value添加成功。如果equals()返回true使用value1替换value2。 // HashMap的默认容量 static final int DEFAULT_INITIAL_CAPACITY 16; // HashMap的默认加载因子 static final float DEFAULT_LOAD_FACTOR 0.75f; // 扩容的临界值(容量 * 加载因子) final float loadFactor;// 空参构造器 public HashMap() {this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR); } // 初始化数组 public HashMap(int initialCapacity, float loadFactor) {// 不执行此处3个ifif (initialCapacity 0) // 最大容量是不是小于0throw new IllegalArgumentException(Illegal initial capacity: initialCapacity);if (initialCapacity MAXIMUM_CAPACITY) // 最大容量是不是超出范围initialCapacity MAXIMUM_CAPACITY;if (loadFactor 0 || Float.isNaN(loadFactor)) // 扩容临界值是不是小于0或者没有初始化throw new IllegalArgumentException(Illegal load factor: loadFactor);int capacity 1;// capacity循环完为16while (capacity initialCapacity)capacity 1;// this.loadFactor 0.75this.loadFactor loadFactor;// threshold 12threshold (int)Math.min(capacity * loadFactor, MAXIMUM_CAPACITY 1);// 初始化Entry数组的长度为16table new Entry[capacity];useAltHashing sun.misc.VM.isBooted() (capacity Holder.ALTERNATIVE_HASHING_THRESHOLD);init(); }// 添加数据方法 public V put(K key, V value) {// 判断key是否为nullif (key null)return putForNullKey(value);// 获取key的哈希值int hash hash(key);// 获取在table数组中存放的位置int i indexFor(hash, table.length);// 看table数组位置上是否有数据for (EntryK,V e table[i]; e ! null; e e.next) {Object k;// 判断哈希值是否相等如果相等判断equals是否为trueif (e.hash hash ((k e.key) key || key.equals(k))) {V oldValue e.value;e.value value;e.recordAccess(this);return oldValue;}}modCount;addEntry(hash, key, value, i);return null; } // 判断table是否需要扩容如果需要扩容则长度扩容2倍 void addEntry(int hash, K key, V value, int bucketIndex) {if ((size threshold) (null ! table[bucketIndex])) {resize(2 * table.length);hash (null ! key) ? hash(key) : 0;bucketIndex indexFor(hash, table.length);}createEntry(hash, key, value, bucketIndex); } // 把数据添加到HashMap中 void createEntry(int hash, K key, V value, int bucketIndex) {EntryK,V e table[bucketIndex];table[bucketIndex] new Entry(hash, key, value, e);size; }jdk 8 new HashMap()底层没有创建一个长度为16的数组。jdk 8底层的数组是Node[]而非Entry[]。首次调用put()方法时底层创建长度为16的数组。jdk 8中底层结构数组链表(七上八下)红黑树。当数组中的某一个索引位置上的元素以链表形式存在的数据个数 8 且当前数组的长度 64时此时此索引位置上的数据改为使用红黑树存储。 static final float DEFAULT_LOAD_FACTOR 0.75f; tatic final int DEFAULT_INITIAL_CAPACITY 1 4; // Bucket中链表长度大于该默认值转为红黑树 static final int TREEIFY_THRESHOLD 8; // 桶中的Node被数化时最小的hash表容量 static final int MIN_TREEIFY_CAPACITY 64;// 空参构造器 public HashMap() {this.loadFactor DEFAULT_LOAD_FACTOR; }// 添加数据方法 public V put(K key, V value) {return putVal(hash(key), key, value, false, true); } final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {NodeK,V[] tab; NodeK,V p; int n, i;// 判断是否为第一次添加数据if ((tab table) null || (n tab.length) 0)n (tab resize()).length;// 判断添加数据在数组的位置是否为空if ((p tab[i (n - 1) hash]) null)tab[i] newNode(hash, key, value, null);else {NodeK,V e; K k;// 判断数组不为空的位置第一个元素与添加元素哈希值是否相等如果相等判断equals是否为trueif (p.hash hash ((k p.key) key || (key ! null key.equals(k))))e p;else if (p instanceof TreeNode) // 判断数据是否为红黑树的方式存储e ((TreeNodeK,V)p).putTreeVal(this, tab, hash, key, value);else {for (int binCount 0; ; binCount) {// 判断数组不为空的位置后面是否还有元素if ((e p.next) null) {p.next newNode(hash, key, value, null);if (binCount TREEIFY_THRESHOLD - 1)// 把链表变为红黑树存储treeifyBin(tab, hash);break;}// 判断数组不为空的位置里的元素与添加元素哈希值是否相等// 如果相等判断equals是否为trueif (e.hash hash ((k e.key) key || (key ! null key.equals(k))))break;p e;}}// 看是否有元素的哈希值一样与equals方法也为trueif (e ! null) {V oldValue e.value;if (!onlyIfAbsent || oldValue null)e.value value;afterNodeAccess(e);return oldValue;}}modCount;if (size threshold)resize();afterNodeInsertion(evict);return null; } // 第一次添加数据或者扩容 final NodeK,V[] resize() {NodeK,V[] oldTab table;int oldCap (oldTab null) ? 0 : oldTab.length;int oldThr threshold;int newCap, newThr 0;// 此if执行elseif (oldCap 0) { .....} else if (oldThr 0){ .....} else {// newCap 16, newThr 12newCap DEFAULT_INITIAL_CAPACITY;newThr (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);}// 此if不执行if (newThr 0) { .... }// threshold 12threshold newThr;// 初始化table数组长度为16SuppressWarnings({rawtypes,unchecked})NodeK,V[] newTab (NodeK,V[])new Node[newCap];table newTab;// 此if不执行if (oldTab ! null) { ..... }return newTab; }final void treeifyBin(NodeK,V[] tab, int hash) {int n, index; NodeK,V e;// 链表长度大于8并且小于64if (tab null || (n tab.length) MIN_TREEIFY_CAPACITY)resize();else if ((e tab[index (n - 1) hash]) ! null) {TreeNodeK,V hd null, tl null;do {TreeNodeK,V p replacementTreeNode(e, null);if (tl null)hd p;else {p.prev tl;tl.next p;}tl p;} while ((e e.next) ! null);if ((tab[index] hd) ! null)hd.treeify(tab);} }LinkedHashMap ​ LinkedHashMap是HashMap的子类。 ​ 保证在遍历map元素时可以按照添加的顺序实现遍历。在原有的HashMap底层结构基础上添加了一对指针指向前一个和后一个元素。对于频繁的遍历操作此类执行效率高于HashMap。 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {if ((p tab[i (n - 1) hash]) null)// LinkedHashMap重写了newNode方法tab[i] newNode(hash, key, value, null);else { ... } } // 重写的newNode方法 NodeK,V newNode(int hash, K key, V value, NodeK,V e) {LinkedHashMap.EntryK,V p new LinkedHashMap.EntryK,V(hash, key, value, e);linkNodeLast(p);return p; } // LinkedHashMap中的Entry static class EntryK,V extends HashMap.NodeK,V {EntryK,V before, after;Entry(int hash, K key, V value, NodeK,V next) {super(hash, key, value, next);} }Map接口的常用方法 Object put(Object key, Object value)将指定key-value添加到(或修改)当前map对象中。void putAll(Map m)将m中的所有key-value对存放到当前map中。Object remove(Object key)移除指定key的key-value对并返回value。void clear()清空当前map中的所有数据。 Map map new HashMap(); map.put(AA, 123); map.put(45, 123); map.put(BB, 56);map.put(AA, 87); System.out.println(map); // {AA87, BB56, 45123}Map map1 new HashMap(); map1.put(CC, 123); map.put(DD, 123); map.putAll(map1); System.out.println(map); // {AA87, BB56, DD123, CC123, 45123}Object value map.remove(CC); System.out.println(value); // 123 System.out.println(map); // {AA87, BB56, DD123, 45123}map.clear(); System.out.println(map.size()); // 0 System.out.println(map); // {}Object get(Object key)获取指定key对应的value。boolean containsKey(Object key)是否包含指定的key。boolean containsValue(Object value)是否包含指定的value。int size()返回map中key-value对的个数。boolean isEmpty()判断当前map是否为空、boolean equals(Object obj)判断当前map和参数对象Object是否相等。 Map map new HashMap(); map.put(AA, 123); map.put(45, 123); map.put(BB, 56); System.out.println(map.get(45)); // 123boolean isExist map.containsKey(BB); System.out.println(isExist); // trueisExist map.containsValue(123); System.out.println(isExist); // truemap.clear(); System.out.println(map.isEmpty()); // trueSet keySet()返回所有key构成的Set集合。Collection values()返回所有value构成的Collection集合。Set entrySet()返回所有key-value对构成的Set集合。 Map map new HashMap(); map.put(AA, 123); map.put(45, 1234); map.put(BB, 56);Set set map.keySet(); Iterator iterator set.iterator(); while(iterator.hasNext()) {System.out.print(iterator.next() \t); // AA BB 45 } System.out.println();Collection values map.values(); for(Object obj: values) {System.out.print(obj \t); // 123 56 1234 } System.out.println();Set entrySet map.entrySet(); Iterator iterator1 entrySet.iterator(); while(iterator1.hasNext()) {Object obj iterator1.next();Map.Entry entry (Map.Entry) obj;System.out.print(entry.getKey() - entry.getValue() \t); // AA-123 BB-56 45-1234 } System.out.println();Set keySet map.keySet(); Iterator iterator2 keySet.iterator(); while(iterator2.hasNext()) {Object key iterator2.next();Object value map.get(key);System.out.print(key value \t); // AA123 BB56 451234 }TreeMap 保证按照添加的key-value对进行排序实现排序遍历。此时考虑key的自然排序或定制排序。 TreeSet底层使用红黑树结构存储数据。‘ TreeMap的key必须实现Comparable或者Comparator接口。 TreeMap判断两个key相等的标准两个key通过compareTo()方法或者compare()方法返回0。 Properties Properties的父类是Hashtable是古老的实现类线程安全的效率低不能存储null的key和value。 Properties常用来处理配置文件。key和value都是String类型。 Properties pros new Properties(); pros.load(new FileInputStream(jdbc.properties)); String user pros.getProperty(user); System.out.println(user);9.7Collections工具类 Collections是一个操作Set、List、Map等集合的工具类。 排序操作 reverse(List)反转List中元素的顺序。shuffle(List)对List集合元素进行随机排序。sort(List)根据元素的自然顺序对指定List集合元素按升序排序。sort(List, Comparator)根据指定的Comparator产生的顺序对List集合元素进行排序。swap(List, int, int)将指定list集合中的i处元素和j处元素进行交换。 查找、替换 Object max(Collection)根据元素的自然顺序返回给定集合中的最大元素。 Object max(Collection, Comparator)根据Comparator指定的顺序返回给定集合中的最大元素。 Object min(Collection)根据元素的自然顺序返回给定集合中的最小元素。 Object min(Collection, Comparator)根据Comparator指定的顺序返回给定集合中的最小元素。 int frequency(Collection, Object)返回指定集合中指定元素的出现次数。 void copy(List dest, List src)将src中的内容复制到dest中。 注意dest的长度要大于等于src的长度不然会报错。 boolean replaceAll(List list, Object oldVal, Object newVal)使用新值替换List对象的所有旧值。 ​ Collections类中提供了多个synchronizedXxx()方法该方法可使将指定集合包装成线程同步的集合从而可以解决多线程并发访问集合时的线程安全问题。 Enumeration Enumeration接口是Iterator迭代器的古老版本。 Enumeration stringEnum new StringTokenizer(a-b*c-d-e-g, -); while(stringEnum.hasMoreElements()){Object obj stringEnum.nextElement();System.out.print(obj \t); // a b*c d e g }
文章转载自:
http://www.morning.cjmmt.cn.gov.cn.cjmmt.cn
http://www.morning.lcjw.cn.gov.cn.lcjw.cn
http://www.morning.lmzpk.cn.gov.cn.lmzpk.cn
http://www.morning.dbrpl.cn.gov.cn.dbrpl.cn
http://www.morning.jqtb.cn.gov.cn.jqtb.cn
http://www.morning.cqyhdy.cn.gov.cn.cqyhdy.cn
http://www.morning.jrwbl.cn.gov.cn.jrwbl.cn
http://www.morning.wbfly.cn.gov.cn.wbfly.cn
http://www.morning.xsetx.com.gov.cn.xsetx.com
http://www.morning.tongweishi.cn.gov.cn.tongweishi.cn
http://www.morning.pbdnj.cn.gov.cn.pbdnj.cn
http://www.morning.qzglh.cn.gov.cn.qzglh.cn
http://www.morning.fdrb.cn.gov.cn.fdrb.cn
http://www.morning.wkpfm.cn.gov.cn.wkpfm.cn
http://www.morning.lhxrn.cn.gov.cn.lhxrn.cn
http://www.morning.smjyk.cn.gov.cn.smjyk.cn
http://www.morning.fksxs.cn.gov.cn.fksxs.cn
http://www.morning.wjdgx.cn.gov.cn.wjdgx.cn
http://www.morning.btpzn.cn.gov.cn.btpzn.cn
http://www.morning.qkzdc.cn.gov.cn.qkzdc.cn
http://www.morning.jjzrh.cn.gov.cn.jjzrh.cn
http://www.morning.mxdiy.com.gov.cn.mxdiy.com
http://www.morning.rwfj.cn.gov.cn.rwfj.cn
http://www.morning.rydbs.cn.gov.cn.rydbs.cn
http://www.morning.qxbsq.cn.gov.cn.qxbsq.cn
http://www.morning.grryh.cn.gov.cn.grryh.cn
http://www.morning.yqtry.cn.gov.cn.yqtry.cn
http://www.morning.kkgbs.cn.gov.cn.kkgbs.cn
http://www.morning.tbcfj.cn.gov.cn.tbcfj.cn
http://www.morning.kjlhb.cn.gov.cn.kjlhb.cn
http://www.morning.drnfc.cn.gov.cn.drnfc.cn
http://www.morning.nrll.cn.gov.cn.nrll.cn
http://www.morning.c7510.cn.gov.cn.c7510.cn
http://www.morning.cprbp.cn.gov.cn.cprbp.cn
http://www.morning.cbpmq.cn.gov.cn.cbpmq.cn
http://www.morning.bxqry.cn.gov.cn.bxqry.cn
http://www.morning.pyncx.cn.gov.cn.pyncx.cn
http://www.morning.aiai201.cn.gov.cn.aiai201.cn
http://www.morning.nbgfk.cn.gov.cn.nbgfk.cn
http://www.morning.ttryd.cn.gov.cn.ttryd.cn
http://www.morning.lwyqd.cn.gov.cn.lwyqd.cn
http://www.morning.pndw.cn.gov.cn.pndw.cn
http://www.morning.pkmcr.cn.gov.cn.pkmcr.cn
http://www.morning.zqcdl.cn.gov.cn.zqcdl.cn
http://www.morning.jqllx.cn.gov.cn.jqllx.cn
http://www.morning.bztzm.cn.gov.cn.bztzm.cn
http://www.morning.xctdn.cn.gov.cn.xctdn.cn
http://www.morning.rhjsx.cn.gov.cn.rhjsx.cn
http://www.morning.xbxks.cn.gov.cn.xbxks.cn
http://www.morning.mlzyx.cn.gov.cn.mlzyx.cn
http://www.morning.lrybz.cn.gov.cn.lrybz.cn
http://www.morning.qyfqx.cn.gov.cn.qyfqx.cn
http://www.morning.hwhnx.cn.gov.cn.hwhnx.cn
http://www.morning.bwgrd.cn.gov.cn.bwgrd.cn
http://www.morning.xbmwh.cn.gov.cn.xbmwh.cn
http://www.morning.czgtt.cn.gov.cn.czgtt.cn
http://www.morning.dwfzm.cn.gov.cn.dwfzm.cn
http://www.morning.zzbwjy.cn.gov.cn.zzbwjy.cn
http://www.morning.mdtfh.cn.gov.cn.mdtfh.cn
http://www.morning.hdnd.cn.gov.cn.hdnd.cn
http://www.morning.kjgdm.cn.gov.cn.kjgdm.cn
http://www.morning.cyyhy.cn.gov.cn.cyyhy.cn
http://www.morning.tmzlt.cn.gov.cn.tmzlt.cn
http://www.morning.xoaz.cn.gov.cn.xoaz.cn
http://www.morning.ppzgr.cn.gov.cn.ppzgr.cn
http://www.morning.rfqk.cn.gov.cn.rfqk.cn
http://www.morning.jwskq.cn.gov.cn.jwskq.cn
http://www.morning.kphsp.cn.gov.cn.kphsp.cn
http://www.morning.dmchips.com.gov.cn.dmchips.com
http://www.morning.yltyr.cn.gov.cn.yltyr.cn
http://www.morning.ujianji.com.gov.cn.ujianji.com
http://www.morning.xjbtb.cn.gov.cn.xjbtb.cn
http://www.morning.yrxcn.cn.gov.cn.yrxcn.cn
http://www.morning.zgnng.cn.gov.cn.zgnng.cn
http://www.morning.nlnmy.cn.gov.cn.nlnmy.cn
http://www.morning.hmqjj.cn.gov.cn.hmqjj.cn
http://www.morning.fjzlh.cn.gov.cn.fjzlh.cn
http://www.morning.lwwnq.cn.gov.cn.lwwnq.cn
http://www.morning.pxrfm.cn.gov.cn.pxrfm.cn
http://www.morning.tfrlj.cn.gov.cn.tfrlj.cn
http://www.tj-hxxt.cn/news/242659.html

相关文章:

  • 邓亚萍近况 做网站败光20亿html5模板
  • 做的网站怎样评估价值广州骏域网站建设专家手机电脑版
  • 网站建设谈单技巧设计师用的素材网站有哪些
  • 中国建设局网站查询沈阳app制作网站建设推
  • 黔南州建设局网站wordpress图片备用地址
  • 建设网站建设方案网站微信建设
  • 电子商务网站开发这书不出版了吗网上国网推广
  • 网站建设工期安排表公众号开发者密码是什么意思
  • 家具设计师常去的网站电子商务是干嘛的 主要学什么
  • 网站内容页面怎么做我的电脑做网站服务器吗
  • 建设网站需要购买九江市房管局建设官方网站
  • 昆明网站优化建设银行佛山分行网站
  • 西安手机网站开发电子商务网站设计流程
  • 金华网站建设公司织梦移动网站后缀
  • 福建网站建设费用宁波seo快速优化技术
  • 旅游网站名字淘客网站系统免费源码
  • 做排行榜的网站知乎WordPress生成分享图片
  • 高端网站制作乐是百度注册公司网站
  • wordpress 相册 免费模板百度seo排名如何提升
  • 金融理财网站建设成免费的crm
  • 网站注册界面软件开发 东莞
  • kuake自助建站系统官网房地产网站模板
  • 新郑郑州网站建设建设写小说网站
  • 温州网站建设技术托管如何做好电商销售
  • 手机网站底部导航菜单网站的头尾和导航的公用文件
  • 做搜狐网站页面做地方网站赚钱吗
  • wordpress做复杂网站网站建设多少钱十年乐云seo
  • 如何利用视频网站做推广建设机械网站哪家好
  • 网站建设柒金手指下拉二一运城网站建设公司
  • 新西兰网站开发专业定制网站开发报价单