集合类的由来:
对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定,就使用集合容器进行存储。

集合特点:
1,用于存储对象的容器。
2,集合的长度是可变的。
3,集合中不可以存储基本数据类型值。

集合容器因为内部的数据结构不同,有多种具体容器。
不断的向上抽取,就形成了集合框架。

框架的顶层Collection接口:java.util

Collection的常见方法:

1,添加。
boolean add(Object obj):

boolean addAll(Collection coll):

2,删除。
boolean remove(object obj):
boolean removeAll(Collection coll);
void clear();

3,判断:
boolean contains(object obj):
boolean containsAll(Colllection coll);
boolean isEmpty():判断集合中是否有元素。

  1. package cn.itcast.p3.collection.demo;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collection;
  5.  
  6. public class CollectionDemo {
  7.  
  8. public static void main(String[] args) {
  9. Collection coll = new ArrayList();
  10.  
  11. show(coll);
  12.  
  13. }
  14.  
  15. public static void show(Collection coll){
  16.  
  17. //1,添加元素。add.
  18. coll.add("abc1");
  19. coll.add("abc2");
  20. coll.add("abc3");
  21. System.out.println(coll);
  22.  
  23. //2,删除元素。remove
  24. // coll.remove("abc2");//会改变集合的长度
  25.  
  26. //清空集合.
  27. // coll.clear();
  28.  
  29. System.out.println(coll.contains("abc3"));
  30.  
  31. System.out.println(coll);
  32.  
  33. }
  34.  
  35. }
  1. package cn.itcast.p3.collection.demo;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collection;
  5.  
  6. public class CollectionDemo {
  7.  
  8. /**
  9. * @param args
  10. */
  11. public static void main(String[] args) {
  12. Collection coll = new ArrayList();
  13.  
  14. Collection c1 = new ArrayList();
  15. Collection c2 = new ArrayList();
  16. show(c1,c2);
  17.  
  18. }
  19.  
  20. public static void show(Collection c1,Collection c2){
  21.  
  22. //给c1添加元素。
  23. c1.add("abc1");
  24. c1.add("abc2");
  25. c1.add("abc3");
  26. c1.add("abc4");
  27.  
  28. //给c2添加元素。
  29. c2.add("abc1");
  30. c2.add("abc2");
  31. c2.add("abc3");
  32. c2.add("abc4");
  33. c2.add("abc5");
  34.  
  35. System.out.println("c1:"+c1);
  36. System.out.println("c2:"+c2);
  37.  
  38. //演示addAll
  39.  
  40. // c1.addAll(c2);//将c2中的元素添加到c1中。
  41.  
  42. //演示removeAll
  43. // boolean b = c1.removeAll(c2);//将两个集合中的相同元素从调用removeAll的集合中删除。
  44. // System.out.println("removeAll:"+b);
  45.  
  46. //演示containsAll
  47. // boolean b = c1.containsAll(c2);
  48. // System.out.println("containsAll:"+b);
  49.  
  50. //演示retainAll
  51. boolean b = c1.retainAll(c2);//取交集,保留和指定的集合相同的元素,而删除不同的元素。
  52. //和removeAll功能相反 。
  53. System.out.println("retainAll:"+b);
  54. System.out.println("c1:"+c1);
  55. }
  56. }

4,获取:
int size():
Iterator iterator():取出元素的方式:迭代器。
该对象必须依赖于具体容器,因为每一个容器的数据结构都不同。
所以该迭代器对象是在容器中进行内部实现的。
对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,
也就是iterator方法。

Iterator接口就是对所有的Collection容器进行元素取出的公共接口。
其实就是抓娃娃游戏机中的夹子!

  1. package cn.itcast.p3.collection.demo;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collection;
  5. import java.util.Iterator;
  6.  
  7. public class IteratorDemo {
  8. public static void main(String[] args) {
  9.  
  10. Collection coll = new ArrayList();
  11. coll.add("abc1");
  12. coll.add("abc2");
  13. coll.add("abc3");
  14. coll.add("abc4");
  15.  
  16. // System.out.println(coll);
  17.  
  18. //使用了Collection中的iterator()方法。 调用集合中的迭代器方法,是为了获取集合中的迭代器对象。
  19. // Iterator it = coll.iterator();
  20. // while(it.hasNext()){
  21. // System.out.println(it.next());
  22. // }
  23.  
  24. for(Iterator it = coll.iterator(); it.hasNext(); ){
  25. System.out.println(it.next());
  26. }
  27. }
  28. }

5,其他:
boolean retainAll(Collection coll);取交集。
Object[] toArray():将集合转成数组。

-------------------------------
Collection
|--List:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。
|--Set:元素不能重复,无序。

List:特有的常见方法:有一个共性特点就是都可以操作角标。

1,添加
void add(index,element);
void add(index,collection);

2,删除;
Object remove(index):

3,修改:
Object set(index,element);

4,获取:
Object get(index);
int indexOf(object);
int lastIndexOf(object);
List subList(from,to);

list集合是可以完成对元素的增删改查。

  1. package cn.itcast.p4.list.demo;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4.  
  5. public class ListDemo {
  6. public static void main(String[] args) {
  7. List list = new ArrayList();
  8. show(list);
  9. }
  10. public static void show(List list) {
  11. //添加元素
  12. list.add("abc1");
  13. list.add("abc2");
  14. list.add("abc3");
  15. System.out.println(list);
  16.  
  17. //插入元素。
  18. // list.add(1,"abc9");
  19. //删除元素。
  20. // System.out.println("remove:"+list.remove(2));
  21. //修改元素。
  22. // System.out.println("set:"+list.set(1, "abc8"));
  23. //获取元素。
  24. // System.out.println("get:"+list.get(0));
  25. //获取子列表。
  26. // System.out.println("sublist:"+list.subList(1, 2));
  27. System.out.println(list);
  28. }
  29. }
  1. package cn.itcast.p4.list.demo;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Iterator;
  5. import java.util.List;
  6. import java.util.ListIterator;
  7.  
  8. public class ListDemo2 {
  9.  
  10. /**
  11. * @param args
  12. */
  13. public static void main(String[] args) {
  14.  
  15. List list = new ArrayList();
  16. show(list);
  17. }
  18. public static void show(List list) {
  19.  
  20. list.add("abc1");
  21. list.add("abc2");
  22. list.add("abc3");
  23. list.add("abc4");
  24.  
  25. Iterator it = list.iterator();
  26. while(it.hasNext()){
  27. System.out.println("next:"+it.next());
  28. }
  29. //list特有的取出元素的方式之一。
  30.  
  31. for(int x=0; x<list.size(); x++){
  32. System.out.println("get:"+list.get(x));
  33. }
  34. }
  35. }
  1. public class ListDemo2 {
  2.  
  3. public static void main(String[] args) {
  4.  
  5. List list = new ArrayList();
  6.  
  7. list.add("abc1");
  8. list.add("abc2");
  9. list.add("abc3");
  10.  
  11. System.out.println("list:"+list);
  12. //Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作。
  13. ListIterator it = list.listIterator();
  14. //获取列表迭代器对象
  15. //它可以实现在迭代过程中完成对元素的增删改查。
  16. //注意:只有list集合具备该迭代功能.
  17.  
  18. while(it.hasNext()){
  19. Object obj = it.next();
  20. if(obj.equals("abc2")){
  21. it.set("abc9");
  22. }
  23. }
  24. // System.out.println("hasNext:"+it.hasNext());
  25. // System.out.println("hasPrevious:"+it.hasPrevious());
  26.  
  27. //逆向遍历
  28. while(it.hasPrevious()){
  29. System.out.println("previous:"+it.previous());
  30. }
  31. System.out.println("list:"+list);
  32.  
  33. }

List:
|--Vector:内部是数组数据结构,是同步的。增删,查询都很慢!(不用了)
|--ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询的速度快。
|--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。

Vector举例:

  1. public class VectorDemo {
  2. public static void main(String[] args) {
  3. Vector v = new Vector();
  4. v.addElement("abc1");
  5. v.addElement("abc2");
  6. v.addElement("abc3");
  7. v.addElement("abc4");
  8. Enumeration en = v.elements();
  9. while(en.hasMoreElements()){
  10. System.out.println("nextelment:"+en.nextElement());
  11. }
  12. //Enumeration接口与Iterator接口功能是重复的。
  13. Iterator it = v.iterator();
  14. while(it.hasNext()){
  15. System.out.println("next:"+it.next());
  16. }
  17. }
  18. }

LinkedList举例:查api

  1. public class LinkedListDemo {
  2. public static void main(String[] args) {
  3.  
  4. LinkedList link = new LinkedList();
  5. link.addFirst("abc1");
  6. link.addFirst("abc2");
  7. link.addFirst("abc3");
  8. link.addFirst("abc4");
  9. // System.out.println(link);
  10. // System.out.println(link.getFirst());//获取第一个但不删除。
  11. // System.out.println(link.getFirst());
  12.  
  13. // System.out.println(link.removeFirst());//获取元素但是会删除。
  14. // System.out.println(link.removeFirst());
  15. while(!link.isEmpty()){
  16. System.out.println(link.removeLast());
  17. }
  18.  
  19. System.out.println(link);
  20. // Iterator it = link.iterator();
  21. // while(it.hasNext()){
  22. // System.out.println(it.next());
  23. // }
  24. }
  25. }

ArrayList示例:

  1. public class ArrayListTest {
  2. public static void main(String[] args) {
  3. Person p1 = new Person("lisi1",21);
  4. ArrayList al = new ArrayList();
  5. al.add(p1);
  6. al.add(new Person("lisi2",22));
  7. al.add(new Person("lisi3",23));
  8. al.add(new Person("lisi4",24));
  9. Iterator it = al.iterator();
  10. while(it.hasNext()){
  11. Person p = (Person) it.next();
  12. System.out.println(p.getName()+"--"+p.getAge());
  13. }
  14. }
  15. }

Set:

元素不可以重复,是无序。
Set接口中的方法和Collection一致。
|--HashSet: 内部数据结构是哈希表 ,是不同步的。
如何保证该集合的元素唯一性呢?
是通过对象的hashCode和equals方法来完成对象唯一性的。
如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。
如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。
如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。

记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。
一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。
建立对象判断是否相同的依据。

示例:

  1. package cn.itcast.p.bean;
  2.  
  3. public class Person extends Object{
  4. private String name;
  5. private int age;
  6. public Person() {
  7. super();
  8.  
  9. }
  10. public Person(String name, int age) {
  11. super();
  12. this.name = name;
  13. this.age = age;
  14. }
  15.  
  16. @Override
  17. public int hashCode() {
  18. // System.out.println(this+".......hashCode");
  19. return name.hashCode()+age*27;
  20. }
  21. @Override
  22. public boolean equals(Object obj) {
  23.  
  24. if(this == obj)
  25. return true;
  26. if(!(obj instanceof Person))
  27. throw new ClassCastException("类型错误");
  28. // System.out.println(this+"....equals....."+obj);
  29. Person p = (Person)obj;
  30. return this.name.equals(p.name) && this.age == p.age;
  31. }
  32. public String getName() {
  33. return name;
  34. }
  35. public void setName(String name) {
  36. this.name = name;
  37. }
  38. public int getAge() {
  39. return age;
  40. }
  41. public void setAge(int age) {
  42. this.age = age;
  43. }
  44. public String toString(){
  45. return name+":"+age;
  46. }
  47. }
  1. package cn.itcast.p4.hashset.test;
  2. import java.util.HashSet;
  3. import java.util.Iterator;
  4. import cn.itcast.p.bean.Person;
  5. /*
  6. * 往hashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人。视为相同元素。
  7. */
  8. public class HashSetTest {
  9. public static void main(String[] args) {
  10. HashSet hs = new HashSet();
  11. /*
  12. * HashSet集合数据结构是哈希表,所以存储元素的时候,
  13. * 使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。
  14. *
  15. */
  16. hs.add(new Person("lisi4",24));
  17. hs.add(new Person("lisi7",27));
  18. hs.add(new Person("lisi1",21));
  19. hs.add(new Person("lisi9",29));
  20. hs.add(new Person("lisi7",27));
  21. Iterator it = hs.iterator();
  22. while(it.hasNext()){
  23. Person p = (Person)it.next();
  24. System.out.println(p);
  25. // System.out.println(p.getName()+"...."+p.getAge());
  26. }
  27. }
  28. }

有序还唯一用子类:LinkedHashSet

|--TreeSet:可以对Set集合中的元素进行排序。是不同步的。
判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。

TreeSet对元素进行排序的方式一
让元素自身具备比较功能,元就需要实现Comparable接口。覆盖compareTo方法。

  1. package cn.itcast.p.bean;
  2. public class Person implements Comparable {
  3. private String name;
  4. private int age;
  5. public Person() {
  6. super();
  7. }
  8. public Person(String name, int age) {
  9. super();
  10. this.name = name;
  11. this.age = age;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public int getAge() {
  20. return age;
  21. }
  22. public void setAge(int age) {
  23. this.age = age;
  24. }
  25. public String toString(){
  26. return name+":"+age;
  27. }
  28. @Override
  29. public int compareTo(Object o) {
  30.  
  31. Person p = (Person)o;
  32. //按年龄排序
  33. int temp = this.age-p.age;
  34. return temp==0?this.name.compareTo(p.name):temp;
  35. //按姓名排序
  36. // int temp = this.name.compareTo(p.name);
  37. // return temp==0?this.age-p.age:temp;
  38.  
  39. }
  40. }
  1. package cn.itcast.p5.treeset.demo;
  2. import java.util.Iterator;
  3. import java.util.TreeSet;
  4. import cn.itcast.p.bean.Person;
  5. public class TreeSetDemo {
  6. public static void main(String[] args) {
  7. TreeSet ts = new TreeSet();
  8. ts.add(new Person("zhangsan",28));
  9. ts.add(new Person("lisi",21));
  10. ts.add(new Person("zhouqi",29));
  11. ts.add(new Person("zhaoliu",25));
  12. ts.add(new Person("wangu",24));
  13. Iterator it = ts.iterator();
  14. while(it.hasNext()){
  15. Person p = (Person)it.next();
  16. System.out.println(p.getName()+":"+p.getAge());
  17. }
  18.  
  19. }
  20. }

如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。怎么办?
可以使用TreeSet集合第二种排序方式二:(常用)
让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。
将该类对象作为参数传递给TreeSet集合的构造函数。

  1. package cn.itcast.p5.comparator;
  2. import java.util.Comparator;
  3. import cn.itcast.p.bean.Person;
  4. /**
  5. * 创建了一个根据Person类的name进行排序的比较器。
  6. */
  7. public class ComparatorByName implements Comparator {
  8. @Override
  9. public int compare(Object o1, Object o2) {
  10. Person p1 = (Person)o1;
  11. Person p2 = (Person)o2;
  12. int temp = p1.getName().compareTo(p2.getName());
  13. return temp==0?p1.getAge()-p2.getAge(): temp;
  14. }
  15. }
  1. package cn.itcast.p5.treeset.demo;
  2. import java.util.Iterator;
  3. import java.util.TreeSet;
  4. import cn.itcast.p.bean.Person;
  5. import cn.itcast.p5.comparator.ComparatorByName;
  6. public class TreeSetDemo {
  7. public static void main(String[] args) {
  8. TreeSet ts = new TreeSet(new ComparatorByName());
  9. /*
  10. * 以Person对象年龄进行从小到大的排序。
  11. *
  12. */
  13. ts.add(new Person("zhangsan",28));
  14. ts.add(new Person("lisi",21));
  15. ts.add(new Person("zhouqi",29));
  16. ts.add(new Person("zhaoliu",25));
  17. ts.add(new Person("wangu",24));
  18. Iterator it = ts.iterator();
  19. while(it.hasNext()){
  20. Person p = (Person)it.next();
  21. System.out.println(p.getName()+":"+p.getAge());
  22. }
  23. }
  24. }
  1. package cn.itcast.p5.comparator;
  2. import java.util.Comparator;
  3. public class ComparatorByLength implements Comparator {
  4. @Override
  5. public int compare(Object o1, Object o2) {
  6. String s1 = (String)o1;
  7. String s2 = (String)o2;
  8. int temp = s1.length()-s2.length();
  9. return temp==0? s1.compareTo(s2): temp;
  10. }
  11. }
  1. package cn.itcast.p5.treeset.test;
  2. import java.util.Iterator;
  3. import java.util.TreeSet;
  4. import cn.itcast.p5.comparator.ComparatorByLength;
  5. /*
  6. * 对字符串进行长度排序。
  7. *
  8. * "20 18 -1 89 2 67"
  9. */
  10. public class TreeSetTest {
  11. public static void main(String[] args) {
  12. TreeSet ts = new TreeSet(new ComparatorByLength());
  13. ts.add("aaaaa");
  14. ts.add("zz");
  15. ts.add("nbaq");
  16. ts.add("cba");
  17. ts.add("abc");
  18. Iterator it = ts.iterator();
  19. while(it.hasNext()){
  20. System.out.println(it.next());
  21. }
  22. }
  23. }

if(this.hashCode()== obj.hashCode() && this.equals(obj))

哈希表确定元素是否相同
1,判断的是两个元素的哈希值是否相同。
如果相同,在判断两个对象的内容是否相同。

2,判断哈希值相同,其实判断的是对象的hashCode的方法。判断内容相同,用的是equals方法。

注意:如果哈希值不同,是不需要判断equals。

完毕..

java学习——集合框架(Collection,List,Set)的更多相关文章

  1. Java自学-集合框架 Collection

    Java集合框架 Collection Collection是一个接口 步骤 1 : Collection Collection是 Set List Queue和 Deque的接口 Queue: 先进 ...

  2. Java学习----集合框架总结

    集合框架总结: Collection接口: Set接口: HashSet//对象必须实现hashCode方法,元素没有顺序呢,效率比LinkedHashSet高 LinkedHashSet//是Has ...

  3. Java学习——集合框架【4】

    一.集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个层次. 实 ...

  4. 【转】Java学习---集合框架那些事

    [原文]https://www.toutiao.com/i6593220692525711885/ Arraylist 与 LinkedList 异同 1. 是否保证线程安全: ArrayList 和 ...

  5. [Java复习] 集合框架 Collection

    Q1 Collection java的集合以及集合之间的继承关系? 数组和链表的区别? 固定长度,连续内存,不能扩展,随机访问快,插入删除慢.链表相反 List, Set, Map的区别? List, ...

  6. java学习——集合框架(泛型,Map)

    泛型: ... Map:一次添加一对元素.Collection 一次添加一个元素. Map也称为双列集合,Collection集合称为单列集合. 其实map集合中存储的就是键值对. map集合中必须保 ...

  7. 理解java集合——集合框架 Collection、Map

    1.概述: @white Java集合就像一种容器,可以把多个对象(实际上是对象的引用,但习惯上都称对象)"丢进"该容器中. 2.Java集合大致可以分4类: @white Set ...

  8. Java集合框架Collection

    转自:http://www.cdtarena.com/javapx/201306/8891.html [plain] view plaincopyprint?01.在 Java2中,有一套设计优良的接 ...

  9. Java中的集合框架-Collection(二)

    上一篇<Java中的集合框架-Collection(一)>把Java集合框架中的Collection与List及其常用实现类的功能大致记录了一下,本篇接着记录Collection的另一个子 ...

随机推荐

  1. springboot工程读取配置文件application.yml的写法

    现在流行springboot框架的项目,里面的默认配置文件为application.yml,我们怎样读取这个配置文件呢? 先贴上我得配置文件吧 目录结构 里面内容 1 写读取配置文件的工具类 @Con ...

  2. What qualities characterize a great PhD student

    省理工计算机教授David Karger接触了许多世界上最杰出的博士生,近日总结出了优秀博士通常具备的五点品质:0 过人的智力 1 好奇心 2 创造力 3 纪律性与生产力 4 与观众沟通 5 与伙伴沟 ...

  3. 玩了一下SDN:MININET+FLOODLIGHT,感觉这确实是一个趋势啊

    功能用增加中间层的方案来解决. 仿佛回到用交换机和路由器模拟器的感觉. 遇到执行命令小问题,狗哥搞定: mininet>mininet> dpctl dump-flows tcp:127. ...

  4. 主席树套树状数组 动态区间第k小

    先打上代码以后更新解释 #include <cstdio> #include <iostream> #include <algorithm> #include &l ...

  5. C语言中for循环的使用

    for循环的作用: 注意:要主要满足条件一和二后是先执行语句,后再执行条件三. 简单重复的输出 for(int i=0:i<10;i++){ printf("对一句话简单重复输出输出1 ...

  6. 【索引】gtest学习笔记

    下载gtest 链接:http://www.cnblogs.com/duxiuxing/p/4270804.html gtest官方文档浅析 链接:http://www.cnblogs.com/dux ...

  7. UVAlive4287 Proving Equivalences(scc)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=10294 [思路] 强连通分量. 求出bcc后,缩点形成DAG,设D ...

  8. 高性能web系统的架构和系统优化

    07年毕业一直都在软件公司,14年来到一个互联网公司,给我的感受,区别主要在于: 软件公司需求相对稳定,能够按照计划按部就班的去实施,互联网公司需求相对来说不稳定,上线比较着急,大部分都是小迭代更新, ...

  9. puppet常用调试命令

    yum快速部署puppet测试环境(C/S端) rpm -ivh  http://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm yum r ...

  10. CSS里的 no-repeat 是什么意思

    CSS里的 no-repeat是针对背景图片来说的.当你设置了no-repeat这个属性后,你的背景图片将不会被重复,再换一种说法,你在网站上所看到的背景图片就是你所添加的图片, 不会出现平铺或者重复 ...