当前位置: 首页 > 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://wiki.neutronadmin.com/news/371324/

相关文章:

  • 做网站值钱吗wordpress极速优化
  • 移动应用开发适合女生吗哈尔滨网站优化排名
  • 我想在阿里巴巴网站开店 怎么做企业wordpress主题免费下载
  • 做qq空间动态皮肤网站网页美工设计培训学校哪家好
  • 做阀门网站电话号码注册域名之后怎么做网站
  • 网站开发公司首页网站概念设计
  • 有没有专门做衣服搭配的网站专业零基础网站建设教学公司
  • 旅游网站开发流程重庆百度优化
  • 如何在微信上做广告新站seo优化快速上排名
  • 视觉创意设计公司商城网站不易优化
  • 外贸建站哪家织梦网站标题被改
  • 定制网站建设官网wordpress 表格小工具
  • 青岛做公司网站的多吗自己做的网站数据库
  • 什么网站有高端定制案例国内建筑公司排名
  • wordpress多站点 文章导入怀柔富阳网站建设
  • 兼职做问卷调查的网站好做网站的岗位好吗
  • 网站建设公众号开高端企业网站建设制作
  • 贵州网站建设设计公司哪家好网站建设的困难
  • 网站建设系统规划电商小程序定制开发
  • 网站推广策划书自己可以学着做网站吗
  • 怎么帮助网站推广wordpress 计数
  • 广告设计网站官网网络营销模式
  • 邵阳建网站自己建站模板
  • 网站被百度惩罚怎么办邢台市政建设集团网站
  • linux做网站教程排版
  • 公司网页网站建设+ppt模板下载网站设计开发报价
  • 国家补贴软件网站开发政策做外贸哪些国外网站可以推广
  • dedecms医院网站wap模板(橙色)腾讯云网站搭建流程
  • 网站建设都分几个阶段平面设计接单网站有哪些
  • 企业网站怎么搭建wordpress 特效插件