java中的集合框架_JAVA中的集合框架(上)List

第一节 JAVA中的集合框架概述

集合的概念,现实生活中:很多事物凑在一起就是一个集合;数学中的集合:具有相同属性事物的总体;JAVA中的集合:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象。集合的作用:在类的内部,对数据进行组织(如果有些属性类型相同,但意义与作用不同,咱们就不能把它们放到集合,如学生的姓名和性别属性),简单而快速的搜索大数量的条目。

有的集合接口,提供了一系列排列有序的元素,并且可以在序列中间快速的插入或者删除有关元素;

有的集合接口,提供了映射关系,可以通过关键字key去快速查找到对应的唯一对象,而这个关键字可以是任意类型。

集合其实就是用来承装其它对象的容器。

与数组相比,为何选择集合而不是数组?数组的长度固定,还得复制,集合的长度可变。数组只能通过数组下标访问元素,类型固定,而有的集合可以通过任意类型查找所映射的具体对象,数组还要遍历元素比较麻烦。

集合的框架体系结构:

f4182f70dbda3f51cebe0e708c73f36e.png

将collection想象成单身宿舍,三个子接口。

1.List(序列):排列有序,可重复

2.Queue(队列):排列有序,可重复

3.set(集):无序,不可重复

将map当成成对出现,Collection 是存储的一个一个的对象,而Map提供映射的关系,内部以的Key,Value两个对象为一个映射来存储数据,Entry类(键值对)是Map的内部类,Key,Value就是Entry的实例,key和value可以是任意类型的对象。两个根接口:Collection和Map,Collection的子接口有:List序列(有序可重复)、Queue队列、Set集(无序不可重复)。实现类分别:ArrayList数组序列,LinkedList链表也是List的接口实现类,HashSet哈希集;Map的实现类有:HashMap哈希表。

在Collection或Map内部是如何存储对象呢?在每一个Collection类中,存储的就是一个个独立的对象,而Map内部有些特殊。有些集合内部能提供一种映射的关系,就是指Map类,在Map类的内部,一个key一个value两个对象为一个映射去存储数据,这样的一个映射就是Entry类的实例,这个Entry类是Map类的一个内部类,咱们把它翻译成键值对,一个键一个值,两个凑成映射的一对,其中key和value可以是任意类型的对象。

在Collection和Map众多子接口和实现类当中,ArrayList、HashSet、HashMap使用最多的三个实现类

第二节 Collection接口List接口简介

Collection接口、子接口及其实现类,Collection接口是java框架中的根接口,也是List、Set和Queue接口的父接口;定义了很多方法,可用于操作List、Set和Queue的方法,对集合的增删改查,可在API中查看Collection的介绍和方法。

List接口和其实现类 ArrayList

1.List是元素有序并且可以重复的集合,被称为序列

2.List可以精确的控制每个元素的插入位置,或删除某个指定位置的元素

3.ArrayList 数组序列,是List的一个重要实现类

4.ArrayList底层是由数组实现的

第三节 学生选课--创建学生类和课程类

/**

* 课程类

* Created by Administrator on 2017/4/2.

*/

public class Course {

private String id;

private String name;

public String getId() {

return id;

}

public String getName(){

return name;

}

public void setId(String id){

this.id=id;

}

public void setName(String name) {

this.name = name;

}

public Course(String id,String name){

this.id=id;

this.name=name;

}

}

import java.util.HashSet;

import java.util.Set;

/**

* 学生类

* Created by Administrator on 2017/4/2.

*/

public class Student {

private String id;

private String name;

public Set courses;

//课程信息存放在set属性里,和list一样是一个子接口

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Student(String id,String name){

this.id=id;

this.name=name;

this.courses=new HashSet();

//构造方法里不能直接实例化,因为set是一个接口,通过HashSet()对courses实例化,HashSet是一个重要的实现类

}

}

第四节 学生选课--添加课程I

在这里注意在List中添加元素,如果插入位置如果大于容量的长度就会报越界异常,如等于容量会在队尾添加一个,小于0也会报错。

import java.util.ArrayList;

import java.util.List;

/**

* 添加课程

* Created by Administrator on 2017/4/2.

*/

//既然学生要选课就要存放备选课程,用一个List容器来存放备选课程

public class ListTest {

//新建ListTest类

//创建一个List类型的属性,用于存放备选课程的容器List

public List courseToSelect;

//给类添加一个构造方法

public ListTest(){

this.courseToSelect=new ArrayList();

//因为List是一个接口,咱们不能直接将它实例化,这里就引入了ArrayList来实现接口的实例化

}

//用于往courseToSelect添加课程对象

public void testAdd(){

//首先要有一个课程对象的实例

Course cr1=new Course("1","数据结构");

//调用add方法添加

courseToSelect.add(cr1);

//打印输出 courseToSelect.get(0)的数据

//当一个对象存入集合后它就变成了Object类型的数据取出时就要把类型转换回来

Course temp=(Course) courseToSelect.get(0);

System.out.println("成功添加课程:"+temp.getId()+":"+temp.getName());

Course cr2=new Course("2","C语言");

//重载的add方法可以指定位置添加元素

courseToSelect.add(0,cr2);

Course temp2=(Course) courseToSelect.get(0);

System.out.println("成功添加课程:"+temp2.getId()+":"+temp2.getName());

}

//调用main方法测试

public static void main(String[] args) {

ListTest lt=new ListTest();

lt.testAdd();

}

}

第五节 添加课程II

add和addAll分别各有两个方法,参数不同。其中addAll 需要先把数组转换成list Arrays.asList();这个方法也是有两种用法,可以指定位置添加元素。

Course[] cr3={new Course("3","离散数学"),new Course("4","汇编语言")};

//创建一个课程数组

//调用addAll把数组添加进去,但是这儿的参数要是Collection的实例,

// 就需要把数组转换成List,用Arrays.asList()方法

courseToSelect.addAll(Arrays.asList(cr3));

//输出

Course temp3=(Course)courseToSelect.get(2);

Course temp4=(Course)courseToSelect.get(3);

System.out.println("成功添加课程:"+temp3.getId()+":"+temp3.getName()+";"

+temp4.getId()+":"+temp4.getName());

Course[] cr4={new Course("5","高等数学"),new Course("6","大学英语")};

courseToSelect.addAll(2,Arrays.asList(cr4));

Course temp5=(Course)courseToSelect.get(2);

Course temp6=(Course)courseToSelect.get(3);

System.out.println("成功添加课程:"+temp5.getId()+":"+temp5.getName()+";"

+temp6.getId()+":"+temp6.getName());

}

第六节 学生选课--课程查询

get方法可以取到指定位置的元素,如果想取出每一个则可以使用for循环来遍历List,由于List中的数据类型是Object,再输出时需要强制转换下类型。长度集合.size()方法。

/**

* 定义方法循环遍历List中的元素

*/

public void test1(){

System.out.println("使用for循环遍历List中一共有以下课程");

for(int i=0;i

//因为类型不同需要强制类型转换

System.out.println("课程:"+((Course)courseToSelect.get(i)).getId()+":"+

((Course)courseToSelect.get(i)).getName());

}

}

public void test2(){

System.out.println("使用foreach循环遍历List中一共有以下课程");

for(Object obj:courseToSelect){

//因为类型不同需要强制类型转换

System.out.println("课程:"+((Course)obj).getId() +":"+((Course)obj).getName());

}

}

接下来还可以试验下List的重复性问题,List中可以重复元素

还有一种的特殊遍历方法,是通过迭代器来遍历集合中的元素 Iterator

Iterator就是迭代器的意思,在Collection接口中定义了iterator方法,通过这个方法可以返回一个当前集合对象的迭代器,再通过这个迭代器去遍历集合中的每个元素,Iterator本身也是一个接口。迭代器本身只是用来遍历元素的,它自己不具备任何存储的功能,可以理解为迭代器依赖于某个集合而存在,本身不能独立存在。

public void test3(){

System.out.println("通过迭代器遍历集合中元素,共有以下课程:");

//通过集合的iterator方法来创建迭代器的实例

Iterator it=courseToSelect.iterator();

//遍历元素如有元素则输出它的真值

while(it.hasNext()){

Course cr=(Course) it.next();

System.out.println("课程:"+cr.getId()+":"+cr.getName());

}

}

第七节 学生选课--课程修改

如何修改List张的元素?用set方法,用指定元素替换列表中指定位置的元素。

set(int index,E element)

参数,要替换元素的索引,要在指定位置存储的元素

courseToSelect.set(4, new Course("7","毛概"));

第八节 学生选课--课程删除

删除List中的元素,删除的方法有remove 和removeAll方法

remove(int index)移除列表中指定位置的元素

remove(object o)此列表中移除第一次出现的指定元素(如果存在)

removeAll(Collection> c)从此列表中移除指定Collection中包含的其所有元素,在某个集合中将另一个集合中的所有元素完全删除,注意要将数组转换成List——Arrays.asList();

public void test5(){

Course[] courses={(Course)courseToSelect.get(4),(Course)courseToSelect.get(5)};

courseToSelect.removeAll(Arrays.asList(courses));

courseToSelect.remove(0);

courseToSelect.remove(courseToSelect.get(0));

}

第九节 学生选课--应用泛型管理

是否有方法可以控制我往某个List或某个集合中添加元素的类型呢?

这时我们就要用到泛型。

泛型:集合中的元素,可以是任意类型的对象(对象的引用),集合里储存的都是一个个引用,它们都是指向某个具体的对象的。如果把某个对象放入集合,则会忽略他的类型,仅仅把它当做Object来处理,取出也是把它当做Object来取出。泛型则是规定了某个集合只能存放特定类型的对象,并且会在编译期间对其进行类型检查,可以直接按指定类型获取出集合中的元素,这样我们在后续获取并使用时不用因为Object类型再去强制转换了,直接就能使用。

public class ListText {

public List courses;

public ListText(){

this.courses=new ArrayList();

}

}

第十节 应用泛型管理课程

其实在泛型集合中,除了可以保存泛型类型的对象实例,还可以存入泛型的子类型的对象实例。泛型集合可以添加泛型子类型的对象实例,泛型不能是基本类型,必须是引用类型,如果非要用基本类型,可以通过使用包装类限定允许存入的基本数据类型。int Integer long Long boolean Boolean泛型是基本类型的包装类的实例化 举例:

List< Integer > list=new ArrayList < Integer > ();

第十一节 通过Set集合来管理课程

Set接口及其实现类——HashSet,Set是元素无序并且不可以重复的集合,被称为集,HashSet——哈希集,是Set的一个重要实现类,Set没有提供方法去修改某个位置上的元素,由于List有序,Set无序且不可重复,所以Set不可能提供一个指定索引位置,去修改相应元素的办法。没有set()方法,一样有add addAll remove removeAll size()等方法,Set方法的遍历只能用foreach或者iterator,不能用get方法,因为无序,也无法查询指定索引位置的元素。

package student;

import java.util.Arrays;

import java.util.List;

import java.util.ArrayList;

import java.util.Scanner;

/**

* Created by Administrator on 2017/4/3.

*/

public class SetTest {

/**

*案例功能:

* 提供备选课程

* 创建学生对象,并给该学生添加三门课程添加在学生的courses—Set

* 类型的属性当中

* 显示备选课程

* 循环三次,每次输入课程ID

* 往学生的courses属性中添加与输入的ID相匹配的课程,

* 输出学生选择的课程

*/

//定义一个课程List,并且调用构造方法初始化。后将之前的添加方法赋值过来并遍历课程输出

public List courseToSelect;

public SetTest(){

this.courseToSelect=new ArrayList();

}

public void testAdd(){

//首先要有一个课程对象的实例

Course cr1=new Course("1","数据结构");

//调用add方法添加

courseToSelect.add(cr1);

//打印输出 courseToSelect.get(0)的数据

//当一个对象存入集合后它就变成了Object类型的数据取出时就要把类型转换回来

Course temp=(Course) courseToSelect.get(0);

System.out.println("成功添加课程:"+temp.getId()+":"+temp.getName());

Course cr2=new Course("2","C语言");

//重载的add方法可以指定位置添加元素

courseToSelect.add(0,cr2);

Course temp2=(Course) courseToSelect.get(0);

System.out.println("成功添加课程:"+temp2.getId()+":"+temp2.getName());

Course[] cr3={new Course("3","离散数学"),new Course("4","汇编语言")};

//创建一个课程数组

//调用addAll把数组添加进去,但是这儿的参数要是Collection的实例,

// 就需要把数组转换成List,用Arrays.asList()方法

courseToSelect.addAll(Arrays.asList(cr3));

//输出

Course temp3=(Course)courseToSelect.get(2);

Course temp4=(Course)courseToSelect.get(3);

System.out.println("成功添加课程:"+temp3.getId()+":"+temp3.getName()+";"

+temp4.getId()+":"+temp4.getName());

Course[] cr4={new Course("5","高等数学"),new Course("6","大学英语")};

courseToSelect.addAll(2,Arrays.asList(cr4));

Course temp5=(Course)courseToSelect.get(2);

Course temp6=(Course)courseToSelect.get(3);

System.out.println("成功添加课程:"+temp5.getId()+":"+temp5.getName()+";"

+temp6.getId()+":"+temp6.getName());

}

public void test2(){

System.out.println("使用foreach循环遍历List中一共有以下课程:");

for(Object obj:courseToSelect){

//因为类型不同需要强制类型转换

System.out.println("课程:"+((Course)obj).getId() +":"+((Course)obj).getName());

}

}

public static void main(String[] args) {

SetTest st=new SetTest();

st.testAdd();

st.test2();

Student st1=new Student("1","宫园薰");

System.out.println("欢迎"+st1.getName()+"同学选课!每位同学可以选取三门课程哦");

Scanner sc=new Scanner(System.in);

//for循环循环三次,通过对比ID来存入对应的课程信息

for(int i=0;i<3;i++) {

System.out.println("请输入您选择的课程ID:");

String courseId = sc.next();

for (Course cr : st.courseToSelect) {

if (courseId.equals(cr.getId())) {

st1.courses.add(cr);

break;

}

}

}

for(Course cr2:st1.courses){

System.out.println("您选择了课程:ID:"+cr2.getId()+":"+cr2.getName());

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【接口时序】2、Verilog实现流水灯及与C语言的对比

一、 软件平台与硬件平台 软件平台&#xff1a; 1、操作系统&#xff1a;Windows-8.1 2、开发套件&#xff1a;ISE14.7 3、仿真工具&#xff1a;ModelSim-10.4-SE 硬件平台&#xff1a; 1、FPGA型号&#xff1a;XC6SLX45-2CSG324 二、 原理介绍 我的开发板上有4个LED灯&#xf…

python中文编程教学_中谷python中文视频教程(全38集)

python在线教学视频教程共40节&#xff0c;中谷教育录制&#xff0c;主要介绍了python编程方面的知识。python在线教学-01-走进pythonpython在线教学-02-开始编程吧python在线教学-03-变量python在线教学-04-运算符-表达式python在线教学-05-数据类型-数字-字符串python在线教学…

java 异步socket_java Socket读写异步分离

在Android开发中&#xff0c;基于Socket的通信必须是非阻塞式的&#xff0c;因此需要Reader和Writer异步分离&#xff0c;此外需要监听Socket网络状态、监听接口package com.io.sockets;import java.io.IOException;import java.net.Socket;public interface SocketStatusListe…

windows下安装mysql服务

1.下载 首先上MySql的官网下载 https://dev.mysql.com/downloads/mysql/ &#xff0c;本人下载的是 mysql-5.7.24-winx64.zip版。 2.解压存放目录 下载完解压到你想要存放的位置 我的是解压到D:\Program Files\MySQL 。 3.配置环境变量 在环境变量path中追加一句&#xff1a;;D…

web.xml 配置文件 超详细说明!!!

一、web.xml是什么&#xff1f; 首先 web.xml 是java web 项目的一个重要的配置文件&#xff0c;但是web.xml文件并不是Java web工程必须的。 web.xml文件是用来配置&#xff1a;欢迎页、servlet、filter等的。当你的web工程没用到这些时&#xff0c;你可以不用web.xml文件来配…

python条件表达式三门课至少有一门及格_Python/ MySQL练习题(一)

Python/ MySQL练习题(一)2、查询“生物”课程比“物理”课程成绩高的所有学生的学号1 SELECT2 *3 FROM4 (5 SELECT6 *7 FROM8 course9 LEFT JOIN score ON score.course_id course.cid10 WHERE11 course.cname ‘生物‘12 ) AS A13 INNER JOIN (14 SELECT15 *16 FROM17 course…

window上安装mysql服务核心版(亲测可用)

上次安装服务启动后&#xff0c;这次又准备重新安装&#xff0c;出现了了很多问题 1首先我们还是去官网下载对应的window安装包 2放置在D:\Program Files\mysql下面&#xff0c;没有则新建一个Program Files 3在同路径下E:\Program Files\mysql建立一个my.ini文件 [mysql] 设置…

java添加信息_java – 向异常添加信息

我想向堆栈跟踪/异常添加信息.基本上我现在有这样的东西,我真的很喜欢&#xff1a;Exception in thread "main" java.lang.ArithmeticException: / by zeroat com.so.main(SO.java:41)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect…

python封装模块_Python练手,封装日志模块,v2

前面第1版写好后&#xff0c;很凌乱&#xff0c;主要的问题在于&#xff0c;Python不支持方法重载&#xff0c;想要灵活创建对象&#xff0c;当时的变通办法是&#xff0c;先链式地有选择地设置属性(方法重载的本质就是有选择地设置属性)&#xff0c;再做实例化&#xff0c;这样…

发现了拯救“文献多的一团麻”的工具

Endnotes是一款好的文献管理工具; 可用以收集文献&#xff1b;整理在引用文献时的不知所踪(提前在reference中细化标题)&#xff1b;还有一些在阅读文献时 转瞬即逝的灵感(notes); 使用笔记来自&#xff1a;感谢其悉心编写。 http://blog.sciencenet.cn/blog-484734-367968.htm…

windows安装apache

1打开apache官网http://httpd.apache.org/ 下载win版本 2解压放入D盘D:\Apache24 3修改http.conf,安装路径 端口改成8080&#xff0c;避免占用&#xff0c;原先是80 4http -t检查配置文件合法 5httpd -k install -n apache安装主服务 6net start apache

java语言中的标识符_Java语言基本语法(一)————关键字标识符(Java语言标识符命名规范Java语言的包名、类名、接口名、变量名、函数名、常量名命名规则 )...

一、关键字关键字的定义和特点定义&#xff1a;被Java语言赋予特殊含义&#xff0c;用做专门用途的字符串(单词)。特点&#xff1a;关键字中所有字母均为小写下面列举一些常用的关键字。用于定义数据类型的关键字&#xff1a;byte、short、int、long、float、double、char、boo…

数组的合并和升序排列_leetcode No.31 下一个排列

题目链接&#xff1a;下一个排列 - 力扣&#xff08;LeetCode&#xff09;​leetcode-cn.com题目描述&#xff1a;实现获取下一个排列的函数&#xff0c;算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列&#xff0c;则将数字重新排列成…

公司网络故障那些事(路由器变交换机)

首先这次网络故障是断电引起的 我给大家画个模型 三层的为八口交换机 一层的为五口打印机 笔记本代表两台无线打印机 首先八口的连接了公司采购电脑一台&#xff0c;业务电脑一台&#xff0c;其他电脑三台 第二个五口交换的连接财务电脑两台 最后一个五口交换机连接两台无线打印…

【原创】大公司为什么还在采用过时的技术

背景 本文出自一朋友给我的提问&#xff0c;于是博主呕心沥血给他花式洗脑了几个小时。忽然发现&#xff0c;应该还有许多朋友有同样的疑问。所以整理成文。 许多刚毕业的程序员朋友&#xff0c;都有一个执念&#xff0c;想要进那种规模大一点的公司、上市的、业内有名的最好。…

java 文件上传 配置_SpringMVCMultipartFilefile文件上传及参数接收

一、form表单属性中加上enctype"multipart/form-data"form表单的二、配置文件中配置MultipartResolver文件超出限制会在进入controller前抛出异常&#xff0c;在允许范围内这个配置无影响三、MultipartFile接受文件并通过IO二进制流(MultipartFile.getInputStream())…

list foreach方法_Java集合三兄弟List,Set,Map你分的清楚吗?

前言集合作为Java基础知识的核心部分&#xff0c;不论是在面试还是平时工作中都是经常遇见的。当然面对熟悉的List、Set、Map&#xff0c;面试管的提问一般也都不会从简单的问题出发了&#xff0c;今天就来聊下集合中的高级部分&#xff0c;让你对它们的理解更加清楚。一、List…

centos7.3防火墙配置

Centos7.3防火墙配置 1、查看firewall服务状态 systemctl status firewalld 2、查看firewall的状态 firewall-cmd --state 3、开启、重启、关闭、firewalld.service服务 开启 service firewalld start 重启 service firewalld restart 关闭 service firewalld stop 4、…

SpringBoot使用Jsp

本文是简单总结一下SpringBoot使用Jsp的Demo。 前言 在早期做项目的时候&#xff0c;JSP是我们经常使用的java服务器页面&#xff0c;其实就是一个简化servlet的设计&#xff0c;在本文开始之前&#xff0c;回顾一下jsp的几大对象&#xff0c;如图。 而在现在SpringBoot框架流行…

java 持久_Java持久锁总结 -解道Jdon

并发主题Java与持久相关的锁总结本文总结Java中有关数据库保存持久数据的锁机制&#xff0c;不只是纯粹数据库自身的锁&#xff0c;本文主要就Java持久层三个技术数据库、JPA和Hibernate的锁应用进行了总结。在并发理论中&#xff0c;锁是用于保护可变的共享数据&#xff0c;以…