首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

集合 (1)

1. java集合框架 类库规模小且易于学习,不想C++那么复杂,却具有算法的优点 1.1 将集合的接口与实现分离 队列:可以队尾添加元素,可以队头添加元素...(); } 队列两种循环方式一种是循环数组;另一种是使用链表 每一个具体的实现都可以通过实现Queue接口的类来显示 // 这就是典型的接口与实现方法相分离 public class CircularArrayQueue...public int size() { . . . }     private E[] elements; } 1.2 collection 接口 java类库中,集合的基本接口是Collection...);     // .... } 1.3 迭代器 Interator 接口包含四个方法 public interface Interator{     E next();     boolean...图2 1.4 实用方法 由于Collection和Interator都是接口,可以编写操作任何集合类型的方法 public static bollean contains(Collection

32530

从源码看集合ArrayList

可能大家都知道,java中的ArrayList类,是一个集合类,可以存储指定类型的数据集合,也知道可以使用get(index)方法通过索引来获取数据,或者使用for each 遍历输出集合中的内容...= 0; }           addAll()方法的动态扩容和添加数值都和add 类似,我们主要理解一下,他的这个参数是什么意思,也顺便复习一下相关内容。 ?           ...声明一个方法 iterator();返回 Iterable 迭代器接口,所有实现了 Iterable接口的类都是可以使用for each 循环遍历集合中元素的。...当我们的类实现 Iterable接口,可以使用for each 循环集合,其实内部还是,通过调用方法 iterator()实现当前集合和迭代器的一种类似于绑定的过程,最终返回迭代器接口,实际上for...(); while(it.hasNext()){ it.remove(); }//报错           现在大家能够想明白为什么调用remove方法之前一定要调用next方法了吧,因为next

62860
您找到你想要的搜索结果了吗?
是的
没有找到

Java-持有对象

但当你用ArrayList的get()方法取出你认为的Apple对象,得到的只是Object引用,必须将其转型为Apple,因此,需要将整个表达式扩起来,调用Apple的id()方法之前,强制执行类型...通过使用,就可以在编译器防止将错误类型的对象放置到容器中。...这样,通过使用,你不仅知道编译器将会检查你放置到容器中的对象类型,而且使用容器中的对象,可以使用更加清晰的语法 上面的例子还说明,如果不需要使用每个元素的索引,可以使用foreach语法来选择List...中的每个元素 当指定了某个类型作为参数,并不仅限于只能将该确切类型的对象放置到容器中,向上转型也可以像作用于其他类型一样作用于。...Java的Iterator只能单向移动,这个Interator只能用来: 1)使用方法Interator()要求容器返回一个Interator

1.1K10

(35) (上) - 基本概念和原理 计算机程序的思维逻辑

Java中,类、接口、方法都可以是的,我们先来看类。 一个简单类 我们通过一个简单的例子来说明类的基本概念、实现原理和好处。...的好处 既然只使用普通类和Object就是可以的,而且最后也转换为了普通类,那为什么还要用呢?或者说,到底有什么好处呢?...这些数据结构Java中的实现主要就是Java中的各种容器类,甚至,Java的引入主要也是为了更好的支持Java容器。...类型参数的限定 之前的介绍中,无论是类、方法还是接口,关于类型参数,我们都知之甚少,只能把它当做Object,但Java支持限定这个参数的一个上界,也就是说,参数必须为给定的上界类型或其子类型...Java中,是通过类型擦除来实现的,它是Java编译器的概念,Java虚拟机运行时对基本一无所知,理解这一点是很重要的,它有助于我们理解Java的很多局限性。

73580

深入理解 Java

为什么引入 引入之前,要想实现一个通用的、可以处理不同类型的方法,你需要使用 Object 作为属性和方法参数,比如这样: public class Generic { private...实现实现接口需要指明具体的参数类型,不然默认类型是 Object,这就失去了接口的意义。...extends E> 类型参数中使用 extends 表示这个中的参数必须E 或者 E 的子类,这样有两个好处: 如果传入的类型不是 E 或者 E 的子类,编辑不成功 中可以使用 E 的方法...super E> 类型参数中使用 super 表示这个中的参数必须E 或者 E 的父类。 根据代码介绍吧: private void add(List<?...4.数组中不能使用 这可能是 Java 面试题中最简单的一个了,当然前提是你要知道 Array 事实上并不支持,这也是为什么 Joshua Bloch 《Effective Java》一书中建议使用

2.1K111

Java

Why:为什么要引入Java 集合框架中的数据元素,是Object类型,也就是可以是任意类型。 使用集合数据,需要显式地调用 强制类型转换。...适当的代码中,集合总是伴随着类型参数。当使用类似集合的类型而不使用类型参数,它称为原始类型。 原始类型类似于通配符类型,这是一个精心设计的决定,允许与预先存在的遗留代码进行互操作。...Casts and InstanceOf 编译使用了类型擦除, 运行时不存在类型变量。这意味着它们时间和空间上都不需要性能开销,这很好。 但是,这也意味着您不能在类型转换中可靠地使用它们。...的一个主要目标就是提高Java程序的类型安全,使用可以使编译器知道变量的类型限制,进而可以更高程度上验证类型假设。...支持Java编译器(例如JDK1.5中的Javac)可以用来编译经过扩充的Java程序(Generics Java程序),但是现有的没有使用扩充的Java程序仍然可以用这些编译器来编译。

2.2K51

kotlin入门之

将具体的类型化,编码的时候用符号来值代类型,使用时再确定他的类型。 因为的存在,我们可以省去强制类型转化。 是跟类型相关的,那么是不是也能使用与类型的多态呢?...Java类型会在编译发生类型擦除,为了保证类型安全,不允许这样赋值、 至于什么是类型擦除,等下再讲。 实际使用中,我们的确会用这种类似的需求,需要实现上面这种赋值。...说完了Java之后,我们回头看一下kotlin中的。 kotlin 中的out和in kotlin和java一样,kotlin中的本身也是不可变的。...当类作为参数类实例的消费者用协变 *号 *号 前面讲到了 Java 中单个?...伪:编译擦除类型,运行时无实际类型生成 例如:java、kotlin 真:编译生成真实类型,运行时也存在该类 例如:C#、C++ 我们知道JVM上的,一般是通过类型擦除来实现

1.1K20

Java基础系列二:Java

实现实现接口,如已将类型传入实参类型,则所有使用的地方都要替换成传入的实参类型即:Generator,public T next();中的的T都要替换成传入的String类型。...3、通配符: 为什么使用通配符: 正如前面讲的,当使用一个(包括声明变量和创建对象两种情况),都应该为这个类传入一个类型实参。如果没有传入类型实际参数,编译器就会提出警告。...另外一些情况下,定义类、接口没有使用形参,但定义方法想自己定义形参,这也是可以的,Java5还提供了对方法的支持。...根据你对这个问题的回答情况,你会 得到一些后续提问,比如为什么是由类型擦除来实现的或者给你展示一些会导致编译器出错的错误代码。请阅读我的Java是如何工作的来了解更 多信息。...这可能是Java面试题中最简单的一个了,当然前提是你要知道Array事实上并不支持,这也是为什么Joshua BlochEffective Java一书中建议使用List来代替Array,因为

50620

一文带你玩转“

答:这是java声明方法的固定格式,方法的返回值声明之前的位置,定义该方法所拥有的标识符,个数可以是多个。...> 表示没什么限制,无界通配符则表明使用,如果不指定,则不能添加任何值。 2、上边界限定通配符,如 <?...五: 的底层实现 (一) 是在编译期进行类型校验,如果类型校验不通过,则会编译报错,它底层是通过编译器进行实现的。...指定类型,不能使用基本类型,只能指定它们的包装类型,如: Person"",因为本质是obejct类型,是引用类型,而不是原始类型(原始类型也就是我们常说的八种基本类型...super E> 表示: 参数必须E或者E的父类,直至Object类型【这个只能用于方法参数,或者变量中修饰,不能修饰接口或类】 非限定通配符: 使用一个单独的T(或者A-Z任意字母)表示,它表示没有任何的限制

53320

Java基础系列2:Java

实现实现接口,如已将类型传入实参类型,则所有使用的地方都要替换成传入的实参类型即:Generator,public T next();中的的T都要替换成传入的String类型。...3、通配符: 为什么使用通配符: 正如前面讲的,当使用一个(包括声明变量和创建对象两种情况),都应该为这个类传入一个类型实参。如果没有传入类型实际参数,编译器就会提出警告。...另外一些情况下,定义类、接口没有使用形参,但定义方法想自己定义形参,这也是可以的,Java5还提供了对方法的支持。...根据你对这个问题的回答情况,你会 得到一些后续提问,比如为什么是由类型擦除来实现的或者给你展示一些会导致编译器出错的错误代码。请阅读我的Java是如何工作的来了解更 多信息。...这可能是Java面试题中最简单的一个了,当然前提是你要知道Array事实上并不支持,这也是为什么Joshua BlochEffective Java一书中建议使用List来代替Array,因为

51150

(37) (下) - 细节和局限性 计算机程序的思维逻辑

这些局限性主要与Java实现机制有关,Java中,是通过类型擦除来实现的,类型参数在编译时会被替换为Object,运行时Java虚拟机不知道这回事,这带来了很多局限性,其中有的部分是比较容易理解的...下面,我们将从以下几个方面来介绍这些细节和局限性: 使用类、方法和接口 定义类、方法和接口 与数组 使用类、方法和接口 使用类、方法和接口,有一些值得注意的地方,比如: 基本类型不能用于实例化类型参数...运行时类型信息不适用于 介绍继承的实现原理,我们提到,在内存中,每个类都有一份类型信息,而每个对象也都保存着其对应类型信息的引用。...定义类、方法和接口 定义类、方法和接口,也有一些需要注意的地方,比如: 不能通过类型参数创建对象 类类型参数不能用于静态变量和方法 了解多个类型限定的语法 我们逐个来看下。...对于类声明的类型参数,可以实例变量和方法中使用,但在静态变量和静态方法中是不能使用的。

88260

Java——Java

实现实现接口,如已将类型传入实参类型,则所有使用的地方都要替换成传入的实参类型即:Generator,public T next();中的的T都要替换成传入的String类型。...3、通配符: 为什么使用通配符: 正如前面讲的,当使用一个(包括声明变量和创建对象两种情况),都应该为这个类传入一个类型实参。如果没有传入类型实际参数,编译器就会提出警告。...另外一些情况下,定义类、接口没有使用形参,但定义方法想自己定义形参,这也是可以的,Java5还提供了对方法的支持。...根据你对这个问题的回答情况,你会 得到一些后续提问,比如为什么是由类型擦除来实现的或者给你展示一些会导致编译器出错的错误代码。请阅读我的Java是如何工作的来了解更 多信息。...这可能是Java面试题中最简单的一个了,当然前提是你要知道Array事实上并不支持,这也是为什么Joshua BlochEffective Java一书中建议使用List来代替Array,因为

2.1K31

Java 基础常见知识点&面试题总结(下),2022 最新版!

使用方式有哪几种? 一般有三种使用方式:类、接口、方法。...1.类: //此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示 //实例化必须指定T的具体类型 public class Generic{ private...> void printArray( E[] inputArray ) 一般被称为静态方法; java只是一个占位符,必须在传递类型后才能使用。...类实例化时才能真正的传递类型参数,由于静态方法的加载先于类的实例化,也就是说类中的还没有传递真正的类型参数,静态的方法的加载就已经完成了,所以静态方法是没有办法使用类上声明的的。...只能使用自己声明的 项目中哪里用到了

44440

Effective-java-读书笔记之

例如, 与List相对应的原生态类型是List. 与Java平台没有之前的接口类型List完全一样.如果使用原生态类型, 就失掉了安全性和表达性方面的所有优势....要是无法接受这些限制, 可以使用方法(见30条)或者有限制的通配符类型(见31条).不要在新代码中使用原生态类型, 有两个小小的例外:类文字(class literal)中必须使用原生态类型...., 而用列表在编译就发现了.第二大区别:数组是具体化的(reified), 在运行时才知道并检查元素类型约束.是通过擦除(erasure)来实现的....把一个值保存在的可变参数数列中是不安全的.那么为什么声明的数组是非法的, 而这种可变参数声明是合法的呢?...super T> c, T... elements), EnumSet.of(E first, E... rest).这些类库方法是类型安全的.Java 7之前, 对可变参数的警告只能在客户端通过

41460

夯实Java基础系列13:深入理解Java中的

-- more --> 概述 java中有很重要的地位,面向对象编程及各种设计模式中有非常广泛的应用。 什么是为什么使用,即“参数化类型”。...var; ..... } 一个最普通的类: //此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示 //实例化必须指定T的具体类型 public class...* 实现实现接口,如已将类型传入实参类型,则所有使用的地方都要替换成传入的实参类型 * 即:Generator,public T next();中的的T都要替换成传入的String...根据你对这个问题的回答情况,你会 得到一些后续提问,比如为什么是由类型擦除来实现的或者给你展示一些会导致编译器出错的错误代码。请阅读我的Java是如何工作的来了解更 多信息。...这可能是Java面试题中最简单的一个了,当然前提是你要知道Array事实上并不支持,这也是为什么Joshua BlochEffective Java一书中建议使用List来代替Array,因为

38900

Java如何优雅获取类型

%E7%B1%BB%E5%9E%8B/ 前言 Java 开发中,获取这种操作虽不是很常用,但有时确实必须的,比如 将Json 字符串反序列化成对象的时候。...,但获取类型是父类。...而返回的 Type 数组就是父类的 Class。因为 Class 实现了 Type 接口。为什么是数组呢?因为每个类可以有多个。 ? 通过这样几行代码,我们就得到了。当然,这种用法很少。...总结 因为历史原因,Java一直是个痛点,但无法避免,所以使用起来确实有点麻烦。但通过 Class 类的众多反射功能,我们还是能够处理的问题。...我们今天使用反射得到了一个类的,并在父类进行处理,成功的将一个字符串反序列化成一个对象。 很干!必须好看☟

6.5K60

年后跑路第一战,从Java学起!

本文章是对 Java的快速介绍,包含背后的目标以及使用如何提高我们代码的质量。 为什么要引入?... Java 集合中,我们使用T表示类型,K表示键,V表示值。 有界 类型参数可以有界,我们可以限制方法接受的类型。...否则会导致编译错误。 使用通配符 Java中,通配符由?表示,我们使用它们来指代未知类型。通配符对特别有用,可以用作参数类型。 首先,我们知道Object是所有 Java 类的超类。...例如,以下不能编译: List list = new ArrayList(); list.add(17); 要理解基本类型为什么不起作用,让我们记住是一个编译特性,这意味着类型参数被删除并且所有类型都实现为类型...在编译强制类型正确,最重要的是,可以实现算法而不会对我们的应用程序造成任何额外开销。

68830

夯实Java基础系列10:深入理解Java中的异常体系

什么是为什么使用,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法传递实参。那么参数化类型怎么理解呢?...var; ..... } 一个最普通的类: //此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示 //实例化必须指定T的具体类型 public class...* 实现实现接口,如已将类型传入实参类型,则所有使用的地方都要替换成传入的实参类型 * 即:Generator,public T next();中的的T都要替换成传入的String...根据你对这个问题的回答情况,你会 得到一些后续提问,比如为什么是由类型擦除来实现的或者给你展示一些会导致编译器出错的错误代码。请阅读我的Java是如何工作的来了解更 多信息。...这可能是Java面试题中最简单的一个了,当然前提是你要知道Array事实上并不支持,这也是为什么Joshua BlochEffective Java一书中建议使用List来代替Array,因为

47430
领券