算法第4版中出现的特性

  • 泛型
  • 自动装箱
  • 迭代

记录一下。。。。。。。不时更新。。

泛型

集合类的抽象数据类型的一个关键特性是我们应该可以用它存储任意类型的数据。 Java拥有独特的泛型机制(许多语言并没有)。在每份 API 中,类名后的 <Item> 记号将 Item 定义为一个类型参数,它是一个象征性的占位符。我们可以将 Item 替换为任意引用数据类型。例如,可以编写如下代码用栈来处理 String 对象:

 Stack<String> stack = new Stack<>();stack.push("Test");...String pop = stack.pop();

泛型使得我们只需要一份 API(和一次实现)就能够处理所有类型的数据。

自动装箱

类型参数必须被实例化为引用类型,因此 Java 有一种特殊机制来使泛型代码能够处理原始数据类型。我们知道,Java 的封装类型都是原始数据类型所对应的引用类型:Boolean、Byte、Character、Double、Float、Integer、Long 和 Short 分别 对应着 boolean、byte、char、double、float、int、long 和 short。在处理复杂语句、方法的参数和算数或逻辑表达式时,Java 会自动在引用类型和对应的原始数据类型之间进行转换。在这里。这种转换有助于我们同时使用泛型和原始数据类型。例如:

 Stack<Integer> stack = new Stack<>();stack.push(17); // 自动装箱(int -> Integer)int i = stack.pop();  // 自动拆箱 (Integer -> int)

自动将一个原始数据类型抓换为一个封装类型成为 自动装箱
自动将一个封装类型转换为一个原始数据类型成为 自动拆箱

迭代

集合类型数据的基本操作之一就是,能够使用 java 的 foreach 语句通过迭代遍历并处理集合中的每个元素。这种方式的代码清晰简洁,且不依赖于集合数据类型的具体实现。让我们先看一段能够打印出一个字符串集合中所有的元素的用例代码:

Stack<String> stack = new Stack<>();
for (String s : stack) {System.out.println(s);
}

这里,foreach 语句只是 while 语句的一种简写方式。它本质上与以下 while 语句是等价的:

Iterator<String> i = stack.iterator();
while (i.hasNext()){String s = i.next();System.out.println(s);
}

这段代码展示了一些在任意可迭代的集合数据类型中我们都需要实现的东西:

  • 集合数据类型必须实现一个 iterator() 方法并返回一个 Iterator 对象。
  • Iterator 类必须包含两个方法:hasNext()(返回一个布尔值)和 next()(返回集合中的一个泛型元素)。

在 Java 中,我们使用接口机制来指定一个类所必须实现的方法。对于可迭代的集合数据类型,Java 已经为我们定义了所需的接口。要使一个类可迭代,第一步就是在它的声明中加入 implements Iterable<Item>,对应的接口(java.lang.Iterable)为:

public interface Iterable<Item>
{Iterator<Item> iteraotr();
}

然后在类中添加一个方法 iterator() 并返回一个迭代器 Iterator<Item>。迭代器那是泛型的,因此我们可以使用参数类型 Item 来帮助用例遍历它们指定的任意类型的对象。对于一直使用的数组表示法,我们需要逆序迭代遍历这个数组,因此我们将迭代器命名为 ReverseArrayIteraotr,并添加了以下方法:

public Iterator<Item> iterator() {return new ReverseArrayIterator();
}

迭代器是什么?它是一个实现了 hasNext() 和 next() 方法的类的对象,由以下接口所定义(java.lang.Iterable):

public interface Iterator<Item>
{boolean hasNext();Item next();void remove();
}

尽管接口指定了一个 remove() 方法,但在本书中 remove() 方法总为空,因为我们希望避免在迭代中穿插能够修改数据结构的操作。对于 ReverseArrayIteraotr,这些方法都只需要一行代码,它们实现在栈类的一个嵌套类中:

private class ReverseArrayIterator implements Iterator<Item>
{  private int i = N;public boolean hasNext() {return i > 0;}public Item next() {return a[--i];}public void remove() {}
}

请注意,嵌套类可以访问包含它的类的实例变量,在这里就是 a[] 和 N。从技术角度来说,为了和 Iterator 的结构保持一致,我们应该在两种情况下抛出异常:如果用例调用了 remove() 则抛出 UnsupportedOperationException,如果用例在调用 next() 时 i 为 0 则抛出 NoSuchElementException。因为我们只会在 foreach 语法中使用迭代器,所以省略了这部分代码。

《Algorithms》Java 语言特性相关推荐

  1. java语言概述、java语言特性、java语言发展史、java语言作用

    Java介绍: Java语言概述: Java语言是由美国Sun(Stanford University Network)斯坦福网络公司的java语言之父–詹姆斯·高斯林,在1995年推出的高级的编程语 ...

  2. 厚积薄发打卡Day75 :【MSUP】Java语言特性与设计模式(上)

    前言 在看狂神频道的时候偶然发现下图,感触颇深.特别在当今[程序 = 业务 + 框架]思想盛行的开发者中,夯实基础基础显得格外重要,因此开此专栏总结记录. 设计模式详解 设计模式的考察点,一般有2个: ...

  3. Java语言特性和技术特点探究

    Java语言特性和技术特点探究 1   引子 Java一直以来是排名前二的编程语言, 这篇文章我们来学习和探讨一下Java的语言特性和技术特点. 2 通用的Java Java是一种通用的编程语言,它是 ...

  4. Java语言特性运用:各种Java语法特性是怎样被Spring各种版本巧妙运用的?

    Java语法变化 Java5(2004): 枚举.泛型.注解.封箱(解箱)- Java6(2006): @Override接口 Java7(2011): Diamond语法.多Catch.Try- J ...

  5. 下列关于java语言特性,下列关于Java 语言特点的叙述中,错误的是()。

    鳃是鱼类的呼吸器官,硬骨鱼类共有______对全鳃,而软骨鱼类共有______个半鳃. 男工人数是女工人数的25,男.女工人数的比是______. 颅内手术后,头部翻转过猛可引起A.脑疝B.休克C.脑 ...

  6. Java语言程序设计(一)选择题

    1.1.如下哪个是 Java中的标识符( ) A.public B.super C.3number D.width 2.如下哪个是 Java中的标识符 ( ) A.fieldname B.super ...

  7. Cay S.Horstmann:从Java新特性看Java的未来

    6月11日,由国内Java技术传播领军机构机械工业出版社华章分社与培生教育集团联合发起的[Java核心技术大会2022]盛大召开!8个专场.24个主题演讲,从6月11日起至6月18日连续8天在线直播, ...

  8. Java修炼 之 基础篇(二)Java语言构成

    上次的博文中Java修炼 之 基础篇(一)Java语言特性我们介绍了一下Java语言的几个特性,今天我们介绍一下Java语言的构成. 所谓的Java构成,主要是指Java运行环境的组成,从外围到核心依 ...

  9. 使用原汁原味的Java 语言

    本文摘自: http://www.ibm.com/developerworks/cn/java/j-noaccent.html 学习一种新的编程语言比学习新的口头语言要容易得多.然而,在这两种学习过程 ...

最新文章

  1. ZServer4D开源项目
  2. 2020年阿里云边缘计算和CDN的关键词
  3. 三角形描边css,[CSS] tips带有描边的小箭头
  4. C++笔记-远程线程注入
  5. 地图分析--广度搜索
  6. chmod 用法示例
  7. linux软件中心无法安eclipse,Ubuntu软件中心安装Eclipse无法启动的问题
  8. 代码高亮插件——wangHightLighter.js——demo演示
  9. mysql 创建和查询数据库和表格
  10. 大数据和人工智能体系图
  11. css3实现旋转的立方体
  12. uniapp - APP判断是否开启位置信息服务判断是否授权位置信息权限
  13. 【Learncpp中文翻译版】【1.9、1.10、1.11】
  14. ESP8266及AT指令学习笔记
  15. A1033 To Fill or Not to Fill
  16. FBOX HMI脚本编写注意事项
  17. 【基础】SimpleDateFormat日期格式转换详解
  18. ELMo模型的理解与实践(2)
  19. 无需下载就能使用的图像编辑器?能代替 Photoshop 吗?#Photopea
  20. Shell 8种字符串截取方法

热门文章

  1. 响应函数sys_xxx
  2. CPU为什么不做成圆的而是方的?
  3. Fiddler笔记一移动端连接
  4. 团体程序设计天梯赛-练习集-L1-036. A乘以B
  5. inno setup相关 (二)
  6. 万物互联时代 如何用好智能家居这把双刃剑?
  7. Hadoop实战之三~ Hello World
  8. algorithm design manual: 8-19
  9. Java中sleep()与wait()的区别
  10. 1392. Dreaming of Stars