------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、集合类Collection
为什么出现集合类?
面向对象语言对事物的体现都是一对象的形式,为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的,集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。
集合类的特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
Collection体系
|--List:里面的元素是有序的,元素可以重复,因为该体系有索引。
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度快。增删较慢。线程不同步。|--LinkedList:底层的数据结构使用的是链表结构。特点:查询较慢,增删较快。|--Vector:底层是数组数据结构。线程同步。
|--Set:里面的元素是无序的,元素不可以重复。
|--HashSet:底层结构是哈希表。|--TreeSet:
Collection的体系图示
List特有的迭代器,ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素因为会发生ConcurrentModificationException异常。所以在迭代器时,只能用迭代器的方法操作元素。但是Iterator方法时有限的。
如果想要其他的操作如添加、修改等,就需要使用其子接口,ListIterator。该接口只能通过List集合的ListIterator方法获取。
1.add方法的参数类型是Object,以便于接收任意类型对象。
2.集合中存储的都是对象的引用(地址)。
什么是迭代器呢?
其实就是集合的取出元素的方式。
迭代器的操作方式图示:
集合的使用示例:
import java.util.*; class CollectionDemo { public static void sop(Object obj) { System.out.println(obj); } public static void method() { //创建一个集合容器,使用Collection接口的子类,ArrayList ArrayList al = new ArrayList(); //1.添加元素 al.add("java1");//add(Object obj); al.add("java2"); al.add("java3"); al.add("java4"); //打印原集合 //sop(al); //2.获取个数,集合长度。 sop("长度:"+al.size()); //3.删除元素 al.remove("java2"); //al.clear();//清空集合 //4.判断元素 sop("判断集合包含元素:"+al.contains("java3")); sop("判断集合是否为空:"+al.isEmpty()); //打印改变后集合 //sop(al); } public static void method_2() { ArrayList al = new ArrayList(); al.add("java1"); al.add("java2"); al.add("java3"); al.add("java4"); ArrayList al2 = new ArrayList(); al2.add("java1"); al2.add("java2"); al2.add("java4"); al2.add("java5"); //al.retainAll(al2);//取交集,al中只会保留和al2中相同的元素 al.removeAll(al2);//去除相同的元素 sop("al"+al); sop("al2"+al2); } public static void method_get() { ArrayList al = new ArrayList(); al.add("java1"); al.add("java2"); al.add("java3"); al.add("java4"); Iterator it = al.iterator();//获取迭代器,用于取出集合中的对象 //sop(it.hasNext());//如果有元素返回true while(it.hasNext()) { sop(it.next()); } /* 用for循环实现可以节省内存 for(Iterator it=al.iterator; it.hasNext(); ) { sop(it.next()); } */ } public static void main(String[] args) { method(); method_2(); } }
二、ArrayList
特有方法,方式可以操作角标的方法都是该体系特有的方法。
增
add(index,element);addAll(index,Collection);
删
remove(index);
改
set(index,element)
查
get(index);subList(from,to);listIterator();
ArrayList的使用示例:
import java.util.* class ListDemo { public static void sop(Object obj) { System.out.println(obj); } public static void method() { ArrayList al =new ArrayList(); //添加元素 al.add("java1"); al.add("java2"); al.add("java3"); al.add("java4"); sop("原集合是:"+al); //在指定位置添加元素 al.add(1,"java0"); //删除指定位置元素 al.remove(2); //修改元素 al.set(2,"java0"); //通过角标获取元素 sop("角标1的元素为:"+al.get(1)); sop(al); //获取所有元素 for(int x=0; x<al.size();x++) { sop(al.get(x)); } Iterator it = al.iterator(); while(it.hasNext()) { sop("next:"+it.next()); } //通过indexOf获取对象的位置 sop("index="+al.indexOf("java2")); List sub = al.subList(1,3);//包含1,不包含3 sop("sub="+sub); } public static static void method_1() { ArrayList al =new ArrayList(); //添加元素 al.add("java1"); al.add("java2"); al.add("java3"); al.add("java4"); //在迭代过程中,准备添加或者删除元素 ListIterator li = al.ListIterator(); while(li.hasNext()) { Object obj = it.next(); if(obj.equals("java2")) li.add("java8"); // li.set("java7"); } //判断之后是否有元素 sop("hasNext:"+li.hasNext()); //判断之前是否有元素 sop("hasPrivious:"+li.hasPrivious()); } public static void main(String[] args) { method(); method_1(); } }
ArrayList练习:
import java.util.*; /* 需求:将自定义对象作为元素存到ArrayList集合中,并去除重复元素。 比如:存人对象,同姓名同年龄视为同一个人,为重复元素。 思路: 1.对人描述,将数据封装进入对象。 2.定义容器,将人存入。 3.取出对象。 */ class Person { private String name; private int age; Person(String name,int age) { this.name = name; this.age = age; } public boolean equals(Object obj) { if(!(obj instanceof Person)) return false; Person p = (Person)obj; // System.out.println(this.name+); return this.name.equals(p.name) && this.age == p.age; } public String getName() { return name; } public int getAge() { return age; } } class ArrayListTest { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[] args) { ArrayList al = new ArrayList(); al.add(new Person("小明",18)); al.add(new Person("小明",18)); al.add(new Person("小红",19)); al.add(new Person("小黑",20)); al.add(new Person("小白",21)); al = singleElements(al); Iterator it = al.iterator(); while(it.hasNext()) { Person p = (Person)it.next(); sop(p.getName()+":::"+p.getAge()); } } public static ArrayList singleElements(ArrayList al) { //定义一个临时容器 ArrayList newAl = new ArrayList(); Iterator it = al.iterator(); while(it.hasNext()) { Object obj = it.next(); if(!newAl.contains(obj)) newAl.add(obj); } return newAl; } }
三、LinkedList
操作方法:增:
addFirst();addLast();
查:
getFirst();getLast();
获取元素,但不删除元素,如果集合中没有元素,会出现NoSuchElementException异常。
删:
removeFirst();removeLast();获取元素,但是元素被删除,如果集合中没有元素,会出现NoSuchElementException异常。
在JDK1.6中出现了替代方法:
增:
offerFirst();offerLast();
查:
peekFirst();peekLast();
获取元素,不删除元素,如果集合中没有元素,会返回null。
删:
pollFirst();pollLast();获取元素,但是元素被删除,如果集合中没有元素,会返回null。
LinkedList使用示例:import java.util.*; class LinkedListDemo { public static void sop(Object obj) { System.out.println(obj); } public static void method() { LinkedList li = new LinkedList(); //增加元素 li.offerFirst("java111"); li.offerFirst("java222"); li.offerFirst("java333"); li.offerFirst("java444"); sop(li);//输出结果:[java444 java333 java222 java111] //获取元素 sop(li.peekFirst()); sop(li.peekLast()); //删除元素 sop(li.pollFirst()); sop(li.poll:Last()); } public static void main(String[] args) { method(); } }
LinkedList练习:
/* 需求:使用LinkedList模拟一个堆栈或者队列数据结构。 堆栈:先进后出 队列:先进先出 First in First out */ import java.util.*; class DuiLie { private LinkedList link; DuiLie() { link = new LinkedList(); } public void myAdd(Object obj) { link.offerFirst(obj); } public Object myGet() { return link.pollLast(obj); // return link.pollLast(obj); } public boolean isEmpty() { return link.isEmpty(); } } class LinkedListTest { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[] args) { DuiLie dl = new DuiLie(); dl.myAdd("java111"); dl.myAdd("java222"); dl.myAdd("java333"); dl.myAdd("java444"); while(!dl.isNull) { sop(dl.myGet()); } } }
四、Vector
枚举是Vector的特有取出方式。枚举和迭代器是一样的。迭代器取代了枚举。
Vector的使用示例:
import java.util.*; /* 枚举是Vector的特有取出方式。枚举和迭代器是一样的。迭代器取代了枚举。 */ class VectorDemo { public static void sop(Object obj) { System.out.println(obj); } public static void vector() { Vector v = new Vector(); a.add("java111"); a.add("java222"); a.add("java333"); a.add("java444"); Enumeration en = v.elements(); while(en.hasMoreElements()) { sop(en.nextElement()); } } public static void main(String[] args) { vector(); } }
三、set
set集合的功能和Collection是一致的。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成的。如果元素的hashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals。
注意:对于判断元素是否存在,以及删除等操作,依赖的方法都是元素的hashCode和equals来完成的。
HashSet练习:
import java.util.*; class Person { private String name; private int age; Person(String name,int age) { this.name = name; this.age = age; } public int hashCode() { return name.hashCode()+age*39;//返回不重复的哈希值 } public boolean equals(Object obj) { if(!(obj instanceof Person)) return false; Person p = (Person)obj; // System.out.println(this.name+); return this.name.equals(p.name) && this.age == p.age; } public String getName() { return name; } public int getAge() { return age; } } class ArrayListTest { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[] args) { HashSet hs = new HashSet(); hs.add(new Person("小明",18)); hs.add(new Person("小明",18)); hs.add(new Person("小红",19)); hs.add(new Person("小黑",20)); hs.add(new Person("小白",21)); Iterator it = hs.iterator(); while(it.hasNext()) { Person p = (Person)it.next(); sop(p.getName()+":::"+p.getAge()); } } }