List集合 java.util.List接口 extends Collection接口
List接口:
有序集合,存储元素和取出元素的顺序是一致的(存储123 取出123)
有索引,包含了一些带索引的方法
允许存储重复的元素
List 接口中带索引的方法(特有)
1 2 3 4 public void add (int index, E element) : 将指定的元素,添加到该集合中的指定位置上。public E get (int index) :返回集合中指定位置的元素。public E remove (int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。public E set (int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
注意:
操作索引的时候,一定要防止索引越界异常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 package com.tipdm.Demo01;import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class demo1 { public static void main (String[] args) { List<String> list = new ArrayList <>(); list.add("a" ); list.add("b" ); list.add("c" ); list.add("d" ); list.add("a" ); System.out.println(list); list.add(3 , "tipdm" ); System.out.println(list); String re = list.remove(2 ); System.out.println(re); System.out.println(list); String se = list.set(3 , "lm" ); System.out.println(se); System.out.println(list); String ge = list.get(3 ); System.out.println(ge); System.out.println("===============" ); for (int i = 0 ; i < list.size(); i++) { System.out.println(list.get(i)); } System.out.println("===============" ); Iterator<String> it = list.iterator(); while (it.hasNext()){ System.out.println(it.next()); } System.out.println("===============" ); for (String s : list) { System.out.println(s); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [a, b, c, d, a] [a, b, c, tipdm, d, a] c [a, b, tipdm, d, a] d [a, b, tipdm, lm, a] lm =============== a b tipdm lm a =============== a b tipdm lm a =============== a b tipdm lm a 进程已结束,退出代码0
ArrayList集合 java.util.ArrayList
集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList
是最常用的集合。
许多程序员开发时非常随意地使用ArrayList完成任何需求,并不严谨,这种用法是不提倡的。
集合 java.util.LinkedList集合 implements List 接口
LinkedList集合的特点:
底层是一个链表接口:查询慢,增删快
里面包含了大量操作首尾元素的方法
注意:使用LinkedList集合特有的方法,不能使用多态
1 2 3 4 5 6 7 8 9 10 11 12 public void addFirst (E e) :将指定元素插入此列表的开头。public void push (E e) :将元素推入此列表所表示的堆栈。public void addLast (E e) `:将指定元素添加到此列表的结尾。public E getFirst () `:返回此列表的第一个元素。public E getLast () `:返回此列表的最后一个元素。public E removeFirst () `:移除并返回此列表的第一个元素。public E pop () `:从此列表所表示的堆栈处弹出一个元素。public E removeLast () `:移除并返回此列表的最后一个元素public boolean isEmpty () `:如果列表不包含元素,则返回true 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 package com.tipdm.Demo01;import java.util.LinkedList;public class demo2LinkedList { public static void main (String[] args) { show01(); System.out.println("================" ); show02(); System.out.println("================" ); show03(); System.out.println("================" ); } private static void show03 () { LinkedList<String> linked = new LinkedList <>(); linked.add("a" ); linked.add("b" ); linked.add("c" ); linked.add("d" ); linked.add("e" ); System.out.println(linked); System.out.println(linked.removeFirst()); System.out.println(linked); System.out.println(linked.removeLast()); System.out.println(linked); System.out.println(linked.pop()); System.out.println(linked); } private static void show02 () { LinkedList<String> linked = new LinkedList <>(); linked.add("a" ); linked.add("b" ); linked.add("c" ); System.out.println(linked.getFirst()); System.out.println(linked.getLast()); linked.clear(); if (linked.isEmpty()){ System.out.println("空集合!" ); }else { System.out.println(linked.getFirst()); } } private static void show01 () { LinkedList<String> linked = new LinkedList <>(); linked.add("a" ); linked.add("b" ); linked.add("c" ); System.out.println(linked); linked.addFirst("www" ); System.out.println(linked); linked.push("https://" ); System.out.println(linked); linked.addLast(".com" ); System.out.println(linked); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [a, b, c] [www, a, b, c] [https://, www, a, b, c] [https://, www, a, b, c, .com] ================ a c 空集合! ================ [a, b, c, d, e] a [b, c, d, e] e [b, c, d] b [c, d] ================ 进程已结束,退出代码0
Set集合 java.util.Set接口 extends Collection 接口
Set接口特点:
不允许存储重复的元素
没有索引,没有带索引的方法,也不能使用普通的for循环遍历
java.util.HashSet集合 implements Set接口
HashSet特点:
不允许存储重复的元素
没有索引,没有带索引的方法,也不能使用普通的for循环遍历
是一个无序的集合,存储元素和取出元素的顺序有可能不一致
底层是一个哈希表结构(查询的速度非常快)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 package com.tipdm.Demo01;import java.util.HashSet;import java.util.Iterator;import java.util.Set;public class demo3Set { public static void main (String[] args) { Set<Integer> set = new HashSet <>(); set.add(1 ); set.add(3 ); set.add(2 ); set.add(5 ); set.add(2 ); Iterator<Integer> it = set.iterator(); while (it.hasNext()){ System.out.println(it.next()); } System.out.println("====================" ); for (Integer integer : set) { System.out.println(integer); } } }
1 2 3 4 5 6 7 8 9 10 11 1 2 3 5 ==================== 1 2 3 5 进程已结束,退出代码0
哈希值 哈希值:是一个十进制的整数,由系统随机给出(就算对象的地址值,是一个逻辑地址。是模拟出来得到地址,不是数据实际存储的物理地址)
在Object类有一个方法,可以获取对象的哈希值
返回该对象的哈希码值。
hashCode方法的源码:
1 public native int hashCode () ;
native:代表该方法调用的是本地操作系统的方法。
Person类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 package com.tipdm.Demo01;import java.util.Objects;public class Person extends Object { private String name; private int age; @Override public boolean equals (Object o) { if (this == o) return true ; if (o == null || getClass() != o.getClass()) return false ; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode () { return Objects.hash(name, age); } @Override public String toString () { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}' ; } public String getName () { return name; } public void setName (String name) { this .name = name; } public int getAge () { return age; } public void setAge (int age) { this .age = age; } public Person (String name, int age) { this .name = name; this .age = age; } public Person () { } }
主类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 package com.tipdm.Demo01;public class demo4Hashcode { public static void main (String[] args) { Person p1 = new Person (); int h1 = p1.hashCode(); System.out.println(h1); Person p2 = new Person (); int h2 = p2.hashCode(); System.out.println(h2); System.out.println(p1); System.out.println(p2); String s1 = new String ("abc" ); String s2 = new String ("abc" ); System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); System.out.println("重地" .hashCode()); System.out.println("通话" .hashCode()); } }
1 2 3 4 5 6 7 8 9 10 961 961 Person{name ='null' , age =0} Person{name ='null' , age =0} 96354 96354 1179395 1179395 进程已结束,退出代码0
Set集合不允许重复元素的原理 Set集合在调用add方法的时候,add方法会调用元素的hashCode方法和equals方法,判断元素是否重复 set.add(s1); add方法会调用s1的hashCode方法,计算字符串”abc”的哈希值,哈希值是96354 在集合中找有没有96354这个哈希值的元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package com.tipdm.Demo01;import java.util.HashSet;public class demo5HashSetSaveString { public static void main (String[] args) { HashSet<String> set = new HashSet <>(); String s1 = new String ("abc" ); String s2 = new String ("abc" ); set.add(s1); set.add(s2); set.add("重地" ); set.add("通话" ); set.add("abc" ); System.out.println(set); } }
1 2 3 [重地, 通话, abc] 进程已结束,退出代码0
HashSet存储自定义类型元素 使用hashSet存储自定义类型元素
set集合保持元素唯一:
存储的元素(String, Integer, …, Student, Person …), 必须重写hashCode
方法和equals
方法
要求:
同名同年龄的人,视为同一个人,只能存储一次
person类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 package com.tipdm.Demo01;import java.util.Objects;public class Person extends Object { private String name; private int age; @Override public boolean equals (Object o) { if (this == o) return true ; if (o == null || getClass() != o.getClass()) return false ; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode () { return Objects.hash(name, age); } @Override public String toString () { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}' ; } public String getName () { return name; } public void setName (String name) { this .name = name; } public int getAge () { return age; } public void setAge (int age) { this .age = age; } public Person (String name, int age) { this .name = name; this .age = age; } public Person () { } }
主类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 package com.tipdm.Demo01;import java.util.HashSet;public class demo6HashSetSavePerson { public static void main (String[] args) { HashSet<Person> set = new HashSet <>(); Person p1 = new Person ("小美女" , 18 ); Person p2 = new Person ("小美女" , 18 ); Person p3 = new Person ("小美女" , 19 ); System.out.println(p1.hashCode()); System.out.println(p2.hashCode()); set.add(p1); set.add(p2); set.add(p3); System.out.println(set); System.out.println(p1.hashCode()); System.out.println(p2.hashCode()); System.out.println(set); } }
重写HashCode方法前:
1 2 3 4 5 6 7 8 460141958 1163157884 [Person{name ='小美女' , age =19}, Person{name ='小美女' , age =18}, Person{name ='小美女' , age =18}] 460141958 1163157884 [Person{name ='小美女' , age =19}, Person{name ='小美女' , age =18}, Person{name ='小美女' , age =18}] 进程已结束,退出代码0
重写HashCode方法后:
1 2 3 4 5 6 7 8 734175839 734175839 [Person{name ='小美女' , age =19}, Person{name ='小美女' , age =18}] 734175839 734175839 [Person{name ='小美女' , age =19}, Person{name ='小美女' , age =18}] 进程已结束,退出代码0
LinkedHashSet集合 java.util.LinkedHashSet集合 extend HashSet集合
LinkedHashSet集合特点:
底层是一个哈希表(数组+链表/红黑树) + 链表:多了一条链表(记录元素的存储顺序),保证元素有序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package com.tipdm.Demo01;import java.util.HashSet;import java.util.LinkedHashSet;public class demo7LinkedHashSet { public static void main (String[] args) { HashSet<String> set = new HashSet <>(); set.add("abc" ); set.add("abc" ); set.add("www" ); set.add("com" ); System.out.println(set); System.out.println("=======================" ); LinkedHashSet<String> linkedset = new LinkedHashSet <>(); linkedset.add("abc" ); linkedset.add("abc" ); linkedset.add("www" ); linkedset.add("com" ); System.out.println(linkedset); } }
1 2 3 4 5 [com , abc , www] ======================= [abc , www, com ] 进程已结束,退出代码0