首页 > 其他分享 >集合

集合

时间:2024-02-12 16:33:58浏览次数:29  
标签:map list System println 集合 out

一.集合框架

1.单例集合的体系结构

 

 List接口:

    1.有序的集合。

    2.允许存储重复的元素。

    有索引,可以使用普通for循环。

ArrayList:底层是数组实现的,查询快 增删慢。

LinkedList:底层是链表实现的,查询慢 增删快。

 

 

Set接口:

    1.不允许存储重复的元素。

    2.没有索引,不能使用for循环遍历。

HashSet:底层是哈希表+(红黑树)实现的,无索引,不能存储重复元素,存取无序。

LinkedHashSet:底层是哈希表+链表实现的,无索引,不能存储重复元素,可以保证存储顺序。

TreeSet:底层是二叉树实现的,一般用于排序。

二.ArrayList集合

1.

  数组的长度是不可以改变的。
  ArrayList集合的长度是可以改变的。

  对于ArrayList来说,有一个尖括号<E>代表泛型。
  泛型:也就是装载集合中的所有元素,全都是统一的类型。
  注意,泛型只能是引用类型,不能是基本类型。
 //从jdk1.7开始,右侧尖括号可以不写类型,但是<>本身还是要写的。
        ArrayList<String> list = new ArrayList<>();
        System.out.println(list);//[]

        //向集合中添加一些数据,使用add()方法。
        list.add("李三");
        System.out.println(list);
        list.add("张武");
        list.add("王六");
        list.add("李四");
        System.out.println(list);

 //       list.add(100);//错误写法,因为创建的时候尖括号已经说明了是字符串,添加进去的元素必修是字符串。

 

2.ArrayList常用方法

  public boolean add(E e); : 向集合中添加元素,参数的类型和泛型一致。
  对于ArrayList来说 add() 添加一定会成功。
  public E get(int index); :从集合当中获取元素,参数是索引编号,返回值是对应的位置的元素。
  public E remove(int index); :从集合当中删除元素,参数是索引编号,返回值是被删掉的元素。
  public int size(); : 获取集合的长度,返回值是集合中包含的元素个数。  
ArrayList<String> list = new ArrayList<>();
        System.out.println(list);
        //add()
        list.add("张三");
        list.add("李四");
        boolean success = list.add("王五");
        System.out.println(list);
        System.out.println("添加的动作是否成功:"+success);

        //set() 方法用于替换动态数组中指定索引的元素
        list.set(1,"囡囡");
        System.out.println(list);

        //get() 索引从0开始
        String name = list.get(0);
        System.out.println(name);

        //remove
        String remove = list.remove(2);
        System.out.println("被删除的元素为:"+remove);
        System.out.println(list);

        //size()
        int size = list.size();
        System.out.println("集合的长度为:"+size);

 

3.总结

    1.arrayList由于本质是数组,所以它在数据的查询方面会很快,而在插入删除这些方面,性能下降很多,有移动很多数据才能达到应有的效果。     2.arrayList可以存放null。    3.如果希望向ArrayList集合中存储基本数据类型 要使用对应的包装类。

 

三.Collection集合

1.Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)一些通用的方法,用于操作所有的单列集合。方法如下:

  boolean add(E e); 向集合中添加元素。
  boolean remove(E e); 删除集合中的某个元素。
  void clear(); 清空集合中的所有元素。
  boolean contains(E e); 判断集合中是否包含某个元素。
  boolean isEmpty(); 判断集合是否为空。
  int size(); 获取集合的长度。
  Object[] toArray(); 将集合转成一个数组。
//创建集合
        Collection<String> list = new ArrayList<>();
        //boolean add(E e);  向集合中添加元素。
        list.add("Hello");
        list.add("World");
        list.add("heima");
        list.add("java");
        System.out.println(list); //[Hello, World, heima, java]

        //boolean contains(E e); 判断集合中是否包含某个元素。
        boolean result1 = list.contains("java");
        System.out.println(result1);//true

        //boolean remove(E e); 删除集合中的某个元素。
        boolean result = list.remove("Hello");
        System.out.println(result); //true
        System.out.println(list); //[World, heima, java]

        //void clear();   清空集合中的所有元素。
        list.clear();
        System.out.println(list); //[]

        //boolean isEmpty(); 判断集合是否为空。
        boolean empty = list.isEmpty();
        System.out.println(empty); //true

        //int size(); 获取集合的长度。
        int size = list.size();
        System.out.println(size); // 0

        //Object[] toArray(); 将集合转成一个数组
        list.add("AAA");
        list.add("bbb");
        list.add("CCC");

        Object[] array = list.toArray();
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }

四.Iterator迭代器

1.概念:即Collection集合元素通用的获取方式,在去元素之前先判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出来

    一直把集合中的所有元素都取出来,这种取出方式的专业术语叫做迭代。

    java.util.Iterator接口:迭代器(对集合进行遍历)

  常用方法:
    boolean hasNext() 如果迭代具有更多元素,则返回 true 。
       判断集合中还有没有下一个元素,有就返回true,没有就返回false
    E next() 返回迭代中的下一个元素。

    Iterator迭代器,是一个接口,无法直接使用,需要使用Iterator接口的实现类对象,获取实现类的方式比较特殊.
    Collection接口中有一个方法,叫iterator()这个方法返回的是迭代器的实现类对象
    Iterator<E> iterator(); 返回此集合中元素的迭代器。

    迭代器的使用步骤(重点)
    1.使用集合中的方法iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态)
    2.使用Iterator接口中的hasNext()方法判断还有没有下一个元素。
     3.使用Iterator接口中的next()方法取出集合中的下一个元素。
 Collection<String> coll = new ArrayList<>();
        coll.add("AAA");
        coll.add("BBB");
        coll.add("CCC");
        coll.add("DDD");
        coll.add("EEE");
        coll.add("FFF");

        //1.使用集合中的方法iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态)
        //注意:迭代器是有泛型的,集合是什么泛型,迭代器就是什么泛型。
        Iterator<String> iterator = coll.iterator();//迭代器的实现类对象把指针(索引)指向集合的-1索引

        while (iterator.hasNext()){
            String s = iterator.next();
            System.out.println(s);
        }

 

五.泛型

  1.创建集合对象使用泛型

      好处:

        1.避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型。

        2.把运行期异常提升到了编译期。

      弊端:

        泛型是什么类型,只能存储什么类型。

  2.创建集合对象不使用泛型

      好处:

        默认是Object类型,可以存储任何数据。

      弊端:

        不安全,会引发异常。

 

六.List集合 

  

List接口的特点:
1.有序的集合。
2.有索引,包含一些带索引的方法。
3.允许存储重复的元素。

List接口带有索引的方法(特有):
public void add(int index , E element) 将指定的元素插入此列表中的指定位置
public E get(int index) 返回此列表中指定位置的元素。
public E remove(int index) 删除该列表中指定位置的元素。
public E set(int index, E element) 用指定的元素替换此列表中指定位置的元素。  
 //创建一个集合,多态.
        List<String> list = new ArrayList<>();

        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("a");
        System.out.println(list);//[a, b, c, d, a]
        //public void add(int index , E element) 将指定的元素插入此列表中的指定位置
        list.add(2,"kuangshenshuo");//[a, b, kuangshenshuo, c, d, a]
        System.out.println(list);
        //public E remove(int index) 删除该列表中指定位置的元素。
        String remove = list.remove(2);
        System.out.println("被删除的元素为:"+remove);//kuangshenshuo
        System.out.println(list);//[a, b, c, d, a]
        //public E get(int index) 返回此列表中指定位置的元素。
        String s = list.get(3);
        System.out.println("返回集合中索引为3的元素是:"+s);
        System.out.println(list);
        //public E set(int index, E element) 用指定的元素替换此列表中指定位置的元素。
        String s1 = list.set(4, "替换的元素");
        System.out.println("被替换的元素为:"+s1);//被替换的元素为:a
        System.out.println(list);//[a, b, c, d, 替换的元素]

 

七.LinkedList集合

LinkedList集合的特点:
1.底层是链表结构:查询慢,增删快。
2.里面包含了大量的操作首尾元素的方法。
   注意,使用LinkedList特有的方法时,不能使用多态。

void addFirst(E e) 在该列表开头插入指定的元素。
void addLast(E e) 将指定的元素追加到此列表的末尾。
void push(E e) 将元素推送到由此列表表示的堆栈上。

E getFirst() 返回此列表中的第一个元素。
E getLast() 返回此列表中的最后一个元素。

E removeFirst() 从此列表中删除并返回第一个元素。
E removeLast() 从此列表中删除并返回最后一个元素。
E pop() 从此列表表示的堆栈中弹出一个元素。
 LinkedList<String> linked = new LinkedList<>();
        linked.add("a");
        linked.add("b");
        linked.add("c");
        linked.add("d");

        System.out.println(linked);//[a, b, c, d]
        //void addFirst(E e) 在该列表开头插入指定的元素。
        linked.addFirst("WWW");
        System.out.println(linked);//[WWW, a, b, c, d]
        //void addLast(E e) 将指定的元素追加到此列表的末尾。
        linked.addLast("kuangshenshuo");
        System.out.println(linked);//[WWW, a, b, c, d, kuangshenshuo]
        //void push(E e) 将元素推送到由此列表表示的堆栈上。
        linked.push("ABCDE");
        System.out.println(linked);//[ABCDE, WWW, a, b, c, d, kuangshenshuo]

        //linked.clear();

        if (!linked.isEmpty()){
            // E getFirst() 返回此列表中的第一个元素。
            String first = linked.getFirst();
            System.out.println(first);//ABCDE
            //E getLast() 返回此列表中的最后一个元素。
            String last = linked.getLast();
            System.out.println(last);//kuangshenshuo
        }

        //E removeFirst() 从此列表中删除并返回第一个元素。
        //E removeLast() 从此列表中删除并返回最后一个元素。
        //E pop() 从此列表表示的堆栈中弹出一个元素。
        String s = linked.removeFirst();
        System.out.println("被移除的第一个元素是:"+s);//被移除的第一个元素是:ABCDE
        String s1 = linked.removeLast();
        System.out.println("被移除的最后一个元素是:"+s1);//被移除的最后一个元素是:kuangshenshuo
        System.out.println(linked);//[WWW, a, b, c, d]
        String pop = linked.pop();
        System.out.println(pop);//WWW
        System.out.println(linked);//[a, b, c, d]

 

八.Set集合

java.util.Set接口 extends Collection接口
  Set集合接口的特点:
1.不允许存储重复的元素。
2.没有索引,不能使用普通for循环遍历集合。
 public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(4);
        //使用迭代器遍历
        Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()){
            Integer i = iterator.next();
            System.out.println(i);
        }
        //使用增强for遍历集合

        for (int i:
             set) {
            System.out.println(i);
        }

    }

 



java.util.HashSet集合 implements Set接口
  HashSet特点:
1.不允许存储重复的元素。
2.没有索引,不能使用普通for循环遍历集合。
3.是一个无序的集合。
4.底层是哈希表结构,查询速度非常快。 Set集合保证存储的元素唯一:
   存储的元素(String,Integer.... Student,Person...)必须重写HashCode方法和equals方法。    

九.LinkedHashSet集合

java.util.LinkedHashSet集合 extends HashSet集合
LinkedHashSet集合的特点:
底层是一个哈希表(数组/链表+红黑树)+链表 ,多了一条链表保证元素有序。
public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("abc");
        set.add("www");
        set.add("it");
        set.add("heima");
        set.add("www");
        System.out.println(set);//[abc, www, heima, it]

        LinkedHashSet<String> linked = new LinkedHashSet<>();
        linked.add("abc");
        linked.add("www");
        linked.add("it");
        linked.add("heima");
        linked.add("www");
        System.out.println(linked);//[abc, www, it, heima]
    }

 

十.Map集合

java.util.Map<k,v> 接口
Map集合的特点:
1.Map集合是一个双列集合,一个元素包含俩个值。(一个key,一个value)。
2.Map集合中的元素,key和value的数据类型可以相同,也可以不同。
3.Map集合中的元素,key是不允许重复的,value是可以重复的。
4.Map集合中的元素,key和value是一一对应的。
java.util.HashMap<k,v> 集合 implements Map<k,v>接口
HashMap集合的特点:
1.HashMap底层是哈希表,查询速度特别快。
2.HashMap是一个无序的集合。
java.util.LinkedHashMap<k,v> extend HashMap<k,v>集合
LinkedHashMap集合的特点:
1.LinkedHashMap集合的底层是哈希表+链表(保证迭代顺序)。
2.LinkedHashMap集合是一个有序的集合。  

1.Map接口中的常用方法

 

  /*
          public V put(K key, V value) 将指定的值与此映射中的指定键相关联。
             存储键值对的时候 key不重复,返回值是null。
             存储键值对的时候 key重复,会使用新的value值替换map中重复key对应的的value,返回被替换的value值。
            */
    public static void show01(){
        //创建集合
        Map<String, String> map = new HashMap<>();

        String put = map.put("1", "2");
        System.out.println(put);//null
        System.out.println(map);//{1=2}
        String put1 = map.put("1", "3");
        System.out.println(put1);//2
        System.out.println(map);//{1=3}
        map.put("100","200");
        map.put("1000","2000");
        map.put("10000","20000");
        System.out.println(map);
    }

    /*
       public V remove(Object key) 从该地图中删除指定键的映射(如果存在),返回被删除的value值。
               key存在,返回被删除的value值。
               key不存在,返回null。
        */
    public static void show02(){

        Map<Integer, String> map = new HashMap<>();
        map.put(1,"张三");
        map.put(2,"李四");
        map.put(3,"王五");
        System.out.println(map);//{1=张三, 2=李四, 3=王五}
        String v1 = map.remove(2);
        System.out.println("被删除的元素的值:"+v1);//被删除的元素的值:李四
        System.out.println(map);//{1=张三, 3=王五}
        String v2 = map.remove("4");
        System.out.println("被删除的元素的值:"+v2);//被删除的元素的值:null


    }

    /*
        public V get(Object key) 返回指定键映射到的值,如果此映射不包含键的映射,则返回 null 。
         */
    private static void show03() {

        Map<Integer, String> map = new HashMap<>();
        map.put(1,"张三");
        map.put(2,"李四");
        map.put(3,"王五");
        System.out.println(map);//{1=张三, 2=李四, 3=王五}
        String s = map.get(2);
        System.out.println("键为2所对应的值为:"+s);//键为2所对应的值为:李四
        String s1 = map.get(4);
        System.out.println("键为4所对应的值为:"+s1);//键为4所对应的值为:null
    }

    /*
    boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。
     */
    private static void show04() {
        Map<Integer, String> map = new HashMap<>();
        map.put(1,"张三");
        map.put(2,"李四");
        map.put(3,"王五");
        boolean b = map.containsKey(1);
        System.out.println(b);//true
    }

 2.Map集合的第一种遍历方式:通过键找值

Map集合中的方法:
Set<K> keySet() 返回此地图中包含的键的Set视图 。
实现步骤:
1.使用Map集合中的方法keySet() ,把Map集合中的key取出来,存储到一个Set集合中。
2.遍历Set集合,获取每一个元素key。
3.通过Map集合中的get()方法通过每一个key找到对应的value。

 

 Map<String,Integer> map = new HashMap<>();
        map.put("张三",1);
        map.put("李四",2);
        map.put("王五",3);

        Set<String> set = map.keySet();

        //使用迭代器来遍历set集合
        Iterator<String> it = set.iterator();
        while (it.hasNext()){
            String key = it.next();
            Integer value = map.get(key);
            System.out.println(key+"="+value);
        }

        System.out.println("-----------------");
        //使用增强for来遍历set集合
        for (String key:set){
            Integer value = map.get(key);
            System.out.println(key+"="+value);
        }

3.Map集合遍历的第二种方法:使用Entry对象遍历。

在Map接口中有一个内部接口Entry,
作用:当Map集合一创建,那么就会在Map集合中创建一个Entry对象,
用来记录键与值,(键与值的映射关系)。

Map集合中的方法:
Set<Map.Entry<K,V>> entrySet() 返回此地图中包含的映射的Set视图。

实现步骤:
1.使用Map集合中的方法,entrySet() ,把Map集合中的多个Entry对象取出来。
2.遍历Set集合,获取每一个Entry对象。
3.使用Entry对象中的方法getKey()和 getValue()获取键和值。
  Map<Integer,String> map = new HashMap<>();
        map.put(1,"张三");
        map.put(2,"李四");
        map.put(3,"王五");

        Set<Map.Entry<Integer, String>> entry = map.entrySet();
        //使用迭代器遍历
        Iterator<Map.Entry<Integer, String>> it = entry.iterator();
        while (it.hasNext()){
            Map.Entry<Integer, String> obj = it.next();
            System.out.println(obj.getKey()+"="+obj.getValue());
        }
        System.out.println("==============");
        //使用增强for遍历
        for (Map.Entry<Integer,String> obj:entry
             ) {
            System.out.println(obj.getKey()+"="+obj.getValue());
        }

4.HashMap集合存储自定义类型的键值。

Map集合保证key是唯一的:
作为key的元素,必须重写HashCode()方法equals()方法。
/*
    HashMap集合存储自定义类型的键值。
        key:String类型
            String类型重写HashCode()方法equals()方法,保证了key唯一。
        value:Student类型
            value值可以重复,(同名同年龄的人视为同一个人)。
     */
    private static void show01() {
            //创建HashMap集合
        HashMap<String,Student> map = new HashMap<>();
            //往集合中添加元素
        map.put("北京",new Student("张三",18));
        map.put("上海",new Student("李四",19));
        map.put("广州",new Student("王五",20));
        map.put("北京",new Student("赵六",21));
        //遍历集合
        Set<String> set = map.keySet();
        for (String key: set
             ) {
            System.out.println(key+"-->"+map.get(key));
        }
        System.out.println("--------------");
        Set<Map.Entry<String, Student>> entrySet = map.entrySet();
        for (Map.Entry<String,Student> obj: entrySet
             ) {
            System.out.println(obj.getKey()+"-->"+obj.getValue());
        }
    }


    /*
    HashMap集合存储自定义类型的键值。
        key:Student类型
            Student类型重写HashCode()方法equals()方法,保证了key唯一。
        value:String类型
            可以重复
     */

    private static void show02(){
        //创建HashMap集合
        HashMap<Student,String> map = new HashMap<>();
        //往集合中添加元素
        map.put(new Student("张三",18),"法国");
        map.put(new Student("李四",19),"法国");
        map.put(new Student("王五",20),"法国");
        map.put(new Student("张三",18),"英国国");

        //遍历集合
        Set<Student> set = map.keySet();
        for (Student key:set
             ) {
            System.out.println(key+"-->"+map.get(key));
        }


    }

 5.LinkedHashMap

java.util.LinkedHashMap<k,v> extends HashMap<k,v>
Map接口的哈希表和链表的实现,具有可预知的迭代顺序。
底层原理:
哈希表+链表(有序的)
 HashMap<String, String> map = new HashMap<>();
        map.put("a","b");
        map.put("c","b");
        map.put("d","b");
        map.put("a","c");
        System.out.println(map);//{a=c, c=b, d=b} 无序的 ,key不允许重复。


        System.out.println("============");
        LinkedHashMap<String, String> lhp = new LinkedHashMap<>();
        lhp.put("a","b");
        lhp.put("c","b");
        lhp.put("d","b");
        lhp.put("a","c");
        System.out.println(lhp);//{a=c, c=b, d=b} 有序的,key不允许重复

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:map,list,System,println,集合,out
From: https://www.cnblogs.com/1997Li/p/17997046

相关文章

  • 集合问题——并查集
    目录问题引入算法原理参考代码问题引入给出n个人的m个关系,表示给出的两个人都是朋友关系,之后进行k次询问,要求判断给出的两人是否是朋友关系,朋友的朋友也是朋友算法原理简单来说就是对集合的合并进行一个处理,使得是朋友的一群人用一个共同的朋友记录,这样在查询的时候就可以通过......
  • 紧急集合 / 聚会
    对于这道题目,我们考虑三个点的位置如果三个点共线,比如下面这个样子那么应该放在哪里呢?很显然应该放在中间这个点这里如果三个点不共线呢?这个时候我们以两个点为端点画线,再画出其他分支那么现在这个点应该放在哪里呢?应该放在中间“T”字形的交点那里于是我们就清楚了,结合上......
  • 接口传送集合数据备份
    //请求路径Stringurl=address+"/priceFreightpriceController.do?outGetMaplist&chargeableWeight="+weight;//url=url+"&data="+jsonString;Gsongson=newGson();//List转String......
  • 盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
    写在开头在Java的世界里万物皆对象。但我认为是万物皆数据,世界由各种各样数据构建起来,我们通过程序去实现数据的增删改查、转入转出、加减乘除等等,不同语言的实现方式殊途同归。由此可见,数据对于程序语言的重要性。这段话是在写数据类型那篇博客时说的,当时是为了引入Java中数据......
  • C++编程练习||1.类模板2.整数集合类3.复数集合类,模板结合
    1.类模板 类模板的作用  使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。  类模板的声明  类模板template<模板参数表>class类名{类成员声明};  ......
  • 并发集合测试
    场景:某个集合正在被遍历的时候,给集合加入新元素,这个时候是会抛并发修改异常还是正常?如果正常的话,能不能拿到新获取的元素?KeySetViewpublicclassconcurrentTest{publicstaticvoidmain(String[]args){Set<String>channels=ConcurrentHashMap.newKeySet(......
  • 第四章:集合运算
    第四章:集合运算4.1表的加减法4.1.1什么是集合运算集合在数学领域表示“各种各样的事物的总和”,在数据库领域表示记录的集合。具体来说,表、视图和查询的执行结果都是记录的集合,其中的元素为表或者查询结果中的每一行。在标准SQL中,分别对检索结果使用UNION,INTERSECT,EXCEPT......
  • 【DM】修改集合(嵌套表类型)中数据
    declaretyperecord_tableisrecord(idint,valvarchar(128),namevarchar);typev_tableistableofrecord_table;tempChangev_table;begin--BULKCOLLECT批量的执行;selectnum,val,'zidingyi'bulkcollectintotempChangefromtable......
  • JUC【1.原子类、2.锁Lock、3.阻塞队列、4.并发集合容器、5.并发工具类、6.线程池】、
    (JUC简介)转自极客时间1.JUC简介从JDK1.5起,JavaAPI中提供了java.util.concurrent(简称JUC)包,在此包中定义了并发编程中很常用的工具,比如:线程池、阻塞队列、同步器、原子类等等。JUC是JSR166标准规范的一个实现,JSR166以及JUC包的作者是同一个人DougLea。2.原......
  • Java 中的Map集合
    Map1.Map接口中常用的方法importjava.util.Collection;importjava.util.HashMap;importjava.util.Map;/*java.util.Map接口中常用的方法:Map和Collection没有继承关系Map集合以key和value的方式存储数据:键值对key和value都是引用数据类型key和value都是存储对象的地......