`
lwbbupt
  • 浏览: 35168 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java基础之持有对象

阅读更多

        持有对象指的是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结构,如果我们的类已经继承了其他的类就必须通过第二种方式实现了。这里面用到了我们前面提到的匿名内部类

 

1
1
分享到:
评论

相关推荐

    think in java 第11章 持有对象

    学习think in java 时的第9章的例题及练习答案。 eclipse 工程包,运行可用!全自己敲的!

    Java基础知识.doc

    学好Java基础、拿高薪offer; java中会存在内存泄漏吗,请简单描述。 会,原因: 如果对象被集合类引用时,如果只是添加,而不删除,会引起内存泄漏,严重时会发出内存溢出。 Java中的内存泄露的情况:长生命周期的...

    Thinking in java4(中文高清版)-java的'圣经'

    非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 第7章 复用类 第8章 多态 第9章 接口 第10章 内部类 第11章 持有对象 第12章 通过异常处理错误 第13章 字符串 第...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    JAVA面试题集合面试技能大全

    wait():使一个线程处于等待状态,并且释放所持有的对象的lock。 sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。 notify():唤醒一个处于等待状态的线程...

    超级有影响力霸气的Java面试题大全文档

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    Java并发编程(学习笔记).xmind

    复合操作:执行复合操作期间,要持有锁 锁的作用 加锁机制、用锁保护状态、实现共享访问 锁的不恰当使用可能会引起程序性能下降 对象的共享使用策略 线程封闭:线程封闭的对象只能由一个线程...

    JAVA集合(List,Set,Map)

    Java 2集合框架图 集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。 抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。 实现类:8个实现类(实线表示),...

    java核心知识点整理.pdf

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    jedis-2.1.0.jar +java调用Redis教程 +方法说明

     字符串类型是Redis中最为基础的数据存储类型 它在Redis中是二进制安全的 这便意味着该类型可以接受任何格式的数据 如JPEG图像数据或Json对象描述信息等 在Redis中字符串类型的Value最多可以容纳的数据长度是512M ...

    java版直播间源码-android-jetpack::rocket:使用Jetpack加速Android开发之路

    java版直播间源码 终极 Android Jetpack 参考 什么是 Android Jetpack Android Jetpack 是下一代组件和工具以及旨在加速 Android 开发的架构指南。 主要原因是: 构建高质量、健壮的应用程序 消除样板代码 加速发展 ...

    Java高并发高性能分布式框架从无到有微服务架构设计(1).doc

    Java高并发高性能分布式框架从无到有微服务架构设计 微服务架构模式〔Microservice Architect Pattern〕....最根本的区别就是,Concur rentMap会持有所有添加的对象,直到被显示的移除.而缓存为了限制其内存的使用,通

    命令模式(Command)原理图

    Invoker:这是负责调用命令对象执行请求的类,它会持有一个命令对象,并在某个时间点触发命令的执行。调用者作为一个中介,将发起请求的对象和执行请求的对象解耦。 命令模式的优点包括降低系统的耦合度、增加或删除...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    spring源代码解析

    在这个上下文的基础上,和web MVC相关还会有一个上下文来保存控制器之类的MVC对象,这样就构成了一个层次化的上下文结构。在web容器中启动Spring应用程序就是一个建立这个上下文体系的过程。Spring为web应用提供了上...

    基础::see-no-evil_monkey:Things2示例

    M / P层都需要定义接口和实现类,创建对象占用内存 每一个页面都需要创建P实例并绑定View(重复代码) P层逻辑比较多的时候,开发时不容易考虑其他页面调用,替换难 页面销毁,P层执行异步操作,持有的视图 我们...

    精通ANDROID 3(中文版)1/2

    13.2.1 持有主线程的影响  13.2.2 使用处理程序延迟主线程上的工作  13.2.3 延迟工作的处理程序源代码示例  13.2.4 构造合适的Message对象  13.2.5 将Message对象发送给队列  13.2.6 响应handleMessage回...

    精通Android 3 (中文版)2/2

    13.2.1 持有主线程的影响  13.2.2 使用处理程序延迟主线程上的工作  13.2.3 延迟工作的处理程序源代码示例  13.2.4 构造合适的Message对象  13.2.5 将Message对象发送给队列  13.2.6 响应handleMessage回...

Global site tag (gtag.js) - Google Analytics