------- android培训、java培训、期待与您交流! ----------
一、集合类:
面向对象语言对事物的体现都是以对戏那个的形式,为了方便对多个对戏那个操作,就对对象进行存储,由于对象个数不确定,就引用集合进行存储。
二、集合特点:
1,用于存储对象的容器,不能存储基本数据类型
2,集合的长度是可变的。
3,集合中不可以存储基本数据类型值。
集合容器因为内部的数据结构不同,有多种具体容器。不断的向上抽取,就形成了集合框架。框架的顶层Collection接口:
三、Collection的常见方法:
1,添加。
boolean add(Object obj): 像集合中添加一个对象,添加成功返回true,否则false;
boolean addAll(Collection coll): 将给定集合的所有兑现添加进集合,添加成功返回true,否则false;
2,删除。
boolean remove(object obj): 操作成功,返回true,否则false;以下凡返回类型是boolean型的都同理。
boolean removeAll(Collection coll);
void clear(); 清空集合。
3,判断:
boolean contains(object obj): 判断集合中是否包含某个对象。
boolean containsAll(Colllection coll); 是否包含某个集合中的所有对象。
boolean isEmpty():判断集合中是否有元素。
4,获取:
int size(): 获取集合元素个数。
Iterator iterator():取出元素的方式:迭代器。
该对象必须依赖于具体容器,因为每一个容器的数据结构都不同。所以该迭代器对象是在容器中进行内部实现的。
对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,
也就是iterator方法。
Iterator接口就是对所有的Collection容器进行元素取出的公共接口。
5,其他:
boolean retainAll(Collection coll);取交集。
Object[] toArray():将集合转成数组。
Collection
|--List:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。
|--Set:元素不能重复,无序。
List:特有的常见方法:有一个共性特点就是都可以操作角标。
1,添加
void add(index,element); 将一个元素添加到集合的指定位置;
void add(index,collection); 将指定集合中的所有元素从指定位置开始添加到集合中。
2,删除;
Object remove(index):
Object set(index,element);
4,获取:
Object get(index);
int indexOf(object);
int lastIndexOf(object);
List subList(from,to);
list集合是可以完成对元素的增删改查。
四、List:
|--Vector:内部是数组数据结构,是同步的。增删,查询都很慢!
|--ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询的速度快。
|--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。
LinkedList:的常见方法
//添加
addFirst();
addLast()
//获取元素但不删除元素,如果集合中没有元素,则会NoSuchElementException异常
getFirst();
getLast();
//获取元素但元素被删除,如果集合中没有元素,则会NoSuchElementException异常
removeFirst();
removeLast();
JDK1.6 出现了替代方法:
offerFirst();
offerLast();
//获取元素但不删除元素,如果集合中没有元素,则返回null
peakFirst();
peakLast();
//获取元素但不删除元素,如果集合中没有元素,则返回null.
poolFirst();
poolLast();
ArrayList /LinkedList 的contains();remove()方法依赖的都是equals().
五、Set:元素不可以重复,是无序。
Set接口中的方法和Collection一致。
|--HashSet: 内部数据结构是哈希表 ,是不同步的。
如何保证该集合的元素唯一性呢?
是通过对象的hashCode和equals方法来完成对象唯一性的。
如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。
如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。
如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。
记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。
一般情况下,如果定义的类会产生很多对象通常都需要覆盖equals,hashCode
方法。
建立对象判断是否相同的依据。
|--TreeSet:可以对Set集合中的元素进行排序。是不同步的。
判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。
TreeSet对元素进行排序的方式一:
让元素自身具备比较功能,元就需要实现Comparable接口。覆盖compareTo方法。
如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。可以使用
TreeSet集合第二种排序方式二:
让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。
将该类对象作为参数传递给TreeSet集合的构造函数。
如果相同,再判断两个对象的内容是否相同。
判断哈希值相同,其实判断的是对象的hashCode的方法。判断内容相同,用的是equals方法。
注意:如果哈希值不同,是不需要判断equals。
import java.util.*;
/*
当元素自身不具备比较性,或者具备的比较性不是所需要的。
这时需要让容器自身具备比较性。
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
当两种排序都存在时,以比较器为主。
定义一个类,实现Comparator接口,覆盖compare方法。
*/
class Student implements Comparable//该接口强制让学生具备比较性。
{
private String name;
private int age;
Student(Stringname,int age)
{
this.name = name;
this.age = age;
}
public intcompareTo(Object obj)
{
//return 0;
if(!(objinstanceof Student))
throw newRuntimeException("不是学生对象");
Student s =(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;
/**/
}
public StringgetName()
{
return name;
}
public int getAge()
{
return age;
}
}
class TreeSetDemo2
{
public static voidmain(String[] args)
{
TreeSet ts = newTreeSet();
ts.add(newStudent("lisi02",22));
ts.add(newStudent("lisi02",21));
ts.add(newStudent("lisi007",20));
ts.add(newStudent("lisi09",19));
ts.add(newStudent("lisi06",18));
ts.add(newStudent("lisi06",18));
ts.add(newStudent("lisi007",29));
//ts.add(newStudent("lisi007",20));
//ts.add(newStudent("lisi01",40));
Iterator it =ts.iterator();
while(it.hasNext())
{
Student stu =(Student)it.next();
System.out.println(stu.getName()+"..."+stu.getAge());
}
}
}
class MyCompare implements Comparator
{
public intcompare(Object o1,Object o2)
{
Student s1 =(Student)o1;
Student s2 =(Student)o2;
int num =s1.getName().compareTo(s2.getName());
if(num==0)
{
return newInteger(s1.getAge()).compareTo(new Integer(s2.getAge()));
/*
if(s1.getAge()>s2.getAge())
return 1;
if(s1.getAge()==s2.getAge())
return 0;
return -1;
*/
}
return num;
}
}