JAVA基础之集合、Iterator迭代器、泛型及增强for循环
个人理解:
对于集合,首先要明确的是最顶层的接口是Collection接口类,其包含一些基本的方法以便子类调用,不过在定义的时候最好定义好数据类型,以免遍历时还得必须进行向上转型;特别注意的是其没有关于下标的方法。同时为了方便遍历其元素,建立了一个Iterable
类由Collection进行实现其独有的返回迭代器的方法,以便下面的子类进行迭代的实现。
关于泛型:
一、集合:
1、介绍:
集合是java中提供的一种容器,可以存储多个数据;集合的长度是可变的,存储的必须是引用数据类型(数组长度是固定的)。
2、ArrayList集合存储元素及遍历:
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(111);
list.add(222);
list.add(333);
list.add(444);
list.add(555);
for(int i=0; i<list.size(); i++){
System.out.println(list.get(i));
}
} public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<Person>();
list.add(new Person("小强"));
list.add(new Person("老王"));
list.add(new Person("小虎"));
list.add(new Person("小泽"));
list.add(new Person("小红"));
for(int i=0; i<list.size(); i++){
Person p = list.get(i);
System.out.println(p);
}
}
3、集合的继承实现关系:
其中list允许出现重复的元素,是有序的;而set是不允许的,无序的。
4、Collection类:
其是集合中的顶层接口,创建方法如下:
Collection<元素类型> 变量名 =new ArrayList<元素类型>();
//只能存储指定的类型(最好采用这种方法) Collection 变量名 = new ArrayList();
//默认类型为Object,即任何类型的元素都可以存储
5、Collection部分基本方法如下:(没有关于下标的方法)
import java.util.ArrayList;
import java.util.Collection; public class Demo02 {
public static void main(String[] args) {
Collection<Integer> col=new ArrayList<Integer>();
col.add(10);
col.add(20);
//清空集合
// col.clear();
//判断集合中是否包含该元素;
boolean flag=col.contains(20);
System.out.println(flag);
//根据值删除元素
col.remove(10);
//遍历
if(col instanceof ArrayList){
ArrayList<Integer> arr=(ArrayList<Integer>)col;
for(int i=0;i<arr.size();i++){
System.out.println(arr.get(i));
}
}
//集合转数组
Object[] obj=col.toArray();
for(int i=0;i<obj.length;i++){
System.out.println(obj[i]);
}
}
}
二、Iterator迭代器:
1、概述:
Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。
2、常用方法:
hasNext(): 如果仍有元素可以迭代,则返回true;(返回一个boolean值)
next():返回迭代的下一个元素,并把指针向后移动下一位。
3、迭代方式的代码体现:
(Iterable
接口 (java.lang.Iterable
) 是Java集合的顶级接口之一。Collection
接口继承Iterable
,所以Collection
的所有子类也实现了Iterable
接口。)
Iterable的方法:
iterator():
返回在此Collection的元素上进行迭代的迭代器。
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator; public class Demo05 {
public static void main(String[] args) {
Collection col=new ArrayList();
col.add("abc");
col.add("add");
col.add("edf");
//获取迭代器对象
Iterator it=col.iterator();
//判断是否有元素
while(it.hasNext()){
//获取每个元素
Object s=it.next();
//判断是否是String类型
if(s instanceof String){
//向下转型
String str=(String)s;
//调用子类独有的方法
System.out.println(str.length());
}
}
}
}
(由于元素被存进集合后全部都被提升为Object类型,所以需要向下转型)
三、泛型:
泛型,用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。
1、含有泛型的类:
定义格式:
修饰符 class 类名<代表泛型的变量>{ }
使用格式:
创建对象时,确定泛型的类型。
2、含有泛型的接口:
修饰符 interface 接口名<代表泛型的变量>{ }
使用格式:
定义时确定泛型的类型(实现接口的时候明确);
或者:
知道创建对象时,确定泛型的类型;
3、使用泛型的好处:
将运行时期的ClassCastException,转移到了编译时期变成了编译失败。避免了类型强转的麻烦。
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator; public class Demo01 {
public static void main(String[] args) {
ArrayList<String> arr=new ArrayList<String>();
arr.add("a");
arr.add("b");
HashSet<Integer> set=new HashSet<Integer>();
set.add(123);
set.add(456);
get(arr);
get(set);
}
//写一个方法遍历两个集合
public static void get(Collection<?> col){
//获取迭代器对象
Iterator<?> it=col.iterator();
//判断是否存在
while(it.hasNext()){
System.out.println(it.next());
}
}
}
4、泛型通配符:
为了解决这个"无法确定具体集合中的元素类型"问题,java中,为我们提供了泛型的通配符<?>。当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
5、泛型限定:
限定泛型的上限:
格式:? extends E
? 代表接收E类型或者E的子类型的元素
限定泛型的下限:
格式:? super E
? 代表接收E类型或者E的父类型的元素
import java.util.ArrayList;
import java.util.Iterator; public class Demo02 {
public static void main(String[] args) {
ArrayList<Cooker> arr1=new ArrayList<Cooker>();
arr1.add(new Cooker());
arr1.add(new Cooker());
ArrayList<Waiter> arr2=new ArrayList<Waiter>();
arr2.add(new Waiter());
arr2.add(new Waiter());
get(arr1);
get(arr2);
} //写一个方法来遍历容器
public static void get(ArrayList<? extends Emp> arr){
Iterator<? extends Emp> it=arr.iterator();
while(it.hasNext()){
/*Object obj=it.next();
if(obj instanceof Cooker){
Cooker c=(Cooker)obj;
c.work();
}
if(obj instanceof Waiter){
Waiter c=(Waiter)obj;
c.work();
}*/
it.next().work();
}
}
}
四、增强for循环:
增强for循环是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。(也没有下标的概念)
格式:
for(元素的数据类型 变量 : Collection集合or数组){
}
import java.util.ArrayList;
import java.util.Collection; public class Demo06 {
public static void main(String[] args) {
/*for(你容器中存放的数据类型 变量名:你要遍历的容器的名字){
System.out.println(变量名);
}*/ Collection<String> col=new ArrayList<String>();
col.add("abc");
col.add("bcd");
col.add("edg");
for(String s:col){
System.out.println(s);
}
}
}
增强for循环和老式的for循环有什么区别?
注意:新for循环必须有被遍历的目标。目标只能是Collection或者是数组。
建议:遍历数组时,如果仅为遍历,可以使用增强for如果要对数组的元素进行 操作,使用老式for循环可以通过角标操作。
JAVA基础之集合、Iterator迭代器、泛型及增强for循环的更多相关文章
- java基础篇1之可变参数,增强for循环,自动装箱
1.java中可变参数应用 例如 add(int x,int... args) 1)只能放在参数列表的最后面 2)...位于变量类型和变量名之间,前后有无空格都可以 3)调用可变参数的方法时,编译器为 ...
- java基础-Map集合
java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...
- Java基础之 集合体系结构(Collection、List、ArrayList、LinkedList、Vector)
Java基础之 集合体系结构详细笔记(Collection.List.ArrayList.LinkedList.Vector) 集合是JavaSE的重要组成部分,其与数据结构的知识密切相联,集合体系就 ...
- 第6节:Java基础 - 三大集合(上)
第6节:Java基础 - 三大集合(上) 本小节是Java基础篇章的第四小节,主要介绍Java中的常用集合知识点,涉及到的内容包括Java中的三大集合的引出,以及HashMap,Hashtable和C ...
- java基础技术集合面试【笔记】
java基础技术集合面试[笔记] Hashmap: 基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键(除了不同步和允许使用 null 之外,Ha ...
- 备战金三银四!一线互联网公司java岗面试题整理:Java基础+多线程+集合+JVM合集!
前言 回首来看2020年,真的是印象中过的最快的一年了,真的是时间过的飞快,还没反应过来年就夸完了,相信大家也已经开始上班了!俗话说新年新气象,马上就要到了一年之中最重要的金三银四,之前一直有粉丝要求 ...
- java基础(18):集合、Iterator迭代器、增强for循环、泛型
1. 集合 1.1 集合介绍 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数 ...
- Java基础之集合框架类及泛型简介
Collection接口 Collection 通用的常见方法 add()添加一个元素,可以指定脚标 addAll()将一个collection放入 clear()清除 remove()删除元素,返回 ...
- Java基础--说集合框架
版权所有,转载注明出处. 1,Java中,集合是什么?为什么会出现? 根据数学的定义,集合是一个元素或多个元素的构成,即集合一个装有元素的容器. Java中已经有数组这一装有元素的容器,为什么还要新建 ...
随机推荐
- BZOJ 4393: [Usaco2015 Dec]Fruit Feast
DP #include<cstdio> using namespace std; int T,A,B,F[5000005],G[5000005]; int main(){ scanf(&q ...
- bootstrap button
样式修改 .sign-button, .sign-button:hover, .sign-button:focus, .sign-button:active, .sign-button:visited ...
- 微信SSL证书更换的检查与安装方法
Ubuntu, Debian 查看根证书 确认操作系统上,是否存在以下文件: /etc/ssl/certs/DigiCert_Global_Root_CA.pem /etc/ssl/certs/Bal ...
- 码农与UI沟通的日常
事情是这样的,这是一个兴趣群组的效果图. 我看了一眼没有帖子时的提示,觉得这样的提示 不走心 不能展现出我们团队对于人生及世界的深度理解和高尚的品格. 于是,我选择了表达内心的真实感受. 我觉得这完美 ...
- C#定时器,定时做什么事情
http://www.cnblogs.com/bobositlife/archive/2015/09/29/aspnet-mvc-csharp-quartz-net-timer-task-schedu ...
- 赢友网络通用框架V10.0.0(WinuAppSoft) 基础框架设计表
/* * 版权所有:赢友网络(http://www.winu.net/) * 开发人员:新生帝(JsonLei) * 设计名称:赢友网络通用框架V10.0.0(WinuAppSoft) * 设计时间: ...
- Android环境安装简单总结
1.安装JDK 参考 http://jingyan.baidu.com/article/215817f7e3f2bd1eda1423f4.html 2.安装android SDK 参考 http:// ...
- 最少的硬币数量组合出1到m之间的任意面值(贪心算法)
题目描述: 你有n种不同面值的硬币,每种面值的硬币都有无限多个,为了方便购物,你希望带尽量少的硬币,并且要能组合出 1 到 m 之间(包含1和m)的所有面值. 输入描述: 第一行包含两个整数:m ,n ...
- python安装pattern失败
做文本分类需要用到pattern.en进行词形还原,安装了一上午都没有成功,mysqlclient安装失败.最后解决办法,pip install --only-binary :all: mysqlcl ...
- Python人工智能-基于百度AI接口
参考百度AI官网:http://ai.baidu.com/ 准备工作: 支持Python版本:2.7.+ ,3.+ 安装使用Python SDK有如下方式 >如果已经安装了pip,执行 pip ...