List集合

来源:互联网 发布:数控折弯机编程方法 编辑:程序博客网 时间:2024/06/06 00:11
一、有序列表List有三种实现方式:ArrayList、Vector和LinkedList都是同一个接口的实现,所以操作和方法都是相同的,但是具体的实现方式不一样。

ArrayList:数组实现方式,查询速度快,按位增删速度慢;
LinkedList:链表的实现方式,按位增删速度快,查询速度慢;

Vector:多线程时线程同步的,保证数据安全。

List集合中的contains()和indexOf()方法是根据equals和hashCode方法来的。

例:

package list;public class Employee {private String empno;private String name;@Overridepublic String toString() {return "Employee [empno=" + empno + ", name=" + name + "]";}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((empno == null) ? 0 : empno.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Employee other = (Employee) obj;if (empno == null) {if (other.empno != null)return false;} else if (!empno.equals(other.empno))return false;return true;}public String getEmpno() {return empno;}public void setEmpno(String empno) {this.empno = empno;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

注意这个实体类只对empno进行了equals和hashcode方法编写。

测试类:

package list;import java.util.ArrayList;public class Main {public static void main(String[] args) {ArrayList<Employee> list=new ArrayList<>();Employee employee=new Employee();employee.setEmpno("0001");employee.setName("zs");list.add(employee);employee=new Employee();employee.setEmpno("0002");employee.setName("zs");list.add(employee);Employee employee1=new Employee();employee1.setEmpno("0002");employee1.setName("zsk");int a=list.indexOf(employee1);System.out.println(a);System.out.println(list.contains(employee1));}}

输出1 true。如果把Employee实体类的name和empno同时进行equals和hashCode,则输出-1  false,由此验证了contains和indexOf这两个方法是根据equals和hashCode方法来判断的。实际上,除了List,其他涉及到indexOf等检索的也都是根据equals和hashCode方法来判断的,由此可见正确重写Object的这两个方法的重要性。


二、无序列表Set 是一个散列的集合,数据会按照散列值存储的,两个hello的散列值相同,会存储在同一个地址中,所以看到的就是只有一个hello在集合中了。

set集合有两个主要的实现子类:hashset和treeset。hashset是去重复,而treeset需要实现compareble接口来排序(比较其实是一种变向的去重复,一旦两个对象比较的元素相同,这两个对象只会存一个进去)。

Set的特征是:
不会出现重复的元素(按照equals 和hashCode 的规则比较是否重复)
Set属于Collection的子接口,拥有Collection的所有的方法;
Set 是散列存储没有位置编号,没有按照编号进行操作的方法。

注意Set<T>如果这个T没有正确重写equals和hashCode方法,会存入重复值。而List<T>即使T正确重写了equals和hsahCode方法,也会存入重复值。

例:

实体类Person,如果Person类有两个属性name和sex,而现在只对name进行equals和hashCode的话,即:

package map;public class Person {private String name;private String sex;public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person [name=" + name + "]";}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Person other = (Person) obj;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}}

测试类:

package map;import java.util.HashSet;import java.util.Iterator;import java.util.Set;public class MyHashSet {public static void main(String[] args) {Set<Person> set=new HashSet<>();Person person=new Person();person.setName("zs");person.setSex("nv");set.add(person);person=new Person();person.setName("zs");person.setSex("nvhj");set.add(person);Iterator<Person> it=set.iterator();while(it.hasNext()){System.out.println(it.next());}}}
只会输出一个对象,表示set里只存了一个。因为现在只按name的hashcoce存储,这两个对象的hashcode是一样的,被当作一个对象。要想set集合正确存储这两个不同的对象进去,Person类需要这样正确地重写equals和hashCode方法:(Map也是这种情况)

package map;public class Person {private String name;private String sex;public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person [name=" + name + "]";}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((name == null) ? 0 : name.hashCode());result = prime * result + ((sex == null) ? 0 : sex.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Person other = (Person) obj;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;if (sex == null) {if (other.sex != null)return false;} else if (!sex.equals(other.sex))return false;return true;}/*@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Person other = (Person) obj;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}*/}



原创粉丝点击