首页 > 编程语言 >Java 初学 day12

Java 初学 day12

时间:2024-10-16 19:10:18浏览次数:1  
标签:Java System 集合 add 初学 day12 println c1 out

java 12

集合

1、Collection

到目前位置,我们学习过哪些可以存储元素的容器

1、数组
    优点:不同的数组可以存储不同数据类型的元素
    缺点:长度不可变
2、StringBuffer|StringBuilder
    优点:长度可以跟随元素的数量而改变
    缺点:里面的元素只有一种字符数据类型
我们今后会根据元素的是否重复,存储和取出的顺序等来决定我们该使用什么样的容器来进行存储
根据我现实生活中经验来说,容器应该是丰富多彩的,多种多样的
java应该要使用若干个不同的类来描述不同的容器,表示不同容器的特点。
容器应该都有若杠共同的特点,都可以装东西等。
那么java中提供的这些类中成员应该也会有相同的部分,那我们将其向上提取,由继承或实现来构建关系
这样我们就可以得到一个继承体系。

Collection【接口】:

我们通过帮助文档发现,Collection是一个接口,不能直接new对象
根据元素是否可以发生重复,继续分类
- List【接口】元素可以发生重复,且有索引的概念
    ArrayList
- Set【接口】元素不可以发生重复,没有索引


借助ArrayList子类对象来使用Collection接口中的方法

   学习java中任意一个集合的步骤:
    1、创建相关集合对象
    2、创建元素对象
    3、将元素添加到集合中
    4、遍历集合

Collection中的成员方法:

boolean add(E e)  //向集合中添加元素
boolean remove(Object o)  //在集合中删除元素
void clear()	//清空集合
boolean contains(Object o)   //查找集合中是否包含某元素
boolean isEmpty()	//验证该集合是否为空
int size()		//获取集合的长度
public class CollectionDemo1 {
    public static void main(String[] args) {
        //借助ArrayList创建对象来使用Collection接口中的方法
        // 1、创建相关集合对象
        Collection c1 = new ArrayList();

        //boolean add(Object e)
        c1.add(100); //这里涉及到自动装箱 int -> Integer
        c1.add(true);
        c1.add(12.34);
        c1.add(1000L);
        c1.add(100);
        c1.add(12.34);
        // 重写toString()方法的类是ArrayList类的父类的父类中重写的。
        // 底层是使用StringBuilder实现的
        System.out.println("c1: " + c1);
        //注意:我们今后使用集合的时候,规定一个集合只能存储一种数据类型的元素
        System.out.println("-----------------------------------------");
        //[100, true, 12.34, 1000, 100, 12.34]
        //boolean remove(Object o) 从集合中删除一个元素,只会删除最左边的一个匹配元素
        c1.remove(100);
        System.out.println("c1: " + c1);
        System.out.println("-----------------------------------------");
        //void clear() 清空集合元素
//        c1.clear();
//        System.out.println("c1: " + c1);
        System.out.println("-----------------------------------------");
        //boolean contains(Object o) 判断Collection集合中是否包含某个元素
        System.out.println(c1.contains(12.34));
        System.out.println("-----------------------------------------");
        //boolean isEmpty() 判断Collection集合是否为空
        System.out.println(c1.isEmpty());
        System.out.println("-----------------------------------------");
        //int size() 获取集合的长度【元素的个数】
        System.out.println(c1.size());


    }
}
boolean addAll(Collection c)  //向集合中添加集合c
boolean removeAll(Collection c)		//在集合中删除集合c
boolean containsAll(Collection c)	//判断集合中是否包含集合c
boolean retainAll(Collection c)		//求该集合与集合c的交集
public class CollectionDemo2 {
    public static void main(String[] args) {
        //创建集合对象
        Collection c1 = new ArrayList();
        c1.add("java");
        c1.add("maven");
        c1.add("clickhouse");
        c1.add("redis");

        Collection c2 = new ArrayList();
        c2.add("java");
        c2.add("hadoop");
        c2.add("maven");
        c2.add("hive");
        c2.add("hbase");
        c2.add("数据采集");

        System.out.println("c1: "+c1);
        System.out.println("c2: "+c2);

        System.out.println("------------------------------");
        //boolean addAll(Collection c)
//        c1.addAll(c2);
//        System.out.println("c1: "+c1);
//        System.out.println("c2: "+c2);

        //boolean removeAll(Collection c)
//        c1.removeAll(c2);
//        System.out.println("c1: "+c1);
//        System.out.println("c2: "+c2);

        //boolean containsAll(Collection c)
//        System.out.println(c1.containsAll(c2));
//        System.out.println("c1: "+c1);
//        System.out.println("c2: "+c2);

        //boolean retainAll(Collection c) 求交集 将结果保存在调用方法的对象集合中
        c1.retainAll(c2);
        System.out.println("c1: "+c1);
        System.out.println("c2: "+c2);

    }
}

问题:如何遍历一个集合

方法一:Object[] toArray() 把集合转成数组,可以实现集合的遍历
public class CollectionDemo3 {
    public static void main(String[] args) {
        Collection c1 = new ArrayList();
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("hadoop");
        c1.add("world");

        Object[] objects = c1.toArray();
        for(int i=0;i<objects.length;i++){
            Object obj = objects[i]; // "hello"
            String s = (String)obj;
            //向下转型,才可使用元素自己类型的方法
            System.out.println(s+"-"+s.length());
        }

    }
}
方法二:Iterator iterator() 迭代器,集合的专用遍历方式
public class CollectionDemo4 {
    public static void main(String[] args) {
        Collection c1 = new ArrayList();
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("hadoop");
        c1.add("world");

        //Collection类型的集合本身是不可以直接遍历的
        //需要生成对应的迭代器,迭代器中存储了集合中的元素
        //将来遍历迭代器就可以获取集合中的元素了
        //生成迭代器
        Iterator iterator = c1.iterator(); // new Itr()
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next()); // NoSuchElementException
        //每一个迭代器,都有一个独立指针,每调用一次next()方法,就会向后移动一次指针取数据
        //如何判断下一个位置上是否有元素呢?
        while (iterator.hasNext()){
            Object obj = iterator.next();
            String s = (String)obj;
            System.out.println(s+"-"+s.length());
        }

    }
}

运用

/*
    Collection集合存储自定义对象
    1、创建集合对象
    2、创建元素对象
    3、将元素添加到集合中
    4、遍历集合
 */
public class CollectionDemo5 {
    public static void main(String[] args) {
        //1、创建集合对象
        Collection c1 = new ArrayList();

        //2、创建元素对象
        Student s1 = new Student("李刚", 15);
        Student s2 = new Student("江川", 11);
        Student s3 = new Student("钱志强", 17);
        Student s4 = new Student("祝帅", 15);

        // 3、将元素添加到集合中
        c1.add(s1);
        c1.add(s2);
        c1.add(s3);
        c1.add(s4);

        // 4、遍历集合
        //方式1:转数组遍历
//        Object[] objects = c1.toArray();
//        for(int i=0;i<objects.length;i++){
//            Object obj = objects[i];
//            Student s = (Student) obj;
//            System.out.println(s.getName()+"-"+s.getAge());
//        }

        //方式2:迭代器遍历
        Iterator iterator = c1.iterator();
        while (iterator.hasNext()){
            Object obj = iterator.next();
            Student s = (Student) obj;
            System.out.println(s.getName()+"-"+s.getAge());
        }
    }
}

2、List集合

List集合:元素可以发生重复,有序(指存储和取出的顺序一致)
Collection【接口】:
     - List【接口】
        ArrayList
     - Set【接口】

List集合中特有的成员方法:

void add(int index,E element)
E remove(int index)
E get(int index)
E set(int index,E element)
ListIterator listIterator()
public class ListDemo1 {
    public static void main(String[] args) {
        List list1 = new ArrayList();

        list1.add("hello");
        list1.add("apple");
        list1.add("banana");
        list1.add("watermelon");
        list1.add("mango");

        System.out.println("list1: " + list1);

        System.out.println("==================================");
        //因为List相关集合具备索引的特点,List集合根据索引提供一些其它集合没有的方法
        //void add(int index,E element) 指定索引位置添加元素 grape
        list1.add(2,"grape");
        System.out.println("list1: " + list1);
        System.out.println("==================================");
        // E remove(int index) 根据索引从集合中移除元素
        System.out.println(list1.remove(2));
        System.out.println("list1: " + list1);
        System.out.println("==================================");
        //E get(int index) 根据索引获取对应元素
        System.out.println(list1.get(3));
        System.out.println("list1: " + list1);
        System.out.println("==================================");
        //E set(int index,E element) 指定索引位置修改元素
        System.out.println(list1.set(3, "orange"));
        System.out.println("list1: " + list1);
        System.out.println("==================================");
        //ListIterator listIterator()
        ListIterator listIterator = list1.listIterator();
        //从前向后取
        while (listIterator.hasNext()){
            System.out.println(listIterator.next());
        }
        System.out.println("==================================");
        //从后向前取
        //注意:一个集合迭代器只有一个游标,要想倒着遍历,必须先正着遍历一遍,所以该方法用的较少
        while (listIterator.hasPrevious()){
            System.out.println(listIterator.previous());
        }




    }
}

问题:

/*
    需求:遍历集合,当遇到mango的时候,向集合中添加一个元素"java"

    我们发现如果使用迭代器遍历,集合发生修改的话,报错了
    ConcurrentModificationException

 */
public class ListDemo2 {
    public static void main(String[] args) {
        List list1 = new ArrayList();

        list1.add("hello");
        list1.add("apple");
        list1.add("banana");
        list1.add("watermelon");
        list1.add("mango");
        list1.add("peach");
        list1.add("pear");

        System.out.println("list1: " + list1);
        System.out.println("======================================");
        //1、转数组遍历
//        Object[] objects = list1.toArray();
//        for(int i=0;i<objects.length;i++){
//            Object obj = objects[i];
//            String s = (String) obj;
//            if("mango".equals(s)){
//                list1.add("java");
//            }
//        }
//        System.out.println("list1: "+list1);
//        System.out.println("======================================");

        //2、使用迭代器遍历
//        Iterator iterator = list1.iterator();
//        while (iterator.hasNext()){
//            Object obj = iterator.next();
//            String s = (String) obj;
//            if("mango".equals(s)){
//               list1.add("java");
//            }
//        }
//        System.out.println("list1: "+list1);

        //使用List集合中特有的迭代器进行遍历比较,且使用它进行添加元素
        ListIterator listIterator = list1.listIterator();
        while (listIterator.hasNext()) {
            Object obj = listIterator.next();
            String s = (String) obj;
            if ("mango".equals(s)) {
                listIterator.add("java");
            }
        }
        System.out.println("list1: " + list1);


    }
}

ArrayList迭代器源码

public interface List extends Collection{}

class ArrayList implements List{
    public Iterator<E> iterator() {
        return new Itr();
    }

    private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        Itr() {}

        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();

            try {
                ArrayList.this.remove(lastRet);
                cursor = lastRet;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }

        @Override
        @SuppressWarnings("unchecked")
        public void forEachRemaining(Consumer<? super E> consumer) {
            Objects.requireNonNull(consumer);
            final int size = ArrayList.this.size;
            int i = cursor;
            if (i >= size) {
                return;
            }
            final Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length) {
                throw new ConcurrentModificationException();
            }
            while (i != size && modCount == expectedModCount) {
                consumer.accept((E) elementData[i++]);
            }
            // update once at end of iteration to reduce heap write traffic
            cursor = i;
            lastRet = i - 1;
            checkForComodification();
        }

        final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
    }

}

标签:Java,System,集合,add,初学,day12,println,c1,out
From: https://www.cnblogs.com/qianzhiqiang798/p/18470581

相关文章

  • Java基础之源
    目录JDK、JRE和JVM有何区别?Java的跨平台原理是什么?描述一下JVM加载class文件的原理机制?Java有什么核心优势让其成为世界上最流行的编程语言之一?编译和执行Java程序的命令是什么?JDK、JRE和JVM有何区别?JDK包含JRE,比JRE多了开发和调试的工具,比如把Java文件编译成class文......
  • 《深入理解Java异常处理:理论与实践》
    《深入理解Java异常处理:理论与实践》引言在Java编程中,异常处理是一个非常重要的概念。它帮助开发者构建健壮、可靠的程序。本文将详细介绍Java中的异常处理机制,包括异常类的层次结构、如何捕获和处理异常,以及在编程实践中的一些最佳实践。目录异常处理的基本概念Java异常类......
  • Javascript算法——二分查找
    1.数组1.1二分查找1.搜索索引开闭matters!!![left,right]与[left,right)/***@param{number[]}nums*@param{number}target*@return{number}*/varsearch=function(nums,target){letleft=0;letright=nums.length-1;//[left,right],相等时......
  • java基础(6)抽象类和接口
    目录​编辑1.前言2.正文2.1抽象类2.1.1抽象类的概念2.1.2抽象类的语法2.1.3抽象类的特点2.1.4抽象类的作用2.2接口2.2.1接口的概念2.2.2接口的用法2.2.3接口的特点2.2.4实现多个接口2.2.5接口间的继承 2.2.6抽象类和接口的区别3.小结1.前言哈喽大家好吖,......
  • Java基础语法-运算符
    运算符Java语言支持如下运算符:算术运算符:+,-,,/,%,++,--赋值运算符:=关系运算符:>,<,>=,<=,==,!=instanceof逻辑运算符:&&,||,!位运算符:&,|,^,~,>>,<<,>>>(了解!!!)条件运算符:?:扩展赋值运算符:+=,-=,*=,/=//二元运算符inta=10;intb=20;intc=25;intd......
  • 前端开发 --JavaScript
    前言html种script主要包括内联script和引用外部JavaScript文件两张方式1.内联script的用法内联script指的是将JavaScript代码直接写在html文档中某个部位<!--内嵌--><script>alert(1)</script><script>windowonload=function(){vara......
  • JAVA入门必备知识点!!你入门了吗?
    目录技术能力考核——答案一、缓存中间件(一)理论部分请简述你熟悉的一种缓存中间件(如Redis)的底层数据结构,并举例说明其在实际应用中的优势。解释缓存穿透、缓存击穿和缓存雪崩的概念,并分别阐述应对这些问题的策略。在分布式系统中,如何保证缓存与数据库的数据一致性?请列......
  • java,awt,中文方框,中文乱码10/16
    今天,在学习图形化界面时,出现中文乱码。经过多种方法,总结1.在IDEA的顶部菜单栏中,选择“Run”(运行)选项。2.在下拉菜单中选择“EditConfigurations”(编辑配置)选项。3.在构建与运行中点修改选项4.添加虚拟机选项5.设置为-Dfile.encoding=gbk在重新运行就可以了。但是一开始,......
  • java_day12_Collection、List
    CollectionCollection【接口】:我们通过帮助文档发现,Collection是一个接口,不能直接new对象根据元素是否可以发生重复,继续分类-List【接口】元素可以发生重复,且有索引的概念ArrayList-Set【接口】元素不可以发生重复,没有索引借助ArrayList子类对......
  • <Leetcode:算法题及解析>最大子数组和(Javascript版)
    题目描述:给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。本题可以使用Kadane's算法实现,这是一种用于解决最大子数组和问题的高效算法。它由JosephBornKadane在1984年提出。这个算法的核......