集合框架的超详细介绍

目录

集合的介绍

1、数组和集合之间的区别

2、集合的框架继承

3、集合遍历的三种方法

4.Collection 和Collections的区别

5.线程安全的问题


集合的介绍

数组长度是固定的,当添加的元素超过了数组的长度的时候,需要重新定义一个更大容量的数组,然后进行复制。而Java内部提供了集合类,能够存储任意对象,长度可以随着元素的增加而发生相对应的改变

1、数组和集合之间的区别

  • 数组既可以存储基本数据类型,也可以存储引用数据类型。基本数据类型存放的是值,而引用数据类型存放的是地址值
  • 集合只能存放数据类型(对象)。但是,如果想将基本数据类型存放在集合中也是可以的,集合会进行自动的装箱操作,将其变成对象。
  • 数组的长度是固定的,而集合的长度可以根据元素数量的增减而发生及时的改变。

装箱:自动将基本数据类型转换为包装类型

2、集合的框架继承

集合框架的超详细介绍_第1张图片

Collection接口

单列集合的跟接口,创建的时候需要导包,使用父类引用指向子类对象。Collection是Set、List、Queue、Deque的接口。

collection c = new ArrayList;

List接口,其继承自Collection接口

List是具有几个特点:

  • 有序,存取的顺序是一致的
  • 有索引
  • 可以重复存取

List的很多方法都是从Collection那里继承过来的,但因为其具有索引这个特点,自己还拥有几个特有的方法:

  • void add(int index,element)
  • get(int index)
  • remove(index)
  • set(index,E element)

List具有三个子类

  • ArrayList:底层是数组实现的,查询快,增删慢,线程不安全,但效率高
  • Vector:底层也是数组实现的,线程安全,但效率低。开发中几乎不使用,现在已经完全被ArrayList取代
  • LinkedList:底层是链表实现,查询慢,增删快,线程是不安全的,效率高。LinkedList不仅实现了List的接口,还实现了双向链表结构Deque,可以很方便的从头和尾插入或者删除元素数据。

数组就好像是电影院,每个座位都有一个标识。而链表就好像佛珠,只连接前后两个,不关心除此之外的其他佛珠在哪里。

Set接口,其继承自Collection接口

Set接口的特点:

  • 无序
  • 无索引
  • 不可以存储重复的元素

因为不可以存储重复的这个特性,在使用add()方法添加元素的时候,遇到重复元素会返回false,而在List集合中一直返回的是true。

Map接口的特点

Map接口中的元素是按照键值对来存储的,且要保证键的唯一性,无放入顺序,其具有三个实现类,HashMap,HashTable,LinkedHashMap。

**Map接口是和Collection接口一个级别的:Collection是单列集合的根接口,而Map是双列集合(存放键值对)的根接口。

3、集合遍历的三种方法

注意:Set类的集合不提供get方法,故其遍历只能使用增强for循环或者使用迭代器遍历。

方法一:for循环遍历

可以把集合转化为数组进行操作,利用集合de toArray() 方法。

方法二:迭代器遍历

iterator()方法: 返回在此Collection上的元素上进行迭代的迭代器 Iterator接口: hasNext()方法,仍有元素迭代,就始终返回true, next()方法,返回迭代的下一个元素,指针会自动向后移动一位。

集合框架的超详细介绍_第2张图片

方法三:增强for循环

该方法能够非常便利的的完成ArrayList中元素的遍历,是很多开发人员的首选。但是它存在几点的不足:

  • 无法用来进行ArrayList的初始化
  • 无法得知当前是第几个元素了,当需要打印单个元素的时候,就做不到了。

  package collection;
     
    import java.util.ArrayList;
    import java.util.Iterator;
       
    public class TestCollection {
     
    public static void main(String[] args) {
    List str = new ArrayList<>();
     
    // 放5个字符串进入容器
    for (int i = 0; i < 5; i++) {
    str.add(ABC+i);
    }
      
    // 第一种遍历 for循环
    System.out.println("--------for 循环-------");
    for (int i = 0; i < str.size(); i++) {
    String h = heros.get(i);
    System.out.println(h);
    }
    
    	// 第二种遍历 迭代器遍历
    System.out.println("--------迭代器遍历-------");
    	Iterator it = str.iterator<>(); //获取迭代器
    	//从最开始的位置判断下一个位置是否有数据,
    	//如果有数据,就使用next将其取出来,并且把指针向下移动
    	//直到下一个位置没有数据
    	 while(it.hasNext()){					//使用while循环进行迭代
    String h = it.next();
    System.out.println(h);
    }
    //迭代器的for写法
    System.out.println("--------使用for的iterator-------");
    for (Iterator iterator = str.iterator(); iterator.hasNext();) {
    String h = (String) iterator.next();
    System.out.println(h);
    }
    
    	// 第三种,增强型for循环
    System.out.println("--------增强型for循环-------");
    for (String h : str) {
    System.out.println(h);
    }
    }
     
    }

4.Collection 和Collections的区别

  • 前面已经介绍了Collection是单列集合的根接口,是Set、List 、Queue、Deque的接口。而且Collection和Map是没有关系的,Collection存放的是一个一个的对象,而Map存放的是键值对(key,values)。
  • Collections是一个类,容器的工具类,就好比Arrays是数组的一个工具类一样。Collections提供了很多实用的方法,例如:reverse(反转),shuffle(混淆),sort(排序),swap(交换)等

5.线程安全的问题

  • 线程安全的类有:Vector、Hashtable,StringBuffer
  • 线程不安全的类有:ArrayList、LinkedList、HashMap、HashSet、TreeMap、TreeSet、StringBulider:

但在Java中,可以将不安全的线程转化为安全的:利用Collections中的线程安全转化方法即可进行转化。

Collections.synchroinzed();

 

你可能感兴趣的:(编程语言学习)