黑马程序员-JAVA基础-集合

------- 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);
                   }

------- android培训java培训、期待与您交流! ---------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值