Java集合框架概述和集合的遍历
第三阶段 JAVA常见对象的学习
集合框架概述和集合的遍历
(一) 集合框架的概述
(1) 集合的由来
如果一个程序只包含固定数量的且其生命周期都是已知的对象,那么这是一个非常简单的程序。
通常,程序总是根据运行时才知道的某些条件去创建新对象。在此之前,不会知道你所需要对象的数量,甚至不知道确切的类型。为了解决这个普遍的编程问题,需要在任意时刻和任意位置创建任意数量的对象。所以,就不能依靠创建命名的引用来持有每一个对象,因为你不知道实际上会需要多少这样的引用
——Thinking in Java
我们来简单的解释一下:
首先要知道我们所学习的Java语言是一个完全面向对象的语言,而这种语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储。
一个基本类型的变量显然是无法满足存储多个对象的,所以应该是一个容器类型的变量,通过前面的知识,我们知道数组和StringBuffe、StringBuilder均属于容器类型。但是呢? StringBuffer的结果是一个字符串,不一定满足我们的要求,所以我们只能选择数组,这就是对象数组。
可是问题又来了,对象数组又不能适应变化的需求,因为数组的长度是固定的,这个时候,为了适应变化的需求,Java就提供了集合类供我们使用。
(2) 数组和集合的区别?
A:长度区别
数组的长度固定
集合长度可变
B:内容不同
数组存储的是同一种类型的元素
而集合可以存储不同类型的元素
C:元素的数据类型问题
数组可以存储基本数据类型,也可以存储引用数据类型
集合只能存储引用类型(装对象)
虽然数组看起来有一丝不太灵活,但数组也确实是保存一组对象的有效方法,如果想要保存一组基本数据类型,我们也推荐使用这种方法,只是由于其长度固定,导致它在很多时候也受到一些限制。
补充:
在Java中,数组是一种效率最高的存储和随机访问对象的引用序列的方式。数组就是一个简单的线性序列,这使得元素访问非常快速。但是为这种速度所付出的代价是数组对象的大小被固定,并且在其生命周期中不可改变。你可能会建议使用ArrayList,它可以通过创建一个新实例,然后把旧实例中所有的引用到移到新实例中,从而实现更多空间的自动分配。尽管通常应该首选ArrayList而不是数组、但是这种弹性需要开销,因此,ArrayList的效率比数组低很多。
——Thinking in Java 第16章
(3) 集合框架关系,以及Collection 类简介
Java提供了很多种集合类,他们的数据结构是不同的,但是,它们肯定有一些共性的地方 (存储,获取,判断)一直向上追溯,我们可以的得到这样继承体系
Collection : 是集合的顶层接口,它的子体系有重复的,有唯一的,有有序的,有无序的。
Collection c = new Collection(); //这是错误的 接口不能实例化
Collection的功能概述:
1:添加功能
//添加一个元素
Boolean add(Object obj)
//添加一个集合的元素
Boolean addAll(Collection c)
2:删除功能
//移除所有元素
void clear()
//移除一个元素
boolean remove(Object o)
//移除一个集合的元素(有一个移除就返回true)
Boolean removeAll(Collection c)
3:判断功能
//判断集合中是否包含指定的元素
Boolean contains(Object o)
//判断集合中是否包含指定的集合元素(包含所有)
Boolean containsAll(Collection c)
//判断集合是否为空
Boolean isEmpty()
4:获取功能(重点)
Iterator<E> iterator()
5:长度功能
int size()
面试题:数组有没有length()方法呢?字符串有没有length()方法呢?集合有没有length()方法呢?
数组求长度用length属性
字符串求长度用length()方法
集合求长度用size()方法
6:交集功能
//两个集合A B ,A对B交集,最终的结果保存在A 中,B不变。返回值表示的是A是否发生过改变
boolean retainAll(Collection c)
7:把集合转换为数组
Object[] toArray()
(二) 集合的遍历
(1) 集合转数组遍历
import java.util.ArrayList;
import java.util.Collection;
public class Demo {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("I");
c.add("love");
c.add("you");
c.add("!");
Object[] objs = c.toArray();
for (int x = 0; x < objs.length; x++) {
//System.out.println(objs[x]);
//得到的元素是字符串,我在获取到元素的同时,如果还想知道元素的长度
//System.out.println(objs[x] + "---" + objs[x].length());
//上述代码实现不了是因为,Object中没有length()方法
//我们想要使用字符串的方法,就必须把元素还原成字符串
//向下转型
String s = (String) objs[x];
System.out.println(s + "---" + s.length());
}
}
}
/*
* Collection存储自定义对象并遍历案例
*/
import java.util.ArrayList;
import java.util.Collection;
public class StudentDemo {
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList();
//创建学生对象
Student s1 = new Student("admin", 10);
Student s2 = new Student("张三", 20);
Student s3 = new Student("李四", 30);
Student s4 = new Student("王五", 40);
//把学生添加到集合
c.add(s1);
c.add(s2);
c.add(s3);
c.add(s4);
//把集合转化为数组
Object[] objs = c.toArray();
//遍历数组
for (int x = 0; x < objs.length; x++) {
//System.out.println(objs[x]);
//得到的元素是字符串,我在获取到元素的同时,如果还想知道元素的长度
//System.out.println(objs[x] + "---" + objs[x].length());
//上述代码实现不了是因为,Object中没有length()方法
//我们想要使用字符串的方法,就必须把元素还原成字符串
//向下转型
Student s = (Student) objs[x];
System.out.println(s.getName() + "-" + s.getAge());
}
}
}
(2) 集合迭代器遍历
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
* Iterator iterator() 迭代器,集合的专用遍历方式
* Object next():获取元素
* oolean hasNext():如果仍有元素可以迭代,则返回 true。
*/
public class IteratorDemo {
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList();
c.add("I");
c.add("love");
c.add("you");
c.add("!");
//实际返回的肯定是子类对象,这里是多态
Iterator it = c.iterator();
while (it.hasNext()) {
String s = (String) it.next();
System.out.println(s);
}
}
}
//运行结果
I
love
you
!
集合的使用步骤:
创建集合元素
创建元素对象
把元素添加到集合
遍历集合
(1) 通过集合对象获取迭代器对象 —— Iterator it = c.iterator();
(2) 通过迭代器对象的hasNext()方法判断是否有元素 ——while
通过迭代器对象的next()方法获取元素并且移动到下一个位置
迭代器为什么不定义成一个类,而是一个接口?
假设迭代器定义的是一个类,这样我们就可以创建该类的对象,调用该类的方法来实现集合的遍历。但是呢?我们想想,Java中提供了很多的集合类,而这些集合类的数据结构是不同的,所以存储的方式和遍历的方式应该是不同的。进而它们的遍历方式也应该是不同的,最终就没有定义迭代器类。
而无论你是哪种集合,你都应该具备获取元素的操作,并且,最好再辅助于判断功能,这样在获取前,先判断,这样就更不容易出错。也就是说,判断功能和获取功能应该是一个集合遍历所具备的,而每种集合的方式又不太一样,所以我们把这两个功能给提取出来,并不提供具体实现,这种方式就是接口。
那么,真正的具体实现类在哪里呢?
在真正的具体的子类中,以内部类的方式体现。
结尾:
如果内容中有什么不足,或者错误的地方,欢迎大家给我留言提出意见, 蟹蟹大家 !_
如果能帮到你的话,那就来关注我吧!(系列文章均会在公众号第一时间更新)
在这里的我们素不相识,却都在为了自己的梦而努力 ❤
一个坚持推送原创Java技术的公众号:理想二旬不止
Java集合框架概述和集合的遍历的更多相关文章
- Java集合源代码剖析(一)【集合框架概述、ArrayList、LinkedList、Vector】
Java集合框架概述 Java集合工具包位于Java.util包下.包括了非常多经常使用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集合框架下大致能够分为例如以下五个部分:List ...
- 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合
不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...
- 第14章 集合框架(1)-List集合的各种类
1.概述 1.1.Java集合框架的由来 1.2.什么是集合框架? 1.3.为什么需要集合框架 1.4.常用的框架接口规范 2.Vector类 2.1.存储原理 2.2.构造方法 2.3.常用方法 3 ...
- Java 集合系列之一:JCF集合框架概述
容器,就是可以容纳其他Java对象的对象.Java Collections Framework(JCF)为Java开发者提供了通用的容器 java集合主要划分为四个部分: Collection(Lis ...
- Java集合框架概述
集合框架指的是容器类.Java中大量持有对象的方式有数组和容器类两种方式.数组相较于容器类的优点在于:①随机访问效率高:由于是连续的存储空间,可以计算地址直接访问 ②类型确定:数组在创建时即可确定元素 ...
- Java ——集合框架 list lambda set map 遍历方法 数据结构
本节重点思维导图 集合框架 有序无序:元素放入的顺序与取出的顺序是否一致,一致即为有序,不一致即无序. List:允许重复.有序 ArrayList:长度可变的数组,遍历速度快 LinkedList: ...
- java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类
本文关键词: java集合框架 框架设计理念 容器 继承层级结构 继承图 集合框架中的抽象类 主要的实现类 实现类特性 集合框架分类 集合框架并发包 并发实现类 什么是容器? 由一个或多个确 ...
- -1-3 java集合框架基础 java集合体系结构 Collection 常用java集合框架 如何选择集合 迭代器 泛型 通配符概念 Properties 集合 迭代器
集合又称之为容器存储对象的一种方式 •数组虽然也可以存储对象,但长度是固定的:显然需要可变长度的容器 集合和数组的区别? A:长度区别 ...
- (1)StringBuilder类和StringBuffer类 (2)日期相关的类 (3)集合框架 (4)List集合
1.StringBuilder类和StringBuffer类(查手册会用即可)1.1 基本概念 由于String类描述的字符串内容无法更改,若程序中出现大量类似的字符串时需要申请独立的内存空间单独保存 ...
随机推荐
- 008_Linux驱动之_IO口的配置
1. 测试:配置S3C2440的GPF4,5,6为输出 2. 测试IO的地址从芯片手册中获取以下资料 3. 从上面可以看出配置输出对应的设置是01=输出,那么对应位如:[9:8]需要设置成=01 4. ...
- 034_非交互自动生成 SSH 密钥文件
#!/bin/bash#-t 指定 SSH 密钥的算法为 RSA 算法;-N 设置密钥的密码为空;-f 指定生成的密钥文件存放在哪里 rm -rf ~/.ssh/{known_hosts,id_rsa ...
- Shell 03 for while case 函数 中断及退出
一.for循环 1.脚本1,通过循环批量显示5个hello world ( in 1 2 3 4 5 ) 2.脚本2,通过循环批量显示10个hello world ( in {1..10} ...
- controller层直接通过server类调用mapper的通用方法
自己写的方法没有,但是逆向生成的server类会有继承maybatis-plus的框架 与下图的配置有关
- Hdu Can you find it?(二分答案)
Can you find it? Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others) P ...
- I Hate It (HDU 1754)
Problem 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师 ...
- yquery-操作样式属性
前几天回家,参加了全国的成人高考,都说学历是找工作的敲门砖,其实一点都不假,尤其是现在的社会竞争力那么强,你不学就会被淘汰.像要过自己想要的生活,就必须努力学习,努力赚钱,买自己想买的,过自己想过的. ...
- mysql —备份和恢复
备份的目的 灾难恢复.硬件故障.软件故障.自然灾害.黑客攻击.误操作测试等数据 丢失场景 备份注意要点 能容忍最多丢失多少数据 恢复数据需要在多长时间内完成 需要恢复哪些数据 还原要点 做还原测试,用 ...
- qt 创建及调用QT的 DLL
先讲一下对QT动态链接库的调用方法,主要包括: 1.显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法 2.显示链接DLL,调用DLL中类对象.成员函数.(通过对象即可实现类成员函数 ...
- Infralution.Localization.Wpf
WPF Localization Using RESX Files Once you have downloaded the source code and built it, add a refer ...