集合详细介绍-java基础

集合
什么是集合:
也是一种容器,用来存储多个数据。集合的大小是可以改变的,集合中只能存储引用类型数据,集合中可以存储不同类型的引用数据。


集合有什么作用?
解决数组的局限性


Collection集合中的方法:
boolean  add(Object obj)   添加一个元素(对象)
boolean  addAll(Collection  c)   添加指定集合中所有的元素
boolean  remove(Object  obj)   删除指定的元素对象
boolean  removeAll(Collection  c)  删除和指定集合中存储元素相同的元素对象
int  size()  获取集合中存储元素的个数
boolean  isEmpty() 判断集合是否为空(没有存储元素)
boolean  contains(Object  obj)  判断指定元素是否包含在集合内
boolean  containsAll(Collection  c) 判断指定的集合中所存储的全部元素是否包含在集合里面

集合的遍历:

1,集合转数组遍历

2,Iterator迭代器
ava.util.Iterator  就是集合框架专用的遍历方式
boolean   hasNext()   判断迭代器指向的集合中是否有下一个元素存在
Object   next()  返回迭代器正在迭代的元素
void    remove()  删除迭代器正在迭代的元素


集合的细节:
1,集合只能存储引用类型数据,在集合底层存储的其实就是地址
2,集合中不能存储基本类型数据(在JDK1.5以后可以在集合的添加删除等功能中书写基本数据类型,但是集合在存储时存储的是基本数据类型的包装类[对基本类型数据进行装箱])
3,集合在存储元素时,所有的元素都会转为Object类型存储(向上转型)。
4,集合在遍历获取存储的元素时,所有的元素在取出时也是Object类型,如果需要使用特有的成员,需要向下转型注意在使用向下转型时使用instanceof避免异常)。




List集合
List集合:
1,集合中存储的元素是有序(有序不是排序,有序的意义是存储的顺序和书写的代码一致)
2,List集合有角标,可以通过角标精确的访问所存储的元素
3,List集合允许存储重复元素、允许存储null值(可以多个null)


List集合特点:存取有序、允许存储重复的元素、有角标,可以通过角标精确访问元素


List集合中的常用方法:
添加方法: void   add(int index, Object  obj)
       按照指定的角标添加相应的引用元素
删除方法: Object  remove(int index)
       删除集合中指定的角标元素,并返回被删除的元素
获取方法: Object  get(int  index)  
       获取集合中指定角标下的元素
修改方法: Object  set(int index,Object obj)
        修改集合中指定角标下的元素,修改为指定的元素,返回旧元素
其它方法:
        int  indexOf(Object  obj)在集合中查找指定的元素,返回第一次出现的角标
        List  subList(int fromIndex,int toIndex)截取集合中从指定位置开始到指定位置结束之间的元素,返回子集合


List特有迭代器ListIterator
注意:List集合的专用迭代器ListIterator可以对集合进行添加、删除、修改。但是需要注意必须使用迭代器对象本身调用添加、删除、修改方法


ArrayList集合特点:
1,ArrayList集合内部使用了可变数组作为底层存储结构
2,ArrayList集合因为实现了List接口,所以具备了List集合的特点
ArrayList集合查询效率比较高,增删效率比ArrayList:
3,较低(适用于存储元素和遍历获取元素)


LinkedList:
LinkedList集合特点:
1,LinkedList集合底层使用链表结构
2,LinkedList集合因为实现了List接口,所以具备了List集合的特点
3,LinkedList集合在查询遍历效率比较低,增删元素的效率比较高


LinkedList特有方法(围绕头和尾设计)





List下的子类总结:
Collection集合(接口)
   |-----List集合:有序、允许存储重复元素、有角标,可以使用角标精确访问集合中的元素
          |-----ArrayList集合:有序、允许存储重复元素、可以存储多个null、有角标
                            查询遍历效率比较高,增删效率比较低
                            底层使用可变数组结构
                            集合中的特有方法都是围绕着角标设计
          |-----LinkedList集合:底层使用链表结构。有序、允许存储重复元素、也可以存储null
                             集合中的特有方法都是围绕着头和尾来设计
                             查询遍历效率比较低,增删的效率比较高
          以上两个集合类都属于线程不安全的集合


          |-----Vector集合:底层使用的是可变数组结构。属于线程安全的集合类
                          查询遍历效率比较高,增删效率比较低


学习了这么集合类,到底应该使用哪个呢?
  如果只是存储和获取,就使用ArrayList集合
  如果对集合中元素频繁的添、删,使用LinkedList集合
  如果实在不知道使用哪个集合类更适合就选择ArrayList集合类


Set集合
Set集合特点:存取无序、不允许存储重复元素、只能存储一个null值、没有角标、只能通过迭代器遍历。
             (set集合中的所有方法都来自Collection集合中的)
Set集合最大弊端是:无角标,不能精确访问集合中的元素


HashSet集合
HashSet集合特点:实现Set集合:存取无序、不允许存储重复元素,只能存储一个null值,没有角标,只能通过迭代器遍历
                 底层使用哈希表结构(哈希表底层使用的还是数组,但这个数组使用了一种名为”哈希”的算法来获取和存储元素),
                 查询效率和添加不重复元素效率比较高
                 保证元素唯一性的方式依赖于:hashCode()和equlas()方法。  
                 哈希表 = 数组 + 哈希算法


HashSet存储元素的过程:在存储元素时,会先拿将要存储的元素和哈希算法结合,计算出存储的位置,如果位置上没有元素存在,则直接存储;如果位置上已经有存储元素了,则再使用equals方法进行比较(比较将要存储的元素和已经存储的元素),比较结果为true:不存储;比较结果为false:再次计算元素要存储的位置




LinkedHashSet集合


LinkHashSet集合特点:存取有序,不允许存储重复元素,只能存储一个null值,无角标。
                      底层使用链表+哈希表结构;查询和增删效率较快




TreeSet集合
TreeSet集合特点:实现了set集合,存取无序、不允许重复元素、只能存储一个null值、没有角标。只能通过迭代器来遍历集合
                 底层使用二叉树结构,可以对存储的元素按照指定规则排序
                 保证元素唯一性依赖于:在添加元素时,会先判断元素是否已在TreeSet集合中存储,相等则不添加元素,不相等则添加
保证唯一性:




是怎么排序的?
在添加元素时,会和已经存在的元素进行比较大小,大:向右存储; 小:向左存储


两种排序:
当TreeSet集合中即有比较器对象排序也有自然排序时,优先使用的是比较器对象排序
  自然排序:使用Comparable接口中的compareTo方法进行比较。比较结果:0、1、-1
  比较器排序:使用Comparator接口中的compare方法进行比较。比较结果:0、1、-1




Foreach循环:
格式:for(类型  变量/引用变量 : 容器)
     {
     }


作用:使用foreach主要是简化迭代器的。
      foreach遍历通常只用来遍历数组或集合,不会对数组或集合进行操作。


注意:Itreator迭代器没有添加功能,只有删除功能remove()
      ListIterator迭代器有添加,删除,修改功能:add(), remove(). set()

Map集合
Map集合特点:
            1,Map集合中存储的是键key-值value对应关系
            2,Map集合中必须保证key是唯一的,key只能存储一个null值
            3,Map集合中的对应关系只能是单一对应
            4,Map集合存取无序,不能直接遍历
            5,Map集合属于双列集合,实际存储的是两个单例集合


Map集合中的基本方法:
   添加方法:Object  put(Object key,Object value) 
           put方法在存储对象时,会先去检查key是否已经存在。不存在则存储key和value的对应关系,返回null值;存在则会把之前已经存在的value对象覆盖并返回旧的value对象


删除方法:Object  remove(Object key)
            remove方法在删除Map集合中的对象时,是根据key对象来删除key-value的对应关系,删除返回被删除的value对象 


修改方法:修改方法也是put方法 


   获取方法:Object  get(Object  key)
            get方法是根据指定的key对象,来获取Map集合中key对应的value对象,如果key没有对应的value对象,则返回null


   判断方法:containsKey(Object key)
             根据指定的key对象判断Map集合中是否存在指定的key对象
             containValue(Object value)
             根据指定的value对象判断Map集合中是否存在指定的value对象


   其它方法:
            clear();   清空Map集合中的所有的存储对象
            isEmpty()  判断Map集合中是否有存储对象
            size()  获取Map集合中存储的key-value对应关系的个数




Map集合:keySet()方法
      存储key对象:key对象的特点是不能重复。  使用Set集合存储
      存储value对象:value对象的特点是可以重复。 使用Collection结合存储




注意:Map集合自身没有遍历方式,需要获取Map中的单列集合,再通过获取的单列集合进行遍历获取




Map集合:entrySet()方法
entrySet()方法:是用来获取Map集合中存储的key-value的映射关系
映射关系类型:Map.Entry类型


Map.Entry方法:
   getKey():返回对应的键
   getValue():返回对应的值
  setValue():替换与此项对应的值

Map集合:values()方法
values()方法:用来获取Map集合中所有的value对象,获取的对象存储在Collection中




小结:

泛型
什么是泛型?
   在创建集合时,就明确容器中的元素类型
格式:<引用类型>
注意:泛型中只能用引用类型,不能使用基本数据类型


好处:1,安全进制
      2,将运行时异常转移到编译时异常
      3,泛型技术是给编译器使用的技术
      4,省略了类型的强制转换


注意:1,泛型在使用时,必须保证两边泛型一致
      2,接口中的泛型传递给子类后,子类还可以继续把泛型向下传递
      3,泛型的传递必须在最后使用最终的子类在创建对象时,明确泛型的类型


通配符:<?>:表示任意引用了类型
什么情况下使用:当使用泛型类或接口时,传递的具体类型不确定时可以通过通配符表示


通配符的限定:
上限:< ? extends E > 表示接受E类型或者E的子类型

下限:< ? super E > 表示接受E类型或者E的父类型

Map集合的主要方法:
添加元素:put(K  key, V  value)
         在使用put存储一对元素(key-value)对象时,会先拿key去判断Map集合中是否已经存在。
         如果Map集合中没有相同的key存在:就把key-value存储到Map集合中,并返回null值
         如果Map集合中有相同的key存在:会把之前存储的value对象覆盖。并返回之前的value对象(旧value对象)
删除元素:remove(Object  key)
          根据指定的key元素对象去Map集合中元素相应的key-value一对元素。
          如果Map集合中有相同的key元素存在:则删除一对key-value对象
          如果Map集合中没有指定的key元素存在:没有删除操作,返回null


修改元素:使用put方法


获取元素:get(Object  key)
          根据指定的key元素对象,去 Map集合获取相应的value对象
          如果Map集合中没有指定的key元素存在,则返回null
其它:
      boolean containsKey(Object key) 判断Map集合中是否包含指定的key元素存在
      boolean containsValue(Object value) 判断Map集合中是否包含指定的value元素存在
      size()  获取Map集合中存储的key-value对应关系的个数




使用集合时,如何选择集合类?
集合框架,包括两大部分:
Collection集合:保存的数据都是相互独立的一个个的数据
List集合: 保存的数据可以重复
ArrayList: 底层使用数组实现,增删慢,查询块;
LinkedList: 底层使用链表实现,增删块,查询慢;
Set集合: 保存的数据不能重复
HashSet:保证唯一,但是迭代无序;
LinkedHashSet:保证唯一,但是迭代有序;
TreeSet: 保存数据直接可以排序;


HashSet和LinkedHashSet保证数据唯一,都依靠hashCode和equals方法;
TreeSet保证数据唯一,依靠比较的结果;
Map集合: 保存的数据都是一对对的键值对的数据;
HashMap: 键唯一而且迭代无序;
LinkedHashMap: 键唯一而且迭代有序;
TreeMap: 键唯一而且键自动排序;


在开发中,要选择具体的集合容器,需要根据具体的需求而定;
如果要保存的数据时键值对的,肯定就是用Map集合;
如果键要排序,应该用TreeMap;否则,如果键没有任何要求,就直接用HashMap;如果要求迭代有序,就要使用LinkedHashMap;
如果保存的数据是单独的一个个的,就要使用Collection集合;
如果可以重复,就要使用List集合;如果不能重复,就要使用Set集合;
如果使用List集合,如果增删的操作多,就要使用LinkedList;如果查询的操作多,就要使用ArrayList;
如果使用Set集合,如果没有任何要求,就直接使用HashSet;如果要求迭代有序,就要使用LinkedHashSet;如果要求排序,用TreeSet;
实际开发中,使用最多的是:
ArrayList;HashSet;HashMap;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值