黑马程序员——java基础之集合

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

集合

为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行储存,集合就是存储对象最常用的一种方式。
数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。
数组中可以存储基本数据类型,集合只能存储对象。

集合类的特点:
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

为什么会出现这么多的容器?
因为每一个容器对数据的存储方式都有不同。这种存储方式称为:数据结构。

Collection集合超级接口

    |--List:元素是有序的,元素可以重复,因为该集合体系有索引。
    |--Set:元素师无序的,元素不可以重复,该集合当中没有索引。

Collection定义了集合框架的共性功能。
①添加:add(e);   addAll(collection);
②删除:remove(e);    removeAll(collection);    clear();
③判断:contains(e);    isEmpty();
④获取:iterator();     size();
⑤获取交集:retainAll();
⑥集合变数组:toArray();
注意:1.add()方法的参数类型是Object。以便于接收任意类型对象。
    2.集合中存储的都是对象的引用或者地址。

迭代器

什么是迭代器呢?
其实就是集合的取出元素的方式。
那么这些内部类都符合一个规则,该规则是Iterator
如何获取集合的取出对象呢?
通过一个对外提供的方法:iterator()
for(Iterator it = al.iterator(); it.hasNext() ; ) //迭代器
{
     sop(it.next());
}
一个迭代器的实例:
public class Test3 {

	public static void al(){
		ArrayList a = new ArrayList();
		a.add("a1");
		a.add("a2");
		a.add("a3");
		a.add("a4");
		a.add("a5");
		Iterator it = a.iterator();
		while(it.hasNext()){
			 String str = (String)it.next();
			 System.out.println(str);
		}
	}
	
	public static void main(String[] args) {
		Test3.al();

	}

}

List:

|--List:元素是有序的,元素可以重复,因为该集合体系有索引。
     |--ArrayList:底层的数据结构使用的是数组结构,
                 特点:查询速度很快。但是增删稍慢。线程不同步
     |--LinkedList:底层使用的是链表数据结构。
                 特点:增删速度很快,查询稍慢。
     |--Vector:底层是数组数据结构。线程同步。被ArrayList替代。

List:特有的方法:凡是可以操纵角标的方法都是该体系特有的方法。

增:add(index,element);     addAll(index,Collection)
删:remove(index);
改:set(index,element);
查:get(index);      subList(from,to);     ListIterator();

 List集合特有的迭代器:ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生:ConcurrentModificationException:并发修改异常。
所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法时有限的,只能对元素进行判断、取出、删除的操作。
如果想要其他的操作如添加、修改等,就需要使用其子接口ListIterator。

该接口只能通过List集合的ListIterator方法获取。

LinkedList特有的方法:
addFirst();放前面    addLast();放后面
getFirst();         getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst();      removeLast();
获取元素,但删除元素。如果集合中没有元素,会出现NoSuchElementException

在JDK1.6出现了替代方法:
offerFirst();        offerLast();
peekFirst();         peekFirst();
获取元素,但不删除元素。如果集合中没有元素,会返回null。
pollFirst();         pollLast();
获取元素,但删除元素。如果集合中没有元素,会返回null。

使用LinkedList模拟一个堆栈或者队列数据结构。
堆栈:先进后出。如同一个杯子
队列:先进先出。First  in First out FIFO。如同一个水管。
class DuiLie
{
    private LinkedList link;
    DuiLie()
   {
      link=new LinkedList();
    }
    public void myAdd(Object obj)
   {
       link.addFirst(obj);
    }
    public Object myGet()
   {
       //return link.removeFirst();先进后出
       return link.removeLast(); //先进先出

   }
   public boolean isNull()
  {
       return link.isEmpty();
   }
}
class  LinkedListTest
{
    public static void main(String[] args) 
   {
       DuiLie d=new DuiLie();
       d.myAdd("java01");
       d.myAdd("java02");
       d.myAdd("java03");
       d.myAdd("java04");
       while (!d.isNull())
      {
         System.out.println(d.myGet());
      } 
    }
}

Set:

Set集合的功能和Collection是一致的。

|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。

    |--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
           HashSet是如何保证元素唯一性的呢?
           是通过元素的两个方法,hashCode和equals来完成。
           如果元素的HashCode值相同,才会判断equals是否为true。
           如果元素的hashcode值不同,不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。


    |--TreeSet:可以对Set集合中的元素自然进行排序。
              底层数据结构是二叉树,保证元素唯一性的依据:compareTo方法return 0.
                
               TreeSet排序的第一种方式:让元素自身具备比较性。
               元素需要实现Comparable接口,覆盖compareTo方法。
               也种方式也成为元素的自然顺序,或者叫做默认顺序。
    

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

泛型:

JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。
好处
   1.将运行时期出现问题ClassCastException,转移到了编译时期。,
     方便于程序员解决问题。让运行时问题减少,安全。,
   2,避免了强制转换麻烦。

泛型格式:通过<>来定义要操作的引用数据类型。
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候,
早期定义Object来完成扩展。
现在定义泛型来完成扩展。
特殊之处:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

Collection 和 Collections的区别: 
Collections是个java.util下的类,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的查找、排序、替换、
线程安全化(将非同步的集合转换成同步的)等操作。
Collection是个java.util下的接口,它是各种集合结构的父接口,继承于它的接口主要有Set和List,提供了关于集合的
一些操作,如插入、删除、判断一个元素是否其成员、遍历等。

Map集合:

该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
①添加:put(K key, V value)
putAll(Map<? extends K,? extends V> m) 
删除:clear()
remove(Object key) 
判断:containsValue(Object value)
containsKey(Object key)---isEmpty() 
获取:get(Object key)
        size()
values() 
               entrySet()
keySet() 

Map
   |--Hashtable:底层是哈希表数据结构,不可以存入null作为键作为值的情况。
                 该集合时线程同步的。JDK1.0 效率低
   |--HashMap:底层是哈希表数据结构,并允许存入null键null值。
               该集合时不同步的。JDK1.2 效率高
   |--TreeMap:底层是二叉树数据结构,线程不同步。可以用于给Map中的键进行排序。
和Set很像!其实Set底层就是使用了Map集合。

什么时候使用map集合呢?
当数据之间存在着映射关系时,就要先想到Map集合。

map集合有两种取出方式。
1.Set<k> keySet:将map中所有的键存入到Set集合。因为Set具备迭代器。
    所以可以使用迭代方式取出所以的键,在根据get方法,获取每一个键所对应的值。
    Map集合的取出原理:将map集合转成Set集合。在通过迭代器取出。

2.Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,
        而这个关系的数据类型就是:Map.Entry
Map.Entry其实Entry也是一个接口,它是Map接口中的一个内部接口。

Arrays:用于操作数组的工具类。
里面都是静态方法。
asList:将数组变成list集合
把数组变成list集合有什么好处?
  可以使用集合的思想和方法来操作数组中的元素。
  注意:将数组变成集合,不可以使用集合的增删方法。
  因为数组的长度是固定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值