目录
集合的介绍
数组长度是固定的,当添加的元素超过了数组的长度的时候,需要重新定义一个更大容量的数组,然后进行复制。而Java内部提供了集合类,能够存储任意对象,长度可以随着元素的增加而发生相对应的改变。
1、数组和集合之间的区别
- 数组既可以存储基本数据类型,也可以存储引用数据类型。基本数据类型存放的是值,而引用数据类型存放的是地址值
- 集合只能引用存放数据类型(对象)。但是,如果想将基本数据类型存放在集合中也是可以的,集合会进行自动的装箱操作,将其变成对象。
- 数组的长度是固定的,而集合的长度可以根据元素数量的增减而发生及时的改变。
装箱:自动将基本数据类型转换为包装类型
2、集合的框架继承
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()方法,返回迭代的下一个元素,指针会自动向后移动一位。
方法三:增强for循环
该方法能够非常便利的的完成ArrayList中元素的遍历,是很多开发人员的首选。但是它存在几点的不足:
- 无法用来进行ArrayList的初始化
-
无法得知当前是第几个元素了,当需要打印单个元素的时候,就做不到了。
package collection;
import java.util.ArrayList;
import java.util.Iterator;
public class TestCollection {
public static void main(String[] args) {
List<String> 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<String> it = str.iterator<>(); //获取迭代器
//从最开始的位置判断下一个位置是否有数据,
//如果有数据,就使用next将其取出来,并且把指针向下移动
//直到下一个位置没有数据
while(it.hasNext()){ //使用while循环进行迭代
String h = it.next();
System.out.println(h);
}
//迭代器的for写法
System.out.println("--------使用for的iterator-------");
for (Iterator<String> 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();