当前位置: 首页 > 编程日记 > 正文

集合、泛型、增强for

对于集合,首先要明确的是最顶层的接口是Collection接口类,其包含一些基本的方法以便子类调用,不过在定义的时候最好定义好数据类型,以免遍历时还得必须进行向上转型;特别注意的是其没有关于下标的方法。同时为了方便遍历其元素,建立了一个Iterable类由Collection进行实现其独有的返回迭代器的方法,以便下面的子类进行迭代的实现。

关于泛型:

(泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?
顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。)
个人认为就像个形参一样的,最好前期定义好,以免再出现转换类型。了解下通配符?,上限需要extends,下限需要super。不过泛型里面没有继承的概念。
增强for循环极大的减少的for循环的代码量,当不要进行操作而只是进行遍历时,建议还是使用增强版的。

一、集合:

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类:

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循环可以通过角标操作。

转载于:https://www.cnblogs.com/G-qz/p/11267991.html

相关文章:

【强推】Blender制作逼真人物角色完整案例视频教程

【强推】Blender制作逼真人物角色完整案例视频教程 【强推】Blender制作逼真人物角色完整案例视频教程 时长53h 30m 1280X720 MP4 含教程工程文件 共九大模块 130小节课程 教程大小&#xff1a;12.9G 语言:英语机译中文字幕&#xff08;含原英文字幕文件&#xff09; Victory…

Java学习总结:15

Object类 Object类的基本定义 Object类是所有类的父类&#xff0c;也就是说任何一个类在定义时如果没有明确地继承一个父类&#xff0c;那它就是Object类的子类。 取得对象信息&#xff1a;toString() 在Object类中的toString()方法设计时&#xff0c;由于要考虑其可以满足…

ECMAScript——引用数据类型之array

array 转载于:https://www.cnblogs.com/cataway/p/4967058.html

2022-2028年中国炼钢行业市场研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国炼钢行业市场行业相关概述、中国炼钢行业市场行业运行环境、分析了中国炼钢行业市场行业的…

mvc存储Cookie和读取Cookie方法

mvc存储Cookie和读取Cookie方法&#xff1a;//存储HttpCookie cookie new HttpCookie("User");System.Text.Encoding enc System.Text.Encoding.GetEncoding("gb2312");cookie["id"] HttpUtility.UrlEncode(logid.ToString(), enc);cookie[&q…

AJAX 简介

什么是 AJAX &#xff1f; AJAX 异步 JavaScript 和 XML。 AJAX 是一种用于创建快速动态网页的技术。 通过在后台与服务器进行少量数据交换&#xff0c;AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下&#xff0c;对网页的某部分进行更新。 传统的网…

c4d跟踪特效合成视频教程 Master Motion Tracking with Cinema 4D

c4d跟踪特效合成视频教程 Master Motion Tracking with Cinema 4D MP4 |视频&#xff1a;h264&#xff0c;1280720 |音频&#xff1a;aac&#xff0c;48000 Hz 语言&#xff1a;英语机译中文字幕 |尺寸&#xff1a;4.9 GB |持续时间&#xff1a;5小时2分钟 你将学到什么 百度…

[转]Getting Start With Node.JS Tools For Visual Studio

本文转自&#xff1a;http://www.c-sharpcorner.com/UploadFile/g_arora/getting-started-with-node-js-tools-for-visual-studio/ Table of contents 1. Introduction 2. What Node.JS is 3. How to install Node.JS 4. Lets Start by Creation of a Simple App Pre-requites…

Java学习总结:16

匿名内部类 匿名内部类指的是没有名字的内部类&#xff0c;其必须在抽象类或接口基础上才可以定义。 例&#xff1a;采用匿名内部类简化类的定义 interface Message{ //定义接口public void print(); } public class Test1_1_4_9 {public static void main(String args[]){fu…

Java 多线程概述

多线程技术概述 1.线程与进程 进程&#xff1a;内存中运行的应用程序&#xff0c;每个进程都拥有一个独立的内存空间。线程&#xff1a;是进程中的一个执行路径&#xff0c;共享一个内存空间&#xff0c;线程之间可以自由切换、并发执行&#xff0c;一个进程最少有一个线程&am…

nginx图片过滤处理模块http_image_filter_module安装配置笔记

http_image_filter_module是nginx提供的集成图片处理模块&#xff0c;支持nginx-0.7.54以后的版本&#xff0c;在网站访问量不是很高磁盘有限不想生成多余的图片文件的前提下可&#xff0c;就可以用它实时缩放图片&#xff0c;旋转图片&#xff0c;验证图片有效性以及获取图片宽…

Centos7 安装 telnet 服务

准备写一个 django-webtelnet&#xff08;运维管理系统集成后管理网络设备&#xff09;&#xff0c;但是手边没有现成的网络设备资源可以测试&#xff0c;那就研究下 Centos7 下安装 telnet-server 吧。 安装 yum -y install xinetd telnet telnet-server telnet-server 是以 x…

Zbrush制作手榴弹案例讲解学习教程

Sculpting In Zbrush- Project Grenade! MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:44节课(11h 43m) |大小解压后:11 GB 含课程素材 云桥网络…

Winform控件缩写

控件名称 缩写 Buttom按钮 Btn CheckBox复选框 Chk ColumnHeader视图列表头 Col ComboBox组合框 Cbo ContextMenu快捷菜单 Ctm DataGrid数据网格控件 Dg DataGridView数据网格视图控件 Dgv DteTimePicker时间输入框 Dtp DomainUpDown数值框 Dud Form窗体 …

Java习题:1

假设类X是类Y的父类&#xff0c;下列声明对象x的语句中不正确的是( )。 A.X xnew X(); B.X xnew Y(); C.Y xnew Y(); D.Y xnew X(); 答案&#xff1a;D 向下转型操作本身是有前提条件的&#xff0c;必须发生向上转型后才可以发生向下转型。 各个选项的代码实现&#xff1a; …

2022-2028年中国廉价航空行业深度调研及投资前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国廉价航空行业市场行业相关概述、中国廉价航空行业市场行业运行环境、分析了中国廉价航空行…

【SSRS】入门篇(二) -- 建立数据源

原文:【SSRS】入门篇(二) -- 建立数据源通过 【SSRS】入门篇(一) -- 创建SSRS项目 这篇&#xff0c;我们建立了一个SSRS项目&#xff1b; 接下来&#xff0c;我们以 AdventureWorks2012 示例数据库&#xff0c;讲下如何建立数据源&#xff1b;(AdventureWorks2012 下载) 1、解决…

k8s相关的面试题

k8s相关的面试题 https://blog.csdn.net/huakai_sun/article/details/82378856 posted on 2019-07-30 20:33 竹径风声 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/girl1314/p/11272568.html

CG游戏道具全流程制作视频教程 Artstation – Stylized Game Asset

CG游戏道具全流程制作视频教程 Artstation – Stylized Game Asset 时长&#xff1a;9h 30m 含项目文件 1920X1080 MP4 语言&#xff1a;英语机译中文字幕 教程大小&#xff1a;4G 标题&#xff1a;Artstation–风格化游戏资产 云桥网络 获qu 教程 信息&#xff1a; 内容&a…

Java学习总结:17

包及访问控制权限 包的定义 在Java中使用package关键字来定义包&#xff0c;此语句必须写在xxx.java文件的首行。 例&#xff1a;定义包 package com.study.Demo; //定义程序所在包&#xff0c;此语句必须放在首行public class Hello {public static void main(String args[…

常用的网络配置命令 ifconfig 所在的包

通过rpm的数据库反查 ifconfig这个可执行文件的提供者&#xff0c;得出这个文件属于一个叫 net-tools 的包 转载于:https://www.cnblogs.com/vanwoos/p/4987375.html

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心…

'libxml/tree.h' file not found

本文转载至 http://www.cnblogs.com/hanjun/p/3711173.html 看看Header Search Paths 为 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/usr/include/libxml2 看看Base SDK 为 ios 6.1 于是把Header Search Paths 该…

Spring Cloud 微服务实战笔记

Spring Cloud 微服务实战笔记 微服务知识 传统开发所有业务逻辑都在一个应用中, 开发&#xff0c;测试&#xff0c;部署随着需求增加会不断为单个项目增加不同业务模块&#xff1b;前端展现也不局限于html视图模板的形式,后端向前端支持需要更多的接口模块。 随着需求增多&…

UE商城资源 Kitsune狐狸女孩

Unreal Engine虚幻游戏引擎素材资源 Unreal Engine Marketplace –Kitsune 4.26狐狸女孩 大小解压后&#xff1a;569M 可爱的Kitsune的3D模型。装配到史诗骷髅。完全模块化&#xff0c;包括无衣服的身体。包含不同的发型。通过材质实例轻松改变颜色。包含与Live Link Face应用程…

Java学习总结:18

认识异常 异常是程序中导致程序中断的一种指令流。 例&#xff1a;产生异常 package com.study.Demo;public class Test1 {public static void main(String args[]){System.out.println("1.除法计算开始");System.out.println("2.除法计算&#xff1a;"(…

java从字符串中提取数字

1、做一下操作时会一般会用到提取数字操纵&#xff1a; a、列表中有翻页&#xff0c;当新添加的数据不是放在第一条或者最后一条时&#xff0c;需要翻页并循环找到对应的那条数据 b、当新添加的数据放在第一条或者最后一条时&#xff0c;则不需要翻页&#xff0c;只需要直接进入…

2022-2028年中国联合办公行业深度调研及投资前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国联合办公行行业市场行业相关概述、中国联合办公行行业市场行业运行环境、分析了中国联合办…

iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】

iBatis的sqlMap配置文件的selectKey元素有个type属性&#xff0c;可以指定pre或者post表示前生成(pre)还是后生成(post)。 Oracle设置 Xml代码 <!-- Oracle SEQUENCE --> <insert id"insertProduct-ORACLE" parameterClass"com.domain.Product&quo…

微信小程序----调用用户信息

在对应的文件夹里面的js里面添加代码&#xff0c;例如&#xff1a;index.js 代码开始/// onLoad: function () {var that this// 查看是否授权wx.getSetting({success(res) {if (res.authSetting[scope.userInfo]) {// 已经授权&#xff0c;可以直接调用 getUserInfo 获取头像…