当前位置: 首页 > news >正文

网站排名提升易下拉教程导航类主题wordpress

网站排名提升易下拉教程,导航类主题wordpress,重庆城乡建设局网站,教育培训类网站建设与维护本章概要 for-in 和迭代器 适配器方法惯用法 本章小结 简单集合分类 for-in和迭代器 到目前为止#xff0c;for-in 语法主要用于数组#xff0c;但它也适用于任何 Collection 对象。实际上在使用 ArrayList 时#xff0c;已经看到了一些使用它的示例#xff0c;下面是它…本章概要 for-in 和迭代器 适配器方法惯用法 本章小结 简单集合分类 for-in和迭代器 到目前为止for-in 语法主要用于数组但它也适用于任何 Collection 对象。实际上在使用 ArrayList 时已经看到了一些使用它的示例下面是它的通用性的证明 import java.util.*;public class ForInCollections {public static void main(String[] args) {CollectionString cs new LinkedList();Collections.addAll(cs,Take the long way home.split( ));for (String s : cs) {System.out.print( s );}} }由于 cs 是一个 Collection 因此该代码展示了使用 for-in 是所有 Collection 对象的特征。 这样做的原因是 Java 5 引入了一个名为 Iterable 的接口该接口包含一个能够生成 Iterator 的 iterator() 方法。for-in 使用此 Iterable 接口来遍历序列。因此如果创建了任何实现了 Iterable 的类都可以将它用于 for-in 语句中 import java.util.*;public class IterableClass implements IterableString {protected String[] words (And that is how we know the Earth to be banana-shaped.).split( );Overridepublic IteratorString iterator() {return new IteratorString() {private int index 0;Overridepublic boolean hasNext() {return index words.length;}Overridepublic String next() {return words[index];}Overridepublic void remove() { // Not implementedthrow new UnsupportedOperationException();}};}public static void main(String[] args) {for (String s : new IterableClass()) {System.out.print(s );}} }iterator() 返回的是实现了 Iterator 的匿名内部类的实例该匿名内部类可以遍历数组中的每个单词。在主方法中可以看到 IterableClass 确实可以用于 for-in 语句。 在 Java 5 中许多类都是 Iterable 主要包括所有的 Collection 类但不包括各种 Maps 。 例如下面的代码可以显示所有的操作系统环境变量 import java.util.*;public class EnvironmentVariables {public static void main(String[] args) {for (Map.Entry entry : System.getenv().entrySet()) {System.out.println(entry.getKey() : entry.getValue());}} }System.getenv() 返回一个 Map entrySet() 产生一个由 Map.Entry 的元素构成的 Set 并且这个 Set 是一个 Iterable 因此它可以用于 for-in 循环。 for-in 语句适用于数组或者其它任何 Iterable 但这并不代表数组一定是 Iterable 也不会发生任何自动装箱 import java.util.*;public class ArrayIsNotIterable {static T void test(IterableT ib) {for (T t : ib) {System.out.print(t );}}public static void main(String[] args) {test(Arrays.asList(1, 2, 3));String[] strings {A, B, C};// An array works in for-in, but its not Iterable://- test(strings);// You must explicitly convert it to an Iterable:test(Arrays.asList(strings));} }尝试将数组作为一个 Iterable 参数传递会导致失败。这说明不存在任何从数组到 Iterable 的自动转换必须手工执行这种转换。 适配器方法惯用法 如果现在有一个 Iterable 类你想要添加一种或多种在 for-in 语句中使用这个类的方法应该怎么做呢例如你希望可以选择正向还是反向遍历一个单词列表。如果直接继承这个类并重写 iterator() 方法则只能替换现有的方法而不能实现遍历顺序的选择。 一种解决方案是所谓_适配器方法_Adapter Method的惯用法。“适配器”部分来自于设计模式因为必须要提供特定的接口来满足 for-in 语句。如果已经有一个接口并且需要另一个接口时则编写适配器就可以解决这个问题。 在这里若希望在默认的正向迭代器的基础上添加产生反向迭代器的能力因此不能使用重写相反而是添加了一个能够生成 Iterable 对象的方法该对象可以用于 for-in 语句。这使得我们可以提供多种使用 for-in 语句的方式 import java.util.*;class ReversibleArrayListT extends ArrayListT {ReversibleArrayList(CollectionT c) {super(c);}public IterableT reversed() {return new IterableT() {Overridepublic IteratorT iterator() {return new IteratorT() {int current size() - 1;Overridepublic boolean hasNext() {return current -1;}Overridepublic T next() {return get(current--);}Overridepublic void remove() { // Not implementedthrow new UnsupportedOperationException();}};}};} }public class AdapterMethodIdiom {public static void main(String[] args) {ReversibleArrayListString ral new ReversibleArrayListString(Arrays.asList(To be or not to be.split( )));// Grabs the ordinary iterator via iterator():for (String s : ral) {System.out.print(s );}System.out.println();// Hand it the Iterable of your choicefor (String s : ral.reversed()) {System.out.print(s );}} }在主方法中如果直接将 ral 对象放在 for-in 语句中则会得到默认的正向迭代器。但是如果在该对象上调用 reversed() 方法它会产生不同的行为。 通过使用这种方式可以在 IterableClass.java 示例中添加两种适配器方法 MultiIterableClass.java import java.util.*;public class MultiIterableClass extends IterableClass {public IterableString reversed() {return new IterableString() {Overridepublic IteratorString iterator() {return new IteratorString() {int current words.length - 1;Overridepublic boolean hasNext() {return current -1;}Overridepublic String next() {return words[current--];}Overridepublic void remove() { // Not implementedthrow new UnsupportedOperationException();}};}};}public IterableString randomized() {return new IterableString() {Overridepublic IteratorString iterator() {ListString shuffled new ArrayListString(Arrays.asList(words));Collections.shuffle(shuffled, new Random(47));return shuffled.iterator();}};}public static void main(String[] args) {MultiIterableClass mic new MultiIterableClass();for (String s : mic.reversed()) {System.out.print(s );}System.out.println();for (String s : mic.randomized()) {System.out.print(s );}System.out.println();for (String s : mic) {System.out.print(s );}} }IterableClass.java import java.util.Iterator;public class IterableClass implements IterableString {protected String[] words (And that is how we know the Earth to be banana-shaped.).split( );Overridepublic IteratorString iterator() {return new IteratorString() {private int index 0;Overridepublic boolean hasNext() {return index words.length;}Overridepublic String next() {return words[index];}Overridepublic void remove() { // Not implementedthrow new UnsupportedOperationException();}};}public static void main(String[] args) {for (String s : new IterableClass()) {System.out.print(s );}} }注意第二个方法 random() 没有创建它自己的 Iterator 而是直接返回被打乱的 List 中的 Iterator 。 从输出中可以看到 Collections.shuffle() 方法不会影响到原始数组而只是打乱了 shuffled 中的引用。之所以这样是因为 randomized() 方法用一个 ArrayList 将 Arrays.asList() 的结果包装了起来。如果这个由 Arrays.asList() 生成的 List 被直接打乱那么它将修改底层数组如下所示 import java.util.*;public class ModifyingArraysAsList {public static void main(String[] args) {Random rand new Random(47);Integer[] ia {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};ListInteger list1 new ArrayList(Arrays.asList(ia));System.out.println(Before shuffling: list1);Collections.shuffle(list1, rand);System.out.println(After shuffling: list1);System.out.println(array: Arrays.toString(ia));ListInteger list2 Arrays.asList(ia);System.out.println(Before shuffling: list2);Collections.shuffle(list2, rand);System.out.println(After shuffling: list2);System.out.println(array: Arrays.toString(ia));} }在第一种情况下 Arrays.asList() 的输出被传递给了 ArrayList 的构造器这将创建一个引用 ia 的元素的 ArrayList 因此打乱这些引用不会修改该数组。但是如果直接使用 Arrays.asList(ia) 的结果这种打乱就会修改 ia 的顺序。重要的是要注意 Arrays.asList() 生成一个 List 对象该对象使用底层数组作为其物理实现。如果对 List 对象做了任何修改又不想让原始数组被修改那么就应该在另一个集合中创建一个副本。 本章小结 Java 提供了许多保存对象的方法 数组将数字索引与对象相关联。它保存类型明确的对象因此在查找对象时不必对结果做类型转换。它可以是多维的可以保存基本类型的数据。虽然可以在运行时创建数组但是一旦创建数组就无法更改数组的大小。Collection 保存单一的元素而 Map 包含相关联的键值对。使用 Java 泛型可以指定集合中保存的对象的类型因此不能将错误类型的对象放入集合中并且在从集合中获取元素时不必进行类型转换。各种 Collection 和各种 Map 都可以在你向其中添加更多的元素时自动调整其尺寸大小。集合不能保存基本类型但自动装箱机制会负责执行基本类型和集合中保存的包装类型之间的双向转换。像数组一样 List 也将数字索引与对象相关联因此数组和 List 都是有序集合。如果要执行大量的随机访问则使用 ArrayList 如果要经常从表中间插入或删除元素则应该使用 LinkedList 。队列和堆栈的行为是通过 LinkedList 提供的。Map 是一种将对象而非数字与对象相关联的设计。 HashMap 专为快速访问而设计而 TreeMap 保持键始终处于排序状态所以没有 HashMap 快。 LinkedHashMap 按插入顺序保存其元素但使用散列提供快速访问的能力。Set 不接受重复元素。 HashSet 提供最快的查询速度而 TreeSet 保持元素处于排序状态。 LinkedHashSet 按插入顺序保存其元素但使用散列提供快速访问的能力。不要在新代码中使用遗留类 Vector Hashtable 和 Stack 。 浏览一下Java集合的简图不包含抽象类或遗留组件会很有帮助。这里仅包括在一般情况下会碰到的接口和类。译者注下图为原著PDF中的截图可能由于未知原因存在问题。这里可参考译者绘制版 简单集合分类 可以看到实际上只有四个基本的集合组件 Map List Set 和 Queue 它们各有两到三个实现版本Queue 的 java.util.concurrent 实现未包含在此图中。最常使用的集合用黑色粗线线框表示。 虚线框表示接口实线框表示普通的具体的类。带有空心箭头的虚线表示特定的类实现了一个接口。实心箭头表示某个类可以生成箭头指向的类的对象。例如任何 Collection 都可以生成 Iterator List 可以生成 ListIterator 也能生成普通的 Iterator 因为 List 继承自 Collection 。 下面的示例展示了各种不同的类在方法上的差异。实际代码来自泛型章节在这里只是调用它来产生输出。程序的输出还展示了在每个类或接口中所实现的接口 CollectionDifferences.java public class CollectionDifferences {public static void main(String[] args) {CollectionMethodDifferences.main(args);} }CollectionMethodDifferences.java import java.lang.reflect.Method; import java.util.*; import java.util.stream.Collectors;public class CollectionMethodDifferences {static SetString methodSet(Class? type) {return Arrays.stream(type.getMethods()).map(Method::getName).collect(Collectors.toCollection(TreeSet::new));}static void interfaces(Class? type) {System.out.print(Interfaces in type.getSimpleName() : );System.out.println(Arrays.stream(type.getInterfaces()).map(Class::getSimpleName).collect(Collectors.toList()));}static SetString object methodSet(Object.class);static {object.add(clone);}static voiddifference(Class? superset, Class? subset) {System.out.print(superset.getSimpleName() extends subset.getSimpleName() , adds: );SetString comp Sets.difference(methodSet(superset), methodSet(subset));comp.removeAll(object); // Ignore Object methodsSystem.out.println(comp);interfaces(superset);}public static void main(String[] args) {System.out.println(Collection: methodSet(Collection.class));interfaces(Collection.class);difference(Set.class, Collection.class);difference(HashSet.class, Set.class);difference(LinkedHashSet.class, HashSet.class);difference(TreeSet.class, Set.class);difference(List.class, Collection.class);difference(ArrayList.class, List.class);difference(LinkedList.class, List.class);difference(Queue.class, Collection.class);difference(PriorityQueue.class, Queue.class);System.out.println(Map: methodSet(Map.class));difference(HashMap.class, Map.class);difference(LinkedHashMap.class, HashMap.class);difference(SortedMap.class, Map.class);difference(TreeMap.class, Map.class);} }Sets.java import java.util.HashSet; import java.util.Set;public class Sets {public static T SetT union(SetT a, SetT b) {SetT result new HashSet(a);result.addAll(b);return result;}public static TSetT intersection(SetT a, SetT b) {SetT result new HashSet(a);result.retainAll(b);return result;}// Subtract subset from superset:public static T SetTdifference(SetT superset, SetT subset) {SetT result new HashSet(superset);result.removeAll(subset);return result;}// Reflexive--everything not in the intersection:public static T SetT complement(SetT a, SetT b) {return difference(union(a, b), intersection(a, b));} }除 TreeSet 之外的所有 Set 都具有与 Collection 完全相同的接口。List 和 Collection 存在着明显的不同尽管 List 所要求的方法都在 Collection 中。另一方面在 Queue 接口中的方法是独立的在创建具有 Queue 功能的实现时不需要使用 Collection 方法。最后 Map 和 Collection 之间唯一的交集是 Map 可以使用 entrySet() 和 values() 方法来产生 Collection 。 请注意标记接口 java.util.RandomAccess 附加到了 ArrayList 上但不附加到 LinkedList 上。这为根据特定 List 动态改变其行为的算法提供了信息。 从面向对象的继承层次结构来看这种组织结构确实有些奇怪。但是当了解了 java.util 中更多的有关集合的内容后就会发现除了继承结构有点奇怪外还有更多的问题。集合类库一直以来都是设计难题——解决这些问题涉及到要去满足经常彼此之间互为牵制的各方面需求。所以要做好准备在各处做出妥协。 尽管存在这些问题但 Java 集合仍是在日常工作中使用的基本工具它可以使程序更简洁、更强大、更有效。 下面是译者绘制的 Java 集合框架简图黄色为接口绿色为抽象类蓝色为具体类。虚线箭头表示实现关系实线箭头表示继承关系。
http://www.pierceye.com/news/216201/

相关文章:

  • php手机网站模板厦门网站设计建设
  • 焦作集团网站建设做食品网站需要什么资质
  • 西北电力建设甘肃工程公司网站90设计电商模板
  • 内蒙古网站设计推广网站注册赚佣金
  • 医药类网站建设评价wordpress微信支付模板
  • 如何查看网站空间商手机服务器下载安装
  • 北京响应式网站建设报价英文版网站案例
  • 做爰全过程免费的视频99网站做h5单页的网站
  • 怎么才能百度做网站海外直播
  • 响应式企业网站开发所用的平台酷炫网站首页
  • 西安网站建设全包大发 wordpress
  • html5 网站开发定制做公司网站好处
  • 建站网站教程网站建设工程师职责说明书
  • 新云网站模版宠物网站开发
  • 网站建设面授班网站备案回访电话号码
  • 阿里有做网站网站建设费是宣传费用吗
  • 点广告挣钱网站有哪些网站的建设与预算
  • 佛山新网站建设详细内容手机软件公司
  • 网站建设美词原创怎样建设一个能上传数据的网站
  • 网站建设网站营销做APP必须要有网站么
  • 易企建站咖啡公司网站建设策划书
  • wordpress 不能查看站点网站建设公司软件开
  • 网站文章seoftp搭建wordpress
  • 济宁企业做网站受欢迎的常州做网站
  • 我有域名有服务器怎么建设网站凡科官网app下载
  • 深圳保障性住房可以买卖吗襄樊seo排名
  • 餐饮官网建站模板网站开发实验报告可行性分析
  • 美食网站建设规划书外链工具软件
  • 网站设计模板代码七牛wordpress后台慢
  • 佛山网站建设怎么办huang色网站