集合

面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
数组虽然也可以存储对象,但长度是固定的,集合的长度是可变的;而且数组只能存储基本类型的数据,集合只能存储对象。
集合框架图:
这里写图片描述
问:集合中为什么会有那么多的容器呢?
因为每一个容器对数据的存储方式都有不同,这个存储方式称之为:数据结构
Collection
Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。
|——-List:元素有序,可以重复,因为有索引
|——-|—–ArrayList:底层使用数组存储结构,查:快,增删:稍慢,线程不同步
|——-|—–LinkedList:底层使用链表存储结构,查:慢,增删:快
|——-|—–Vector:与ArrayList一样,在Collection出现前就有,线程同步,被ArrayList替代了
|——-Set:元素无序(存储和取出顺序不一定一致),不能重复
|——-|—–HashSet:底层数据结构是Hash表,
|——-|—–TreeSet:
Set集合的功能和Collection是一致的

集合Collection的共性方法,以ArrayList为例:

package second;

import java.util.ArrayList;
/*
 * 1.add方法的参数类型是Object,以便于接受任意类型对象
 * 2.集合中存储的都是对象的引用(地址)
 */

public class CollectionDemo {
    public static void main(String[] args) {
        //创建一个集合容器,使用Collection接口的子类:ArrayList
        ArrayList al=new ArrayList();
        //添加元素
        al.add("java01");
        al.add("java02");
        al.add("java03");
        al.add("java04");
        //打印集合长度
        System.out.println("size="+al.size());//size=4
        //打印集合
        System.out.println(al);//[java01, java02, java03, java04]
        //删除元素
        al.remove("java02");
        //al.clear();//清空集合
        System.out.println("size="+al.size());//size=3
        System.out.println("java03是否存在:"+al.contains("java03"));//java03是否存在:true
        //al.isEmpty()//是否为空
        method();
        method_get();
    }
    /*
     * 迭代器(Iterator),就是集合的取出元素的方式
     * 迭代器就是把取出方式定义在集合的内部
     * 这样取出方式就可以直接访问集合内容的元素
     * 取出方式被定义为内部类
     * 每一个集合的数据结构不同,所以取出的动作也不一样
     * 但是都有共性内容,判断和取出,可以将这些共性抽取即Iterator
     * 通过对外提供的iterator()获取
     */
    public static void method_get() {
        ArrayList al1=new ArrayList();
        al1.add("java01");
        al1.add("java02");
        al1.add("java03");
        al1.add("java04");
        for(Iterator it=al1.iterator();it.hasNext();){
            System.out.println(it.next());
        }
    }
    public static void method() {
        ArrayList al1=new ArrayList();
        al1.add("java01");
        al1.add("java02");
        al1.add("java03");
        al1.add("java04");
        ArrayList al2=new ArrayList();
        al2.add("java05");
        al2.add("java06");
        al2.add("java03");
        al2.add("java04");
        //al1.retainAll(al2);//al1=[java03, java04],取交集
        al1.removeAll(al2);//al1=[java01, java02],去掉al2中包含的
        System.out.println(al1);
    }
}

List集合的共性方法

package second;
/*
 * List 集合的特有方法,(所有带角标的都是其特有方法)
 * 增add(index,element);         addAll(index,Collection)
 * 删remove(index)
 * 改set(index,element)
 * 查get(index)                  subList(from,to)        ListIterator()
 * 
 * List集合的特有迭代器ListIterator是Iterator的子接口
 * 在迭代时,不可以通过集合对象的方法操作集合中的元素,会发生异常
 * 所以在迭代时,Iterator方法是有限的,只能有判断,取出,删除操作
 * 如果想要增加修改等操作,就需要其子接口,ListIterator
 * 该借款通过List的ListIterator方法获取
 */

import java.util.ArrayList;
import java.util.ListIterator;

public class ListDemo {
    public static void main(String[] args) {
        //以ArrayL为例
        ArrayList al=new ArrayList();
        al.add("java01");
        al.add("java02");
        al.add("java03");
        al.add("java04");
        System.out.println("原来的集合"+al);
        al.add(1, "java05");
        System.out.println("add以后"+al);
        al.remove(2);
        System.out.println("remove以后"+al);
        al.set(1, "java07");
        System.out.println("set以后"+al);
        //获取元素
        System.out.println("get获取元素"+al.get(1));
        //获取所有元素
        for(int i=0;i<al.size();i++){
            System.out.println("al-->"+i+":"+al.get(i));
        }
        //获取对象的位置
        System.out.println(al.indexOf("java03"));
        System.out.println(al.subList(0, 2));//包头不包尾
        //在迭代过程中准备添加或删除元素,但不能对数据进行并发操作,要用到列表迭代器
        ListIterator li=al.listIterator();
        while(li.hasNext()){
            Object obj=li.next();
            if (obj.equals("java03")){
                li.add("java10");
            }
        }
        //li.hasPrevious();//可以逆向遍历
        System.out.println(al);
    }
}

Set集合举例

package second;

import java.util.HashSet;
import java.util.Iterator;
public class SetDemo {
public static void main(String[] args) {
    HashSet hs=new HashSet();
    hs.add("java01");
    hs.add("java02");
    hs.add("java03");
    hs.add("java04");
    System.out.println(hs.add("java01"));
    for(Iterator it=hs.iterator();it.hasNext();){
        System.out.println(it.next());
    }
    HashSet hsP=new HashSet();
    hsP.add(new Person("zhangsan",20));
    hsP.add(new Person("zhangsan",20));
    hsP.add(new Person("zhangsi",21));
    hsP.add(new Person("zhangwu",22));
    for(Iterator it=hsP.iterator();it.hasNext();){
        System.out.println(it.next());
    }
}
}
/*
 * HashSet是如何确定元素的唯一性呢?
 * 通过元素的两个方法。hashCode()和equals()来完成
 * 如果元素的hashCode相同,元素会判断equals是否为true
 */
class Person{
    private String name;
    private int age;
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int hashCode(){
        return name.hashCode()+age;
    }
    public boolean equals(Object obj){
        if(!(obj  instanceof Person) ) {
            return false;
        }
        Person p=(Person) obj;
        return this.name.equals(p.getName())&&this.age==p.getAge();
    }
    public int getAge() {
        return age;
    }
}

Map集合
Map将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
|—HashMap:底层是hash表数据结构,可以存储null键null值,线性不同步
|—TreeMap底层是二叉树数据结构,线性不同步,可以给Map的键排序
|—HashTable:底层是hash表数据结构,不可以存储null键null值,线性同步,被HashMap取代了
其实Set的底层就使用了Map
Map的一般方法

package second;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/*
 * 借口的共性方法
 * 添加:put()  putAll()
 * 删除:clear()  remove()
 * 判断:containsValue() containsKey() isEmpty()
 * 获取:get() size() values()
 * 
 */
public class MapDemo {
    public static void main(String[] args) {
        Map<String, String>map=new HashMap<String,String>();
        Map<String, String>map2=new HashMap<String,String>();
        map.put("01", "zhangsan");
        map.put("02", "zhangsi");
        map.put("03", "zhangwu");
        System.out.println("size:"+map.size());
        System.out.println("containsKey 02:"+map.containsKey("02"));
        System.out.println("get:"+map.get("02"));
        System.out.println("remove:"+map.remove("02"));
        System.out.println("get:"+map.get("02"));
        map2.put("03", "zhangwu");
        System.out.println(map2.put("03", "wangwu"));//当存放相同键是会把原来的替换,并且返回原来的值
        System.out.println(map2.put("04", "wanger"));
        map.putAll(map2);
        System.out.println("size:"+map.size());
        System.out.println(map.get("03"));
        //values()返回所有值
        Collection<String>c=map.values();
        System.out.println(c);
    }
}

Map的特殊取出方法

package second;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/*
 * 
 * entrySet():将map中所有的键存入Set集合,因为Set可以迭代
 *          所以可以迭代出所有的键,再用get取出
 * keySet():将map中的映射关系取出,放到map.entry中
 * 
 */
public class MapDemo2 {
    public static void main(String[] args) {
        keySet();
        entrySet();
    }
    public static void keySet() {
        Map<String, String>map=new HashMap<String,String>();
        map.put("01", "zhangsan");
        map.put("02", "zhangsi");
        map.put("03", "zhangwu");
        //获取键,用keySet()
        Set<String>keySet=map.keySet();
        //获取迭代器
        for(Iterator<String>it=keySet.iterator();it.hasNext();){
            String key=it.next();
            String value=map.get(key);
            System.out.println("key:"+key+" value:"+value);
        }
    }
    public static void entrySet() {
        Map<String, String>map=new HashMap<String,String>();
        map.put("01", "zhangsan");
        map.put("02", "zhangsi");
        map.put("03", "zhangwu");
        //获取键,用keySet()
        Set<Map.Entry<String, String>>entrySet=map.entrySet();
        //获取迭代器
        for(Iterator<Map.Entry<String, String>>it=entrySet.iterator();it.hasNext();){
            Map.Entry<String, String> me=it.next();
            String value=me.getValue();
            String key=me.getKey();
            System.out.println("key:"+key+" value:"+value);
        }
    }
}

简单的集合就到这儿
谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值