Java容器类型以及使用方法(1)

简介: Java容器类型以及使用方法(1)

前言

我们知道Java容器一节有很多类或者接口

本文先浅谈一下Collection集合的使用方法以及细节处理


一、Collection是什么?

Collection是属于容器Iterable的一种,与Map平级,下设分两种类型 ,Set和List接口,集合只要是分两组(单列集合,双列集合),Set和List接口是实现子类的单列集合,Collection作为容器,可以存放任何类的元素(在没有使用泛型的情况下),可以同时加进去int ,Double,String等类型,行为方式比数组更加方便灵活,不需要设定空间大小,这一点很重要,也就是说可以存放任意数量的元素(理论上)

/*

Iterable<-Collection

作为接口指向Collection  有Set和List连接Collection接口

Collection<--Set  和Collection<--List

Set下设TreeSet和HashSet  指向接口Set

Set<--TreeSet   和  Set<--HashSet



List  下设接口Vector 和ArrayLinkedList和ArrayList

List <--Vector

List <--ArrayLinkedList

List <--ArrayList

*/

二、Collection的使用方法以及性质

1.性质

//1.Collection实现子类可以存放多个元素,每个元素可以是Object

//2.有些Collection的实现类,可以存放重复的元素,有些是不可以 的

//3.有些Collection的实现类,有些是有序 的(List),有些不是有序(Set)

//4.Collection接口没有直接实现的子类,是通过它的子接口Set和List来实现


2.Collection的常用使用方法

//Collection的常用方法
        //1.add  添加
        List list = new ArrayList();
        list.add("添加方法: add()");//添加单个元素
        list.add(10);//相当于collection.add(new Integer (10));
        list.add(true);
        System.out.println(list);//[添加方法: add(), 10, true]
        //2.list.remove(0);//删除第一个元素
        list.remove(true);//删除指定对象
        System.out.println(list);//
        //3.contains:查找指定元素是否存在
        System.out.println(list.contains(10));//true
        //4.isEmpty 判断是否为空
        System.out.println(list.isEmpty());//false
        //5.clear  清空  清空对象中所有的元素
        list.clear();
        System.out.println(list);//打印为:[]
        //6.addAll  添加多个元素  list.addAll(Collection e) 表示添加的是一个集合内容,所以为添加多个元素
        ArrayList arrayList=new ArrayList();//list中的元素已经使用clear清空
        arrayList.add("红楼梦");
        arrayList.add("三国演义");
        list.addAll(arrayList);
        System.out.println(list);//输出为: [红楼梦, 三国演义]
        //7.containsAll 你查看多个元素是否存在 list.containsAll(Collection e)  判断list中是否存在Collection e的多个元素
        System.out.println(list.containsAll(arrayList));//true
        //8.removeAll  同时删除多个元素   list.removeAll (Collection e),删除list中
       list.add("西游记");
       list.removeAll(arrayList);
        System.out.println(list);//[西游记]

3.Collection遍历方法

1)  增强for方法  ,这个方法是在这三种方法中最为简便的一种方法,执行起来只需要三行代码

如:for(Object book:col)  其中book是任意起名的,相当于 Object book=(Object)col;意思为,讲Collection中的元素col向上转型给Object的对象book,然后进行遍历

public static void main(String[] args) {
        Collection col = new ArrayList();
        col.add(new Book("红楼梦", "曹雪芹", 50.0));
        col.add(new Book("西游记", "曹吴承恩", 100));
        col.add(new Book("三国演义", "罗贯中", 120.0));
        col.add("mark");
        //使用增强for循环   底层也是用迭代器  可以理解为简化版的迭代器
        for(Object book:col){
            System.out.println(book);
        }
       //增强for也可以直接在数组使用
        int[]num={1,2,3,4};
        for (int i:num){          //int 为数组类型  ,i自定义的名字,num对应的数组名
            System.out.println("i="+i);
        }
       //快捷键  I  直接回车
    }

2) 迭代器遍历

List list=new ArrayList();
        list.add(new Dog("xiaohuang", 12));
        list.add(new Dog("xaiolan", 10));
        list.add(new Dog("xiaohong", 8));
        list.add("xiaoming");
        Iterator iterator=list.iterator();
        //迭代器遍历方法
        while(iterator.hasNext()){
            Object obj=iterator.next();//进入iterator的运行类型Dog
            System.out.println(obj);
        }

3)普通for遍历

//普通for方法
        for (int i = 0; i <list.size() ; i++) {
            System.out.println(list.get(i));
        }

4.Collections工具类常用方法

主要是用于排序和正删改查

1.排序有sort方法  由COllections.sort(容器名)得到的是正常字典顺序的排序,就是数字升序,字母是按照字母表升序,如果第一个字母相同根据sort内部的Comparable接口的CompareTo方法进行排序。

2.可以选择自定义排序方法

如  :    其中new Comparator是接口,在里面重写自己的方法Compare方法传入两个形参 Object类进行比较,在Compare方法中自定义比较形式

Collections.sort(list, new Comparator() {


   @Override

   public int compare(Object o1, Object o2) {

       return ((String) o1).length() - ((String) o2).length();

   }//根据字符串大小进行排序

});

public class CollectionSetting {
    public static void main(String[] args) {
        //Collections  工具类
        //1.
        //创建 ArrayList  集合 用于测试
        List list = new ArrayList();
        list.add("tome");
        list.add("micker");
        list.add("why");
        list.add("wjq");
        list.add("wjq");
        System.out.println(list);
        //reverse(List) :反转List中的元素顺序
        Collections.reverse(list);
        System.out.println("list: " + list);
        //shuffle(list) :对list集合元素进行随机排序
        for (int i = 0; i < 5; i++) {
            Collections.shuffle(list);
            System.out.println("第" + i + "次:  " + list);
        }
        //sort(List):根据元素的自然顺序对指定List集合元素按升序排序
        Collections.sort(list);
        System.out.println("自然排序后...");
        System.out.println("list: " + list);
        //sort(List,Comparator)  :根据指定的Comparator进行比较
        //传入一个比较器
        //List 允许重复  如果长度相同或者字符串相同(根据比较器来) 也可以放进去 ,但是对于Set来说不允许重复 不能放进去
        Collections.sort(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String) o1).length() - ((String) o2).length();
            }//根据字符串大小进行排序
        });
        System.out.println("list根据字符串大小进行排序: " + list);
        //swap(List,int,int)  //将指定位置的List集合中的i 和j进行交换
        //如果int越界  会抛出异常
        /**
         * 第二组  查找
         */
        //Object max(Collection) :根据元素的自然顺序,返回给定集合中的最大元素
        System.out.println("自然排序的最大元素:" + Collections.max(list));
        //max(Collection,Comparator):根据比较器需求得到排序之后的最大值
        Object max = Collections.max(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String) o1).length() - ((String) o2).length();
            }
        });
        System.out.println("比较长度之后的list:" + max);
        //Object min  与上面的  max一样
        //int frequency(Collection Object) :返回指定集合中的指定元素出现的次数
        System.out.println("容器中出现指定元素的次数"+Collections.frequency(list, "wjq"));
        //void copy(List dest,List src)  :将后面的容器copy给前面的容器
        //不能直接将后面的容器copy给前面的空容器   会抛出异常
//        ArrayList list1=new ArrayList();
//        Collections.copy(list1, list);//IndexOutOfBoundsException: Source does not fit in dest
//        System.out.println(list1);
     //要先进行对于空容器添加元素  最少与copy对象的元素个数相同
        ArrayList list1=new ArrayList();
        for (int i = 0; i <list.size() ; i++) {
            list1.add(" "+i);
        }
        Collections.copy(list1, list);
        System.out.println("copy赋值之后的新容器list1: "+list1);
        //boolean replaceAll(List list,Object oldVal,Object newVal) :使用新值来替换list容器中的旧值
        Collections.replaceAll(list, "why", "王红岩");
        System.out.println(list);
    }
    //max(Collection,Comparator):根据比较器需求得到排序之后的最大值
}
class A{
    int age1;//10
    public A(int age) {
        this.age1=age;//10   10
    }
//    void add(){
//        System.out.println(age1);//10
//    }
}
class B extends A{
    public B(int age) {
        super(age);
    }
//    public B(int age) {
//        super(age);
//        age1
//    }
}

5.Set和List的比较

1.List可以存放null ,而且容许元素重复,对于重复加入的(add)的元素都可以进入数组中,List集合类中的怨怒是是有序的(填入和储存顺序是一致的)

2.Set方法和List大部分方法是一致的,使用起来只有个别不同,但是Set有一下特性

//set的接口实现类的对象(Set接口对象),不能存放重复的元素,可以添加一个null
        //存放数据是无序的(添加的顺序和取出的顺序不一致)
        //存放数据顺序有底层算法,数组加链表的形式
        //虽然取出的数据顺序不是添加的顺序,但是它固定数据的顺序,不会改变
        //
public static void main(String[] args) {
        //List集合类中的元素是有序的(添加顺序和储存顺序一致),且可重复
        List list = new ArrayList();
        list.add("jack");
        list.add("tom");
        list.add("tom");//可以重复
        //对于运用到index索引的方法,index一定是在数组或者容器中有对应元素的,即不会索引越界OutIndexException
        //List有很多实现类,常用的为Vector ArrayList  LinkedList
        System.out.println(list);//[jack, tom, tom]
}

6.List的常用方法

Set的常用方法与List的常用方法类似,只有个别不同

public static void main(String[] args) {
        //List集合类中的元素是有序的(添加顺序和储存顺序一致),且可重复
        List list = new ArrayList();
        list.add("jack");
        list.add("tom");
        list.add("tom");//可以重复
        //对于运用到index索引的方法,index一定是在数组或者容器中有对应元素的,即不会索引越界OutIndexException
        //List有很多实现类,常用的为Vector ArrayList  LinkedList
        System.out.println(list);//[jack, tom, tom]
        //list支持索引,每一个元素都有对应的顺序索引,可以通过索引找到元素进行加减
        //索引从0开始
        list.remove(1);//删除索引为1的元素
        System.out.println(list);//[jack, tom]
        //1.add方法
        //add(int index,Object s):在index的位置上插入s元素
        list.add(1, "王红岩");
        System.out.println(list);//[jack, 王红岩, tom],插入到相应位置,原来元素整体后移
        //2.addAll(int index,Collection c)   在index的位置,插入集合中的元素
        List list1 = new ArrayList();
        list1.add("小明");
        list1.add("小王");
        list.addAll(1, list1);//讲list1的元素  小明小王加入到list的索引为1的位置
        System.out.println(list);//[jack, 小明, 小王, 王红岩, tom]
        //3.remove(int index)消除方法  ,消除指定索引index处的元素
        list.remove(0);
        System.out.println(list);//[小明, 小王, 王红岩, tom]
        //4.set(int index ,Object o)  在index的索引上,讲对应的元素,替换为元素 o
        list.set(3, "小红");
        System.out.println(list);//[小明, 小王, 王红岩, 小红]
        //5.List  subList(int fromIndex,int toIndex)//返回fromIndex 到  toIndex的位置子集合  前闭后开 不包括toIndex
        System.out.println(list.subList(0, 1));//[小明]
        //6.indexOf()  查找list容器中是否有指定元素,或者索引位置有无元素  有返回下标  无返回-1
        System.out.println(list.indexOf(" "));//-1
        //7.lastIndexOf()  查找容器中最后出现指定元素的下标, 有返回下标  无返回-1
        System.out.println(list.lastIndexOf("王红岩"));//2
    }

总结

通过本文,我们知道了,Collection的强大功能,其下设两大接口Set 和List的常用方法以及细则(例如有序和无序等),且对于Collection接口的遍历三大方法做了解释,以List为例,这三种都可成功遍历,最简单的还是增强For遍历,最后是对于Collections工具类的使用,其内接接口以及方法的使用无不显示了Collection的强大能力。

在下一章,我们讲着重讲解List的常用方法细则,List有很多实现类,常用的为Vector ,ArrayList LinkedList 我们讲着重讲解这三个实现类的使用方法,以及特点。

相关文章
|
7天前
|
Java 虚拟化 容器
(Java)Java里JFrame窗体的基本操作(容器布局篇-1)
容器 容器,我的理解是可以包容其他东西的玩意。它可以是一个盒子,可以是一个虚拟化的物品,可只要能包裹住其他存在质体的东西,那么都可以称作是容器。例如:JPanel组件和JScollPane组件两者都是容器也是组件。 既然有容器,那么容器中的布局就必不可少了。不然不规矩的摆放物品,人类看不习惯,我也看不习惯 ???? 本篇内容,将说明java JFrame窗体里容器中几类布局。 说明:所有在JFrame窗体里的容器布局都会使用setLayout()方法,采用的布局参数都将放进这个方法里 绝对布局 调用窗体容器
27 1
|
9天前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
37 7
|
20天前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
2月前
|
安全 算法 Java
Java泛型编程:类型安全与擦除机制
Java泛型详解:从基础语法到类型擦除机制,深入解析通配符与PECS原则,探讨运行时类型获取技巧及最佳实践,助你掌握泛型精髓,写出更安全、灵活的代码。
|
2月前
|
安全 IDE Java
Java记录类型(Record):简化数据载体类
Java记录类型(Record):简化数据载体类
314 120
|
2月前
|
Java 测试技术
Java浮点类型详解:使用与区别
Java中的浮点类型主要包括float和double,它们在内存占用、精度范围和使用场景上有显著差异。float占用4字节,提供约6-7位有效数字;double占用8字节,提供约15-16位有效数字。float适合内存敏感或精度要求不高的场景,而double精度更高,是Java默认的浮点类型,推荐在大多数情况下使用。两者都存在精度限制,不能用于需要精确计算的金融领域。比较浮点数时应使用误差范围或BigDecimal类。科学计算和工程计算通常使用double,而金融计算应使用BigDecimal。
1112 102
|
2月前
|
安全 Java 编译器
Java类型提升与类型转换详解
本文详解Java中的类型提升与类型转换机制,涵盖类型提升规则、自动类型转换(隐式转换)和强制类型转换(显式转换)的使用场景与注意事项。内容包括类型提升在表达式运算中的作用、自动转换的类型兼容性规则,以及强制转换可能引发的数据丢失和运行时错误。同时提供多个代码示例,帮助理解byte、short、char等类型在运算时的自动提升行为,以及浮点数和整型之间的转换技巧。最后总结了类型转换的最佳实践,如避免不必要的转换、使用显式转换提高可读性、金融计算中使用BigDecimal等,帮助开发者写出更安全、高效的Java代码。
152 0
|
4月前
|
缓存 Java API
Java 集合容器实操技巧与案例详解
本教程基于Java 8+新特性和现代开发实践,深入讲解Java集合容器的实操技巧。通过具体场景演示Stream API数据处理、ConcurrentHashMap并发控制、LinkedHashMap实现LRU缓存、TreeSet自定义排序等高级特性。同时涵盖computeIfAbsent优化操作、EnumMap专用集合使用、集合统计与运算(交集、并集、差集)等内容。代码示例丰富,助力掌握高效编程方法。[点击获取完整代码](https://pan.quark.cn/s/14fcf913bae6)。
67 0
|
4月前
|
存储 缓存 安全
Java 集合容器常见面试题及详细解析
本文全面解析Java集合框架,涵盖基础概念、常见接口与类的特点及区别、底层数据结构、线程安全等内容。通过实例讲解List(如ArrayList、LinkedList)、Set(如HashSet、TreeSet)、Map(如HashMap、TreeMap)等核心组件,帮助读者深入理解集合容器的使用场景与性能优化。适合准备面试或提升开发技能的开发者阅读。
76 0