黑马程序员---------集合

来源:互联网 发布:mac优盘装win7 编辑:程序博客网 时间:2024/06/06 17:52

             ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

一、集合的出现:

面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象常用的一种方式。

二、特点:

集合只用于存储对象,集合长度是可变的,集合可以储存不同类型的对象。

三、集合框架:

Collection(类)

     |--List(子类):元素是有序的,元素可以重复。因为该集合体系有索引。
            |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。

            |--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线不同步。
            |--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低  

     |--Set (子类):元素是无序(存入和取出的顺序不一定一致),元素不可以重复

            |--HashSet:数据结构是哈希表。线程是非同步的。

            |--TreeSet:可以对Set集合中的元素进行排序。

1,添加

 add(e);

 addAll(collection);

2,删除

 remove(e);

 removeAll(collection);

 clear();

3,判断。

 contains(e);

 isEmpty();

4,获取

 iterator();(迭代器)

 size();

5,获取交集。

 retainAll();

6,集合变数组。

 toArray();

迭代器:迭代器是取出方式,会直接访问集合中的元素。所以将迭代器通过内部类的形式来进行描述。通过容器的iterator()方法获取该内部类的对象。

迭代器方法:1、boolean hasNext();   2、next()

例题!

1、public static void method_get()

   {

ArrayList al = new ArrayList();


        //1,添加元素。

  al.add("java01");//add(Object obj);

al.add("java02");

  al.add("java03");

  al.add("java04");


/*

 Iterator it = al.iterator();//获取迭代器,用于取出集合中的元素。 

   while(it.hasNext())

  {

 sop(it.next());

 }

 */ 

 for(Iterator it = al.iterator(); it.hasNext() ; )

 {

 sop(it.next());

 }

    }

    2、public static void base_method()

      {

 //创建一个集合容器。使用Collection接口的子类。

ArrayList ArrayList al = new ArrayList(); 

 //1,添加元素。

 al.add("java01");//add(Object obj);

 al.add("java02");

 al.add("java03");

 al.add("java04"); 

 //打印原集合。

 sop("原集合:"+al);  

 //3,删除元素。

 //al.remove("java02");

 //al.clear();//清空集合。  

 //4,判断元素。

 sop("java03是否存在:"+al.contains("java03"));

 sop("集合是否为空?"+al.isEmpty());  

 //2,获取个数。集合长度。

 sop("size:"+al.size()); 

 //打印改变后的集合。

 sop(al); 

      }

3.1  List集合:除了继承Collection的方法外,还定义了自己特有的方法,凡是可以操作角标的方法都是该体系的特有方法。

List的特有方法:

     增  

add(index,element);

addAll(index,Collection);     

remove(index);     

set(index,element);    

get(index):

subList(from,to);

listIterator();

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

ListIterator listIterator();

注意:List集合特有的迭代器。ListIterator是Iterator的子接口在迭代时,不可以通过集合对象的方法操作集合中的元素,因为 会发生ConcurrentModificationException异常。所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限 的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator

3.2 ArrayList方法基本和List相同,举几个例子吧。

例题3、去除集合中的重复元素。

class ArrayListTest 

public static void sop(Object obj)

{

System.out.println(obj);

}

public static void main(String[] args) 

{

ArrayList al = new ArrayList(); 

al.add("java01");

al.add("java02");

al.add("java01");

al.add("java02");

al.add("java01");

//al.add("java03");  

/*

在迭代时循环中next调用一次,就要hasNext判断一次。

Iterator it = al.iterator(); 

while(it.hasNext())

{

sop(it.next()+"...."+it.next());

}

*/ 

System.out.println(al);

al = singleElement(al); 

System.out.println(al);  

public static ArrayList singleElement(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;

}

}

3.3 LinkList的特有方法

addFirst();

addLast(); 

getFirst();

getLast();

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

removeFirst();

removeLast();

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

JDK1.6出现了替代方法。 

offerFirst();

offerLast();  

peekFirst();

peekLast();

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

pollFirst();pollLast();

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


class LinkedListDemo 

{

public static void main(String[] args) 

{

LinkedList link = new LinkedList(); 

link.addLast("java01");

link.addLast("java02");

link.addLast("java03");

link.addLast("java04"); 

//sop(link);

//sop(link.getFirst());

//sop(link.getFirst());

//sop(link.getLast());

//sop(link.removeFirst());

//sop(link.removeFirst()); 

//sop("size="+link.size()); 

while(!link.isEmpty())

{

sop(link.removeLast());

public static void sop(Object obj)

{

System.out.println(obj);

}

}

/* 

---

java01

java02

java03

java04 

----

java04

java03

java02

java01

---

*/

3.4 Set集合和Collection集合功能是一致的,我们着重介绍他的俩个子类。

    HashSet:底层数据结构是哈希表。是线程不安全的。不同步。HashSet是如何保证元素唯一性的呢?是通过元素的两个方法,hashCode和equals来完成。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashcode值不同,不 会调用equals。


例题5 hashSet集合中存入自定对象,姓名和年龄相同为同一个人,重复元素。

class HashSetTest 

{

public static void sop(Object obj)

{

System.out.println(obj);

}

public static void main(String[] args) 

{

HashSet hs = new HashSet(); 

hs.add(new Person("a1",11));

hs.add(new Person("a2",12));

hs.add(new Person("a3",13));

//hs.add(new Person("a2",12));

//hs.add(new Person("a4",14)); 

//sop("a1:"+hs.contains(new Person("a2",12)));

//hs.remove(new Person("a4",13));  

Iterator it = hs.iterator(); 

while(it.hasNext())

{

Person p = (Person)it.next();

sop(p.getName()+"::"+p.getAge());

}

}

}

class Person

{

private String name;

private int age;

Person(String name,int age)

{

this.name = name;

this.age = age;

}

public int hashCode()

{

System.out.println(this.name+"....hashCode");

return name.hashCode()+age*37;

public boolean equals(Object obj)

if(!(obj instanceof Person))

return false; 

Person p = (Person)obj;

System.out.println(this.name+"...equals.."+p.name); 

return this.name.equals(p.name) && this.age == p.age;

public String getName()

{

return name;

}

public int getAge()

{

return age;

}

}

3.5 TreeSet

    可以对Set集合中的元素进行排序,底层数据结构是二叉树。保证元素唯一性的依据:compareTo方法return 0.TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。也种方式也成为元素的自然顺序,或者叫做默认顺序。    

TreeSet的第二种排序方式。当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。

当元素自身不具备比较性,或者具备的比较性不是所需要的。这时需要让容器自身具备比较性。定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。当两种排序都存在时,以比较器为主。定义一个类,实现Comparator接口,覆盖compare方法。


例题6 TreeSet集合中存储自定义对象学生。想按照学生的年龄进行排序。记住,排序时,当主要条件相同时,一定判断一下次要 条件。

class TreeSetDemo 

{

public static void main(String[] args) 

{

TreeSet ts = new TreeSet(); 

ts.add(new Student("lisi02",22));

ts.add(new Student("lisi007",20));

ts.add(new Student("lisi09",19));

ts.add(new Student("lisi08",19));

//ts.add(new Student("lisi007",20));

//ts.add(new Student("lisi01",40)); 

Iterator it = ts.iterator();

while(it.hasNext())

{

Student stu = (Student)it.next();

System.out.println(stu.getName()+"..."+stu.getAge());

}

}

}  

class Student implements Comparable//该接口强制让学生具备比较性。

{

private String name;

private int age; 

Student(String name,int age)

{

this.name = name;

this.age = age;

public int compareTo(Object obj)

//return 0;

if(!(obj instanceof Student))

throw new RuntimeException("不是学生对象");

Student s = (Student)obj; 

System.out.println(this.name+"....compareto....."+s.name);

if(this.age>s.age)

return 1;

if(this.age==s.age)

{

return this.name.compareTo(s.name);

}

return -1;

public String getName()

{

return name; 

}

public int getAge()

{

return age;

}

}



0 0
原创粉丝点击