Java第十四章 之 List、Set
1 /* 2 3 List接口:元素存储有序、带有索引、可以重复元素的集合 4 5 常用子类有ArrayList、LinkedList 6 7 add(Object obj) 向集合末尾处添加指定元素 8 9 add(int index , Object obj)向集合指定索引处添加元素,原有元素依次后移 10 11 12 13 remove(Object obj) 将指定元素对象,从集合中删除,返回值为被删除的元素 14 15 remove(int index) 将指定索引处的元素,从集合中删除,返回值为被删除的元素 16 17 18 19 set(int index , Object o) 将指定索引处的元素,替换成指定元素,返回值为替换前的元素 20 21 22 23 get(int index) 获取指定索引处的元素,并返回该元素 24 25 ArrayList是数组结构,元素查询快,增删慢 26 27 LinkedList是链表结构,元素查询慢,增删快 28 29 void addFirst(E e)将指定元素插入此列表的开头 30 31 void addList(E e)将指定元素插入此列表的末尾 32 33 E getFirst()返回此列表的第一个元素 34 35 E getLast()返回此列表的最后一个元素 36 37 E removeFirst() 移除并返回此列表的第一个元素 38 39 E removeLast() 移除并返回此列表的最后一个元素 40 41 E pop()从列表所表示的堆栈处弹出一个元素 42 43 void push(E e) 将元素推入此列表所表示的堆栈 44 45 boolean isEmpty()如果列表不包含元素,则返回true 46 47 */ 48 49 public class listDemo{ 50 51 public static void main(String[] args){ 52 53 List<String> list = new ArrayList<String>(); 54 55 list.add("张三“); 56 57 list.add("李四"); 58 59 list.add("王五"); 60 61 list.add(1 , "马五"); 62 63 list.remove(2); 64 65 list.set(1,"马四"); 66 67 for(int i = 0 ; i < list.size() ; i++){ 68 69 String str = list.get(i); 70 71 System.out.println(str); 72 73 } 74 75 } 76 77 } 78 79 80 81 /* 82 83 Set接口:元素不可重复,通过元素的equals方法,来判断是否为重复元素 84 85 HashSet(实际上是一个HashMap集合),HashSet集合不能保证迭代顺序与元素存储顺序相同 86 87 HashSet采用哈希表结构存储数据,保证元素唯一性的方式依赖于hashCode()与equals()方法 88 89 HashSet中存储JavaAPI中提供的类型元素时,不需要重写元素的hashCode和equalsf方法,这两个方法已经在JavaAPI每个类中重写 90 91 HashSet中存储自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中对象的唯一 92 93 LinkedHashSet链表和哈希表组合的一个的数据存储结构,保证元素的存入和取出的顺序 94 95 */ 96 97 public class SetDemo{ 98 99 public static void main(String[] args){ 100 101 HashSet<String> hs = new HashSet<String>(); 102 103 hs.add("张三"); 104 105 hs.add("李四"); 106 107 Iterator it = set.iterator(); 108 109 while(it.hasNext()){ 110 111 Strign s = it.next(); 112 113 System.out.println(s); 114 115 } 116 117 } 118 119 } 120 121 public class Student{ 122 123 private String name; 124 125 private int age; 126 127 public Student(){ 128 129 } 130 131 public Student(String name , int age){ 132 133 super(); 134 135 this.name = name; 136 137 this.age = age; 138 139 } 140 141 public void setName(String name){ 142 143 this.name = name; 144 145 } 146 147 public String getName(){ 148 149 return name; 150 151 } 152 153 public void setAge(int age){ 154 155 this.age = age; 156 157 } 158 159 public int getAge(){ 160 161 this.age = age; 162 163 } 164 165 @Override 166 public int hashCode() { 167 final int prime = 31; 168 int result = 1; 169 result = prime * result + age; 170 result = prime * result + ((name == null) ? 0 : name.hashCode()); 171 return result; 172 173 } 174 175 @Override 176 public boolean equals(Object obj) { 177 if (this == obj) 178 return true; 179 if (obj == null) 180 return false; 181 if (getClass() != obj.getClass()) 182 return false; 183 Student other = (Student) obj; 184 if (age != other.age) 185 return false; 186 if (name == null) { 187 if (other.name != null) 188 return false; 189 } else if (!name.equals(other.name)) 190 return false; 191 return true; 192 } 193 @Override 194 public String toString() { 195 return "Student [name=" + name + ", age=" + age + "]"; 196 } 197 198 } 199 200 public static void main(String[] args) { 201 HashSet<Student> hs = new HashSet<Student>(); 202 hs.add(new Student("张三" , 20)); 203 hs.add(new Student("李四" , 20)); 204 hs.add(new Student("王五" , 20)); 205 206 for(Student st : hs){ 207 208 Syste.out.println(st.getName() +" "+ st.getAge()); 209 210 } 211 212 /* 213 214 ArrayList : boolean contains(Object obj)如果此列表中包含指定的元素,则返回true 215 216 传入的元素的equals方法依次与集合中的旧元素比较,根据返回的布尔值判断是否有重复的元素,存放自定义类型时,由于自定义类型未重写equals方法,判断是否重复的依据是地址值,想判断内容是否有重复的元素,需要重写equals方法 217 218 HashSet : boolean add(E e)如果此set中没有包含指定元素,则添加指定元素 219 220 boolean contains(Object o) 如果此set中包含指定元素,则返回true 221 222 添加方法在添加时会判断是否有重复元素,有重复不添加,没重复则添加 223 224 由于是无序的,判断唯一的依据是元素类型的hashCode与equals方法的返回结果: 225 226 先判断新元素和集合中的旧元素的hashCode值: 227 228 如果不同,说明是不同元素,添加到集合 229 230 如果相同,再判断equals比较结果,返回true则相同元素,返回false则不同元素,添加到集合 231 232 存储自定义类型,如果没有重写该类的hashCode与equals方法时,则判断重复时,使用的是地址值,如果想通过内容比较元素是否相同,需要重写hashCode与equals方法 233 234 */