java类集(List,Set,Map)

java类集(List,Set,Map)

集合和数组:

集合的长度可变,数组长度固定,集合常用来存放一组对象

集合中的常用接口和类及其关系

collection

ArrayList的使用:
@Test
    //测试ArrayList
    public void arrayListTest(){
        List<String> arlist1 = new ArrayList<>();
        List<String> arlist2 = new ArrayList<>();

        //测试添加add()方法
        arlist1.add("我是第二个元素");         //默认在表尾添加元素
        arlist1.add(0,"我是第一个元素");   //在指定索引位置处添加元素

        arlist2.add("我是第三个元素");
        arlist2.add("我是第四个个元素");
        arlist2.add("我是第五个元素");

        arlist1.addAll(arlist2);    //在arlist1中插入arlist2集合中的内容
        System.out.println(arlist1);

        //测试删除remove()方法
        arlist1.remove(0);//删除指定索引处的元素
        arlist1.remove("我是第二个元素");  //删除指定String对象(如果是自定义类的对象,该自定义类要重写equals()和hashCode()方法才能实现删除)
        arlist1.removeAll(arlist2);             //删除指定集合中的一组对象(元素)

        //测试size()并验证删除
        int size = arlist1.size();
        System.out.println(size);

    }
LinkedList的使用:
 @Test
    //测试LinkedList
    public void linkedListTest(){
        //链表实现队列
        Queue<String> queue = new java.util.LinkedList<>();
        //测试添加(入队)
        queue.add("a");
        queue.add("b");
        queue.add("c");
        System.out.println("依次入队后队列为:"+queue);
        //测试删除(出队)
        String poll = queue.poll();
        System.out.println("出队的元素为:"+poll+"\t出队后队列为:"+queue);
        //测试寻找队头元素
        String peek = queue.peek();
        System.out.println("找到的队头元素为:"+peek);


        //链表实现栈
        Queue<String> stack = new java.util.LinkedList<>();
        //测试入栈
        ((java.util.LinkedList<String>) stack).push("3");
        ((java.util.LinkedList<String>) stack).push("2");
        ((java.util.LinkedList<String>) stack).push("1");
        System.out.println("依次入栈后栈为:"+stack);
        //测试出栈
        String pop = ((java.util.LinkedList<String>) stack).pop();
        System.out.println("出栈的元素为:"+pop);
        //测试获取栈顶元素
        System.out.println("栈顶元素为:"+stack.element());


    }
HashSet的使用:
@Test
    //测试HashSet
    public void hashSetTest(){
        Set<String> hashSet = new java.util.HashSet<>();
        //测试添加
        hashSet.add("a");
        hashSet.add("b");
        hashSet.add("b");
        hashSet.add("c");
        hashSet.add("c");
        hashSet.add("c");
        hashSet.add("d");
        System.out.println("添加元素后hashSet为:"+hashSet+"\t其长度为:"+hashSet.size());
        
        //测试删除
        hashSet.remove("a");    //和ArrayList类似,如果该对象为自定义类的对象,该类必须重新equals()和hashCode()方法
        

    }
TreeSet使用(内部元素自动排好序):
package domain;

import java.util.Date;

public class Person implements Comparable<Person>  {
    private String name;
    private String sex;
    private int age;
    private Date date;

    public Person(){}

    public Person(String name, String sex,int age,Date date){
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.date = date;
    }

    public String toString(){
        return "姓名:"+this.name+";   性别:"+this.sex+";    年龄:"+this.age+";    出生日期:"+this.date;
    }

    public boolean equals(Object obj){
        if(this==obj){
            return true;
        }
        if(!(obj instanceof Person)){
            return false;
        }
        Person p = (Person) obj;    //向下转型
        if((this.name.equals(p.name)&&this.sex.equals(p.sex)&&this.date.equals(p.date))){
            return true;
        }
        return false;

    }

    public int hashCode(){
        return this.name.hashCode()*this.sex.hashCode();

    }


    @Override
    public int compareTo(Person o) {
        //注意出生日期越大年龄越小(所以o的出生日期大于this,说明this比o大)
        return o.date.compareTo(this.date);
    }


}

import domain.Person;
import org.junit.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Set;

public class TreeSet {
    @Test
    //测试TreeSet
    public void TreeSetTest () throws Exception {
        Set<Person> treeSet = new java.util.TreeSet<>();
        //测试添加
        treeSet.add(new Person("张三","男",28,new SimpleDateFormat("yyyy-MM-dd").parse("2000-01-01")));
        treeSet.add(new Person("李四","男",28,new SimpleDateFormat("yyyy-MM-dd").parse("2000-01-11")));
        treeSet.add(new Person("王五","男",30,new SimpleDateFormat("yyyy-MM-dd").parse("1998-01-02")));
        treeSet.add(new Person("赵六","男",26,new SimpleDateFormat("yyyy-MM-dd").parse("2002-01-02")));
        treeSet.add(new Person("张三","男",29,new SimpleDateFormat("yyyy-MM-dd").parse("1999-01-02")));
        treeSet.add(new Person("张三","女",28,new SimpleDateFormat("yyyy-MM-dd").parse("2000-01-01")));
        //重复元素
        treeSet.add(new Person("张三","男",28,new SimpleDateFormat("yyyy-MM-dd").parse("2000-01-01")));
        treeSet.add(new Person("张三","男",28,new SimpleDateFormat("yyyy-MM-dd").parse("2000-01-01")));

        int i=1;
        for (Person person : treeSet) {
            System.out.println("第"+i+"个元素为:"+person);
            i++;
        }
    }
}

注意以上代码的输出结果为:

TreeSet

而将TreeSet改为HashSet则结果变为:

HashSet

说明hashSet是根据类中equals()和hashCode()方法来判断对象元素是否相等,而TreeSet不管是排序还是判断对象元素是否相等都是根据类中compareTo()方法判断的。故在使用TreeSet集合时类中equals和hashCode都是无效的,没有作用。
Map接口:

与前面的List,Set所不同的是Map中是以键值对形式存储元素的,也就是说,map中一次操作的是一对对象

与Set类似,Map中也存在HashMap和TreeMap两个实现类,前者无序,后者根据Key值排序。

具体使用如下

//测试Map
    public void mapTest(){
        java.util.Map<String,String> map = new HashMap<>();
        map.put("a","wwww.mldn.cn");
        map.put("b","www.zhihu.com");
        map.put("c","wwww.runoob.com");
        if(map.containsKey("cf")){
            System.out.println("搜索的key存在!");
        }else {
            System.out.println("搜索的key不存在");
        }
        //获取全部的key
        Set<String> keys = map.keySet();
        for (String key : keys) {
            System.out.println(key);

        }
        //获取全部的值
        Collection<String> values = map.values();
        for (String value : values) {
            System.out.println(value);
        }


    }

最后说说前面提到多次的hashCOde的理解,其可以看成一个对象的编码,可以在进行判断对象是否相等是起到一定的过滤作用,首先排除到一些比较明显的因素,比如上面的Person的hashcOde由其name和age属性决定,很明显age或name不等一定不是同一对象,然后在通过equals方法比较一些更深层次的细节,故hashCode相同的对象不一定为同一对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值