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中已经有数组这一装有元素的容器,为什么还要新建 ...
随机推荐
- qt4.8.5 qtwebkit 静态编译 版本
2013年就编译好了,qtwebkit是最不好编译的了,尤其是静态编译,这儿分享给大家 估计总有人会用得到... 静态库下载地址:http://yunpan.cn/cyyNqrApbVDwq 提取码 ...
- c++ primer 读书笔记
顺序容器:为程序提供控制元素存储和访问顺序的能力,这种顺序与元素加入到容器时的位置相对应,而与元素值无关. 另外还有根据关键字的值来存储元素的容器:有序.无序关联容器. 另外STL还有三种容器适配器, ...
- http的一些知识
TCP/IP协议分层 应用层 TFP DNS DNS域名解析的过程 在浏览器DNS缓存中搜索 读取系统的hosts文件,查找其中是否有对应的ip 向本地配置的首选DNS服务器发起域名解析请求 HTTP ...
- order by 对null的处理
[Oracle 结论] order by colum asc 时,null默认被放在最后order by colum desc 时,null默认被放在最前nulls first 时,强制null放在最 ...
- [Android]APK一键反编译
每次反编译就是件很烦的事情,烦了就开始偷懒.直接写成脚本节省操作. 使用apktool,d2j-dex2jar进行反编译 脚本:reseve-complie-apk.py import os impo ...
- 习题:Wormhole(思路题)
tyvj1763 描述 一维的世界就是一个数轴.这个世界的狭小我们几乎无法想象.在这个数轴上,有N个点.从左到右依次标记为点1到N.第i个点的坐标为Xi.经过漫长时间的物理变化和化学变化,这个一维世界 ...
- 秀秀的照片(photo)
秀秀的照片(photo) 题目描述 华华在和秀秀视频时有截很多图.华华发现秀秀的每一张照片都很萌很可爱.为什么会这样呢?华华在仔细看过秀秀的所有照片后,发现秀秀的照片都具有一个相同的性质. 设秀秀的分 ...
- TCP面试题之为什么会有TIME_WAIT状态
1.确保有足够的时间让对方收到ACK包:(一来一去刚好是2MSL) 2.避免新旧连接混淆 MSL(最大报文段的生成时间)在RFC793中规定hi2分钟,实际应用是30秒,1分钟,2分钟等:
- nodeJS学习(9)--- nodeJS模块:exports vs module.exports
模块简介: 通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ 这些核心模块被编译成二进制文件,可以 require('模块名') ...
- 在做展开功能的时候,字体变多了,字体会变大的bug的解决方案
在没有限制高度的情况下字体会变大,要做展开效果,当然不能限制高度. 解决方案是,加个max-height就可以解决这个问题