集合框架和泛型

  使用的原因:

1.数组长度是固定的,但需要的长度不固定的时候       2.如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象

集合是接口,所以下面有实现类

                 List-- 具体类  ->ArrayList   LinkedList

Collection----接口-->Set-  具体类   ->HashSet    TreeSet

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

  boolean add(Object o),int size(),boolean contains(Object  o),boolean  remove  (Object  o),clear(),isEmpty(),iterator(),toArray()是Collection接口的方法,所以在List和Set中是通用的。

List 接口存储一组不唯一、有序(插入顺序)的对象(可以重复的对象,因为有序,所以可以通过下标找对象)

  ArrayList:实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高,删除、插入会影响后面全部的元素,所以删除和插入元素不建议使用此                              集合

       注意:1、ArrayList中的 get (int  index)是获取集合中的下标对象,需要将对象转换成所需的对象,记得一定要转化类型。

          2、除了可以使用for去循环遍历元素,也可以使用foreach去遍历,但是接收的是Object类型,记得一定要转化类型

  LinkedList:采用链表存储方式。插入、删除元素时效率比较高,因为在上一个元素中有下一个元素的地址,空间不连续,插入、删除元素只影响邻近的两位元素,所以效率高

  ArrayList和LinkedList的异同:

              相同点:都是以List的父接口

              不同点:使用的场景不同,ArrayList适合遍历元素,LinkedList适合添加、删除元素

Set 接口存储一组唯一、无序的对象(对象不重复,没有排序,因为Set中存入对象是存放对象的引用(地址))

  Set接口在添加对象的时候,会先判断此对象是否已经存在了(采用Object类的equals()方法比较两个对象是否是相等,也就是去比较两个内存地址是否相等 )

  注意:如果添加到Set中的是new  String ,值是相同的的,但也是添加了一个,是因为String类重写了Object类中的equals()方法,是对字符串的对比,不是地址的对比,所以只能添加一个。(只有String类的对象比较特殊)

比如:

  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);

  set.size();                 长度为1

Set接口不存在get()方法,因为它是无序的,可以使用:

1.增强型for

2.使用迭代器Iterator实现遍历:获取Iterator---使用Collection接口的iterator()方法,所有的集合都有iterator()方法

Iterator的方法:boolean  hasNext();判断是否存在另一个可访问的元素

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

步骤:1.获得迭代器,通过集合的iterator()方法去获得,返回的类型是Iterator类型

   2.通过Iterator类型对象的hasNext()方法去判断集合是否有值,然后通过Iterator类型对象的next()方法得到元素,记得要转换类型。

比如:

NewsList newsList=new NewsList("xiao","刘诗诗和吴厅隆出现机场",1);
NewsList newsList1=new NewsList("xiao","刘诗诗和吴厅隆出现机场",1);
  Set set=new HashSet();
  set.add(newsList);
  set.add(newsList1);
  Iterator iter=set.iterator();
  while(iter.hasNext()){
   NewsList news=(NewsList)iter.next();
   System.out.println(news.getName());
  }

Map---  具体类-->HashMap   TreeMap(Map不是Collection下的接口,它跟List   Set没有关系)

Map 接口存储一组键值对象,提供Key到Value的映射(键Key是唯一的、无序的,值Value可以是重复的),一 一对应的就可以使用此接口

 遍历Map的方法:

1:
  Map map=new HashMap();
  map.put("cn", "中国");
  map.put("jp","日本");
  map.put("usa", "美国");
  
  //分别为获取Map中的键和值
  //方法一:先获取到每个key,然后根据每个key拿到相应的value
  Set keys=map.keySet();
  for(Object obj:keys){
   String key=(String)key;
   String value=(String)map.get(key);
   System.out.println(key+"-"+value);
  }

2:

//方法二:使用Iterator迭代器拿到每个key
  Iterator ite=keys.iterator();
  while(ite.hasNext()){
   String key=(String)ite.next();
   String value=(String)map.get(key);
   System.out.println(key+"-"+value);
  }

3:

//(2)先拿到Map中的键值对,然后再在每个键值对中分别取出来键和值
  Set s=map.entrySet();//Map中所有键值对的集合
  for(Object obj:s){
   Map.Entry mm=(Map.Entry)obj;//Map中的每一个键值对(Map.Entry)
   Object key=mm.getKey();//取出每个键值对中的键
   Object value=mm.getValue();//取出每个键值对中的值
   System.out.println(key+"-"+value);
  }

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

 实现一个类的对象之间的比较大小,该类在实现Comparable接口,重写compareTo()方法

 集合中不可以存放基本数据类型,就算放了基本数据类型,Java虚拟机会将它装箱成Object类型

泛型:因为上述的集合没有规定类型,所以如果放入的类型不同,那么就会存在数据的混乱,所以才会有泛型的出现,去规定类型,保证类型转换的安全和稳定性

语法如下:

类1或者接口<类型参数>  对象= new  类1<类型实参>();

原文地址:https://www.cnblogs.com/shmilynanmei/p/8849903.html