第48节:Java当中的集合框架

作者: 魔王哪吒 | 来源:发表于2018-09-21 23:58 被阅读107次
    标题图

    Java当中的集合框架

    01

    在我们班里有50位同学,就有50位对象。

    // 简书作者:达叔小生
    Student[] stus = new Student[20];
    

    结果来了一位插班生,该同学因为觉得学IT行业好,才要求老师转专业的。可以结果没有多余的空位了,数组里的长度都是安排好的,没有空间了。

    为了解决新同学的问题,老师们重新创建一个空间(重复创建一个新的数组),为了能够更好的解决问题,老师提供了可以不断扩大空间(Java提供了集合,当数据多了,个数不稳定时,可以用集合)。

    Java中,数组的长度是不可以改变的,在数组中存储的是同种类型的元素,可以存储基本数据类型值;但是集合的长度是可以改变的,存储的是对象,对象的类型可以不一样,集合是存储对象的,当数据多,即对象多的时候,可以用集合来存储。

    虽然数组和集合类都是容器
    为什么用集合来解决问题,数组难道就不可以吗?

    数组也可以存储对象的,但是因为长度的固定,限制了数组,而集合的长度是可以改变的,在数组中可以用来存储基本数据类型,而在集合中只能用来存储对象,但是可以存的对象可以是不同类型的对象哦~

    数组可以存放基本数据类型和对象
    集合只能存放对象

    Java语言这种面向对象语言中,对一切事物的体现都可以用对象的形式来表现,为了对对象进行方便的操作,Java就提供了集合这个名词,用来存储对象一种方式。

    02

    类集合框架主体

    集合框架的构成及分类

    类集合框架主体
    // 简书作者:达叔小生
    java.util
    类 Vector<E>
    java.lang.Object
     -> java.util.AbstractCollection<E>
      -> java.util.AbstractList<E>
       -> java.util.Vector<E>
    
    // 简书作者:达叔小生
    public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess,Cloneable,Serializable
    

    类集框架,那么什么是类集框架,集合的种类有哪些,类集框架的基础结构。

    类集框架是一组类和接口的集合,位于java.util包当中,是用来用户存储和管理对象的,在这个类集合框架中,我们主要学习的为三大类,分别是集合,列表和映射。

    集合,列表,映射

    类集合框架是jdk提供的一类类和接口,主要掌握集合,列表,映射,集合是无序的,集合中的元素不允许是重复的,列表是有序的,列表中的元素是允许重复的,映射是以键值对的方式来存储数据,键是不可重复的,值是可以重复的。

    其实在jdk最早的时候jdk1.0版的时候,提供的集合是很少的,但是随着发展,到jdk1.2的时候就变多了,为了营造更多的需求,就有了集合框架。

    所以的根接口为Collection.

    // 简书作者:达叔小生
    // 集合框架体系
    Iterator
     ->Collection
     -> Map
    
    // 简书作者:达叔小生
    Collection
     -> Set 无序不重复 -> 无序HashSet,需要排序TreeSet
     -> List 有序可重复 -> 查,改ArrayList,增删LinkedList
    
    Map
     -> 无序 HashMap
     -> 排序 TreeMap
    

    03

    顶级Iterator和Collection

    Collection的相关方法,可以去官方下载文档来看哦:

    方法 说明
    add(E e) 返回的是boolean的类型,确保collection包含指定的元素
    addAll(Collection<? extends E> e) 返回的是boolean的类型,将指定collection中的所有元素添加到collection
    clear() 返回Void,移除此collection中的所有元素
    contains(Object o) 返回boolean类型,如果此collection包含指定的元素,则返回true
    containsAll(Collection<?> c) 返回boolean类型,如果此collection包含指定collection中的所有元素,则返回true
    equals(Object o) 返回boolean类型,比较collection与指定对象是否相等
    hashCode() 返回的是int类型,返回此 collection 的哈希码值
    isEmpty() 返回 boolean类型,如果此collection不包含元素,则返回true
    iterator() 返回Iterater<E>,返回在此collection的元素上进行迭代的迭代器
    size() 返回Int类型,返回此collection中的元素数
    Collection接口

    Collection接口:它定义了集合体系中最共性的功能

    // 简书作者:达叔小生
    java.util
    接口 Collection<E>
    所有超级接口:
    Iterable<E>
    
    // 简书作者:达叔小生
    public interface Collection<E>
    extends Iterable<E>
    

    Collection接口为层次结构中的根接口,由上方提供的图片得知,Collection表示为一组对象,这些对象称为Collection的元素,在这个类集合框架中,我们主要学习的为三大类,分别是集合,列表和映射。

    注意一些collection允许有重复的元素,有的不允许,有的是有序的,有的是无序的。

    这些都跟三大类有关。

    java中,jdk不提供Collection接口的实现,都是由它的子接口进行实现的。

    Collection是List和Set的父类

    如图

    ListSet也都是由再次向下,由它们的子类接口实现的。

    // 简书作者:达叔小生
    Set 和 HashSet 为Set的实现类 使用
    Iterator -> Collection -> Set -> HashSet
    Iterator -> Collection -> List -> ArrayList
    

    来解释:一些collection允许有重复的元素,有的不允许,有的是有序的,有的是无序的。是因为数据结构的不同。为 -> 三大类集合,列表,映射

    出现了集合框架,有了很多种容器可以完成很多需求,我们区分容器是靠着每个容器的数据结构不同,去命名了解的。

    04

    三大类集合,列表,映射

    Set为集合,在集合中的对象是不按照顺序排列的,并且是没有重复的对象的。
    简单为:无序,无重复。

    Set

    List为列表,中在列表中的对象是由顺序的排序的,并且是有重复的对象。
    简单为:有序,有重复。

    List

    Map为映射,在集合中的每个元素都有一个键对象和一个值对象,在Map中键是不可以重复的,值是可以重复的。
    键不可重复,值可以重复;

    Map

    Set为无序集合,无序无重复;
    List为有序集合,有序有重复;
    Map为映射,存储键值对,键不可重复,值可以重复;

    05

    Collection是所有集合类的根接口,有人问那么这个呢?
    Collections,其实这个是集合操作的工具类。

    // 简书作者:达叔小生
    Collection
     -> Set
      -> HashSet
      -> LinkedHashSet
      -> TreeSet
    
     -> List
      -> ArrayList
      -> Vector
      -> LinkedList
    
     -> Queue
      -> LinkedList
      -> PriorityQueue
    
     -> Map
      -> Hashtable
      -> HashMap
      -> TreeMap
      -> LinkedHashMap
    
    Collection接口
    // 简书作者:达叔小生
    import java.util.List;
    import java.util.ArrayList;
    
    public class Demo{
     public static void main(String args[]){
     // 创建列表的实现类对象
      ArrayList<String> arrayList = new ArrayList<String>();
     // 添加数据
     arrayList.add("a");
     arrayList.add("b");
     arrayList.add("c");
    // 移除
     arrayList.remove(1);
     // 获取数据
     String s = arrayList.get(1);
     System.out.println(s);
     // 获取长度
     int a = arrayList.size();
     // 打印所有元素
     for(int i=0; i<arrayList.size(); i++){
      String s = arrayList.get(i);
      System.out.println(s);
     }
     }
    }
    

    SetHashSetSet的实现类 使用

    // 简书作者:达叔小生
    import java.util.Set;
    import java.util.HashSet;
    public class Demo{
     public static void main(String args[]){
      HashSet<String> hashSet = new HashSet<String>();
     Set<String> set = hashSet;
     // 实现类向上转型为接口
     // 同理 Set<String> set = new HashSet<String>();
     // 添加元素
     set.add("a"); 
     set.add("b");
     set.add("c");
     set.add("d");
     // 获取集合中的元素长度
     int a = set.size();
     }
    }
    

    Iterator 接口 迭代器对象

    迭代是Java中的用来表示取元素的名称而已,Iterator 接口 迭代器对象用来取元素,无论是什么数据结构,最终共性的取出方式,取值是一个一个取的,在之前先要判断是否有值,如果有就取一个,如果没有就over,不取。

    // 简书作者:达叔小生
    Iterator - > Collection -> Set - > HashSet
    hasNext() next()
    it.hasNext() 是否还有元素
    it.next() 取出元素
    

    Iterator -> Collection -> List -> ArrayList

    Set 和 HashSet 为Set的实现类 使用

    // 简书作者:达叔小生
    hasNext() 判断是否还有下一个元素
    next() 取出这个元素,然后把游标移动到下一位
    

    Iterator -> Collection -> Set -> HashSet

    // 简书作者:达叔小生
    import java.util.Set;
    import java.util.HashSet;
    import java.util.Iterator;
    public class Demo{
     public static void main(String args[]){
      HashSet<String> hashSet = new HashSet<String>();
     Set<String> set = hashSet;
     // 实现类向上转型为接口
     // 同理 Set<String> set = new HashSet<String>();
     // 添加元素
     set.add("a"); 
     set.add("b");
     set.add("c");
     set.add("d");
     // 迭代器 iterator() 遍历整个set
    // 通过迭代器取出集合中的对象
     Iterator<String> it = set.iterator<String>();
     while(it.hasNext){
      String s = it.next();
      System.out.println(s);
     }
     }
    }
    

    Iterator迭代器 iterator()

    // 简书作者:达叔小生
    Iterator<E> iterator()
    // 返回在此collection的元素上的迭代效果。
    

    接口Iterable<E>中的iterator
    在此collection的元素上进行迭代
    iterator()可以获取具体容器中的迭代器对象
    迭代器返回的是Iterator接口

    迭代器的方法

    方法 说明
    hasNext() 返回boolean类型,如果有元素可以迭代(取出),则返回true
    next() 返回E,返回迭代的下一个元素
    remove() 返回void,从迭代器中移除迭代器返回的最后一个元素

    java.util.NoSuchElementException 没有这个元素异常
    it.next()

    // 简书作者:达叔小生
    public class IteratorDemo{
     public static void mian(String[] args){
      // 创建集合对象
      Collection collection  = new ArrayList();
     // 存储的是对象的引用
     // 集合存储不了基本数据类型
     // collection.add(12); == 内部效果 collection.add(Integer.valueOf(12); // 自动装箱
     // 即在jdk1.5后,存储的是基本数据类型包装类的对象
      collection.add("ab");
      collection.add("bbb");
      collection.add("cbbb");
      collection.add("dbbbb");
      // 获取迭代器 iterator()方法
      Iterator it = collection.iterator();
      while(it.hasNext(){
       System.out.println(it.next());
      }
      // 
       //可以转变为
       // for(Iterator it = collection.iterator(); it.hasNext(); ) {}
      //
      // 每个存储对象的长度
      for(Iterator it = collection.iterator(); it.hasNext(); ){
       // 取出对象
       Object object = it.next();
       // 向下转型,才能使用元素的特殊方法
       String str = (String)object;
       // 打印对象长度
       System.out.println(str.length());
      } 
     }
    }
    
    // 简书作者:达叔小生
    // 可以使用这个,节省内存
    for(java.util.Iterator iterator = collection.iterator(){
     Object object = (Object) iterator.next();
    }
    

    06

    // 简书作者:达叔小生
    // 创建一个Student类
    public class Student{
     // 定义私有的String变量 name
     private String name;
     // 定义私有的int变量 age
     private int age;
     // 创建构造函数
     public Student(){
      super();
     }
     public Student(String name, int age){
      super();
      this.name = name;
      this.age = age;
     }
     // 创建toString()方法
     @Override
     public String toString(){
      return "Student [name=" + name + ", age=" + age + "]";
     }
     // 创建getXxx(),setXXX()方法
     public String getName(){
      return name;
     };
     public void setName(String name){
      this.name = name;
     }
     public int getAge(){
      return age;
     }
     public void setAge(int age){
      this.age = age;
     }
     // equals();
     @Override
     public boolean equals(Object obj){
      if(this == obj){
       return; 
      }
      if(! (obj instanceof Student) ){
       throw new ClassCastException("类型错误");
      }
       Student stu = (Student)obj;
       return this.name.equals(stu.name) && this.age == stu.age;
     }
    }
    

    equals()方法

    // 简书作者:达叔小生
    public class CollectionDemo {
     public static void main(String[] args){
      // 创建集合对象
     Collection collection = new ArrayList();
     // 添加元素 添加一个地址两次为重复
     Student stu = new Student( "a",12 );
     collection.add( stu );
     collection.add( new Student("b",13) );
     collection.add( new Student("c",14) );
     collection.add( new Student("d",15) );
     for(Iterator it = collection.iterator(); it.hasNext(); ){
      Student student = (Student) it.next();
      System.out.println(student.getName());
     }
     }
    }
    

    Map 与 HashMap(Map的实现类) 的使用

    Map 为映射,映射中的每个元素都有一个键对象和一个值对象,在Map中键是不可以重复的,值是可以重复的。从jdk1.2有了这个类。

    // 简书作者:达叔小生
    java.util
    Interface Map<K,V>
    K - the type of keys maintained by this map
    V - the type of mapped values
    

    Map是一种对象,将keys键和values值建立起一种映射关系,一个map不能有重复的keys,每个key只能唯一映射到一个值。

    // 简书作者:达叔小生
    import java.util.Map;
    import java.util.HahMap;
    public class Demo{
     public static void main(String args[]){
      HashMap<String,String> hasMap = new  HashMap<String,String>();
      Map<String,String> map = hasMap;
     // 向上转型
     // 同理 Map<Stirng,String> map = new HashMap<String,String>();
     // put() 用来存放键值对
     map.put("1","a");
     map.put("2","b");
     map.put("3","c");
    // 获取长度
     int i = map.size();
    // 获取键为2的值
     String s = map.get("2");
     }
    }
    

    Map中键是不可以重复的,值是可以重复的。如果map中添加一样的键,那么新的值会覆盖老的值。

    Collection

    // 简书作者:达叔小生
    public interface List<E>
    extends Collection<E>
    
    简书作者:达叔小生
    // 简书作者:达叔小生
    java.util
    接口 List<E>
    所有超级接口:Collection<E>,Iterable<E>
    所有已知实现类:AbstractList,AbstractSequentialList,ArrayList,AttributeList,CopyOnWriteArrayList,LinkedList,RoleList,Vector,Stack。
    可以用 ArrayList
    

    public interface List<E> extends Collection<E>

    // 简书作者:达叔小生
    public class ListDemo{
     public static void main(String[] args){
      // List
      List list = new ArrayList();
     // 添加元素
     list.add( new Student("a",12) );
     list.add( new Student("b",13) );
     list.add( new Student("c",14) );
     // 插入元素
     // list.add( 1, new Student("d",15) );
     // list.remove(44); 
     // 角标越界IndexOutOfBoundsException)
     // list.set( 2, new Student("dashucoding", 16) );
     // 循环出对象
     for(Iterator it = List.iterator(); it.hasNext(); ){
      Student stu = (Student) it.next();
      System.out.println(stu);
     }
     // 获取对象
     Object obj = list.get(1);
     System.out.println(obj);
     // 获取对象
     for(int i = 0; i<list.size(); i++){
      System.out.println(list.get(i));
     }
    }
    

    往后余生,唯独有你
    简书作者:达叔小生
    90后帅气小伙,良好的开发习惯;独立思考的能力;主动并且善于沟通
    简书博客: https://www.jianshu.com/u/c785ece603d1

    结语

    • 下面我将继续对 其他知识 深入讲解 ,有兴趣可以继续关注
    • 小礼物走一走 or 点赞

    相关文章

      网友评论

        本文标题:第48节:Java当中的集合框架

        本文链接:https://www.haomeiwen.com/subject/bmiznftx.html