——- android培训、java培训、期待与您交流! ———-
每个人都离不开集体,人以群分,就好比一个个集合,我们都是其中的一个子类,继承父类并有自己的个性。我热爱我的热爱,并将继续坚持我的热爱,我会是那匹黑马。
一、集合综述
所有集合类都位于java.util包下。集合中只能保存对象(保存对象的引用变量)。(数组既可以保存基本类型的数据也可以保存对象)。
当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进行处理。从JDK1.5以后,这种状态得到了改进:可以使用泛型来限制集合里元素的类型,并让集合记住所有集合元素的类型(参见具体泛型的内容)。
Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类。
Collection中定义了集合框架的共性功能:
Collection定义了集合框架的共性功能。
1,添加:add(e);addAll(collection);
2,删除:remove(e);removeAll(collection);clear();
3,判断:contains(e);isEmpty();
4,获取:iterator();size();
5,获取交集:retainAll();
6,集合变数组:toArray();
Set和List接口是Collection接口派生的两个子接口。
Map实现类用于保存具有映射关系的数据(key-value)。
Set、List和Map可以看做集合的三大类。
List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是不能集合里元素不允许重复的原因)。
Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。
对于Set、List和Map三种集合,最常用的实现类分别是HashSet、ArrayList和HashMap三个实现类
二、List
1、List综述
元素是有序的,元素可以重复。因为该集合体系有索引。
ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢
LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢。
Vector:底层是数组数据结构。线程同步,被ArrayList替代。枚举名称以及方法的的名称过长。
2、程序解读
class
CollectionDemo
{
public static void main(String[] args)
{
method_get();
}
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());
}
}
public static void vectorDemo()
{
Vector v = new Vector();
v.add("java01");
v.add("java02");
v.add("java03");
v.add("java04");
Enumeration en = v.elements();
while(en.hasMoreElements())
{
System.out.println(en.nextElement());
}
}
/*
LinkedList:特有方法
getFirst();
getLast();
removeFirst();
removeLast();
*/
public static void linkedListDemo()
{
LinkedList link = new LinkedList();
link.addLast("java01");
link.addLast("java02");
link.addLast("java03");
sop(link.getFirst());
sop(link.getLast());
sop(link);
sop("size="+link.size());
sop(link.removeFirst());
sop("size="+link.size());
}
/*
堆栈:先进后出,如同一个杯子
队列:先进先出,如同一个水管
*/
public static void sop(Object obj)
{
System.out.println(obj);
}
}
三、Set
1,Set综述
Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
HashSet:底层数据结构是哈希表,线程是非同步的。
HashSet是如何保证元素唯一性的呢?是通过hashCode和equals来完成的,如果元素的HashCode值相同,才会判断equals是否为true;HashCode值不同时,不会调用equals;
对于判断元素是否存在、以及删除等操作,依赖的方法是元素的HashCode和equals方法。
TreeSet: set集合的功能和collection 功能是一致的。可以对set集合中的元素排序。底层数据结构是二叉树;保证元素的唯一性的依据:compareTo 方法return 0;
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。
这种方式也成为元素的自然顺序,或者叫做默认顺序。
第二种排序方式:
当元素自身不具备比较性,或者具备的比较性不是所需要的。
这时需要让容器自身具备比较性。
自定义一个比较器,将比较器对象作为参数传递给TreeSet集合的结构函数,当两种排序同时存在时,以比较器为主。
定义比较器:定义一个类,实现Comparator 接口,覆盖compare方法。
2、程序解读
class SetDemo
{
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args)
{
//hashSetDemo();
treeSetDemo();
}
public static void hashSetDemo()
{
HashSet hs = new HashSet();
sop(hs.add("java01"));
sop(hs.add("java01"));
hs.add("java02");
hs.add("java03");
hs.add("java03");
hs.add("java04");
Iterator it = hs.iterator();
while(it.hasNext())
{
sop(it.next());
}
}
public static void treeSetDemo()
{
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;
}
}