初识集合和泛型

author author     2022-09-05     322

关键词:

package com.oracle.Test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
 * 问题: 你们怎么理解集合这个词.
 * 答: 通常指容器.用来装载n个数据.
 * 
 * 问题: 集合中能放的元素类型
 * 答: Java设计人员.设计Java中的集合时.是希望这个集合可以放下所有类型的数据.
 * Java中有一个类是所有类的父类.Object.按照继承和多态的理念.放Object可以代表
 * 所有类型的数据.那么放入没有问题.但是再取出时要由大转小.需要强转.那么这就会
 * 遇到一个问题.ClassCastException(类型转换异常.)这个异常是在引用数据类型
 * 大转小时.很容易产生的.如果想避免这个问题.需要使用instanceof 或者对象.getClass
 * ==类.class 来验证数据类型是否匹配.(判断对象属不属于某个类型)
 * 
 * JDK在1.5的时候借鉴C++中模版这一概念在Java中引入了泛型.
 * 
 * 问题:什么是泛型
 * 答: 简单说就是类型参数化.要求一个容器中保存的数据类型是一致的.写法是
 * 容器<T>  T代表这个容器要保存的数据类型.
 * 
 * 总结:Java中的所有括号
 * 1. {  } 代表各种作用域. 类体 方法体 循环体 判断体 
 *             静态域    代码块
 * 2. (  ) 遇到小括号代表方法.
 * 3. [  ] 数组
 * 4. <  > 泛型
 * 
 * 泛型可以写成泛型类 : 在类名后<T>  T语法上可以被其它
 *             英文替换.我们习惯都使用T
 * 泛型可以写泛型变量
 *             T t;  是跟随泛型类的
 * 泛型可以写泛型方法.有两个地方可以写泛型
 *         1.参数  也是和泛型类挂钩的.
 *         2.返回值 
 * 
 *     public <T>void method(){
 *     }
 *     
 * 
 * 泛型的使用注意点:
 *     1.泛型的尖括号内只支持引用数据类型.如果想放
 *         源生数据类型,需要使用对应的包装类.
 * 
 *     2.不推荐使用泛型类.C++中模版是可以被继承的.但是
 * Java中泛型是可擦除的.即在父类中设计了泛型.子类在继承时
 * 如果没有显示的提供泛型.父类的泛型可以被不继承.如果
 * 一定要使用泛型类那么在遇到继承时要在子类中提供一个构造
 * 方法(带有泛型的).强制要求子类继承父类的泛型.
 * 目前泛型依然可以使用的是泛型方法.  
 * 
 * 
 * 集合:
 *     1.集合是可变长度,因此在声明时不需要像数组那样指明长度
 *     2.集合产看长度用的size()方法.获取的是集合中元素的个数.
 * 
 * 补充:
 * 1.接口和接口之间只有继承关系.因为实现一个接口要把接口中所有
 * 抽象内容具体化.而接口本身只能提供声明.
 * 
 * 2.接口可以继承多个接口.而class(类)只能单继承.所以Java被叫做
 * 单继承,多实现.
 * 
 * 3.接口是对外的.所有接口中不可以有私有内容.
 * 
 * 
 * 
 * 
 */
public class Test {
    //Ctrl + Shift + T  Open Type
    
    
    public static void main(String[] args) {
        
        /*
         * SRP  职责单一  方法
         * LSP  里氏替换   继承
         * OCP  开闭原则  抽象类
         * DIP  迪米特方法则 .依赖倒置原则  - 面向接口编程
         * ISP  接口职责单一 
         * 
         * 这里的警告是因为Collection接口上有泛型..编译器会
         * 检查类型因此.因此需要提供
         * 
         * 在JDK1.8之前使用泛型时前后两边都要写
         * 在JDK1.8以后可以省略后面的泛型.
         * 
         *
         */
        Collection<String/*只要是引用数据类型都行*/> list = new ArrayList<String>();
        
        //--注意size是方法
        System.out.println(list.size());    //0
        
        System.out.println(list.isEmpty());  //true
        
        /*
         *通过add方法向集合中添加元素.当集合因为调用该方法
         *而发生改变时会返回true.其它情况返回false
         */
        System.out.println(list.add("Hello")+" 变化1");
            //list =    list.add("World");   这是错误的,因为 list.add("World")的返回值是boolean型
        System.out.println(list.add("World")+" 变化2");    
        //list.add("World");
        //--以下代码是否会产生死循环.是否会产生异常.会产生什么异常.
        /*for(int i = 0 ;i < list.size() ;i ++){
            list.add(i+"");
        }*/    //  不是死循环,但会产生异常  int类型最大值是会产生异常
        
        //--判断是否包含指定的对象.参数是对象.
        System.out.println(list.contains("Hello")+"包含指定对象1");
        System.out.println(list.contains("World")+"包含指定对象2");
        
        //--需要注意的是.这里的返回值是Object[] 不可以转变成
        //--其它类型..如果转换会产生ClassCastException
        Object[] array = list.toArray();
        
        for (Object object : array) {
            System.out.println (object+" ");
        }                              //输出         Hello World         
        System.out.println(list.remove("World") );            //输出    true
        System.out.println(list.size());                //输出   1
        
        Collection<String> other = new ArrayList<>();
        other.add("World");
        //--不会覆盖之前的..ArrayList是允许有重复元素的.
        other.add("Hello");
        other.add("!");
        
        list.addAll(other);
        
        System.out.println(list.size());   //输出   4
        
        for (String string : list) {
            System.out.println(string);
        }
        
        list.remove("!");
        list.add("ABC");
        list.add("DEF");
        list.add("!");
        
        
        /*
         * list : Hello World Hello !
         * other : World Hello !
         * 
         * 判断是否包含全部元素.这个比较和顺序无关.
         * 
         */
        System.out.println(list.containsAll(other));   //输出   true
        
    }
    
    //-- 自己写判断包含全部的原型
    public static boolean isContainsAll(Collection c1,Collection c2){
        boolean result = true;
        //--1.参数检查
        //--2.确定谁大谁下
        if(c1.size() >= c2.size()){
            //--2.对第一个集合进行遍历
            for (Object obj : c2) {
                //--将每一个元素在c2中判断是否包含
                if(c1.contains(obj)){
                    result = true;
                    continue;
                }else{
                    result = false;
                    break;
                }
            }
        }
        return result;
    }
    
    
    
    /** 
     * 想把c2中的内容都加到c1中.
     * @param c1
     * @param c2
     */
    public void addAll(Collection<String> c1,Collection<String> c2){        
        //--1.检查参数        
        //--2.遍历C2.利用迭代器对集合进行遍历.
        Iterator<String> iter = c2.iterator();
        //--3.利用迭代器中已有API来判断是否有下一个元素
        while(iter.hasNext()){    //hasNext()  如果仍有元素可以迭代则返回true,其他返回false.
            //--4.通过迭代器取值
            String temp = iter.next();//--返回值的类型会根据泛型自动改变      next() 返回迭代的下一个元素
            c1.add(temp);
        }
    }
    
}

 

 

泛型和泛型集合

 泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.UI;usingSystem.Web.UI.WebCon... 查看详情

c#中的泛型和泛型集合

...,保护类型的安全及提高性能,他的最常见应用就是创建集合类,可以约束集合类中的元素类型。比较典型的泛型集合是List<T>和Dictionary<>;泛型集合List<T>语法List<T>对象名=newList<T> 查看详情

java集合框架和泛型

---恢复内容开始---  集合:用来存储多个元素数组和集合区别:  数组的长度是固定的;集合的长度是可变的  数组存储的类型是同一类,可以存储基本数据类型;集合存储的都是对象,对象类型可以不一致 java集合... 查看详情

java示例代码_将集合和泛型与通配符一起使用

java示例代码_将集合和泛型与通配符一起使用 查看详情

[java]java集合(setlistmap)和泛型

一、集合1.集合体系图Set集合体系图List集合体系图Map集合体系图2.Collection接口方法Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的//只要是Collection接口的实现类都可以做实参booleanaddAll(Collection<?extendsE&... 查看详情

集合和泛型(代码片段)

目录1.1集合框架1.1.1为什么要使用集合框架1.1.2单值集合的顶层接口:Collection家族1.1.3键值映射集合的顶层接口:Map家族1.2Set接口1.2.1HashSet类的使用1.2.2HashSet类无重复特性体现总结: 1.2.3TreeSet类的使用1.2.3.1使用TreeSet... 查看详情

集合和泛型(代码片段)

目录1.1集合框架1.1.1为什么要使用集合框架1.1.2单值集合的顶层接口:Collection家族1.1.3键值映射集合的顶层接口:Map家族1.2Set接口1.2.1HashSet类的使用1.2.2HashSet类无重复特性体现总结: 1.2.3TreeSet类的使用1.2.3.1使用TreeSet... 查看详情

java集合框架和泛型

java的集合类有四个接口:collection、map、list、set。实现四个接口的六个实现类:ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeSet。 collection:存储一组不唯一,无序的对象List:继承collection接口,存储一组不唯一,有序的对象S... 查看详情

ProGuard 混淆、java、Google Gson 和泛型集合——如何留住成员?

】ProGuard混淆、java、GoogleGson和泛型集合——如何留住成员?【英文标题】:ProGuardobfuscation,java,GoogleGsonandgenericcollections-howtokeepmembers?【发布时间】:2012-02-0607:55:30【问题描述】:我有这样的课:publicclassMyClassprivateQueue<MyOtherClas... 查看详情

java之collection集合常见数据结构list和泛型

目录​​集合概述​​​​总结​​​​Collection集合的体系特点​​​​总结​​​​Collection集合常用API​​​​Collection集合的遍历方式​​​​方式一:迭代器​​​​总结​​​​方式二:foreach/增强for循环​​​​方式... 查看详情

普通集合和泛型集合的区别,哈希表和字典表的区别,队列和堆栈的区别以及堆和栈的区别。

普通集合和泛型集合的区别:泛型集合与传统集合相比类型更安全. 泛型集合无需装箱拆箱操作.泛型的重要性.泛型是未来五年的主流技术...通常情况下,建议您使用泛型集合,因为这样可以获得类型安全的直接优点而不需要... 查看详情

c#中arraylist和泛型集合list方法概述概述

首先,ArrayList集合和List都是非静态类,使用时都必须先实列化。ArrayList类似一个数组,但比数组优越的是它的长度大小可变,并且可以存放不同类型的变量,包括值类型和引用类型。常用方法如下:1、Add():方法用于添加一个元... 查看详情

java高级特性第1节集合框架和泛型

...方便的接口和类,他们都位于java.util包中。一、Java中的集合 查看详情

java基础第十二篇之集合增强for循环迭代器和泛型

...ection接口中的常用方法:* 所有的子类子接口都是具有的*集合的方法:增删改查** publicbooleanadd(Ee);//添加元素返回值表示是否添加成功* publicbooleanremove(Objecto);//删除元素,返回值表示是否删除成功* 没有修改方法* 查询元素的方法... 查看详情

链表和泛型

链表属于集合的一部分,泛型指的是多种数据类型,链表可以接收多种数据类型。package*;importjava.util.ArrayList;publicclassLiu{ publicstaticvoidmain(String[]args){ Stringstr="1,3,5,0,7,0,12,9,2,0,0,0,0,0,0,0,0,0,0,0"; String[]strs=str.spli 查看详情

[java]集合和泛型(代码片段)

一、集合1.集合体系图Set集合体系图List集合体系图Map集合体系图2.Collection接口方法Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的//只要是Collection接口的实现类都可以做实参booleanaddAll(Collection<?extendsE&... 查看详情

集合框架和泛型编程(代码片段)

Java集合框架一组存储对象的容器(动态)常见的集合算法遍历集合添加集合元素删除集合元素查找集合元素集合元素排序JavaSE提供了:Collection接口:存储另一个元素的集合Map接口(图):存储键/值对Collection:操作集合的工具... 查看详情

总结第一章集合框架和泛型

1.Collection表示一组对象,它是集中、收集的意思,就是把一些数据收集起来。2.Collection接口的两个子接口:   1)List中的元素有顺序,可重复。常用的实现类有ArrayList、LinkedList和vector。     ØArrayL... 查看详情