集合的学习笔记

首先,我们要明白什么是集合,集合的定义是什么:
集合,又称作容器,提到容器,我们不难想到数组,集合与数组不同的是

  • 数组是用来保存基本类型的,而集合是用来保存对象的引用,不可以存放基本类型
  • 集合的长度是不固定的,而数组的长度是固定的。
  • 数组转换为集合:Arrays.asList(数组),集合转换为数组:集合.toArray();

常见的集合一共有三类

  • Map:映射
    • HashMap:适用于在Map中插入、删除和定位元素。 无序
    • Treemap:适用于按自然顺序或自定义顺序遍历键(key)。 有序
  • Set,代表无序,不可重复的集合
    • HashSet无序
    • TreeSet有序
  • List,有序可重复的集合
    • Arraylisy:随机访问快,插入麻烦
    • LinkedList:插入块,随机访问性能差
      首先,我们先介绍List和Set,这两个都是接口,但是都实现了collection接口,虽然collection接口不能直接使用,但是它提供了添加、删除、管理数据的方法,由于Set和List继承了collectin接口,所以这些方法对于Set和List都是通用的,我们来看一下具体的方法使用
  • add(E e):将指定的对象增加到集合中
  • remove(Ee):和add相反
  • isEmpty():判断一个集合是否为空,返回值为boolean值
  • iterator():返回一个迭代器,用于遍历对象
  • size():返回为int值,用于获取元素的个数
    看代码

List:

public class fan{

    public static void main(String[] args) {
        List  list=new ArrayList();//创建一个List集合,定义为String类型
        for (int i = 0; i < 5; i++) {//for循环为list增加元素
            String list1="编号"+i;
            list.add(list1);
        }
        System.out.println("list集合的内容是否为空:"+list.isEmpty());//调用isEmpty()方法判断集合是否为空
        list.remove("编号2");//移除元素“编号2”
        list.remove(3);//移除索引号为3的元素
        list.set(0, "liqifeng");//将指定索引位置的对象修改为制定的对象
        Iterator it=list.iterator();//通过list对象创建一个迭代器
        while (it.hasNext()) {//遍历输出集合内容
            String string = (String) it.next();
            System.out.println(string);

        }
        for (int i = 0; i < list.size(); i++) {//不创建迭代器,直接使用for也可以遍历集合内容
            System.out.println(list.get(i));//调用get(index i)来输出
        }
    }


}

输出内容

list集合的内容是否为空:false
liqifeng
编号1
编号3
liqifeng
编号1
编号3

上述代码我们需要注意的是list.get()方法不是collection接口的方法
而且remove()方法的参数可以为索引号,也可以是具体的对象
我们的List接口还提供了set(int index,Object obj)方法,就是将指定索引位置的对象修改为指定的对象。

Set:

接下来我们来看一下Set
我们讲HashSet实现了Set接口,而TreeSet除了实现Set接口外,还实现了java.util.SortedSet接口,所以TreeSet在遍历集合的时候按照自然顺序递增排序,也可以通过比较器排序。接下来我们来看一下TreeSet新增的方法

  • first():返回此Set集合中第一个(最低)元素
  • last():返回此Set集合中最后一个(最高)元素
  • comparator():返回对Set进行排序的比较器,如果Set使用自然顺序,则返回null
  • headSet(E test):返回一个新的Set集合,拥有test(不包含)之前的所有对象
  • tailSet(E test):返回一个新的Set集合,拥有test(包含)之后的所有对象
  • subSet(E test,E test2):返回一个新的Set集合,拥有test(包含)之后,test2(不包含)之前的所有对象。
public class fan{

    public static void main(String[] args) {
        TreeSet  tree=new TreeSet();//创建String类型的TreeSet集合
        tree.add("liqifeng");//添加元素
        tree.add("wuyachen");
        tree.add("lizafeng");
        System.out.print("tree的第一个元素:");
        System.out.println(tree.first());
        System.out.print("tree的最后一个元素:");
        System.out.println(tree.last());
        System.out.println("创建迭代器遍历集合");
        Iterator it =tree.iterator();
        while(it.hasNext()){//遍历集合的方法
            String string =it.next();
            System.out.println(string);
        }
        System.out.println("取出wuyachen之前的对象元素");
        it=tree.headSet("wuyachen").iterator();
        while(it.hasNext()){
            String string =it.next();
            System.out.println(string);
        }   
    }
}

tree的第一个元素:liqifeng
tree的最后一个元素:wuyachen
创建迭代器遍历集合
liqifeng
lizafeng
wuyachen
取出wuyachen之前的对象元素
liqifeng
lizafeng

以上代码为我们展示了TreeSet中新增的方法,需要注意的是,TreeSet中不管添加元素的顺序是什么,但是一旦添加进去,TreeSet内的元素就会自动按照自然排序排好。就按照上述代码中遍历集合的输出结果来看,我们集合添加的顺序是

tree.add(“liqifeng”);
tree.add(“wuyachen”);
tree.add(“lizafeng”);

但是输出的时候却变成了自然排序的

liqifeng
lizafeng
wuyachen

Map;

好的,接下来我们来看Map

Map集合没有继承colletion接口,其提供的是key到value的映射。Map中不能包含相同的key,每个key只能映射一个value。Map集合包括Map接口以及Map接口的所有实现类。
我们来看一下Map集合的常用方法:

  • put(K key,V value):向集合中添加指定的key和value的映射关系
  • containsKEY(Object key):如果此映射包含指定的key的映射关系,则返回true
  • containsVALUE(Object value):如果此映射将一个或者多个key映射到指定值,则返回true
  • get(Object key):如果存在指定的key对象,则返回此对象的值,否则返回null
  • keySet():返回该集合中所有的key对象形成的Set集合
  • valuses():返回该集合中所有的值对象形成的collection集合

    上述方法具体怎么使用呢,看代码

public class map {
    public static void main(String[] args) {
        Map map=new HashMap();//创建Map对象
        map.put("liqifeng", "001");
        map.put("lidaeng", "002");//添加映射
        map.put("wuyachen", "003");
        System.out.println("map中是否liqifeng映射的值:"+map.containsKey("liqifeng"));
        System.out.println("map中是否存在指定映射的值002:"+map.containsValue("002"));
        Set set=map.keySet();//调用方法返回Set集合
        Iterator it=set.iterator();//创建迭代器
        System.out.println("使用ketSet方法返回Set集合并且遍历输出");
        while(it.hasNext()){
            String string=(String)it.next();
            System.out.println(string);
        }
        Collection coll=map.values();//使用values方法返回Collcetion集合
            it=coll.iterator();//创建迭代器
        System.out.println("使用values方法返回Collcetion集合并且遍历输出");
        while (it.hasNext()) {
            String string = (String) it.next();
            System.out.println(string);

        }
    }

}

上述代码的输出结果是

map中是否liqifeng映射的值:true
map中是否存在指定映射的值002:true
使用ketSet方法返回Set集合并且遍历输出
wuyachen
liqifeng
lidaeng
使用values方法返回Collcetion集合并且遍历输出
003
001
002

接下来我们来讲一下Map接口的实现类:HashMap和TreeMap

  • HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。

  • HashMap:适用于在Map中插入、删除和定位元素。
    Treemap:适用于按自然顺序或自定义顺序遍历键(key)。

  • HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。

我们通过一段代码来看

public class Map1 {
    public static void main(String[] args) {
        Map<String, String> map=new HashMap<String, String>();//创建HashMap集合
        Test test1=new Test("001", "李奇峰");
        Test test2=new Test("005", "李大峰");//创建对象
        Test test3=new Test("002", "吴娅晨");
        map.put(test1.getId(), test1.getName());
        map.put(test2.getId(), test2.getName());//将对象添加到集合中去
        map.put(test3.getId(), test3.getName());
        Set<String> set=map.keySet();//获取Map集合的key的对象集合
        Iterator<String> it=set.iterator();//创建迭代器
        while (it.hasNext()) {
            String integer = (String) it.next();
            String name=map.get(integer);           //遍历HashMap集合
            System.out.println(integer+"-"+name);
        }
     TreeMap<String, String> map2=new TreeMap<String, String>();//创建TreeMap集合对象
     map2.putAll(map);向集合添加对象
     Set<String> set1=map2.keySet();//获取Map集合的key的对象集合
        Iterator<String> it1=set1.iterator();
        while (it1.hasNext()) {
            String integer = (String) it1.next();
            String name=map2.get(integer);           //遍历TreeMap集合
            System.out.println(integer+"-"+name); 
        }

    }

}

这是输出的

005-李大峰
001-李奇峰
002-吴娅晨
001-李奇峰
002-吴娅晨
005-李大峰

接下来我们把key的值换成Integer类型的时候,看看有什么变化

public class Map1 {
    public static void main(String[] args) {
        Map map=new HashMap();
        Test test1=new Test(001, "李奇峰");
        Test test2=new Test(005, "李大峰");
        Test test3=new Test(002, "吴娅晨");
        map.put(test1.getId(), test1.getName());
        map.put(test2.getId(), test2.getName());
        map.put(test3.getId(), test3.getName());
        Set set=map.keySet();
        Iterator it=set.iterator();
        while (it.hasNext()) {
            Integer integer = (Integer) it.next();
            String name=map.get(integer);
            System.out.println(integer+"-"+name);
        }
     TreeMap map2=new TreeMap();
     map2.putAll(map);
     Set set1=map2.keySet();
        Iterator it1=set1.iterator();
        while (it1.hasNext()) {
            Integer integer = (Integer) it1.next();
            String name=map2.get(integer);
            System.out.println(integer+"-"+name);
        }

    }

}

来看输出内容

1-李奇峰
2-吴娅晨
5-李大峰
1-李奇峰
2-吴娅晨
5-李大峰

我们会看到,当key的值为String类型时,HashMap处于无序状态,当key值为int型时,HashMap又为有序状态
而TreeMap不管什么类型,都是有序状态。

以上呢就是我对于集合的全部理解内容,如有纰漏,请在评论区留言指正,谢谢

你可能感兴趣的:(java)