黑马程序员--集合框架、Collection集合

来源:互联网 发布:桌面定时提醒软件 编辑:程序博客网 时间:2024/05/17 07:28

------- android培训、java培训、期待与您交流! ----------

第一节--集合框架

集合是什么?

集合是一种容器,可以用来存储对象。

在开发过程中需要创建很多对象,为了方便对众多的对象进行操作,按照面向对象的思想,java提供了容器对对象进行存储和操作,集合就是最常用的容器。

集合和数组有什么区别?

数组也是一种容器,和集合的区别:

1、数组长度是固定的,既可以存储基本数据也可以存储对象(其实是对象的引用)

2、集合长度是可变的,只能存储对象

开发过程中需要的对象个数是不确定的,所以最常用集合来存储

集合容器有很多种,是因为容器对数据的存储方式即底层数据结构不同,有各自的特点,但既然都是容器,就会有共性内容,将这些共性内容不断抽取并封装,就形成了集合体系。

 

第二节--Collection接口

 Collection是集合框架中的常用接口。其下有两个子接口:List,Set

       所属关系:

            Collection

                     |--List,集合中元素有序,可重复,因为有脚标

                     |--Set,集合中元素无序(存入和取出顺序不一定一致),不可重复

1、Collection接口中常用的操作

添加

        add(Object  obj); add方法的参数类型是Object。以便于接收任意类型对象。

删除

        remove(Object  obj);

        removeAll(另一集合);调用者只保留另一集合中没有的元素。

        clear();清空集合

判断

        contains(Object  obj);判断是否存在obj这个元素

        isEmpty();是否为空

获取集合长度

        size();

取交集

        retainAll(另一集合);调用者只保留两集合的共性元素。

/* * collection是存储对象的常用集合,他有两个子接口:list和set。 * collection接口中常用的方法 */public class CollectionDemo {public static void main(String[] args) {ArrayList arr = new ArrayList();//添加元素arr.add("java01");arr.add("java02");sop("添加"+arr);//删除元素arr.remove("java01");sop("删除"+arr);arr.clear();sop("清空"+arr);//判断sop(arr.isEmpty());sop(arr.contains("java02"));//获取sop(arr.size());//取交集:retainAll();}//封装打印功能public static void sop(Object obj){System.out.println(obj);}}

2、Iterator

/* * Iterator是取出集合元素的方式。 * 取出集合元素的功能一个函数无法完成,需要几个函数才能实现,将集合元素的取出 * 方式封装成对象,定义在集合内部,可以直接访问集合内部成员。取出方式就定义 * 成了集合类的内部类。 * 而集合中存储元素数据结构不同,那么取出动作细节也不同,但都有共性内容: * 判断和取出。将共性内容抽象出来,就有了Iterator接口。collection接口实现了 * Iterator接口,提供了获取迭代器对象的方法,iterator();所以collection接口的 * 子类都有迭代器。 * 迭代器中的方法: * hasNext();判断是否有下一个元素,有就返回真 * next();获取元素。每一次获取之前都要先判断 * remove();移除元素 * 迭代器的使用:取出集合ArrayList中元素 */public class IteratorDemo {public static void main(String[] args) {ArrayList arr = new ArrayList();arr.add("java01");arr.add("java02");arr.add("java03");//迭代方式一//Iterator iter = arr.iterator();//while(iter.hasNext())//迭代方式二//for(Iterator iter = arr.iterator();iter.hasNext();)//sop(iter.next());//List特有取出方式int x = 0;while(x<arr.size())sop(arr.get(x++));}public static void sop(Object obj){System.out.println(obj);}}

 

第三节--List接口

List中的元素有序的,可重复的,因为元素有脚标 

List接口常用子类

List

  |——ArrayList:底层是数组结构,线程不同步,查询快,增删慢

  |——LinkedList:底层是链表结构,线程不同步,增删快,查询慢

  |——Vector:底层是数组结构,线程同步,效率低,被ArrayList取代

1、List中特有的方法

add(index,element);在指定位置添加元素

addAll(index,Collection);在指定位置添加另一个集合的元素

 

remove(index);删除指定脚标的元素

 

set(index,element);更改指定脚标的元素

get(index);根据指定脚标获取元素

subList(from,to);获取脚标从from到to的子集合

listIterator();List特有的迭代器

int indexOf(obj):获取指定元素的位置。

ListIterator listIterator();获取listIterator

与操作脚标相关的方法都是List特有的方法

 

2、listItrator

/* * ListIterator是Iterator的子接口,List实现了这个接口。 * 在集合中使用迭代器取出元素时,不能同时用集合的方法对元素进行操作,因为会 * 发生并发操作异常。但Iterator中的方法只有判断获取和移除,没有添加,修改等 * 操作,ListIterator继承并扩展了Iterator接口的,提供了添加,修改等操作, * List实现了ListIterator接口。 * ListIterator特有的方法: * add(Object obj);添加 * set(Object obj):修改,将obj替换为next()或previous()获取的最后一个元素 * hasPrevious():判断前一个元素是否存在 * previous():获取前一个元素 * 演示ListIterator特有的方法 */public class ListIteratorDemo {public static void main(String[] args) {ArrayList<String> arr = new ArrayList();arr.add("java01");arr.add("java02");arr.add("java03");arr.add("java04");for(ListIterator<String> liter = arr.listIterator();liter.hasNext();){String s = liter.next();//next()默认方法返回值类型是Objectif(s.equals("java04")){liter.set("Hello World");liter.add("I Love You!");}}sop(arr);}public static void sop(Object obj){System.out.println(obj);}}

3LinkedList特有的方法

添加

addFirst();

addLast();

获取

getFirst();

getLast();

获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException

删除

removeFirst();

removeLast();

获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException

 

JDK1.6出现了替代方法。

添加

offerFirst();

offerLast();

获取

peekFirst();

peekLast();

获取元素,但不删除元素。如果集合中没有元素,会返回null

删除

pollFirst();

pollLast();

获取元素,但是元素被删除。如果集合中没有元素,会返回null

/*  *练习:使用LinkedList模拟堆栈和队列: * 堆栈:后进先出,进出为同一个口,像杯子 * 队列:先进先出,有进出两个口,像一个水管 */public class LinkedListDemo {public static void main(String[] args) {LinkedList link = new LinkedList();//从首位开始添加link.addFirst("java01");link.addFirst("java02");link.addFirst("java03");link.addFirst("java04");//stack(link);duilie(link);}//模拟队列,从末位开始移除public static void stack(LinkedList link){while(!link.isEmpty())sop(link.removeLast());}//模拟堆栈,从首位开始移除public static void duilie(LinkedList link){while(!link.isEmpty())sop(link.removeFirst());}public static void sop(Object obj){System.out.println(obj);}}

第四节--Set接口

 

Set中的元素是无序的(添加和取出的顺序不一定一致),不可以重复的

Set

 |——HashSet

 |——TreeSet

HashSet:

 底层为哈希表存储结构,线程不同步,按哈希值的大小排序。保证集合中元素

 唯一依据的是hashCode和equals()方法。先判断hashCode是否相等,若不等,则元素不同,若相等,再

使用equals方法判断对象是否相同。


<pre name="code" class="java">/* *练习:使用HashSet存储自定义对象 *思路:HashSet判断元素是否相同的依据是hashCode和equals方法 *       定义Person类,有姓名和年龄属性,姓名和年龄都一样视为同一人,复写Object *       的hashCode和equals方法,姓名的哈希值与年龄的和相等则元素的哈希值相等 *       姓名和年龄都相同,则为同一对象,即equals()方法为true,取出元素并打印 *  */public class HashSetDemo {public static void main(String[] args) {HashSet<Person> hset = new HashSet<Person>();//HashSet集合判断元素是否相同,底层依据的是hashCoad()和equals()hset.add(new Person("zhangsan",20));hset.add(new Person("wangsan",22));hset.add(new Person("lili",18));hset.add(new Person("zhangsan",20));getOut(hset);}//迭代式一定记得next()方法的返回值类型是Object!!!如果没使用泛型,一定记得转型!!!public static void getOut(HashSet<Person> hset){for(Iterator<Person> iter = hset.iterator();iter.hasNext();){Person p = iter.next();System.out.println("姓名:"+p.getName()+'\t'+"年龄:"+p.getAge());}}}class Person{private String name;private int age;Person(String name,int age){this.name = name;this.age = age;}//public void setName(String name){//this.name = name;//}//public void setAge(int age){//this.age = age;//}public String getName(){return name;}public int getAge(){return age;}public int hashCode(){return this.name.hashCode()+this.age;}public boolean equals(Object obj){if(!(obj instanceof Person))//equals方法参数是Object类型,所以先判断return false;Person p = (Person)obj;return this.name.equals(p.name)&&this.age==p.age;}}


TreeSet:

底层为二叉树存储结构,默认按字母排序,即自然顺序。保证集合中元素唯一的

依据是compareTo和return 0;

set集合的功能和collection一致

/* * TreeSet集合可以对元素进行排序,底层数据结构是二叉树 * 第一种排序方式:让元素自身具备比较性:元素自身实现comparable接口,复写comparaTo方法, * 定义比较规则,首要条件相同,比较次要条件。很多类实现了comparable接口,自身具备 * 比较性,例如String类。这种排序方式的结果叫自然顺序,或默认排序 * 练习:使用TreeSet存储自定义对象。 * 思路:定义Person类,有name和age属性。实现comparable接口,复写comparaTo方法,年龄为首要 * 比较条件,姓名为次要比较条件,姓名和年龄相同视为同一人。 */public class TreeSetDemo {public static void main(String[] args) {//TreeSet hs = new TreeSet(new myComparator());TreeSet hs = new TreeSet();hs.add(new Person01("xiaoming01",12));hs.add(new Person01("xiaoming02",23));hs.add(new Person01("xiaoming03",29));hs.add(new Person01("xiaoming04",19));hs.add(new Person01("xiaoming05",29));getOut(hs);}public static void getOut(TreeSet hs){for(Iterator iter = hs.iterator();iter.hasNext();){Person01 p = (Person01)iter.next();System.out.println("name:"+p.getName()+'\t'+"age:"+p.getAge());}}}class Person01 implements Comparable{private String name;private int age;Person01(String name,int age){this.name = name;this.age = age;}public String getName(){return name;}public int getAge(){return age;}@Overridepublic int compareTo(Object obj) {if(!(obj instanceof Person01))throw new RuntimeException("非人类对象");Person01 p = (Person01)obj;if(this.age > p.age)return 1;if(this.age == p.age){return (this.name).compareTo(p.name);}else return -1;}}/* * 第二种排序方式:让集合自身具备比较性。当元素自身不具备比较性,或者是元素自身的比较性 * 不是所需要的时候,可以让集合初始化时具备比较功能。具体做法是:定义一个类(比较器)实现 * comparator接口,复写其compara(o1,o2),创建比较器对象,作为实际参数传递给集合构造函数, * 是集合对象创建时具备比较器.o1,o2是集合中的元素 * 练习:将Person01类按姓名排序,姓名相同再按年龄排序 */class myComparator implements Comparator{@Overridepublic int compare(Object o1, Object o2) {Person01 p1 = (Person01)o1;Person01 p2 = (Person01)o2;int num = p1.getName().compareTo(p2.getName());if(num == 0){return (new Integer(p1.getAge()).compareTo(new Integer(p2.getAge())));//if(p1.getAge()>p2.getAge())//return 1;//else if(p1.getAge()<p2.getAge())//return -1;//else return 0;}return num;}}




0 0
原创粉丝点击