黑马程序员-------集合框架之Collection

------- <a href="http://www.itheima.com"target="blank">android培训</a>、<a href="http://www.itheima.com"target="blank">java培训</a>、期待与您交流! ----------


集合框架之Collection

集合,是用于存储数据的容器。

(对象多了用集合存(或数组),数据多了用对象存),所以要明确一点,集合用于存储

对象。

集合与数组的区别:

1. 数组长度固定,集合长度可变。

2. 数组可以存储任何数据类型,集合只能存储引用数据类型。

3. 数组存储的元素必须是同一数据类型,集合存储的对象可以是不同数据类型。

 

集合体系大致分为:

Collection
|---List

     |---LinkedList
     |---ArrayList
     |---Vector
 
|---Set

     |---HashSet

     |---TreeSet

(本篇未涉及)

Map
     |---TreeMap

     |---HashMap


如上,集合框架产生出这么多容器的原因是:每一个容器对数据的存储方式不同,这种存储方式就称之为数据结构。

 

1.Collection接口

Collection是最基本的集合接口Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection子接口ListSet

2.集合共性方法:

add(object):添加一个元素 

addAll(Collection) :添加一个集合中的所有元素。

clear():移除此 collection 中的所有元素,清空集合

remove(obj) :删除集合中指定的对象。注意:删除成功,集合的长度会改变。 removeAll(collection) :删除部分元素。部分元素和传入Collection一致。

boolean contains(obj) :集合中是否包含指定元素 。 

boolean containsAll(Collection) :集合中是否包含指定的多个元素。 

boolean isEmpty():集合中是否有元素。

int size():返回此 collection 中的元素数。

 toArray(); 返回包含此 collection 中所有元素的数组。

等等

 3.Iterator接口:

其中获取集合中所有元素:Iterator  iterator():迭代器

每个集合都有自己的数据结构,那么取出自己内部元素的方式也不同,那么这种取出方式就被定义成了内部类,但是共性是判断,取出。所以这些在不同集合中的内部类都符合一个规则,该规则就是Iterator,获取集合的取出对象的方法就是iterator()方法。即遍历Collection中的每一个元素,不论Collection的实际类型如何,它都支持一个该iterator()方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
    Iteratorit = collection.iterator(); //获得集合中一个迭代对象

              while(it.hasNext()) {
      Objectobj = it.next(); // 得到下一个元素
    }

4.List接口:

List:有序(元素存入集合的顺序和取出的顺序一致),因为元素都有索引,所以可重复

    |--ArrayList:底层的数据结构是数组,特点:查询速度很快,增删慢,线程不同步,效率高。

    |--LinkedList:底层的数据结构是链表,增删元素的速度很快,查询慢,线程不同步。

    |--Vector:底层的数据结构就是数组,线程同步,ArrayList替代了Vector。


List接口中凡是可以操作角标的方法都是其特有方法

 

add(index,element) :在指定的索引位插入元素。 

addAll(index,collection) :在指定的索引位插入一堆元素。 

 

remove(index) :删除指定索引位的元素。 返回被删的元素。 

改 

Object set(index,element) :对指定索引位进行元素的修改。 

Object get(index) :通过索引获取指定元素。 

 int indexOf(obj) :获取指定元素第一次出现的索引位,如果该元素不存在返回-1;  

 所以,通过-1,可以判断一个元素是否存在。 

 int lastIndexOf(Object o) :反向索引指定元素的位置。

 List subList(start,end) :获取子列表,包含头不包含尾 

 ListIterator listIterator():list集合特有的迭代器。

------------------------------------------------------------------------------------------------------------------------------------

下面关于 listIterator()的介绍

ListIterator是List集合特有的迭代器,是Iterator的子接口。Iterator接口只有三个有限的方法,只能对元素进行判断,取出,删除操作,如果想要其他操作,如添加,修改等(注意:在迭代时不可以通过集合对象的方法操作集合中的元素,否则会发生ConcurrentModificationException并发修改异常),就可以用到子接口ListIterator该列表迭代器接口也具备对元素的增、删、改、查的操作。

package com.gzj.jihe;
/*
 *ListIterator迭代器用法
 */
import java.util.ArrayList;
import java.util.*;

public class ListDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List li = new ArrayList();
		li.add("java01");
		li.add("java02");
		li.add("java03");
		li.add("java03");
		ListIterator it =li.listIterator();
		while(it.hasNext())
		{
			Object obj = it.next();
			if(obj.equals("java01"))
			{
				it.set("java04");//ListIterator迭代器的方法
				it.add("java05");
			}
		}
		System.out.println(li);
	}

}

知识点注意:对于list集合,底层判断元素是否相同,其实用的是元素自身的equals方法完成的。所以建议元素都要复写equals方法,建立元素对象自己的比较相同的条件依据。

 5.Set接口:

Set接口:元素无序(取出和存入的顺序不一定一致),元素不可重复

 |--HashSet:底层数据结构是哈希表,线程是不同步的,不安全的。 

HashSet集合保证元素唯一性:通过元素的两个方法hashCode和equals方法。 当元素的hashCode值相同时,才继续判断元素的equals是否为true。 如果为true,那么视为相同元素,不存。如果为false,那么存储。 如果hashCode值不同,那么不判断equals,从而提高对象比较的速度。 (另写日志有示例分析)

另外,对于判断元素是否存在,删除等操作,依赖的都是hashCode和equals方法。     

    |--LinkedHashSet:有序,hashset的子类。 

|--TreeSet:对Set集合中的元素的进行指定顺序的排序。不同步。TreeSet底层的数据结构是二叉树。

TreeSet存储字符串(元素本身是具备比较性的)示例: 

package com.gzj.jihe;
/*
 * TreeSet默认按自然顺序排序*/
import java.util.Iterator;
import java.util.TreeSet;

public class TreeDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TreeSet ts = new TreeSet();
		ts.add("abd");
		ts.add("abcd");
		ts.add("bc");
		
		Iterator it = ts.iterator();
		while(it.hasNext())
		{
			it.next();
		}
		System.out.println(ts);
	}

}


### Java 高级集合进阶教程 #### Set 接口及其子类特性 Set接口是Java集合框架中的一个重要部分,它不允许存储重复元素。这使得`Set`非常适合用于去除重复项以及表示数学上的集合理论概念。 - **HashSet**: 实现了`Set`接口,内部基于哈希表实现[^3]。其特点是查找速度非常快,因为它是无序的,并且允许null值的存在(仅限一个)。为了保证元素唯一性,在向`HashSet`中添加对象时会调用该对象的`hashCode()`和`equals()`方法来判断是否已经存在相同元素。 ```java import java.util.HashSet; public class Student { private String name; public Student(String name){ this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Student other = (Student) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } ``` - **LinkedHashSet**: 继承自`HashSet`,除了具备后者所有的性质外还保持了插入顺序不变。这意味着当你迭代这个set的时候,你会按照最初加入这些项目的次序得到它们。 - **TreeSet**: 提供了一种有序的方式去保存元素,底层采用红黑树结构实现了排序功能。可以通过自然排序(`Comparable`)或定制比较器(`Comparator`)两种方式定义元素之间的大小关系。 #### Collection 和 Map 的区别与联系 在Java中,`Collection`是一个顶层接口,代表一组单一类型的对象列表。而`Map`则用来映射键到值之间的一对一关联,即每一对键都对应着唯一的值[^4]。 对于想要深入了解高级集合特性的开发者来说: - `Collection`适用于处理单列数据; - `Map`更适合于管理具有键值对形式的数据。 了解两者间的差异有助于选择合适的数据容器以满足特定应用场景的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值