java集合就像一个容器,可以存储任何类型的数据,也可以结合泛型来存储具体的类型对象,在程序运行时,java集合可以动态的进行扩展,随着元素的增加而扩大,在java中集合通常存在于java.util包中
这里说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化(存放在硬盘当中的数据)的存储(.txt或者jpg或者avi 等)
集合框架是怎样运行的
java集合中分两个体系Collection接口
Collection是 单列数据 ,定义了存取一组对象的方法的集合Collection中又分为List接口与Set接口
List接口: 元素有序,且可重复的集合 "动态数组"
接口实现:ArrayList,linkedList,Vector
Set接口:元素无序,且不可重复的集合 "去重"
接口实现: HashSet,linkedHashSet,TreeSet
Collection接口继承树:这里的实线表示继承关系,虚线表示实现关系
Map接口
Map是双列数据,保存具有映射关系 "key - value键值对的"集合
接口实现:HashMap,linkedHashMap,TreeMap ,Hashtable,Properties
list接口 什么是list接口: ArrayList:ArrayList的特点:作为list接口的主要实现类,线程不安全,执行效率高 ,底层使用Object[]数组 的方式进行存储,,elementData 的方式进行存储、
jdk7:ArrayList list = new ArrayList();//底层创建了长度是10 的Object[] 类型的数组elementData
list.add(123);//elementData[0] = new Integer(123);
。。。一直添加数据添加到第11位
list.add(11),如果此次的添加导致底层elementData数组容量不够,则扩容,默认情况下,扩容为原来的容量的1.5倍。同时需要将原有数组的数据复制到新的数组当中。
jdk8:ArrayList list = new ArrayList();//底层为Object[ ] elementData 初始化为 { } 并没有创建长度为10 的数组
list .add(123);第一次调用add()时,底层才创建了长度为10的数组,并将数据123添加到elementData的数组当中,
后续的扩容和添加数据与jdk1.7一致
总结:jdk7中的ArrayList 的对象的创建类似于单列的饿汉式,而jdk8中的arrayList的对象的创建类似于单列式设计模式中的懒汉式,延迟了数组的创建,节省了内存
linkedList:对于频繁的插入,删除操作,使用此类效率比ArraysList的效率要高,底层使用的是双向链表的方式进行存储
list与collection的常用API工具类
| 常用api | 功能(向集合中添加元素) |
| coll.add(E e) | 向集合中添加一个元素 |
| void add(int index ,E element) | 在指定位置添加一个元素 |
| coll.addAll(Collection extends E> c) | 将已经添加到集合中的元素添加到一个新的集合元素当中 |
| coll.hashCode(); | 返回当前对象的哈希值 |
public void test1(){
Collection coll = new ArrayList();
// add(Object e); 往Collection集合里面添加数据
coll.add("AA");
coll.add("BB");
coll.add(123);
coll.add(new Date());
// size,获取添加元素的长度
System.out.println(coll.size());
// addAll(Collection coll1) :将Coll1集合中的元素添加到当前的集合中
Collection coll1 = new ArrayList();
coll1.add(456);
coll1.add("CC");
coll1.add(coll1);
System.out.println(coll1.size());
// clear():清空集合元素
coll1.clear();
// isEmpty():判断当前集合中的元素是否为空
System.out.println(coll1.isEmpty());
}
| 判断功能API | |
| boolean is Empty(); | 判断集合是否为空 |
| bolean contains(object obj) | 判断集合中是否存在指定的元素 |
| bolean containsAll(Collection> c) | 判断集合中是否存在指定的一个集合中的元素 |
| 修改API | |
| E set(int index ,E element ) | 把指定索引位置的元素修改为指定的指,并且返回修改之前的值 |
Iterator接口遍历:迭代
| 获取功能 | |
| E get(int index) | 获取指定位置的元素 |
| Iterator iterator() | 就是用来获取集合中每一个元素 |
public class IteratorTest {
// hasNext(),判断是否还有下一个元素,调用hasNext的时候指针没有下移
// iterator.next(),1指针下移,2将下以一会集合位置上的元素进行返回
@Test
public void test1(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(1234);
coll.add(new Person("Jerry",20));
coll.add(new String("Tom"));
coll.add(false);
Iterator iterator = coll.iterator();
// for (int i= 0; i< coll.size(); i++){
通过for循环的方式 获取添加对象中的所有的集合
// System.out.println(iterator.next());
// }
//异常报错:NoSuchElementExceprion,跳出循环
// 最合适的方法,通过迭代的方式进行实现
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
| 删除功能API | |
| void clear(); | 删除集合中的所有元素 |
| E remove (int index) | 根据指定索引删除元素,并把删除的元素进行返回 |
| boolean remove(Object o) | 从集合中删除指定的元素 |
| boolean removeAll(Collection)> c ); | 从集合中删除一个指定的集合元素 |
@Test
public void test2(){
// 内部定义remove(),可以在遍历的时候,删除集合中的元素,此方法不同于集合直接调用remove()
Collection coll = new ArrayList();
coll.add(123);
coll.add(1234);
coll.add(new Person("Jerry",20));
coll.add(new String("Tom"));
coll.add(false);
//删除集合中"Tom"的数据
Iterator iterator = coll.iterator();
while (iterator.hasNext()){
Object next = iterator.next();
if ("Tom".equals(next)){
iterator.remove();
}
}
// 遍历集合中的数据
Iterator iterator1 = coll.iterator();
while (iterator1.hasNext()){
System.out.println(iterator1.next());
}
}
| 获取长度功能 | |
| int size(); | 获取集合中元素的个数 |
Collection coll1 = new ArrayList();
coll1.add(456);
coll1.add("CC");
coll1.add(coll1);
// 传入集合中三个元素
System.out.println(coll1.size());//所以这里打印的结果4
| 把集合转换成数组 | |
| Object[] to Array(); | 把集合变成数组 |
| Arrays.asList() | 将数组转换为集合,调用Arrays类的静态方法asList(),注意:转换int类型时,会默认将int类型的可变型参当做一个元素 ,而不是当作几个元素 |
将集合变成数组
Object[] coll3 = coll1.toArray();
for (Object o : coll3) {
System.out.println(o);//[456, CC, (this Collection), 1, 2, 0]打印结果
}
foreach循环遍历集合



