持有对象指的是Java中保存对象的方式,这次我们主要谈论是Java中的容器类。
Java内的容器类可以划分为两种:
①Collection。一个独立的元素序列,这些元素都服从一条或多条规则。常用的有List,Set,Queue,Stack等等。
②Map。一组成对的“键值对”对象,允许我们使用键来查找值。
Collection 接口概括了序列概念,关于List,Set等这些类的基本方法,在平时开发中经常用到对于其包含的基本方法就不一一介绍了,另外值得提一下的是 java.util包中的Arrays和Collections类中包含了很多实用的方法,例如:Arrays.asList()方法接受一个数组,或者 是用都好分隔的元素列表,并将其转换为List对象。
关于Arrays.asList()方法只是对它所产生的List类型做出理想的假设,并不会检测你声明类型,进行转型,通过下面这个例子可以看出这一点:
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; class Snow{} class Powder extends Snow{} class Light extends Powder{} class Heavy extends Powder{} class Crusty extends Snow{} class Slush extends Snow{} public class AsListInference { public static void main(String[] args) { List<Snow> snow1 = Arrays.asList(new Crusty(), new Slush(), new Powder()); // List<Snow> snow2 = Arrays.asList(new Light(), new Heavy()); List<Snow> snow3 = new ArrayList<Snow>(); Collections.addAll(snow3, new Light(), new Heavy()); List<Snow> snow4 = Arrays.<Snow>asList(new Light(), new Heavy()); } }
其中snow2与snow5注释掉了,
snow2报错为:Type mismatch: cannot convert from List<Powder> to List<Snow>
当 试图创建snow2是只有Powder类型,所以会创建List<Powder>而不是List<Snow>,如果 asList()方法参数中含有不同类,则试图生成最上层的基类,或者Object的List。也可以像snow4中,告诉编译器生成Snow类型的 List。
在使用容器类时我们经常使用到迭代器。迭代器是一个对象,它的工作室遍历并选择序列中的对象,而客户端程序员不必知道该序列的底层结构。所以我们可以看出迭代器的真正优势在于:能够将遍历序列的操作与底层序列的结构分离,统一了我们对容器的访问方式。
如果我们编写了一个方法,其接受一个Collection的参数,我们有两种方式(1)通过继承AbstractCollection
public class CollectionSequence extends AbstractCollection<Snow>{ private Snow[] snows = {new Snow(), new Snow(), new Snow()}; public Iterator<Snow> iterator(){ return new Iterator<Snow>() { private int index = 0; @Override public void remove() { throw new UnsupportedOperationException(); } @Override public Snow next() { return snows[index++]; } @Override public boolean hasNext() { return index < snows.length; } }; } @Override public int size() { return snows.length; } }
(2)通过实现collection接口中的方法
class SnowSequence{ protected Snow[] snows = {new Snow(), new Snow(), new Snow()}; } public class NonCollectionSequence extends SnowSequence{ public Iterator<Snow> iterator(){ return new Iterator<Snow>() { private int index = 0; @Override public void remove() { throw new UnsupportedOperationException(); } @Override public Snow next() { return snows[index++]; } @Override public boolean hasNext() { return index < snows.length; } }; } }
可以看出我们可以通过继承AbstractCollection很容易实现,但此时必须强制的实现iterator()和size()方法,而且此时可以 使用foreach结构,如果我们的类已经继承了其他的类就必须通过第二种方式实现了。这里面用到了我们前面提到的匿名内部类。
相关推荐
学习think in java 时的第9章的例题及练习答案。 eclipse 工程包,运行可用!全自己敲的!
学好Java基础、拿高薪offer; java中会存在内存泄漏吗,请简单描述。 会,原因: 如果对象被集合类引用时,如果只是添加,而不删除,会引起内存泄漏,严重时会发出内存溢出。 Java中的内存泄露的情况:长生命周期的...
非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 第7章 复用类 第8章 多态 第9章 接口 第10章 内部类 第11章 持有对象 第12章 通过异常处理错误 第13章 字符串 第...
JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。 sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。 notify():唤醒一个处于等待状态的线程...
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...
复合操作:执行复合操作期间,要持有锁 锁的作用 加锁机制、用锁保护状态、实现共享访问 锁的不恰当使用可能会引起程序性能下降 对象的共享使用策略 线程封闭:线程封闭的对象只能由一个线程...
Java 2集合框架图 集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。 抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。 实现类:8个实现类(实线表示),...
25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................
25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................
字符串类型是Redis中最为基础的数据存储类型 它在Redis中是二进制安全的 这便意味着该类型可以接受任何格式的数据 如JPEG图像数据或Json对象描述信息等 在Redis中字符串类型的Value最多可以容纳的数据长度是512M ...
java版直播间源码 终极 Android Jetpack 参考 什么是 Android Jetpack Android Jetpack 是下一代组件和工具以及旨在加速 Android 开发的架构指南。 主要原因是: 构建高质量、健壮的应用程序 消除样板代码 加速发展 ...
Java高并发高性能分布式框架从无到有微服务架构设计 微服务架构模式〔Microservice Architect Pattern〕....最根本的区别就是,Concur rentMap会持有所有添加的对象,直到被显示的移除.而缓存为了限制其内存的使用,通
Invoker:这是负责调用命令对象执行请求的类,它会持有一个命令对象,并在某个时间点触发命令的执行。调用者作为一个中介,将发起请求的对象和执行请求的对象解耦。 命令模式的优点包括降低系统的耦合度、增加或删除...
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
在这个上下文的基础上,和web MVC相关还会有一个上下文来保存控制器之类的MVC对象,这样就构成了一个层次化的上下文结构。在web容器中启动Spring应用程序就是一个建立这个上下文体系的过程。Spring为web应用提供了上...
M / P层都需要定义接口和实现类,创建对象占用内存 每一个页面都需要创建P实例并绑定View(重复代码) P层逻辑比较多的时候,开发时不容易考虑其他页面调用,替换难 页面销毁,P层执行异步操作,持有的视图 我们...
13.2.1 持有主线程的影响 13.2.2 使用处理程序延迟主线程上的工作 13.2.3 延迟工作的处理程序源代码示例 13.2.4 构造合适的Message对象 13.2.5 将Message对象发送给队列 13.2.6 响应handleMessage回...
13.2.1 持有主线程的影响 13.2.2 使用处理程序延迟主线程上的工作 13.2.3 延迟工作的处理程序源代码示例 13.2.4 构造合适的Message对象 13.2.5 将Message对象发送给队列 13.2.6 响应handleMessage回...