java中的集合类:List、Set(TreeSet和HushSet)、Map

Set和List都是Collection接口下的,实现了这个接口,这个接口中的功能有add()、remove()、isEmpty()、iterator()、size()等。
1.其中List下面又分为:ArrayList和LinkedList,就像它的名字一般一个内部以数组的形式实现,另一个以链表的形式实现,分别在各自的领域有着应用。
2. 其中Set又分为TreeSet和HushSet,TreeSet是排好序的。
3. 自己去定义的时候在最右边一定是最底层的数据类型,不能是Set或者是List,那样你会需要实现他的所有接口。

4. 注意,next()返回的是Object,而且集合中的元素只能是类不能是基本数据类型,这与C++不同!!!

1.List(类似java数组)

List也可以用Iterator进行遍历,但是List自己增加了get()、set()函数,使得遍历和修改都更加方便。

public class Main {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        Iterator<String> it=list. iterator();
        list.set(1,"aaaa");
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
        System.out.println(list.get(2));
    }
}

在这里插入图片描述

2.TreeSet(无重复值,且自动排序)

(1)基础语法:

1. 内部数据是有序的,如果Set中的数据是基本数据类型或者是java自带的String、Long等类型的就自带比较的内部函数,也就是自带规则。但是如果是你自己定义的类,那就需要你实现接口Comparable中的comParaTo函数,自己在函数内部制定一个比较的规则。
2. 但是遍历只能用Iterator,hasNext(),next()进行,没有函数set啥的!!!

package test;
import java.util.Iterator;
import java.util.TreeSet;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        StuTest stu1=new StuTest(1,"Sean");
        StuTest stu2=new StuTest(2,"Xiao");
        StuTest stu3=new StuTest(3,"Zhan");
        StuTest stu4=new StuTest(4,"Yan");
        TreeSet<StuTest> set=new TreeSet<>();
        set.add(stu1);
        set.add(stu2);
        set.add(stu3);
        set.add(stu4);
        Iterator<StuTest> it=set.iterator();
        while(it.hasNext()){
            StuTest temp=(StuTest)it.next();
            System.out.println(temp.getId()+" "+temp.getName());
        }
        Set<String> stuName=new TreeSet<>();
        stuName.add("a");
        stuName.add("c");
        stuName.add("e");
        stuName.add("d");
        Iterator<String> iter=stuName.iterator();
        while (iter.hasNext()){
            System.out.println((String) iter.next());
        }
    }
}

class StuTest implements Comparable<Object>{
    private int id;
    private String name;

    @Override
    public int compareTo(Object o) {   //Set内元素是自定义类型的的话,需要自己去设定排序的条件或者称为规则。
        StuTest temp=(StuTest)o;
        int result=id>temp.id? 1:(id==temp.id?0:-1);
        return result;
    }

    public StuTest(int id, String name){
        this.id=id;
        this.name=name;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

在这里插入图片描述

(2)新添加的函数,Set中没有,TreeSet中才有的。

subSet()、headSet()、tailSet()函数,但是返回的都是Set类型的,而不是TreeSet类型的。

Set<String> subSet1=stuName.subSet("a","d");
        iter=subSet1.iterator();
        System.out.println();
        while(iter.hasNext()){
            System.out.print((String) iter.next()+" ");
        }
        System.out.println();
        Set<String> subSet2=stuName.headSet("d");
        iter=subSet2.iterator();
        while(iter.hasNext()){
            System.out.print((String) iter.next()+" ");
        }
        System.out.println();
        Set<String>subSet3=stuName.tailSet("c");
        iter=subSet3.iterator();
        while(iter.hasNext()){
            System.out.print((String) iter.next()+" ");
        }
        

在这里插入图片描述

3.Map

添加了put()、containsKey()、containsValue()、get()、keySet()、values()函数。
发现HushMap中的输出顺序与建立时数据的输入顺序不同,是因为HashMap散列图、Hashtable散列表是按“有利于随机查找的散列(hash)的顺序”。并非按输入顺序。遍历时只能全部输出,而没有顺序。甚至可以rehash()重新散列,来获得更利于随机存取的内部顺序。总之,遍历HashMap时不要求顺序输出,即与顺序无关。

public class Main {
    public static void main(String[] args) {
        Map<String,String> map=new HashMap<>();
        map.put("71","Xia");
        map.put("13","Li");
        map.put("02","Yan");
        Set<String>set=map.keySet();
        Iterator<String> it=set.iterator();
        while(it.hasNext()){
            String temp=(String) it.next();
            System.out.print(temp+" ");
            System.out.println(map.get(temp));

        }
    }
}

在这里插入图片描述
改成TreeMap后:就是有序的了,按照Key值进行排序。
在这里插入图片描述
但是一般建议使用HashMap,因为效率高,遍历使用Iterator进行遍历

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值