• Java-集合


    # 1 集合:
    * 1、用于存储对象的容器
    * 2、集合的长度是可变的 (数组的大小是固定的)
    * 3、集合中不可以存储基本数据类型

    Collection中常用的方法
    1,添加。
    boolean add(Object obj):
    boolean addAll(Collection coll):

    2,删除。
    boolean remove(object obj):
    boolean removeAll(Collection coll);
    void clear();
    3,判断:
    boolean contains(object obj):
    boolean containsAll(Colllection coll);
    boolean isEmpty():判断集合中是否有元素。
    4,获取:
    int size():
    Iterator iterator():取出元素的方式:迭代器。
    该对象必须依赖于具体容器,因为每一个容器的数据结构都不同。
    所以该迭代器对象是在容器中进行内部实现的。
    对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,
    也就是iterator方法。
    Iterator接口就是对所有的Collection容器进行元素取出的公共接口。
    5,其他:
    boolean retainAll(Collection coll);取交集。
    Object[] toArray():将集合转成数组。

    public static void collection(){
    
            Collection col1 = new ArrayList();
            Collection col2 = new ArrayList();
    
            col1.add("1");
            col2.add("2");
            col2.add("3");
            System.out.println(col1);
            col1.addAll(col2);
            System.out.println(col1);
    
    //        col1.remove("1");
    //        System.out.println(col1);
    //        col1.removeAll(col2);
    //        System.out.println(col1);
    
            boolean contain = col1.contains("5");
            System.out.println(contain);
    
            boolean containsAll = col1.containsAll(col2);
            System.out.println(containsAll);
    
            boolean empty = col1.isEmpty();
            System.out.println(empty);
    
            int size = col1.size();
            System.out.println(size);
    
            Iterator iterator = col1.iterator();
            while (iterator.hasNext()) {
                Object next = iterator.next();
                if (next instanceof String && next.equals("1")) {
                    iterator.remove();
                } else {
                    System.out.println(next);
                }
            }
        }
        

    Collection
    |-- List 有序可重复
    |-- Set 无序不重复

    # 2 、List

    List:
    |--Vector:内部是数组数据结构,是同步的。增删,查询都很慢!
    |--ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询的速度快。
    |--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。 addFirst等方法

    /**
         * List :常见方法
         1,添加
         void add(index,element);
         void add(index,collection);
    
         2,删除;
         Object remove(index):
    
         3,修改:
         Object set(index,element);
    
         4,获取:
         Object get(index);
         int indexOf(object);获取指定元素的索引
         int lastIndexOf(object);
         List subList(from,to);
         *
         */
          
            public static void list(){
    
            List list = new ArrayList();
    
            list.add("11");
            list.add("22");
            list.add("33");
    
            list.add(1,"111");
            System.out.println(list);
    
            list.remove(1);
            System.out.println(list);
    
            list.set(1,"222");
    
            Object o = list.get(1);
            System.out.println(o);
    
    
            int i = list.indexOf("33");
            System.out.println(i);
    
            int i1 = list.lastIndexOf("11");
            System.out.println(i1);
    
            List list1 = list.subList(0, 1);
            System.out.println(list1);
    
            // List的遍历方式以及使用,使用Iterator接口的子接口ListIterator来完成在迭代中对集合元素进行的增删改查,不会抛出并发修改的异常,
            ListIterator listIterator = list.listIterator();
            while (listIterator.hasNext()) {
                Object o1 = listIterator.next();
                if (o1.equals("11")) {
                    // 集合和迭代器同时对元素进行修改,就会产生异常,所以这里不能使用list.add(obj)等方法;
                    listIterator.add("44");
    //                listIterator.set("111212");
    //                listIterator.remove();
                }
            }
            System.out.println(list);
    
        }

    # 3、Set

    /**
         * Set
         *  Set接口中的方法和Collection一致。
         * |-- HashSet
         * |-- TreeSet 自然排序,如果存放的是自定义对象,使用TreeSet,必须实现Comparable接口,覆盖里面的compareTo方法,添加元素的时候进行比较;如果添加的是字符串
         就不需要覆盖compareTo方法,因为字符串有自己的compareTo方法 , 自定义对象在TreeSet存储时候,如果不覆盖,就会报 java.lang.ClassCastException: cn.itcast.p.bean.Person cannot be cast to java.lang.Comparable异常
         */
        /**
         * HashSet
         * 内部数据结构是哈希表 ,是不同步的。
         *
         如何保证该集合的元素唯一性呢?
         是通过对象的hashCode和equals方法来完成对象唯一性的。
         如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。
         如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。
         如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。
         记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。
         一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。
         建立对象判断是否相同的依据。
    
         如果HashSet不覆盖equal和hashCode方法的话,默认的是使用Object中的equal和hashCode方法
         Object中的equal方法比较地址的,而不是比较内容,如果添加重复的对象,地址不同,就会认为没有重复的对象
         所以比较对象是否相同,必须覆盖equal和hashCode方法
         */
        
        
        public static void hashSet(){
            HashSet set = new HashSet();
            set.add(new Person("pp",21));
            set.add(new Person("zz",22));
            set.add(new Person("tt",23));
            set.add(new Person("pp",21));
    
            Iterator iterator = set.iterator();
            while (iterator.hasNext()) {
                Person person = (Person)iterator.next();
                System.out.println(person.getName() + "---------" + person.getAge());
            }
    
    
        }
        
        
        public class Person {
    
        private String name;
        private int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public boolean equals(Object obj) {
            System.out.println("调用了equals方法---------------");
            if (this == obj) {
                return true;
            }
            if (!(obj instanceof Person)) {
                throw new ClassCastException("类型转化错误");
            }
            Person person = (Person) obj;
            return this.name.equals(person.name) && this.age == person.age;
        }
    
        @Override
        public int hashCode() { // 判断人的hash值是否相同
            System.out.println("调用了hashCode方法---------------");
            return this.name.hashCode() + age;
        }
      }

    # 4、 Map

    *
    * 可以使用键来查找对象,类似于数组下标。Map.put(key,value)插入数据,Map.get(key)查找数据。键要求唯一。存储方式不是顺序存储,速度快。不必指定Map的尺寸,因为它自己会自动的调整。
    *
    (1)HashMap使用最快的查找技术,存储无顺序。

    (2)TreeMap按照比较结果升序保存。

    (3)LinkedHashMap按照插入顺序保存键,同时保留HashMap的查询速度

    常用方法:
    1,添加。
    value put(key,value):返回前一个和key关联的值,如果没有返回null.

    2,删除。
    void clear():清空map集合。
    value remove(key):根据指定的key翻出这个键值对。

    3,判断。
    boolean containsKey(key):
    boolean containsValue(value):
    boolean isEmpty();

    4,获取。
    value get(key):通过键获取值,如果没有该键返回null。
    当然可以通过返回null,来判断是否包含指定键。
    int size(): 获取键值对的个数。

    5.特殊方法: Collection<V> values() 包含的值的 Collection 视图。

     private static void method1(Map<Integer, String> map) {
            map.put(1, "zhang");
            map.put(2, "wang");
            map.put(3, "li");
            System.out.println(map);
    
            if (!map.isEmpty()) {
                if (map.containsKey(2)) {
                    map.remove(2);
                }
            }
    
            System.out.println(map);
            System.out.println("size : " + map.size());
            System.out.println(map.get(3));
    
            Collection values = map.values();
            Iterator iterator = values.iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
        }
    /**
         * 第一种遍历的方法
         * Set<K> keySet():返回键的set集合
         * 取出map中的所有元素。
         * 原理,通过keySet方法获取map中所有的键所在的Set集合,在通过Set的迭代器获取到每一个键,
                 在对每一个键通过map集合的get方法获取其对应的值即可。
    
         */
        private static void method2(Map<Integer, String> map) {
            map.put(8,"zhaoliu");
            map.put(2,"zhaoliu");
            map.put(7,"xiaoqiang");
            map.put(6,"wangcai");
    
            Set<Integer> keySet = map.keySet();
            Iterator<Integer> iterator = keySet.iterator();
    
            while (iterator.hasNext()) {
                Integer key = iterator.next();
                String value = map.get(key);
                System.out.println(value);
            }
        }
    /**
         *
         * Set<Map.Entry<K,V>> entrySet()方法:返回一个set集合,里面装的是Map.Entry接口类型的键值对象
         *
         * 第二种遍历map的方式:通过看API:Set<Map.Entry<K,V>> entrySet():Map.Entry<K,V>接口类型,
         * 里面有K getKey() 返回与此项对应的键。 V getValue()  返回与此项对应的值。
    
         * 思路:通过把map转化为set,进行迭代
         * 通过使用entrySet方法吧键和值的映射关系作为对象,存储到set集合中,这个映射关系的类型为Map.Entry类型
         *
         *
         */
        private static void method3(Map<Integer, String> map) {
            map.put(8,"zhaoliu");
            map.put(2,"zhaoliu");
            map.put(7,"xiaoqiang");
            map.put(6,"wangcai");
    
            Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
            Iterator<Map.Entry<Integer, String>> iterator = entrySet.iterator();
            while (iterator.hasNext()) {
                Map.Entry<Integer, String> entry = iterator.next();
                System.out.println("key : " + entry.getKey());
                System.out.println("value : " + entry.getValue());
            }
    
        }
  • 相关阅读:
    关于CSS网页布局id与class命名的问题
    JavaScript弹出层技术探讨文章收藏
    Jquery实现弹窗
    Asp.net中时间格式化的几种方法
    新建商品时,导入商品,随机文件名称的形成
    Linux问题:Crontab 执行shell脚本时相对路径的问题,不能识别。
    linux环境php扩展pdo_mysq安装l错误
    测试php代码的运行时间
    Apache的工作方式
    PHP时间处理
  • 原文地址:https://www.cnblogs.com/king-peng/p/10048479.html
Copyright © 2020-2023  润新知