网站的meta标签优化,国外采购平台有哪些,wordpress 社交插件,如何做拼多多商城官网站Collection的子接口#xff1a;List、Set 
1、List接口 
鉴于Java中数组用来存储数据的局限性#xff0c;我们通常使用java.util.List替代数组List集合类中元素有序、且可重复#xff0c;集合中的每个元素都有其对应的顺序索引。JDK API中List接口的实现类常用的有#xff…Collection的子接口List、Set 
1、List接口 
鉴于Java中数组用来存储数据的局限性我们通常使用java.util.List替代数组List集合类中元素有序、且可重复集合中的每个元素都有其对应的顺序索引。JDK API中List接口的实现类常用的有ArrayList、LinkedList和Vector。 
1 List接口方法 
List除了从Collection集合继承的方法外List 集合里添加了一些根据索引来操作集合元素的方法。 
插入元素 void add(int index, Object ele):在index位置插入ele元素其余元素自动后移一位若容量不够则自动扩容boolean  addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来获取元素 Object get(int index):获取指定index位置的元素List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合获取元素索引 int  indexOf(Object obj):返回obj在集合中首次出现的位置int  lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置删除和替换元素 Object remove(int index):移除指定index位置的元素并返回此元素Object remove(Object obj) : 移除与obj相同的元素Object set(int index, Object ele):设置指定index位置的元素为ele 
Test
public void test(){List list  new ArrayList();list.add(faculty);//全体教员list.add(poll);//民意调查list.add(render);//给予list.add(descend);//下降list.add(2);list.add(new Person(Qum,18));//add(int index,Collection eles)ListInteger list1  Arrays.asList(1, 2, 3);list.addAll(3,list1);System.out.println(list);list.remove(2);//移除索引2System.out.println(list);list.remove(Integer.valueOf(2));//若有重复的2只删除一个System.out.println(list);} 2、List接口主要实现类 
1主要实现类ArrayList 
java.util.Collection存储一个一个的数据 
--子接口List  存储有序的、可重复的数据“动态”数组 
--ArrayList 
ArrayList是线程不安全的效率更高。 
Vecor线程安全效率低版本古老一般不使用。 ArrayList 是 List 接口的主要实现类本质上ArrayList是对象引用的一个”变长”数组如果长度不够可以自动扩容Arrays.asList(…) 方法返回的 List 集合既不是 ArrayList 实例也不是 Vector 实例。 Arrays.asList(…) 返回值是一个固定长度的 List 集合 List list  new ArrayList();//体现多态性创建一个ArrayList的对象将其赋值给List型的引用变量。
//初始化创建list集合时底层创建空数组
list.add(illusion);//第一次添加元素时默认将底层集合容量设置为10.若之后容量不够可自动扩容
list.add(realm);
list.add(verify);
list.add(accumulate);String []strings  new String[]{radical,convention,outline,cling,neutral};
list.addAll(Arrays.asList(strings));//将数组strings中的元素全都转化为集合的元素 
底层使用Object[]存储添加、查找数据时效率较高插入、删除数据时效率较低 2实现类之二LinkedList 
对于频繁的插入或删除元素的操作建议使用LinkedList类效率较高。这是由底层采用链表双向链表结构存储数据决定的。但是添加、查找数据时效率较低。特有方法 void  addFirst(Object obj)void  addLast(Object obj) Object  getFirst()Object  getLast()Object  removeFirst()Object  removeLast() 
3List的实现类之三Vector 
Vector 是一个古老的集合JDK1.0就有了。大多数操作与ArrayList相同区别之处在于Vector是线程安全的。在各种List中最好把ArrayList作为默认选择。当插入、删除频繁时使用LinkedListVector总是比ArrayList慢所以尽量避免使用。特有方法 void  addElement(Object obj)void  insertElementAt(Object obj,int index)void  setElementAt(Object obj,int index)void  removeElement(Object obj)void  removeAllElements() 3、Set接口概述 
Set接口是Collection的子接口Set接口相较于Collection接口没有提供额外的方法Set 集合不允许包含相同的元素如果试把两个相同的元素加入同一个 Set 集合中则添加操作失败。Set集合支持的遍历方式和Collection集合一样foreach和Iterator。Set的常用实现类有HashSet、TreeSet、LinkedHashSet。 
Set主要实现类HashSet 
java.util.Colection存储一个一个的数值 
--子接口Set接口存储无序的、不可重复的数据集合 
--HashSet主要实现类底层使用HashMap使用数组单向链表红黑树的结构进行存储在JDK8中 
-LinkedHashSetHashSet的子类在现有的数组单向链表红黑树的结构的基础上又添加了一组双向链表用于记录添加元素的先后顺序可以按照添加元素的先后顺序进行遍历。 
--TreeSet底层使用红黑树存储可以按照添加元素的指定属性的大小顺序进行遍历。- 
set的无序性1 无序性不等于随机性。 
无序性不像ArrayList一样依次紧密排列而是根据添加元素的Hash值不同计算其在数组中的存储位置进行排列因为此位置不是依次排列的所以表现出无序性。 
set的不可重复性添加到set中的元素不能相同。比较的标准需要判断hashCode得到的哈希值和equals方法得到的布尔值。 
只有哈希值和布尔值都相同才认为两个元素相同不允许放入集合。 
1HashSet概述 
HashSet 是 Set 接口的主要实现类大多数时候使用 Set 集合时都使用这个实现类。HashSet 按 Hash 算法来存储集合中的元素因此具有很好的存储、查找、删除性能。HashSet 具有以下特点 不能保证元素的排列顺序HashSet 不是线程安全的集合元素可以是 nullHashSet 集合判断两个元素相等的标准两个对象通过 hashCode() 方法得到的哈希值相等并且两个对象的 equals()方法返回值为true。对于存放在Set容器中的对象对应的类一定要重写hashCode()和equals(Object obj)方法以实现对象相等规则。即“相等的对象必须具有相等的散列码”。HashSet集合中元素的无序性不等同于随机性。这里的无序性与元素的添加位置有关。具体来说我们在添加每一个元素到数组中时具体的存储位置是由元素的hashCode()调用后返回的hash值决定的。导致在数组中每个元素不是依次紧密存放的表现出一定的无序性。 
2HashSet中添加元素的过程 
第1步当向 HashSet 集合中存入一个元素时HashSet 会调用该对象的 hashCode() 方法得到该对象的 hashCode值然后根据 hashCode值通过某个散列函数决定该对象在 HashSet 底层数组中的存储位置。第2步如果要在数组中存储的位置上没有元素则直接添加成功。第3步如果要在数组中存储的位置上有元素则继续比较 如果两个元素的hashCode值不相等则添加成功如果两个元素的hashCode()值相等则会继续调用equals()方法 如果equals()方法结果为false则添加成功。如果equals()方法结果为true则添加失败。 
2步添加成功元素会保存在底层数组中。3步两种添加成功的操作由于该底层数组的位置已经有元素了则会通过链表的方式继续链接存储。 
HashCode与LickedHashSet中元素的要求 
重写equals方法和hashCode方法且保持一致性 Test
public void test1(){Set set  new HashSet();set.add(AAA);set.add(descend);set.add(123);set.add(123);//不输出Integer integer  Integer.valueOf(123);set.add(integer);Iterator iterator  set.iterator();while (iterator.hasNext()){System.out.println(iterator.next());} 重写 hashCode() 方法的基本原则 
在程序运行时同一个对象多次调用 hashCode() 方法应该返回相同的值。当两个对象的 equals() 方法比较返回 true 时这两个对象的 hashCode() 方法的返回值也应相等。对象中用作 equals() 方法比较的 Field都应该用来计算 hashCode 值。 
注意如果两个元素的 equals() 方法返回 true但它们的 hashCode() 返回值不相等hashSet 将会把它们存储在不同的位置但依然可以添加成功。 
5.2.4 重写equals()方法的基本原则 
重写equals方法的时候一般都需要同时复写hashCode方法。通常参与计算hashCode的对象的属性也应该参与到equals()中进行计算。推荐开发中直接调用Eclipse/IDEA里的快捷键自动重写equals()和hashCode()方法即可。 为什么用Eclipse/IDEA复写hashCode方法有31这个数字 
hash地址越大所谓的“冲突”就越少查找起来效率也会提高。减少冲突 其次31只占用5bits,相乘造成数据溢出的概率较小。 再次31可以 由i*31 (i5)-1来表示,现在很多虚拟机里面都有做相关优化。提高算法效率 最后31是一个素数素数作用就是如果我用一个数字来乘以这个素数那么最终出来的结果只能被素数本身和被乘数还有1来整除(减少冲突) 
Set实现类之二LinkedHashSet 
LinkedHashSet 是 HashSet 的子类不允许集合元素重复。LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置但它同时使用双向链表维护元素的次序这使得元素看起来是以添加顺序保存的。LinkedHashSet插入性能略低于 HashSet但在迭代访问 Set 里的全部元素时有很好的性能。 5.4 Set实现类之三TreeSet 
5.4.1 TreeSet概述 
TreeSet 是 SortedSet 接口的实现类TreeSet 可以按照添加的元素的指定的属性的大小顺序进行遍历。TreeSet底层使用红黑树结构存储数据新增的方法如下 (了解) Comparator comparator()Object first()Object last()Object lower(Object e)Object higher(Object e)SortedSet subSet(fromElement, toElement)SortedSet headSet(toElement)SortedSet tailSet(fromElement)TreeSet特点不允许重复、实现排序自然排序或定制排序TreeSet 两种排序方法自然排序和定制排序。默认情况下TreeSet 采用自然排序。 自然排序TreeSet 会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系然后将集合元素按升序(默认情况)排列。 如果试图把一个对象添加到 TreeSet 时则该对象的类必须实现 Comparable 接口。实现 Comparable 的类必须实现 compareTo(Object obj) 方法两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小。 
Test
public void test1(){TreeSet treeSet  new TreeSet();treeSet.add(affluent);treeSet.add(constrain);treeSet.add(revelation);treeSet.add(interval);//treeSet.add(123);ClassCastException异常TreeSet类中应当add加入同一类型的元素Iterator iterator  treeSet.iterator();while (iterator.hasNext()){System.out.println( iterator.next());//输出时按照默认排序输出} 定制排序如果元素所属的类没有实现Comparable接口或不希望按照升序(默认情况)的方式排列元素或希望按照其它属性大小进行排序则考虑使用定制排序。定制排序通过Comparator接口来实现。需要重写compare(T o1,T o2)方法。 利用int compare(T o1,T o2)方法比较o1和o2的大小如果方法返回正整数则表示o1大于o2如果返回0表示相等返回负整数表示o1小于o2。要实现定制排序需要将实现Comparator接口的实例作为形参传递给TreeSet的构造器。因为只有相同类的两个实例才会比较大小所以向 TreeSet 中添加的应该是同一个类的对象。对于 TreeSet 集合而言它判断两个对象是否相等的唯一标准是两个对象通过 compareTo(Object obj) 或compare(Object o1,Object o2)方法比较返回值。返回值为0则认为两个对象相等。TreeSet集合不再考虑HashCode和equals方法是否重写不再重要。 
public class User implements Comparable{private String name;private int age;public User() {}public User(String name, int age) {this.name  name;this.age  age;}public String getName() {return name;}public int getAge() {return age;}Overridepublic String toString() {return User{ name  name  \ , age  age };}Overridepublic boolean equals(Object o) {System.out.println(equals...);if (this  o) return true;if (o  null || getClass() ! o.getClass()) return false;User user  (User) o;return age  user.age  Objects.equals(name, user.name);}Overridepublic int hashCode() {return Objects.hash(name, age);}Overridepublic int compareTo(Object o) {if (this  o){return 0;}if (o instanceof User){User user  (User) o;return this.age- user.age;}throw new RuntimeException();}
}Test
public void test3(){Comparator comparator  new Comparator() {Overridepublic int compare(Object o1, Object o2) {if (o1 instanceof  User  o2 instanceof User){User u1  (User) o1;User u2  (User) o2;int value  u1.getName().compareTo(u2.getName());if (value!0){return value;}return u1.getAge()-u2.getAge();}throw new RuntimeException();}};//实现匿名内部类创建实例对象comparatorTreeSet treeSet  new TreeSet(comparator);//按照定制排序的顺序进行排序User u1  new User(Tom,13);User u2  new User(Flank,24);User u3  new User(Ry,999);User u4  new User(Serial,999);treeSet.add(u1);treeSet.add(u2);treeSet.add(u3);treeSet.add(u4);Iterator iterator  treeSet.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}
}