java的集合



Conllection常用功能
public boolean add(E e): 把给定的对象添加到当前集合中 public void clear(); 情况集合中所有的元素,但是不删除集合,集合是空而已 public boolean remove(e);把给定的对象在当前的集合中删除,集合中存在则删除并返回true,不存在则返回false public boolean contains(E e);判断当前集合是否含有给定对象 public boolean isEmpty(); 判断当前集合是否给空 public int size();返回集合的元素个数 public Object[] toArray() 把集合中的元素,存储到数组中
public class DemonCollection { public static void main(String[] args) { // 创建集合对象,可以使用多态,接口指向一个实例类 Collection<String> coll = new ArrayList<>(); System.out.println(coll);//重写了toString方法 boolean bl = coll.add("quan"); coll.add("QQQ"); System.out.println(coll); //删除元素 System.out.println(coll.remove("QQQ")); System.out.println(coll.remove("QQ")); //判断是否包含元素 System.out.println(coll.contains("quan")); //判断是否为空 System.out.println(coll.isEmpty()); //集合元素的多少 System.out.println(coll.size()); Object[] arr = coll.toArray(); System.out.println(arr); coll.clear(); System.out.println(coll.isEmpty()); } }
结果:
[] [quan, QQQ] true false true false 1 [Ljava.lang.Object;@1b6d3586 true
Iterator 迭代器

迭代器用于对集合进行百年来 boolean hasNext() 如果有元素可以迭代,则返回true 判断集合中还有没有下一个元素,如果有则返回true,没有则返回false E next() 返回迭代的下一个元素。取出集合的下一个元素 Iterator 地带其,是一个接口,我们二u发直接使用,需要使用Iterator 接口的实现对象,获取实现类的方法比较特殊 Conllection 接口中国有一个方法,叫iterator(),这个方法返回的就是迭代器的实现对象 迭代器使用步骤: 使用集合中的方法iterator获取迭代器 实现类对象,使用Iterator接口接受(多态) 使用Iterator 接口中的方法hashnext 判断是否有下一个元素 使用Iterator 接口中的方法next ,取出集合中的下一个元素 注意: 使用集合中的方法创建迭代器的时候,使用Iterator接口接受(多态) Iterator<E>也有泛型,迭代器的泛型跟着集合走,集合是什么泛型,迭代器就是什么泛型 如果没有元素还进行取出,会返回异常:java.util.NoSuchElementException */
public class Demon { public static void main(String[] args) { Collection<String> coll = new ArrayList<>(); coll.add("QQQQ"); coll.add("AAA"); coll.add("BBB"); coll.add("DDDD"); //多态 接口 实现类对象 Iterator<String> it = coll.iterator(); boolean bl = it.hasNext(); System.out.println(bl); String st = it.next(); System.out.println(st); // 知道长度用for,不知道长度用while while(it.hasNext()){ System.out.println(it.next()); } } } /* true QQQQ AAA BBB DDDD */

增强for循环
/* Collection<E> extends Iterable<E>,所有单鞋集合恶斗可以使用增强for public interface Iterable<T> 实现此接口允许对象成为“for-each loop”语句的目标。 增强for循环,用来遍历结合和数组 格式: for(集合/数组的数据类型 变量名:集合名/数组名){ sout(变量名) } */
public class DemoFor { public static void main(String[] args) { demo01(); demo(); } // 遍历集合 private static void demo(){ ArrayList<String> arrl = new ArrayList<>(); arrl.add("QQQ"); arrl.add("WWW"); arrl.add("RRR"); for (String str:arrl){ System.out.println(str); } } //遍历数组 private static void demo01(){ int [] arr = {1,1,2,3,4}; for(int i:arr){ System.out.println(i); } } } /* 1 1 2 3 4 QQQ WWW RRR */
List

IndexOutOfBoundsException越界异常:
public class d1 { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); //安装存的方式输出,打印的不是地址,证明重写的toString System.out.println(list); list.add(1,"D"); System.out.println(list); // 移除a元素,返回移除的元素 System.out.println(list.remove(0)); System.out.println(list); // 特换指定索引的元素,并返回所替换的元素内容 System.out.println(list.set(0,"ddd")); System.out.println(list); // list集合遍历方式 for (int i = 0;i<list.size();i++){ System.out.println(list.get(i)); } System.out.println("############"); //d迭代器遍历 Iterator<String> it = list.iterator(); while(it.hasNext()){ System.out.println(it.next()); } System.out.println("############"); // 增强for循环 for (String s :list){ System.out.println(s); } } }
List子类
ArrayList集合:

linkedList集合

/* 特点: 底层是一个链表结构,查询慢,增删块 里面包含大量操作单点首位方法,不能用多态 注意:使用LinkedList 集合特有的方法,不能使用多态 */ import java.sql.ClientInfoStatus; import java.util.LinkedList; import java.util.List; public class LinkListT { public static void main(String[] args) { show1(); show2(); } private static void show2(){ LinkedList<String> lisked = new LinkedList<>(); lisked.add("QQ"); lisked.add("DAWI"); lisked.add("UUUU"); String first = lisked.getFirst(); System.out.println(first); String second = lisked.getLast(); System.out.println(second); lisked.clear(); } private static void show1(){ LinkedList<String> linked = new LinkedList(); linked.add("A"); linked.add("B"); linked.add("C"); System.out.println(linked); linked.addFirst("ONE"); System.out.println(linked); linked.addLast("last"); System.out.println(linked); } } /* [A, B, C] [ONE, A, B, C] [ONE, A, B, C, last]
Vector,认识就好
-
Vector类实现了可扩展的对象数组。 像数组一样,它包含可以使用整数索引访问的组件。 但是,Vector的大小可以根据需要增长或缩小,以适应在创建Vector之后添加和删除项目。
Set接口
/* set特点: 不允许存储重复元素 没有索引,没有索引的算法不能通过普通for遍历 HashSet特点: 不允许存储重复元素 没有索引,没有索引的算法不能通过普通for遍历 是一个无序的集合,存储元素和取出元素的顺序有可能不一致 底层是一个哈希表结构,查询结构非常块 */
public class DDD1 { public static void main(String[] args) { Set<Integer> set = new HashSet<>(); set.add(21); set.add(3); set.add(4); set.add(21); // 使用迭代器遍历 Iterator<Integer> it = set.iterator(); while (it.hasNext()){ System.out.println(it.next()); } System.out.println("############"); for (Integer i:set){ System.out.println(i); } } } /* 3 4 21 ############ 3 4 21 */
HashSet集合存储数据结构—哈希表
/* 哈希值:是一个十进制的整数,由系统随机给出 (就是对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址) 在Object 类有一个方法,可以获取对象的哈希值 int hashCode() 返回对象的哈希码值。 */
public class HashCode { public static void main(String[] args) { // person类默认继承了object类,可以使用hashCode方法 Person person = new Person(); int h1 = person.hashCode(); System.out.println(h1); Person person2 = new Person(); int h2 = person2.hashCode(); System.out.println(h2); //// toString 源码 // public String toString() { // return getClass().getName() + "@" + Integer.toHexString(hashCode()); // } System.out.println(person);//这里的哈希值是上面哈希值的16进制表示方法 System.out.println(person2); // 字符串类的哈希值 String s = new String("abc"); String s1 = "abc"; String ss = new String("abc"); System.out.println(s.hashCode()); System.out.println(ss.hashCode()); System.out.println(s1.hashCode()); } } /* 460141958 1163157884 quan.set.Person@1b6d3586 quan.set.Person@4554617c 96354 96354 96354 */


HashSet存储自定义的元素:
//存储自定义类型元素 //set集合保证元素唯一: // 存储的元素,必须重写hashVCode和equals方法
自定义的类:
public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.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; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + 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); } }
hashset储存:
public class SetPerson { // 要求同名同年龄的人,视为同一个人,只能村一次 public static void main(String[] args) { HashSet<Person> hp = new HashSet<>(); Person p1 = new Person("quan",22); Person p2 = new Person("quan",22); Person p3 = new Person("quan",11); System.out.println(p1.hashCode()); System.out.println(p2.hashCode()); hp.add(p1); hp.add(p2); hp.add(p3); System.out.println(hp); } } /* 107941030 107941030 [Person{name='quan', age=11}, Person{name='quan', age=22}] */
LinkedHashSet
/* java.util.LinkedHashSet集合 extends HashSet集合 LinkedHashSet集合提点: 底层是一个哈希表(数组+链表/红黑树)+链表 多了一个链表(就hi了元素的存储顺序),保证元素有序 */
public class LinkHashSet { public static void main(String[] args) { HashSet<String> set = new HashSet<>(); set.add("www"); set.add("abc"); set.add("quan"); set.add("abc"); System.out.println(set);//不允许重复,无序 LinkedHashSet<String> linkedset = new LinkedHashSet<>(); linkedset.add("www"); linkedset.add("abc"); linkedset.add("quan"); linkedset.add("abc"); System.out.println(linkedset);//不允许重复,有序 } }
操作集合的工具

/* sort方法的使用前提, 对排序的集合里面必须实现Comparable ,重写定义排序的规则 Comparable的排序规则 自己(this) - 参数:升序 */
public class Demo { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); // 集合加入多个元素,因为addALL是静态方法 Collections.addAll(list,"A","tt","b","uu","B"); System.out.println(list); //打乱顺序,打乱集合的顺序 Collections.shuffle(list); System.out.println(list); //自然排序 Collections.sort(list); System.out.println(list); ArrayList<Integer> listInt = new ArrayList<>(); listInt.add(22); listInt.add(21); listInt.add(12); listInt.add(42); System.out.println(listInt); // sort<List<T> list> 将集合中的元素安装默认规则排序 Collections.sort(listInt);//默认是升序排序 System.out.println(listInt); ArrayList<Person> personlist = new ArrayList<>(); personlist.add(new Person("AA",12)); personlist.add(new Person("BB",9)); personlist.add(new Person("CC",82)); System.out.println(personlist); Collections.sort(personlist); System.out.println(personlist); } }
结果:
[A, tt, b, uu, B] [A, B, b, tt, uu] [A, B, b, tt, uu] [22, 21, 12, 42] [12, 21, 22, 42] [Person{name='AA', age=12}, Person{name='BB', age=9}, Person{name='CC', age=82}] [Person{name='BB', age=9}, Person{name='AA', age=12}, Person{name='CC', age=82}]
其中Person类:
package quan.kebvian; public class Person implements Comparable<Person> { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = 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; } @Override public int compareTo(Person o) { // return 0;表示元素都是相同的 // 自定义比较的规则,比较两个人的年龄 // return .getAge() - this.getAge();//年龄降序序排序 return this.getAge() - o.getAge();//年龄升序排序 } }
Comparator和Comparable的区别
/* Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较规则 Comparator: 相当于找一个第三方的裁判,比较两个 Comparator 的排序规则 o1 -o2 升序 */
public class Comparator { public static void main(String[] args) { ArrayList<Integer> listInt = new ArrayList<>(); listInt.add(22); listInt.add(21); listInt.add(12); listInt.add(42); System.out.println(listInt); Collections.sort(listInt, new java.util.Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2; } }); System.out.println(listInt); System.out.println("@@@@@@@@@@@@@@@@@"); ArrayList<Person> personlist = new ArrayList<>(); personlist.add(new Person("AA",12)); personlist.add(new Person("BB",90)); personlist.add(new Person("CC",12)); personlist.add(new Person("DD",9)); System.out.println(personlist); Collections.sort(personlist, new java.util.Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return o1.getAge() - o2.getAge(); } }); System.out.println(personlist); Collections.sort(personlist, new java.util.Comparator<Person>() { @Override public int compare(Person o1, Person o2) { int re = o1.getAge() - o2.getAge(); // 如果两个人的年龄相同,再使用姓名的首字母比较 if (re == 0){ re = o1.getName().charAt(0) -o2.getName().charAt(0); } return re; } }); System.out.println(personlist); } } [22, 21, 12, 42] [12, 21, 22, 42] @@@@@@@@@@@@@@@@@ [Person{name='AA', age=12}, Person{name='BB', age=90}, Person{name='CC', age=12}, Person{name='DD', age=9}] [Person{name='DD', age=9}, Person{name='AA', age=12}, Person{name='CC', age=12}, Person{name='BB', age=90}] [Person{name='DD', age=9}, Person{name='AA', age=12}, Person{name='CC', age=12}, Person{name='BB', age=90}]

浙公网安备 33010602011771号