JAVA中集合框架和泛型重点总结

Java集合框架:

Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中。

(Collection是·所有Java集合框架的父接口;Collections操作集合的工具类)

Iterator:是迭代器

  1. 接口:

  1. 具体实现类:

  1. 算法:

Collections(提供了对集合进行排序,遍历等多种算法实现)

 

Collection接口存储一组不唯一(可以重复),无序的对象

 

List接口存储一组不唯一,有序(插入顺序)的对象

0

1

2

3

4

5

aaaa

dddd

 cccc

aaaa

eeee

dddd

 

Set接口存储一组唯一,无序的对象

aaaa

dddd

cccc

 

Map接口存储一组键值对象,提供key到value的映射(KV值)

CN

JP

RU

FR

China

Japan

Russia

France

键Key都是唯一的,而且是无序的

而值Value不一定是唯一的(可以有两个China)

 

List接口:

List接口的实现类:

 

ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高

0

1

2

3

4

5

aaaa

dddd

cccc

aaaa

eeee

dddd

 

ArrayList常用方法:

方法名

说明

Boolean      add(Object 0)

在列表的末尾顺序添加元素,起始索引位置从0开始

Void            add(int index,Object 0)

在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间

int               size()

返回列表中的元素个数

Object        get(int index)

返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换

boolean      contains(Object 0)

判断列表中是否存在指定元素

Boolean     remove(Object 0)

从列表中删除元素

Object        remove(int index)

从列表中删除指定位置元素;起始索引位置从0开始

Collection接口常用通用方法还有:clear()(清空)、isEmpty()(返回布尔值要么空,要么不空)、iterator()、toArray()

equals(object【另外一个集合】):判断两个集合的内容是否一样,从第一个开始一次比较

subList(0,2)取出该集合下标0到1的集合并组成一个新的集合

这些红色的都是父接口Collection有的方法。在set和LinkedList这些方法都有

 

集合里不能添加基本数据类型,只能添加对象或者添加引用数据类型

LinkedList采用链表存储方式。插入、删除元素时效率比较高

注意这样声明,无法使用LinkedList独有的方法:List list = new LinkedList();

而应该这样声明:LinkedList list = new LinkedList();

 

LinkedList中独特的方法:

方法名

说明

void         addFirst(Object 0)

在列表的首部添加元素

void         addLast(Object 0)

在列表的末尾添加元素

Object     getFirst()

返回列表中的第一个元素

Object     getLast()

返回列表中的最后一个元素

Object     removeFirst()

删除并返回列表中的第一个元素

Object     removeLast()

删除并返回列表中的最后一个元素

lastIndexOf(object arg0)最后一个重复的元素的下标

 

ArrayList和LinkedList有何异同?

  1. ArrayList和LinkedList都是list的两个实现类,可以通过get拿出来
  2. ArrayList适用于遍历取值,不适用于插入增加
  3. LinkedList插入删除的时候效率比较高,而且LinkedList还有很多自己的独特方法

 

Set接口:

  1. Set接口存储一组唯一,无序的对象
  2. HashSet是Set接口常用的实现类
  3. Set中存放对象的引用

 

Set接口如何判断加入对象是杏已经存在呢?

采用对象的equals()方法比较两个对象是否相等

   Set set=new HashSet();

  String s1=new String("java");

  String s2=s1;

  String s3=new String ("java");

  set.add(s1);

  set.add(s2);

  set.add(s3);

  System.out.printIn(set.size());

最后输出1。

String重写了equals的方法,所以如果字符串一样equals最后返回的一定是true。

 

HashSet是Set接口常用的实现类:

  Set newsTitleSet = new HashSet();

  NewTitle car = new NewTitle(1,“汽车","管理员");

//增加元素

  newsTitleSet.add(car);

//获取元素个数

  System.out.println("新闻标题数目为: "+ newsTitleList.size()+ "条");

然而Set接口不存在get()方法:

  newsTitleSet.get(0);

因为set是无序的没有索引,所以不能用下标输出。想要获取元素可以用增强性的for

 

如何遍历Set集合?

方法1:增强型for循环

方法2:通过迭代器lterator实现遍历:(lterator和Collection是两个并列的接口)

  1. 获取Iterator:Collection 接口的iterate()方法(set和list都有这个方法)
  2. lterator的方法

【boolean hasNext():判断是否存在另一个可访问的元素】

【Object next();:返回要访问的下一个元素】

 

有序的list想要get出有3种方法:

  1. 普通for,遍历索引
  2. 增强型for
  3. 迭代器lterator实现遍历

无序的set想要get只有2种方法:

  1. 增强型for
  2. 迭代器lterator实现遍历

 

Map接口:

Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作

【最常用的实现类是HashMap】

//往map集合里添加键值对

              countries.put("CN", "中华人民共和国");

              countries.put("RU", "俄罗斯联邦共和国");

              countries.put("FR", "法兰西民主共和国");

              countries.put("U.S.", "美利坚合众国");

 

//获取map的元素(对)数

              System.out.println(countries.size());

 

//通过某个键获取对应值

              String country = (String)countries.get("CN");

              System.out.println(country);

 

//判断map中是否包含某个键         

boolean flag = countries.containsKey("U.S.");

              System.out.println(flag);

 

//删除特定键对应的键值对

              countries.remove("U.S.");

              flag = countries.containsKey("U.S.");

              System.out.println(flag);

 

//分别显示map中键集,值集,和键值对集

              System.out.println(countries.keySet());

              System.out.println(countries.values());

              System.out.println(countries);

 

//清空

              countries.clear();

              if(countries.isEmpty()){

                     System.out.println("清空");

              }

 

Map接口常用方法:

方法名

说明

Object         put(Object key, Object val)

以“键-值”对的方式进行存储

Object         get(Object key)

根据键返回相关联的值,

如果不存在指定的键,返回null

Object         remove(Object key)

删除由指定的键映射的“键值对”

Int               size()

返回元素个数

Set              keySet()

返回键的集合

Collection    values()

返回值的集合

boolean       containsKey(Object key)

如果存在由指定的键映射的

“键-值对”,返回true

 

Map中取出数据的方法:

  1. 先获取每一个Key(使用增强性的for,或者迭代器lterator实现遍历),然后根据每个Key拿到相应value

方法一:使用增强性的for拿到每个Key

              for(Object obj : keys){

                     String key = (String) obj;

                     String value = (String)countries.get(key);

                     System.out.println(key+"-"+value);

              }

方法二:使用迭代器Interator拿到每个Key

              Iterator itor = keys.iterator();

              while(itor.hasNext()){

                     String key = (String) itor.next();

                     String value = (String)countries.get(key);

                     System.out.println(key+"-"+value);

              }

  1. 先拿到Map中的键值对,然后再在每个键值对中分别取出来键和值

方法三:使用键值对

              Set ms = countries.entrySet();        // ms就是所有键值对的集合

              for(Object obj : ms){

                     Map.Entry me = (Map.Entry)obj;  //Map中的每一个键值对(Map)

                     Object key = me.getKey();       //getKey取出每个键值对中的键

                     Object value = me.getValue();    //getValue取出每个键值对中的值

                     System.out.println((String)key+"-"+(String)value);

              }

 

              Set entrySet = map.entrySet();

             for(Object obj : entrySet){

                     Entry entry = (Entry)en;

                    System.out.println(entry.getKey());

              }

 

泛型:

(JDK 5之后提倡使用泛型,改写了集合框架中的所有接口和类)

将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性

【本质是参数化类型】

泛型集合:

泛型集合可以约束集合内的元素类型

典型泛型集合ArrayList<E>、HashMap<K,V>

  1. <E>、<K,V>表示该泛型集合中的具体元素类型【写的时候写实际的类型】
  2. 泛型集合中的数据不再转换为Object

【除了指定了集合中的元素类型外,泛型集合和之前学习的集合的用法完全一样】

泛型的尖括号中可以放父类对象,这样子类对象也可以插入到这个集合里。

 

Collections算法类·

  1. Java集合框架将针対不同数据结构算法的实现都保存在工具类中
  2. Collections类定义了一系列用干操作集合的静态方法

Collections类常用方法:

  1. Collections和Collection不同,前者是集合的操作类,后者是集合接口
  2. Collections提供的常用静态方法

      (1)sort () :排序

      (2)binarySearch() :查找

      (3)max () \min() :查找最大\最小值

      (4)打印输出集合中的最大值和最小值

              String strMax = (String)Collections.max(list);

              String strMin = (String)Collections.min(list);

              System.out.println(strMax+"-"+strMin);

       (5)升序排序:

System.out.println("*********************");

              Collections.sort(list);

              for(String str :list){

                     System.out.println(str);

              }

       (6)查找:

System.out.println("*****************************");

              System.out.println(Collections.binarySearch(list, "tom"));

       (7)反转集合元素:

System.out.println("*****************************");

              Collections.reverse(list);

              for(String str :list){

                     System.out.println(str);

}

 

Collections排序:

  1. Collections类可以对集合进行排序、查找和替换操作
  2. 实现一个类的对象之间比较大小,该类要实现Comparable接口【重写compareTo()方法】

 

Student类继承Comparable接口:

public class Student implements Comparable<Student>{

编写Comparable的算法compareTo:

public int compareTo(Student stu) {

当现在的成绩大于原有的成绩时返回1:

              if(this.getScore()>stu.getScore()){

                     return 1;

当现在的成绩小于原有的成绩时返回-1:

              }else if(this.getScore()<stu.getScore()){

                     return -1;

              }else{

当现在的年龄大于原有的年龄时返回1:

                     if(this.getAge()>stu.getAge()){

                            return 1;

当现在的年龄小于原有的年龄时返回-1:

                     }else if(this.getAge()<stu.getAge()){

                            return -1;

字符串比较时直接调用compareTo方法此时可以直接点出来,因为String重写了compareTo这个方法,所以可以直接调用(也就是 .compareTo

                     }else return this.getName().compareTo(getName());

              }

       }

在测试类中直接利用Collections. 调用Collections的sort方法进行升序排列:

Collections.sort(list);

再利用增强型的for遍历数组输出信息:

for(Student str :list){

       System.out.println(str.getName()+"-"+str.getAge()+"-"+str.getSex()+"-"+str.getScore());

}

猜你喜欢

转载自blog.csdn.net/baidu_29343517/article/details/81262999