集合框架-Collection集合

集合有两大类:Collection和Map,

集合的由来:我们用对象来封装数据,对象多了也要存储起来,如果对象的个数不确定,就使用集合容器进行存储。

集合的特点:所有集合类都位于java.util包下。集合中只能保存对象(保存对象的引用变量,集合存储的是对象的地址),不可以存储基本数据类型值,集合长度的是可变的,集合可以存储不同类型的对象

为什么会出现这么多容器?每个容器对数据存储的方式不同,这个方式就称为:数据结构。

集合与数组的区别:数组长度不可变,数组对象必须是同种类型。

集合Collection总结。

Collection是根接口,Collection下有两个比较重要的子接口,他们是Set和List

Collection:

|--List:元素是有序的,元素可以重复。因为该集合体系有所以

|--
ArrayList
:底层是数组数据结构,数组长度是可变的,超出后延长50%,线程是不同步的,,查询,修改速度快效率高,替代了Vector
,增删较慢.

|--LinkedList;底层使用的链表数据结构 此实现不是同步的 特点:查找慢,增删快//重要

|--Vector:
Vector:
底层是数组数据结构,数组长度是可变的,超出后延长100%,是同步的(线程安全),效率低,增删查询都很慢

|--Set:元素是无序(指不安存储顺序来),元素不可以重复。但是提供了可以排序的TreeSet(但是存入的对象必须具备就)

|--TreeSet:可以对Set集合的元素进行排序。底层数据结构是二叉树,不同步。保证元素唯一性的依据:compareTo或compara方法
return的数据 .

二叉树:比较,小于放左边,大于放右边,这样存入时就可以一次性排除一边数据,取数据时:从最小的开始从下往上。

|--HashSet:数据结构是哈希表,线程是非同步的。保证元素唯一性的原理:判断元素的hashCode值是否相同。

存储数据:

List:自定义类复写equals可以按自定义去除重复元素

HashSet:按哈希表和equals,注意先找hashcode()方法。自定义条件保证唯一性:自定义类需要复写hashcode(返回值int,不要超了),equals。

:哈希表之所以出现希望不要每次都要调用equals,否则很慢。

TreeSet:方法1:自定义对象实现comparable,复写compareTo(),方法2:自定义比较器实现comparator(比较器,并作为参数传给TreeSet),复写compare方法。

原理:不调用equals,只看compare和compareTo返回的结果来判断是否重复。

排序:不论是什么排序,主要条件相同,一定要判断次要条件。

如何实现怎么存入,怎么取出。将compareTo方法的返回值写成:1即可

总结

后缀名就是该集合所属的体系,前缀名就是该集合的数据结构。

看到array:就要想到数组,就要想到查询快,有角标.

看到link:就要想到链表,就要想到增删快,就要想要 add get remove+frist last的方法

看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashcode方法和equals方法。

看到tree:就要想到二叉树,就要想要排序,就要想到两个接口Comparable,Comparator。

通常这些常用的集合容器都是不同步的,除了Vector

Collection的一些基本方法:

1.添加  集合中存放的是对象的地址或引用

boolean add(E e);

boolean addAll(Collection<? extends E> c);

2.删除

void clear();删除全部

boolean remove(Object o); 移除第一次出现的指定元素 ,不存在返回false

removeAll(Collection<?> c) ;

3.获取

int size() ;返回元素数,集合长度

4.判断

boolean isEmpty();

boolean contains(Object obj);

boolean containsAll(Collectioncoll);

5.交集

boolean retainAll(Collection<?> c)

a1.retainAll(a2);//取交集,a1中只会保留与a2相同的对象,如果没有交集,a1是null

6.常用

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

<T> T[]  toArray(T[] a)

迭代器:迭代器取代了Enumeration。

迭代器与枚举有两点不同:迭起可以使用remove()方法,名字变短了.

 List接口:常用的实现类
:ArrayList:Vector:LinkedList:

:特有方法.凡是可以操作角标的方法都是该体系特有的方法,因为List有序(存入和取出的顺序一致),元素都有索引,所以元素可以重复。

因为list集合有脚标,所以就有两种取出元素的方式:for循环和迭代器.

获取所有元素

for (int x=0;x<a1.size();x++ )       {

System.out.println("a1("+x+"):"+a1.get(x));

}

迭代器

Iterator it = a1.iterator();

while (it.hasNext())       {

//System.out.print("a1:"+it.next());

}

注:第一种while循环后迭代器对象还驻留在内存中,第二种for循环后迭代器对象立即释放,第二种更省内存。

      
|---List
特有迭代器:ListIterator

在迭代时,只能用迭代器操作元素,可是Iterator方法是有限的:hasNext()  next() void remove()

只能对元素进行判断,取出,删除。

如果要进行其他操作如添加,修改,就需要使用其子接口,ListIterator.该接口只能通过List集合的listIterator方法获取。特有方法:add,remove,set.

ListIterator li =
a.listIterator();

while (li.hasNext()) {

Object obj = li.next();

if (obj.equals("hehe")) {

//li.remove();

li.add("java");

//li.set("2222");

}

}

注:hasPrevious() previous()是逆向遍历

List的一些常用方法:

添加:add(index,element);

addAll(index,Collection)

获取:

listIterator(int index)    返回列表中元素的列表迭代器,从列表的指定位置开始。

get(index);

int indexOf(Object o)    返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回
-1。

int lastIndexOf(Object o)   返回此列表中最后出现的指定元素的索引,如果此列表中不包含该元素,则返回
-1

List<E> subList(int fromIndex, int toIndex) :不包含尾

修改元素:

set(int index, E element) 用指定元素【替换】列表中指定位置的元素

删除:

a1.remove(int index);// 移除列表中指定位置的元素

--LinkedList

特有方法

addFirst()指定元素插入此列表的开头

addLast()指定元素插入此列表的尾部

列表为空,removeFirst()等抛异常:

(1)获取元素,但不删除元素

getFirst()返回此列表的第一个元素。

getLast()返回此列表的最后一个元素。

获取元素,并删除元素。

(2) removeFirst() 移除并【返回】此列表的第一个元素  列表为空,removeFirst()等抛异常

removeLast()移除并【返回】此列表的组最后一个元素

取出全部元素;除了迭代器和get(for遍历),可以用removeFirst()

while(!link.isEmpty){

removeFirst()//pooFirst()

}

在jdk1.6出现了代替()方法,如果此列表为空,则返回 null

offerFirst()在此列表的开头【插入】指定的元素。代替add

offerLast()在此列表的尾部【插入】指定的元素。

pollFirst();【获取并移除】此列表的第一个元素则返回 null。代替remove

pollLast();【获取并移除】此列表的最后一个元素 则返回 null。

peekFirst():【获取但不移除】此列表的第一个元素;【如果此列表为空,则返回 null】。代替get

peek(Last) 【获取但不移除】此列表的第一个元素;【如果此列表为空,则返回 null】。

练习:

     1.使用LinkedList模拟一个堆栈或者队列数据结构。

/*

2.删除ArrayList集合中的重复元素

思路:定义一个临时容器

遍历集合,存入临时容器,相同不存

打印临时容器

*/

/*

    3.将自定义对象作为元素存到ArrayList集合中,并去除重复元素。

比如;存人对象,同姓名,同年龄,视为同一个人,为重复元素。

思路;

1.对人描述,将数据进行封装。//人本身具备equals方法(继承自Object),比较的是地址值。但我们要复写。

2.定义容器,将人存入。

3.取出。

*/

Set :元素不能重复,无序(存入和取出的顺序不一致)的, 因为没有脚标,

所以,Set接口中的方法和Collection是一样的。

|--HashSet:底层结构式是哈希表

HashSet是如何保证元素的唯一性呢?

是通过元素的两个方法,hashcode和equals来完成。

如果元素的hashcode值相同,才会判断equals是否为true

如果元素的hashcode值不同,不会调用equals 复写hashCode方法, 哈希值相同才调用equals

注意:HashSet:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法

ArrayList判断或存储,只依赖于equals。

|--TreeSet:可以对Set集合的元素进行排序。底层数据结构是二叉树。保证元素唯一性的依据:compareTo和compare.表示元素相同。

        

时间: 2024-08-02 15:10:41

集合框架-Collection集合的相关文章

集合框架(Collection集合的高级功能测试)

package cn.itcast_01; import java.util.ArrayList; import java.util.Collection; /*  * boolean addAll(Collection c):添加一个集合的元素  * boolean removeAll(Collection c):移除一个集合的元素(是一个还是所有)  * boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(是一个还是所有)  * boolea

集合框架(Collection集合的基本功能测试)

Collection接口概述Collection 层次结构中的根接口.Collection 表示一组对象,这些对象也称为 collection 的元素.一些 collection 允许有重复的元素,而另一些则不允许.一些 collection 是有序的,而另一些则是无序的. boolean add(E e)boolean remove(Object o)void clear()boolean contains(Object o)boolean isEmpty()int size() 下面写一个测

集合框架(Collection集合的功能概述)

* 刚说过集合是存储多个元的,但是呢,存储多个元素我们也是有不同需求的:比如说,我要这多个元素中不能有相同的元素, * 再比如说,我要这多个元素按照某种规则排序一下.针对不同的需求,Java就提供了不同的集合类,这样呢,Java就提供了很多个集合类. * 这多个集合类的数据结构不同,结构不同不重要的,重要的是你要能够存储东西,并且还要能够使用这些东西,比如说判断,获取等. * 既然这样,那么,这多个集合类是有共性的内容的,我们把这些集合类的共性内容不断的向上提取,最终就能形成集合的继承体系结构.

JAVASE02-Unit04: 集合框架 、 集合操作 —— 线性表

Unit04: 集合框架 . 集合操作 -- 线性表 操作集合元素相关方法 package day04; import java.util.ArrayList; import java.util.Collection; import day02.Point; /** * 操作集合元素相关方法 * @author adminitartor * */ public class Collection_Remove { public static void main(String[] args) { C

集合框架Collection(一)

1.1集合概念 1.1.1集合:是java中提供的一种容器,用来存储多个数据 数组和集合的区别:1.数组的长度是固定的,集合的长度是可变的:2.数组中存储数据类型是同一类型,可以存储基本数据类型值,集合存储的都是对象,不能存储基本数据类型           值,对象数据类型可以不一致,一般在开发中使用集合存储. 1.1.2   集合框架:javaSE提供了各种API(方法). 集合按照存储结构可以分为两大类:1.单列集合java.util.Collection  2.双列集合java.util

Java集合(一): 集合框架Collection和Map

目录 集合设计的目标 Collection接口 Map接口 集合设计的目标 在Java2之前,Java就提供了特设类.比如Dictionary,Vector,Stack,和Properties这些类用来存储和操作对象数组. 虽然这些类也很有用,但是它们缺少一个核心的主题.由于这个原因,使用Vector和Properties的操作方式有着很大的不同. 集合框架设计出来的目标是: 框架必须是高性能的,基本集合(动态数组,链表,树,哈希表)的实现必须是高效的. 该框架必须允许不同类型的集合,以类似的方

集合框架(Collection存储自定义对象并遍历案例)

 package cn.itcast_02; import java.util.ArrayList; import java.util.Collection; /*  * 练习:用集合存储5个学生对象,并把学生对象进行遍历.  *   * 分析:  * A:创建学生类  * B:创建集合对象  * C:创建学生对象  * D:把学生添加到集合  * E:把集合转成数组  * F:遍历数组  */ public class StudentDemo {  public static void mai

集合框架(Collection存储字符串并遍历)

Collection案例存储字符串并遍历存储自定义对象并遍历Student(name,age)  import java.util.Collection; import java.util.Iterator; /*  * 需求:存储字符串并遍历.  *   * 分析:  *   A:创建集合对象  *   B:创建字符串对象  *   C:把字符串对象添加到集合中  *   D:遍历集合  */ public class CollectionTest {  public static void 

集合框架(Collection存储学生对象并遍历)

先创建学生类 package cn.itcast_04; public class Student { private String name; private int age; public Student() { super(); } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } publi