Java集合类

集合类概述

Java集合类主要在包java.util中。
Java集合类中的接口有很多,其中最主要的接口是Collection和Map。

  • Collection接口可以用来存储某一种类型的多个元素,Map接口则用来存储两种类型的具有对应关系的多个元素,即键值对,Key-value。
  • Collection接口有多个子接口,List、Set和Queue等,其中Set对应于集合结构,而List和Queue对应于线性结构。
  • Set和Map接口提供相应的子类,可以用来存储数状结构的数据。
  • TreeSet是使用树状结构来存储Set接口的实现类,保证了TreeSet中的所有元素是有序存储的。而TreeMap则使用树状结构存储了键值对信息,并且其中元素按Key顺序存储。

Collection接口

Collection接口的主要方法
添加元素:add(E),addAll()
删除元素:remove(Object),removeAll(),removelf,clear(快速删除所有元素)
保留:retainAll仅保留参数Collection中的所有元素,删除其他的
是否包含元素:contains(Object)返回为true或False
获取元素个数:size
是否为空集合:isEmpty
遍历所有元素:iterator()
转换为数组:toArray,toArraya(T[ ])(T表示一个泛型类型)
Object类的toString()方法将Object类的对象转换为String对象
Collection接口继承了接口lterable
Collection接口中元素无位置概念,没有获得指定元素下标的方法。
Collection的子接口中,List元素有位置,Set没有位置和顺序

public lterator<E> iterator();

上述该方法返回一个lterator类型的对象,使用该对象可对原有Collection进行元素的遍历。
在使用Collection接口的实例对象时,若用泛型,要明确指明E代表的具体类型,如Integer、String等用其封装类而不是用基本数据类型int。

lterable接口

常用方法:lterator< T >iterator();
该接口仅用于遍历
而对于Set,lterator是遍历它的唯一途径
其中hashNext方法用于判断是否有下一个元素,若有用next()方法取出。remove方法可以用来删除,一般少用。

泛型

我们可以定义带泛型类型的类或方法,后编译器用具体的类型替换它
以Collection接口为例,该泛型接口的定义如下

public interface Collection<E> extends lterable<E>

这个定义中,Collection和lterable都是支持泛型的接口,此处的< E >表示形式泛型类型,随后可用具体的类型来替换它,此为泛型实例化,E或T都表形式泛型类型。

  • ArrayList类支持泛型,其类的直接父类也支持泛型
  • ArrayList类同时实现了四个接口,其中List接口是泛型接口
  • List接口的父接口就是Collection接口也是泛型的。
    使用Java集合类时常会见到
List<String> names=new ArrayList<String>();

小括号在尖括号后
这行代码中,左边的类型是泛型接口List,其中实际具体类型使用了String型,右边创建对象则使用了ArrayList泛型类,实现了List泛型接口,同样是String型。
也可使用泛型类而不指定具体类型例如:
List list=new ArrayList();等价于List< Object > list=new ArrayList< Object >();这种不带类型参数的集合类用法为原始类型,与泛型相对,会有警告。

  • 具体的泛型类型可以是具体类,接口或抽象类,但不能是基本数据类型。
  • 若想用Java集合类存储许多Int或double型数据,可用其对应的封装类,即Integer和Double类。

List接口

  • List接口是Collection接口的子接口之一,支持泛型,其他子接口还有Set、Queue等
  • List接口还提供了基于链表的实现类LinkedList
  • List接口继承了Collection接口的方法,但对应例如添加方法中可以指定元素添加的位置。
  • 与Collection接口相比,List接口中增加了位置的概念
  • List接口中可以通过Set方法修改指定下标的元素值
  • 可以通过下标来获取元素get方法
  • IndexOf(从前往后找),lastIndexOf(从后往前找)可查找指定下标元素值
  • subList(int fromIndex,int toIndex)指定开始元素的下标和结束元素的下标可获得其一个子集。fromIndex所在元素包含在获得的子集中,toIndex所在元素不会包含在所获子集中。
List的遍历

1.使用下标,同数组
2.interator方法来获得.interator的对象后调用hashNext和next方法来遍历
3.List中特有的子接口ListIterator来遍历

List的实现类

List是一个接口,编程时需要从其实现类来创建对象,实现类有ArrayList、LinkedList其分别对相应顺序表和链表。

Set接口

Collection的子接口之一,支持泛型,除Collection接口的方法未添加新的方法,Set中元素无位置概念,不包含重复元素
对象的相等判断有以下方法
1.用相等运算符(比较的是对象的引用,判断是否是同一个对象的管理者)
2.用equals方法
3.用equals和hashCode(长整型long)方法(set这两个方法都会调用来判断两个对象是否相等)
因此指定Set泛型类要确认已经正确定义了equals和hashCode方法##

set 的遍历

调用Set的iterator方法,获得lterator的对象,即可对set进行遍历。

Set<String> names=new HashSetString;
lterator<String> iterator=names.iterator();
while(iterator.hashNext()){
   String element=iterator.next();
   System.out.println(element);
   }
set接口的实现类
  • HashSet、LinkedHashSet、TreeSet,其中最常用的是HashSet。
  • HashSet是Set接口实现类之一,使用较为广泛,它不保存元素的加入顺序,不允许存储重复元素。
  • TreeSet是一个有序的集合,它的作用是提供有序的Set集合。
  • 如果Set中指定的类型是自定义的某一个类,不是String等而是自定义的Student等则要重写它的两个方法hashCode和equals,因为它会判断对象是否相等,若相等第一次成功后面就会添加失败。

Map接口

定义为public interface Map<K,V>

  • Map接口没有父接口,也是泛型接口。
  • Map接口中两种泛型类型K,V,分别代表键和值。
Map接口中的方法
  • 添加键值对:put(K,V)添加一个键值对,putAll(K,V)添加所有键值对
  • 删除方法:remove(K);remove(K,V);void clear();清空这个Map。
  • 读取键值对:get(K);keySet();values();其中get方法是通过给定的键来获得相应的值,keySet方法是获得所有键的集合,得到的集合是一个Set。values方法是获得所有值的集合,得到的集合是一个Collection。
  • 修改键值对:replace(K,oldValue,newValue);replace(K,newValue);
  • default方法只能在接口中使用(可以有大括号,在大括号中定义方法体),在接口中被default标记的方法为普通方法可以直接写方法体。
  • 查询键值对:containsKey(K);containsValue(V);
  • 查询Map结构的方法:int size();isEmpty();
Map的遍历
  • 方法一:先通过Map的keySet方法来获得包含所有key的set集合,后通过lterator来遍历这个Set集合,从而获得每一个key,然后通过Map的get方法使用key来获得对应的value,从而完成整个Map的遍历。
Map<String,Integer> scores=new HashMap<String,Integer>;
Set<String> names=scores.keySet();//获得包含Key的set的集合
Iterator<String> iterator=names.iterator();//遍历这个集合
while(iterator.hashNext()){
   String playerName=iterator.next();//获得每一个key
   int score=scores.get(playerName);//通过get方法使用key获得对应value
System.out.println(playerName+":"+score;//以Key:Value格式来输出
}
  • 方法二:首先,通过Map的entrySet方法来获得对应的iterator的对象,使用该lterator对象可遍历这个Set集合,获取其中的每一个Entry对象,然后调用Entry对象的相应方法即可获得相应的key和Value,从而完成整个对Map 。Entry是一个键值对。
Map<String,Integer> scores=new HashMap<String,Integer>;
Set<Entry<String,Integer>> entrySet=scores.entrySet();//通过entrySet方法来获得对应的iterator的对象
Iterator<Entry<String,Integer>> iterator=entrySet.iterator();//使用该lterator对象遍历这个Set集合
while(iterator.hashNext()){
   Entry<String,Integer> entry=iterator.next();//获取其中的每一个Entry对象
   String key=entry.getkey();//调用Entry对象的相应方法即可获得相应的key
   int value=entry.getvalue();//获得Value
   System.out.println(key+":"+value);
   }
  • 使用Map接口内部定义的一个接口Entry,entry的意思是一项,一条。因此Entry就表示Map中的一个键值对。Entry接口最常用的方法包括getKey、getValue、setVaue。因此可以通过Entry对象来获取Key,value,也可以设置新的value
Map接口的实现类
  • Map接口有四个实现类,分别是HashMap,Hashtable,LinkedHashMap和TreeMap.
  • HashMap最多只允许一条记录的键为null,但允许多条记录的值为null. HashMap不支持线程的同步,即某时可以有多个线程同时写但也可能会导致HashMap数据会不一致。
  • Hashtable继承自Dictionary类,Hashtable不允许记录的键或值为null 它支持线程的同步,即任一时刻只有一个线程能写Hashtable,这也导致了Hashtable在写入时会比较慢。
  • LinkHashMap是HashMap的一个子类,保存了记录的插入顺序。
  • TreeMap则实现了SortMap接口,可以把保存的记录根据键排序,默认按key的升序进行排序,同时也可以指定用于排序的比较器。当使用lterator遍历TreeMap时,得到的记录是有序的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值