黑马程序员五、集合框架Collection
来源:互联网 发布:linux 打开一个目录 编辑:程序博客网 时间:2024/04/30 12:25
---------------------- android培训、java培训、期待与您交流! ----------------------
Collection
|-- Set : 元素是无序,元素不可以重复。
|-- HashSet: 底层数据结构是哈希表。线程是非同步的。
| -- TreeSet : 可以对Set集合中的元素进行排序。
Set集合的功能和Collection是一致的。无序的(存入和取出的顺序不一定一致),不可重复。
一、HashSetpublic static void main(String[] args)
{
HashSet hs = new HashSet();
hs.add("java01");
hs.add("java02");
hs.add("java03");
hs.add("java04");
Iterator it = hs.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
运行结果:java04 // 存储的地址不同,按地址存储,所以排列是无序的。
java02 // HashSet的底层是通过HashMap来实现存储的,
java03
java01
HashSet是如何保证元素的唯一性?
是通过元素的两个方法,hashCode和equals来完成的。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的HashCode不同,不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的Hashcode和equals方法。
二、TreeSet底层数据结构是二叉树,保证元素唯一性的依据。
而TreeSet的底层又是通过TreeMap来实现存储的,而且HashSet和TreeSet中的元素都是以Key值存储的,这也是HashSet和TreeSet的元素不能重复的原因。
TreeSet排序的第一种方式:让元素具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。也称为元素的自然顺序,或默认顺序。
import java.util.*;
/*
需求:往TreeSet集合中存储自定义对象学生。
按照学生的年龄进行排序。
*/
publicclass TreeSetDemo {
publicstaticvoid main(String[] args){
TreeSetts = newTreeSet();
ts.add(new Student("lisi02",22));
ts.add(new Student("lisi07",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi08",19));
Iteratorit = ts.iterator();
while(it.hasNext())
{
Studentstu = (Student)it.next();
System.out.println(stu.getName()+"..."+stu.getAge());
}
}
}
class StudentimplementsComparable//该接口强制让学生具备比较性。
{
private Stringname;
privateintage;
Student(Stringname,int age)
{
this.name = name;
this.age = age;
}
publicint compareTo(Objectobj)
{
if(!(objinstanceof Student))
thrownew RuntimeException("不是学生对象");
Students = (Student)obj;
System.out.println(this.name+"...compareto..."+s.name);
if(this.age>s.age)
return 1;
if(this.age==s.age)
{
returnthis.name.compareTo(s.name);
}
return -1;
}
publicString getName()
{
returnname;
}
publicint getAge()
{
returnage;
}
}
运行结果:lisi08...19lisi09...19
lisi07...20
lisi02...22
TreeSet的第二种排序方式,当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。
import java.util.*;
/*
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
当两种排序都存在时,以比较器为主。
定义一个类,实现Comparator接口,覆盖compare。
*/
class StudentimplementsComparable
{
private Stringname;
privateintage;
Student(Stringname,int age)
{
this.name = name;
this.age = age;
}
publicint compareTo(Objectobj)
{
if(!(objinstanceof Student))
thrownew RuntimeException("不是学生对象");
Students = (Student)obj;
if(this.age>s.age)
return 1;
if(this.age==s.age)
{
returnthis.name.compareTo(s.name);
}
return -1;
}
publicString getName()
{
returnname;
}
publicint getAge()
{
returnage;
}
}
publicclass TreeSetDemo2 {
publicstaticvoid main(String[] args){
TreeSetts = newTreeSet(new MyCompare());
ts.add(new Student("lisi02",22));
ts.add(new Student("lisi07",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi06",18));
Iteratorit = ts.iterator();
while(it.hasNext())
{
Studentstu = (Student)it.next();
System.out.println(stu.getName()+"..."+stu.getAge());
}
}
}
class MyCompare implements Comparator
{
public intcompare(object o1,object o2)
{
Students1 = (Student)o1;
Students2 = (Student)o2;
int num =s1.getName().compareTo(s2.getName());
if(num==0)
{
return new Integer(s1.getAge()).comparTo(new Integer(s2.getAge())));
}
}
}
Collection
|-- List :元素是有序的,元素可以重复。因为该集合体系有索引。
|-- ArrayList :底层的数据结构使用的是数组结构。线程不同步。
特点:查询速度很快。但增删稍慢。
|-- LinkedList : 底层使用的链表数据结构。
特点:增删速度很快,查询很慢。
|-- Vector :底层是数组数据结构。线程同步。被ArrayList替代了。
特有方法,凡是可以操作角标的方法都是该体系特有的方法。
增 add(index,element);
addAll(index,Collection);
删 remove(index);
改 set(index,element);
查 get(index);
subList(from,to);
listIterator();
一、ArrayList
ArrayList al= new ArrayList ();
//添加元素
al.add("java01");
al.add("java02");
al.add("java03"); //结果: [java01, java02, java03]
//在指定的位置添加元素
al.add(1,"java06"); //结果: [java01, java06, java02, java03]
//删除指定位置的元素
al.remove(2); // [java01, java06, java03]
//修改元素
al.set(2,"java05"); // [java01, java06, java05]
//通过角标获取元素
System.out.println(al.get(1)); // java06
List集合特有的迭代器,ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。
所以,在迭代时,只能用迭代器的方法操作元素,可是Iterator方法是有限的。只能对元素进行判断,取出,删除的操作。
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。该接口只能通过List集合的ListIterator方法获取。
如下:
ArrayList al= new ArrayList ();al.add("java01");
al.add("java02");
al.add("java03");
Iterator it = al.iterator();
while(it.hasNext()){
Object obj = it.next();
if(obj.equals("java02"))
it.remove();
System.out.print(" obj="+obj); // obj=java01 obj=java02 obj=java03
}
System.out.println(al); // 结果:[java01, java03]
二、LinkedList
LinkedList:特有方法:
addFirst(); //添加到列表第一个
addLast(); //添加到列表最后一个
getFirst();//get获取元素,但不删除元素。
getLast();
removeFirst();//remove获取元素,但元素被删除。
removeLast();
如果集合中没有元素,会出现NoSuchElementException异常。
在JDK1.6出现替代方法。
offerFirst();
offerLast();
peekFirst();获取元素,但不删除元素,如果集合中没有元素,会返回null。
peekLast();
pollFirst();获取元素,但是元素被删除,如果集合中没有元素,会返回null。
pollLast();
如:队列:先进先出
import java.util.LinkedList;
public class HeiMa {
public static void main(String[] args) {
DuiLie dl = new DuiLie();
dl.myAdd("java01");
dl.myAdd("java03");
dl.myAdd("java02");
while(!dl.isNull())
System.out.println(dl.myGet());
}
}
class DuiLie{
private LinkedList link;
DuiLie(){
link = new LinkedList();
}
public void myAdd(Object obj){
link.addFirst(obj);
}
public Object myGet(){
return link.removeLast();
}
public boolean isNull(){
return link.isEmpty();
}
}
枚举就是Vector特有的取出方式。枚举和迭代器很类似。
其实枚举和迭代器是一样的。
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima
- 黑马程序员五、集合框架Collection
- 黑马程序员--集合框架(collection)
- 黑马程序员--集合框架、Collection集合
- 黑马程序员--集合框架(Collection集合)
- 黑马程序员_集合框架 Collection
- 黑马程序员——集合框架-Collection
- 黑马程序员_集合框架Collection
- 黑马程序员_集合框架(Collection,Iterator)
- 黑马程序员-集合框架之Collection
- 黑马程序员-集合框架之Collection
- 【黑马程序员】java中----------Collection集合框架
- 黑马程序员 Java集合框架Collection
- 黑马程序员_集合框架Collection
- 黑马程序员-------集合框架Collection List
- 黑马程序员【Java集合框架(上)Collection】
- 黑马程序员_集合框架Collection
- 黑马程序员——集合框架Collection
- 黑马程序员——集合框架-Collection
- Eclipse源码阅读:Add Interfaces
- ubuntu -- SSH安装与启动
- 黑马程序员_JavaSE基础05 之 数组的操作 求最值 排序 折半查找
- html内嵌php函数的写法
- Event Blocks for Selection Screens
- 黑马程序员五、集合框架Collection
- ubuntu --jdk1.6 安装
- hdu 4123 Bob’s Race 树形DP + 单调队列
- uva 10148 - Advertisement
- windows 7热点
- 驱动模块的加载
- hibernateTemplate的9个常用方法
- 2011-01-08 19:49 Oracle数据导入导出imp/exp sp2-0734
- Oracle权限