java集合


集合框架

概念

集合是一组可变数量的数据项(也可能是0个)的组合,这些数据项可能共享某些特征,需要以某种操作方式一起进行操作。一般来讲,这些数据项的类型是相同的,或基类相同(若使用的语言支持继承)。列表(或数组)通常不被认为是集合,因为其大小固定,但事实上它常常在实现中作为某些形式的集合使用。集合的种类包括列表,集,多重集,树和图。枚举类型可以是列表或集。


数组虽然也可以存储对象,但长度是固定的,集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。集合中存储的都是对象的引用(地址)

集合类中的关系图如下:



迭代器

迭代器其实就是集合的取出元素的方式。把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内部的元素,而每一个容器的数据结构不同,所以取出的动作细节也不一样,但是都有共性内容,判断和取出,那么可以将共性写出抽取。内部类都符合一个规则,该规则就是Interator。通过一个对外提供的方法iteratro()来获取集合的取出对象

迭代器内部实现:




Collection

Collection集合共通操作

Collection定义了集合框架的共性功能。有
   1,添加:add(e);addAll(collection);
   2,删除:remove(e);removeAll(collection);   clear();
   3,判断:contains(e);isEmpty();
   4,获取:iterator();      size();
   5,获取交集。retainAll();
   6,集合变数组。toArray();


Collection集合架构详解

|——List:元素是有序的,元素可以重复,因为该集合体系有索引。

             |——ArrayList:底层的数据结构使用的是数组结构,特点:查询速度很快。但是增删稍慢

             |——LinkedList:底层使用的是链表数据结构,特点:增删速度很快,查询稍慢。

             |——Vector:底层是数组数据结构,线程同步,被ArrayList替代了。

  |——Set:元素是无序,元素不可以重复。

             |——HashSet:底层数据结构是哈希表。HashSet是通过元素的两个方法,hashCode和equals来完成。如果   元素的HashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,才会调用到equals。对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode 和equals方法。

             |——TreeSet:可以对Set集合中的元素进行排序,底层数据元素是二叉树,保证元素唯一的依据compareTo方法return 0。

TreeSet排序:

1、让元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法。这种方式也成为元素的自然顺序,或者叫做默认顺序。

2、当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性,在集合初始化时,就有了比较方式。

比较器

由于TreeSet排序的第二种方法,是用到了比较器。

比较器就是用来让集合中元素具有可比较性的一个接口。该接口为Comparator

比较器使用实例

class TreeSetDemo2 
{
	public static void main(String[] args) 
	{
		TreeSet ts = new TreeSet();

		ts.add(new Student("lisi02",22));
		ts.add(new Student("lisi02",21));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi09",19));
		ts.add(new Student("lisi06",18));
		ts.add(new Student("lisi06",18));
		ts.add(new Student("lisi007",29));
		//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 MyCompare implements Comparator
{
	public int compare(Object o1,Object o2)
	{
		Student s1 = (Student)o1;
		Student s2 = (Student)o2;

		int num = s1.getName().compareTo(s2.getName());
		if(num==0)
		{

			return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
		}

		
		return num;

	}
}


泛型

泛型:JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。
好处:
1、将运行时期出现问题ClassCastException,转移到了编译时期。,
方便于程序员解决问题。让运行时问题减少,安全。,
2、避免了强制转换麻烦。
泛型格式:通过<>来定义要操作的引用数据类型。

使用时机
1、通常在集合框架中很常见,只要见到<>就要定义泛型。

其实<> 就是用来接收类型的。
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。

泛型实例

class Demo<T>
{
         public void show(T t)
         {
               System.out.println("show:"+t);
         }
         public void print(T t)
         {
               System.out.println("show:"+t);
         }
}
 
泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。如上面代码所示。

Map

Map架构

Map

  |——Hashtable:底层是哈希表数据结构,不可以存入null键null值,该集合是线程同步的。

  |——HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的。

  |——TreeMap:底层是二叉树数据结构。线程不同步,可以用于给map集合中的键进行排序。

Map和Set很想,其实大家,Set底层就是使用Map集合。

Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。


Map常见操作

1、添加

put(K key, V value) 和  putAll(Map<? extends K,? extends V> m)添加元素,如果出现添加时,相同的键。那么后添加的值会覆盖原有键对应值。并put方法会返回被覆盖的值。
2、删除

clear()清空  

remove(Object key)删除指定值。 

3、判断

containsValue(Object value)       containsKey(Object key)      isEmpty() 
4、获取

get(Object key)size() values()entrySet() keySet() 

    

当发现有映射关系时,可以选择map集合,因为map集合中存放就是映射关系。当数据之间存在这映射关系时,就要先想map集合


Map值获取

1、原理:

map中是没有迭代器的,collection具备迭代器,只要将map集合转成Set集合,可以使用迭代器了。
之所以转成set,是因为map集合具备着键的唯一性,其实set集合就来自于map,set集合底层其实用的就是map的方法。

把map集合转成set的方法:
Set<k> keySet();  将map中所有的键存到Set集合。
Set<k,value> entrySet();//取的是键和值的映射关系。
Entry就是Map接口中的内部接口;

2、实例

keySet()方法
可以将map集合中的键都取出存放到set集合中。对set集合进行迭代。迭代完成,再通过get方法对获取到的键进行值的获取。
Set keySet = map.keySet(); 
Iterator it = keySet.iterator(); 
while(it.hasNext()) 
{ 
    Object key = it.next(); 

     Object value = map.get(key);
  
     System.out.println(key+":"+value);
}
entrySet()方法。
Set<Map.Entry<String,String>> entrySet = map.entrySet();//将Map集合中的映射关系取出。存入到Set集合中。
       Iterator<Map.Entry<String,String>> it = entrySet.iterator();
       while(it.hasNext())
       {
                Map.Entry<String,String> me = it.next();
                String key = me.getKey();
                String value = me.getValue();
                System.out.println(key+":"+value);
       }

集合框架的工具类
Collections
• 对集合进行查找
• 取出集合中的最大值,最小值
• 对List集合进行排序
• ……
Arrays
• 将数组转成List集合
• 对数组进行排序
• 对数组进行二分查找


新增for语句

Collection在JDK1.5后出现的父接口   Iterable就是提供了这个for语句。
格式:
for(数据类型 变量名 : 数组或集合)
{
执行语句;
}
作用:简化了对数组,集合的遍历。


函数的另一种表现形式

返回值类型  
函数名(参数类型…  形式参数)
{
执行语句;
}
 
其实接收的是一个数组,可以指定实际参数个数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值