------- android培训、java培训、期待与您交流! ---------
集合
集合的作用
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,于是就对对象的共性抽取形成集合,集合就是存储对象最常用的一种形式。
集合的特点:
1.用于储存对象
2.长度可变
3.可以存储不同类型的对象
Collectijon集合
Collection的共性功能
1,添加
add(e)
addAll(collection)
2,删除
remove(e)
removeAll(collection)
clear()
3,判断。
contains(e)
isEmpty()
4,获取
iterator()
size()
5,获取交集。
retainAll()
6,集合变数组
toArray();
Iterator迭代器
每个集合都具备一种取出方式,但这个方式不足以用一个方法描述,比如取之前要先判断容器内是否有元素,有则取,无则不取。它需要多个功能来体现,因此就将这多个功能封装至对象。因数据不同,每个取出对象中取出的实现方式不一样,那么这个取出就必须描述一下,通过一个类来完成,这取出这个类就定义在了集合内部。对于集合中的元素,你要想操作,定义内部类直接在集合内部操作时最方便的。所以这个内部类就完成了取出动作的定义。
Iterator it = al.iterator();
while(it.hasNext())
{
Person p = (Person)it.next();
sop(p.getName()+"::"+p.getAge());
}
}
HashSet的数据结构
它的底层数据结构是哈希表,它采用这个算法存取对象,它内部采用对某个数字进行取余的方式对hashcode进行分组和划分对象的存储区域。Object类中定义了一个hashCode()方法来返回每个java对象的哈希码,当HashSet集合中查找某个对象时Java系统首先调用对象的hashCode()方法获取对象的哈希码,然后根据哈希码找到相应的存储区域,最后取出该存储区域的每个元素与该对象进行equals方法比较,所以这个集合的存入与取出数据的顺序不一致。因此它通过hashCode()和equals()来完成。如果元素的HasCode值相同,才会判断equals是否为true,如果hashCode值不同则不会调用equals方法,这两个方法时集合底层内部调用的,它自己拿对象互相比较。
TreeSet的数据结构
它的底层数据结构是二叉树。二叉树默认从小到大存取,怎么存,怎么取,只需将compareTo()和return x的值,x>0升序,x<0降序,x=0相等。
TreeSet ts=new Treeset();
ts.add();//增加的元素排序如图:若return>0,则存入的元素会与集合中的元素进行比较,小于则放在左边,大于则放于右边
TreeSet中的排序两种方式:
往TreeSet里存入对象它是会帮你排序的,按自然顺序排序,底层调用Comparable接口中的compareTo()方法.
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)//复写compareTo
{
if(!(obj instanceof Student))throw new RuntimeException("不是学生对象");
Student s = (Student)obj;if(this.age>s.age)return 1;if(this.age==s.age)
{
return this.name.compareTo(s.name);
}
return -1;
}
}
用比较器:实现Comparator接口,复写compare方法,两种排序方式都存在时以比较器为主。
class MyCompare implements Comparator
{
public int compare(Objecto1,Object o2)
{
Student s1 =(Student)o1;
Student s2 =(Student)o2;
intnum = s1.getName().compareTo(s2.getName());
if(num==0)
{
return newInteger(s1.getAge()).compareTo(new Integer(s2.getAge()));
}
return num;
}
}
将比较器传入集合TreeSetts = new TreeSet(new MyCompare())
Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
Map的子类
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。
|--HashMap:底层是哈希表数据结构,允许使用 null值和 null 键,该集合是不同步的。
|--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。
Map集合的方法:
1,添加。
put(Kkey, V value)
putAll(Map<?extends K,? extends V> m)
2,删除。
clear()
remove(Objectkey)
3,判断。
containsValue(Objectvalue)
containsKey(Objectkey)
isEmpty()
4,获取。
get(Objectkey)
size()
values()
keySet()
entrySet()
Collection,List,Map,Set之间的关系
Collection和Map集合:
相同点:
1. Map与Collection在集合框架中属并列存在,属于集合框架的顶层接口。
不同点:
1. Map存储的是键值对,Collection类型者,每个位置只有一个元素。
2. Map存储元素使用put方法,Collection使用add方法
3. Map集合没有直接取出元素的方法,而是先转成Set集合,再通过迭代获取元素.Collection直接可以通过迭代取出。
4. Map集合中键要保证唯一性。而Collection集合子类根据各自的特点来确定里面的集合元素是否可以重复。
List集合和Set集合:
相同点:
他们都是Collection的子类接口,Collection定义了他们的共性方法。
不同点:
1.List集合元素是有序的,元素可以重复。因为该集合体系有索引。
2. Set集合元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
3.List集合判断元素是否相同,依据的是元素的equals方法,而Set集合依据的是底层的数据结构。
Map集合和Set集合
1.Set集合底层使用Map集合,调用了Map集合的方法。
2.子类集合底层的数据结构相同,都是哈希表和二叉树。
Map集合取出方法
因为Map集合没有迭代器,所以必须将所有的键或键-值关系取出放入Set集合,然后用Set集合中的迭代器取出对象
keySet():将键取出放入Set集合中,调用Iterator方法,取出键。
public static voidgetStudentInfo(HashMap<String,String> roomMap)
{
Iterator<String> it =roomMap.keySet().iterator();while(it.hasNext())
{
String id = it.next();
String name = roomMap.get(id);
System.out.println(id+":"+name);
}
}
entrySet()将键-值关系这里的键值关系是对象取出, 放入Set集合中。
用法与图解
Set<Map.Entry<String,String>>entrySet = map.entrySet();
Iterator<Map.Entry<String,String>>it = entrySet.iterator();
while(it.hasNext())
{
Map.Entry<String,String>me = it.next();
Stringkey = me.getKey();
Stringvalue = me.getValue();
System.out.println(key+":"+value);
}