创建容器向上转型为接口的时候,有时候,并不是一定可行的,因为有的实现类,在接口的基础添加了自己的方法;比如:List 接口下面的 LinkedList 自己定义了一些方法 ;


Arrays.asList() 返回值,内部其实是一个 数组;因此,我们不能对其进行 add 、delete 操作。因为这些操作,会改变数组的尺寸,而数组大小是固定的 ;

 List<A1> list = Arrays.asList(new C1(),new A1(),new B1()) ;
// 编译时不会产生任何警告,但是我们运行就会得到一个异常:不支持的操作 ;
list.add(new A1());

在定义 List 的时候,可以使用 Arrays.asList() 的返回值为其赋值;但是在赋值的时候,返回值类型,是根据参数的类型来的,这里会引起问题的;

即使几个参数是一个 继承体系 中的;

如果参数类型和泛型不一致的话,会报错;但是只要有一个参数与泛型匹配,那么就不会再报错 ;

// 类的继承关系
class A1 {} class B1 extends A1{} class C1 extends B1 {} -------------------------------
// error ,因为泛型要求是 A1,但是参数中没有这样 A1类型
List<A1> list = Arrays.asList(new C1(),new B1()) ;
// oK ,只要一个继承体系中,有一个参数是泛型类型,就OK
List<A1> list = Arrays.asList(new C1(),new B1(),new A1()) ;

上面的代码,我们可以看出,很不好,必须要有泛型类型的参数才行,只有其子类,都会报错;

因此我们需要给 Arrays.asList() 提供一个线索 :Arrays.<泛型>asList() ,这样 Arrays.asList() 就会自动的返回泛型指定的类型,而不是去根据参数来返回具体的类型 ;

List<A1> list = Arrays.<A1>asList(new C1(),new B1()) ;

当然我们也可以用 Collections.addAll();会根据第一个参数类型,直接推导出应该返回的类型 ;

List<A1> list = new ArrayList<>();
Collections.addAll(list,new C1(),new B1());

存储元素:

HashSet HashMap 乱序

TreeSet TreeMap 默认按照自然顺序,我们可以自己传入比较器

LinkedHashSet LinkedHashMap 按照插入顺序

List 中的 remove(xx)removeAll(xx)indexOf(xx)等操作,都用到元素的 equals()方法;因为他们都要判断参数是否在容器里面,这个判断,就需要用到 equals()方法;

当然上述方法,都有自己的重载版,直接操控角标,那么则用不到 equals()方法 ;

List 可以在中间插入元素的;想到 List 下面的小弟 LinkedLsitArrayList 就应该不会对其可在中间插入元素的能力感到怀疑 ;


collectionsAll(a,b,c); 对参数的顺序是不关心的 ;

     List<A1> list = new ArrayList<>();
list.add(new B1());
C1 c1 = new C1();
C1 c2 = new C1();
B1 b1 = new B1();
Collections.addAll(list,b1,c1,c2);
// 对参数的顺序是不做要求的
List<A1> a1List = Arrays.<A1>asList(c2,c1,b1);
// 输出 true
System.out.println(list.containsAll(a1List));

a.retainAll(b) 查交集 ;


迭代器(Iterator)的出现,统一了对容器的遍历操作;

因为,迭代器的方法:haveNext()next() ;根本就没有出现对具体容器操作的代码;后期即使改变了容器,迭代器的代码也不用改变 ;

Iterator 迭代器,只能 单向遍历,但是可以遍历任意容器;

ListIterator 只能遍历 List 集合;但是可以 双向遍历,也可以从任何一个位置开始遍历;还可以返回当前位置的前一个、后一个位置的索引 ;


SetCollection 具有一样的接口,不像 List 那样,自己添加了一些方法 ;

HashSet 维护着一个散列函数,该散列函数决定了元素的次序;

TreeSet 里面维护着红黑树;


Collection 接口 AND Iterator 方法

Collection 接口中有许多方法,假如我们要实现这个接口,那么我们将要实现一大堆方法,尽管其中有些方法,我们并不想用;

官方也考虑到这个问题,因此,官方给出来一个 Collection 接口的直接抽象子类 AbstractCollection ,这样我们就只需要实现 两个方法 iterator() 、size() 即可 ;

class D1 extends AbstractCollection{

    @Override
public Iterator iterator() {
return null;
} @Override
public int size() {
return 0;
}
}

foreach 增强for循环

只对 数组 和 实现了 Iterator 接口,起作用 ;但是并不是 数组Iterator 类型 ;


Arrays.asList(c2,c1,b1) 返回值底层是一个数组,对返回值的操作,将直接影响到原数组 ;因此,一次操作是不允许的,比如 add(()、remove()等方法 ;

如果对返回值进行操作,那么同样影响到原数组 ;

    Integer[] integer = {1,22,33,4,56,21};
List<Integer> a1List = Arrays.asList(integer);
a1List.set(0,12) ;
// 输出的是 12 而不是 1 ;
System.out.println(integer[0]);

如果实在需要操作,可以将返回值转成一个真正的 List 类型 ;

     List<A1> a1List = Arrays.<A1>asList(c2, c1, b1);
List<A1> a1List1 = new ArrayList<>(a1List);
// 添加元素
a1List1.add(new A1()) ;
// 改变元素组。。

java 中的容器(札记)的更多相关文章

  1. java中的容器问题

    小小的总结一下java中的容器问题. 一.三个知识点 1.迭代器 1).java.util.Interator + hasnext(); next(); remove(); 2).java.lang. ...

  2. Java中的容器(集合)之ArrayList源码解析

    1.ArrayList源码解析 源码解析: 如下源码来自JDK8(如需查看ArrayList扩容源码解析请跳转至<Java中的容器(集合)>第十条):. package java.util ...

  3. Java中的容器(集合)之HashMap源码解析

    1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是 ...

  4. (转)Java中的容器详细总结

    Java中的容器详细总结(编辑中) 原文链接:http://anxpp.com/index.php/archives/656/ 注:本文基于 Jdk1.8 编写 通常程序总是根据运行时才知道的某些条件 ...

  5. [转] Java中的容器

    在书写程序的时候,我们常常需要对大量的对象引用进行管理.为了实现有效的归类管理,我们常常将同类的引用放置在同一数据容器中. 由于数据容器中存放了我们随时可能需要使用到的对象引用,所以一般的数据容器要都 ...

  6. java中Collection容器

    1.容器(Collection)也称为集合, 在java中就是指对象的集合. 容器里存放的都只能是对象. 实际上是存放对象的指针(头部地址): 这里对于八种基本数据类型,在集合中实际存的是对应的包装类 ...

  7. Java中的容器和注入分析

    为什么会出现容器的注入? 容器:顾名思义,装东西的器物. 至于spring中bean,aop,ioc等一些都只是实现的方式:具体容器哪些值得我们借鉴,我个人觉得是封装的思想.将你一个独立的系统功能放到 ...

  8. java中的容器解释

    解释一:容器(Container)Spring 提供容器功能,容器可以管理对象的生命周期.对象与对象之间的依赖关系,您可以使用一个配置文件(通常是XML),在上面定义好对象的名称.如何产生(Proto ...

  9. Java中的容器(集合)

    1.Java常用容器:List,Set,Map List: 继承了Collection接口(public interface List<E> extends Collection<E ...

随机推荐

  1. JavaEE三层架构与MVC

    JavaEE三层架构与MVC 摘要与总结 等下总结下 MVC模式 Model1 ​ 说到设计模式,不得不提一下之前的的Model1.据说早期对于java企业项目的开发,用的是Jsp+JavaBean的 ...

  2. Java基础系列 - 子类继承父类,调用父类的构造函数

    package com.test7; public class test7 { public static void main(String[] args) { Son son = new Son(1 ...

  3. hadoop3.1.1:找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster

    yarn执行MapReduce任务时,找不到主类导致的 解决: 1.在命令行输入:hadoop classpath [hadoop@localhost ~]$ hadoop classpath /da ...

  4. [PKUSC2018]真实排名——线段树+组合数

    题目链接: [PKUSC2018]真实排名 对于每个数$val$分两种情况讨论: 1.当$val$不翻倍时,那么可以翻倍的是权值比$\frac{val-1}{2}$小的和大于等于$val$的. 2.当 ...

  5. ICEM-一种三维Y型网格

    ​原视频下载地址:https://yunpan.cn/cLHD9ewat8v9a  访问密码 0f0f

  6. 2018-2019-2 网络对抗技术 20165202 Exp9 Web安全基础

    博客目录 一.实践内容 跨站脚本攻击XSS 跨站请求伪造CSRF SQL注入攻击 二.实验中遇到的问题及解决 三.基础问题回答 四.实验总结 一.实践内容 本实践的目标理解常用网络攻击技术的基本原理. ...

  7. this和super的用法

    this关键字的使用: 1.成员变量和局部变量重名时,在方法中调用成员变量,需要使用this.调用. 2.把这个类自己的实例化对象当做参数进行传递时,使用this. 3.内部类中,调用外部类的方法或变 ...

  8. Vue学习手记04-跨域问题

    01-安装axios,指令(npm install --save axios)02-解决跨域问题 在config=>中创建一个新的文件proxyConfig.js module.exports ...

  9. uboot移植spi驱动

    记录一下在uboot内移植spi驱动的过程 芯片:freescale Mpc8308 uboot版本:u-boot-2009.11-rc1.2 需求:我们需要在uboot下通过spi配置一个时钟芯片( ...

  10. usb 设备 复位

    How to Reset USB Device in Linux by ROMAN10 on MAY 4, 2011 · 9 COMMENTS   USB devices are anywhere n ...