Java 集合类及其方法

来源:互联网 发布:wifi共享精灵for mac 编辑:程序博客网 时间:2024/06/17 09:56

集合类的由来:

对象用于的封装成特有数据,对象多了需要存储,如果对象的个数不确定

就用集合容器进行存储(对象的地址)


集合特点:

1:用于存储对象的容器

2:集合的长度是可变的

3:集合中不可以存储基本类型值


集合容器因为内部的数据结构不同,有多种容器。

不断的向上抽取,就形成了集合框架


框架的顶层Collection接口


Collection的常见方法:

1. 添加

boolean add(Object obj);

boolean addAll(Collection coll);//添加一堆

2. 删除

boolean remove(Object obj);

boolean removeAll(Collection coll);//删除一堆

void clear();//全部删除 集合还在

3 .判断

boolean contains(Object obj);//是否包含

boolean containsAll(Collection coll);

boolean ifEmpty();//是否有元素

4.获取

int size();//获取长度

iterator iterator();//取出元素的方式,迭代器。

该对象必须依赖具体的容器,因为每一个容器的数据结构都不同

所以该迭代器是在容器中进行内部实现的(内部类)

对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可

也就是iterator方法

5.其他

boolean retainAll(Collection coll);//取交集

Object toArray();将集合转成数组

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

Collection

|--List: 有序(存入和去除的顺序一致) 元素都有索引(角标),元素可以重复

|--Set: 元素不能重复 无序。LinkedHashSet 有序

Set接口中的方法和Collection一致

|--HashSe:内部数据结构是哈希表,是不同步的。

如何保证该集合元素的唯一性呢?
是通过对象的hashCode和equals方法来完成对象唯一性的

如果对象的hashCode值不同,那么不用判断equals方法 就直接储存到哈希表中

如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true

如果为true视为相同元素,不存。如果为false 那么视为不同元素,就进行储存

记住:如果元素哟啊储存的HashSe集合中 不许覆盖hashCode方法和equals方法

一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都要覆盖equals方法

建立对象判断是否相同的依据


|--TreeSet:可以对Set集合中的元素今进行排序,是不同步的、

判断元素唯一性的方式:就是根据比较方法的返回结果是否为0,是0,就是相同元素,不存

               

TreeSet对元素进进行排序的方式之一

就是让元素自身具备比较功能,元素需要实现Comparable接口 覆盖compareTo方法

如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序(着对象不是你写的) 怎么办?

可以使用TreeSet集合的 排序方式之二

让集合自身具备比较功能 定义一个类实现Comparator接口 覆盖compare方法

将该类对象作为参数传递给TreeSet集合的构造函数

 


List 特有的常见方法:有一个共性特点就是都可以操纵角标

1 添加

void add(index,element);

void add(index,collection);


2 删除 

Object remove(index);

3 修改

Object set(index,element);

4 获取

Object get(idnex);

int indexOf(object);

int lastIndexOf(object);

List sublist(from ,to);


List集合是可以完成对元素的增删改差


List:

|---Vector:内部是数组数据结构。是同步的(线程安全的) 可变长(100%) 增删 查询都很慢

|---ArrayList:内部是数组数据结构、是不同步的 替代Vector。多线程加锁 基本不用  可变长(50%) 查询的速度快

|---LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。



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

集合技巧

需要唯一吗?

需要:Set

需要指定顺序吗?

需要:TreeSet

不需要:HashSet

但是想要一个和储存一致的顺序(有序):LinkedHashSet


不需要:List

需要频繁增删吗?

需要:LinkedList

不需要:ArrayList

如何记录每一容器的结构和所属体系?

看名字

List

|--ArrayList

|--LinkedList


Set

|--HashSet

|--TreeSet

后缀名就是改集合所属的体系

前缀名就是该集合的数据结构


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


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


看到hash 就要想到哈希表 就要想到唯一新 就要想到元素需要覆盖hashCode 方法和euqals方法


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


而且通常这些 常用的集合容器都是不同步的

import java.util.ArrayList;import java.util.List;public class ListDemo {public static void main(String[] args) {// TODO Auto-generated method stubList list=new ArrayList();show(list);}private static void show(List list) {// TODO Auto-generated method stublist.add("abc1");list.add("abc2");list.add("abc3");System.out.println(list);//插入元素//list.add(1,"abc9");//删除元素 //System.out.println("remove:"+list.remove(2));//修改元素//System.out.println("set:"+list.set(1, "abc8"));//获取元素//System.out.println("get:"+list.get(0));//获取子列表System.out.println("sublist:"+list.subList(0, 2));System.out.println(list);}}


import java.util.ArrayList;import java.util.Collection;import com.sun.org.apache.xml.internal.security.c14n.helper.C14nHelper;public class CollectionDemo {public static void main(String[] args) {// TODO Auto-generated method stubCollection coll =new ArrayList();Collection c1 =new ArrayList();Collection c2 =new ArrayList();show(coll);show(c1,c2);}public static void show(Collection c1,Collection c2) {//给c1添加元素c1.add("abc1");c1.add("abc2");c1.add("abc3");c1.add("abc4");//给c2添加元素c2.add("abc2");c2.add("abc6");c2.add("abc7");System.out.println("c1"+c1);System.out.println("c2"+c2);//演示addAll//c1.addAll(c2);//演示removeAll//boolean b=c1.removeAll(c2);//将两个集合中的相同元素从调用removeAll的集合中删除//System.out.println("remove:"+b);//演示containsAll//bolean b=c1.containsAll(c2);//System.out.println("containsALL:"+b); //演示retainAllboolean b=c1.retainAll(c2);//取交集 保留和指定的集合相同的元素,而删除不同的元素//和removeAll功能相反System.out.println("retainALL:"+b);System.out.println("c1"+c1);}public static void show(Collection coll) {//1 添加元素 addcoll.add("abc1");coll.add("abc2");coll.add("abc3");//2 删除元素 removecoll.remove("abc3");//会改变集合的长度// 清空集合//coll.clear();System.out.println(coll.contains("abc2"));System.out.println(coll);// }}