1.认识集合

Java中可以使用数组存储多个类型相同的数据,但是使用数组存在如下缺陷:

数组长度固定,不能很好的适应元素动态变化的情况;

可以通过数组名.length获取数组的长度,但是不能直接获取数组中实际存储的元素个数。

针对数组的缺陷,Java提供了比数组更灵活、更实用的集合框架,可大大提高软件的开发效率,并且不同的集合可适用于不同应用场合。

1.1 Java集合框架

Java集合框架提供了一套性能优良、使用方便的接口和类,都位于java.util包中,主要关系图如下

可以看出,Java的集合接口主要有Collection接口Map接口。其中Collection接口有两个常用子接口:List接口Set接口。List接口常用实现类:ArrayList类LinkedList类。Map接口常用子接口:Set接口。Set接口常用实现类:HashSet类。即:Java集合框架主要由3大类接口组成:List接口,Set接口,Map接口

2.List接口

1.Collection接口是最基本的集合接口,存储的是一组不唯一、无序的对象;List接口继承Collection接口,是有序集合。可以使用索引(下标)访问List接口中的元素,类似数组。

2.List接口中允许存放重复的元素,即:List接口存储的是一组不唯一、有序的对象

List接口常用的两个实现类:ArrayList类和LinkedList类。

2.1 ArrayList类

ArrayList实现了长度可变的数组,在内存中分配连续的空间,即又称ArrayList为动态数组。

ArrayList集合中可以添加任何类型的数据,并且添加的数据都会转换成Object类型

ArrayList类常用方法

方法名 说明
boolean add(Object o); 将指定的元素添加到列表的末尾,起始索引位置从零开始
void add(int index,Object o); 在指定的索引位置添加元素,添加位置必须介于0和列表中元素个数之间
Object get(int index); 返回指定索引位置的元素,返回值是Object类型,使用前需要进行强制类型转换
boolean contains(Object o); 判断列表中是否包含指定元素
boolean remove(Object o); 删除列表中指定元素
int size(); 返回列表中的元素个数
Object remove(int index); 删除列表中指定位置的元素,起始索引从零开始

Collection接口常用通用方法还有:clear()、isEmpty()、toArray()、iterator()。

2.2 补充:Iterator接口

1.Iterator接口表示对集合进行迭代的迭代器,为集合而生,专门实现集合的遍历。

2.凡是由Collection接口派生的接口或者类都实现了iterator()方法,iterator()方法返回的是一个Iterator对象。

常用方法:hasNext()和next()。

hasNext():判断是否存在一个可访问的元素,如果仍有元素可以迭代,则返回true

next():返回要访问的下一个元素

使用Iterator遍历集合

Iterator it=new Iterator();//获取集合迭代器Iterator对象

//通过迭代器一次输出集合中所有的元素信息

while(it.hasNext(){

Object object=it.next();

}

2.3 LinkedList类

LinkedList类是List接口的链表实现类,它支持实现所有List接口可选的列表的操作,并且允许元素值是任何类型,包括null

LinkedList类常用方法

除了包含ArrayList类所包含的方法外,还提供了以下一些方法:

void addFirst(Object o)//将指定元素插入到当前集合首部

void addLast(Object o)//将指定元素插入到当前集合尾部

Object getFirst()//获取当前集合的第一个元素

Object getLast()//获取当前集合的最后一个元素

Object removeFirst()//移除并返回当前集合的第一个元素

Object removeLast()//移除并返回当前集合的最后一个元素

ArrayListVSLinkedList

ArrayList类的底层和数组一样,在内存中分配连续的空间,所以遍历元素和随机访问元素的效率比较高;

LinkedList类的底层是采用链接列表的存储方式,删除、插入元素的效率比较高。

2.4 代码举例说明

ArrayList集合和LinkedList集合可以使用for循环、增强for循环、迭代器(Iterator接口)三种方式遍历。

public static void main(String[] args) {//1.准备数据:创建NewsTitle对象NewsTitle nt1=new NewsTitle(100, "俄乌战争走向", "国际社");NewsTitle nt2=new NewsTitle(200, "国庆放假通知", "学校通知");NewsTitle nt3=new NewsTitle(300, "金坷垃之谜", "圣地亚哥");//创建ArrayList对象,这个类在java.util包中,需要导包ArrayList alt=new ArrayList();//通过add()方法向集合添加元素alt.add(nt1);alt.add(nt2);alt.add(nt3);alt.add(nt2);//add(int index,Object obj)方法:将元素存储到集合指定位置alt.add(2, nt1);//对集合中元素的操作,都是通过集合对象名alt调用方法来实现//获取集合元素个数,即集合长度:size()方法int size=alt.size();System.out.println("alt集合中的元素个数:"+size);//获取集合中的指定元素:get(int index)方法,有返回值,返回值类型是父类Object类引用对象Object obj1=alt.get(3);//返回值是什么类型的就用什么类型的变量去接收System.out.println(obj1);//或者向下转型转成真正的类型来输出NewsTitle newsTitle=(NewsTitle)obj1;System.out.println(newsTitle);System.out.println("-----------");//遍历集合元素有三种方式:普通for()循环,增强for()循环,迭代器//普通for()循环for (int i = 0; i < alt.size(); i++) {Object obj=alt.get(i);NewsTitle newsTitle1=(NewsTitle)obj;System.out.println(newsTitle1);}//删除集合中的元素:remove(元素名/元素下标)方法boolean boo=alt.remove(nt1);System.out.println("删除了nt1:"+boo);//使用增强for循环遍历删除后的集合for(Object obj:alt){NewsTitle ntl=(NewsTitle)obj;System.out.println(ntl);}System.out.println("----使用迭代器-----");//使用迭代器来遍历集合:iterator()/*Iterator:迭代器,可以看成是集合容器集合名.iterator();将集合中的元素都转移到Iterator中通过hasNext()方法判断iterator中是否有元素,有则返回true,无则返回false;返回true时,通过next()方法取出元素*/Iterator it=alt.iterator();while(it.hasNext()){Object obj=it.next();NewsTitle newst=(NewsTitle)obj;System.out.println(newst);}//判断集合中是否包含某个元素:contains()方法boolean result=alt.contains(nt3);System.out.println("集合中包含nt3这个元素:"+result);//将集合中的元素转换为数组:toArray()方法Object[] objs=alt.toArray();//遍历数组for (int i = 0; i < objs.length; i++) {System.out.println(objs[i]);}//清空集合:clear()方法alt.clear();System.out.println(alt.size());//isEmpty()方法boolean boo1=alt.isEmpty();System.out.println("集合元素清空成功:"+boo1);}
public static void main(String[] args) {NewsTitle nt1=new NewsTitle(100, "俄乌战争走向", "国际社");NewsTitle nt2=new NewsTitle(200, "国庆放假通知", "学校通知");NewsTitle nt3=new NewsTitle(300, "金坷垃之谜", "圣地亚哥");List list=new LinkedList();//使用多态的形式创建list.add(nt1);list.add(nt2);list.add(nt3);//addFirst()方法将元素添加到集合的第一个位置//不能这样list.addFirst(nt3);直接添加,因为addFirst()方法是LinkedList类特有方法//接口的引用无法调用实现类中特有的方法,向下转型LinkedList link=(LinkedList)list;link.addFirst(nt3);//遍历集合for (int i = 0; i < link.size(); i++) {Object obj1=link.get(i);//get()方法获取元素NewsTitle newsT1=(NewsTitle)obj1;//向下转型System.out.println(newsT1);}//获取集合中的第一个元素:getFirst()方法Object obj2=link.getFirst();NewsTitle newsT2=(NewsTitle)obj2;//向下转型System.out.println(newsT2);//获取集合中的最后一个元素Object obj3=link.getLast();NewsTitle newsT3=(NewsTitle)obj3;//向下转型System.out.println(newsT3);//删除集合中的第一个元素,最后一个元素System.out.println("删除的第一个元素是:"+link.removeFirst());System.out.println("删除的最后一个元素是:"+link.removeLast());//清空集合:clear()link.clear();//判断集合是否为空System.out.println(link.isEmpty());}

3.Set接口

Set接口是Collection接口的另一个常用子接口,Set接口存储的是一组唯一、无序的对象

Set接口常用的实现类有HashSet类。

3.1 HashSet类

HashSet集合特点如下

集合内的元素是无序的;

HashSet类是非线程安全的;

允许集合元素值为null。

HashSet类常用方法

方法 说明
boolean add(Object o) 如果Set中尚未包含指定元素0,则添加指定元素o
void clear() 从set中移除所有元素
int size() 返回Set中元素的数量
boolean isEmpty() 如果Set不包含任何元素,则返回true
boolean contains(Object o) 如果Set包含指定元素o,则返回true
boolean remove(Object o) 如果指定元素o在Set集合中,则将其移除

3.2 代码举例说明

由于Set接口存储的唯一、无序的对象,所以没有get(int index)方法获取集合中的元素,进而不能使用普通for循环遍历集合。HashSet集合的遍历方式有两种:增强for循环、Iterator迭代器

//Set接口:存储的是一组唯一、无序的对象集合。HashSet类是Set接口常用的实现类public static void main(String[] args) {// 1.准备数据NewsTitle nt1 = new NewsTitle(100, "俄乌战争走向", "国际社");NewsTitle nt2 = new NewsTitle(200, "国庆放假通知", "学校通知");NewsTitle nt3 = new NewsTitle(300, "金坷垃之谜", "圣地亚哥");//2.创建HashSet类对象HashSet hs=new HashSet();//3.将元素存储到hs集合中hs.add(nt1);hs.add(nt2);hs.add(nt3);hs.add(nt2);//添加重复的元素//获取集合元素个数size()方法int size=hs.size();System.out.println(size);//元素个数是3,也验证了set接口存储的数据是唯一的//获取集合中的元素,Set集合是无序的,所以没有get()方法获取元素,不能用普通for循环//增强for循环遍历集合for(Object obj:hs){NewsTitle newsT=(NewsTitle)obj;System.out.println(newsT);//输出结果是无序的}System.out.println("-----迭代器------");//通过迭代器来遍历数组Iterator it=hs.iterator();while(it.hasNext()){Object obj=it.next();NewsTitle newst=(NewsTitle)obj;System.out.println(newst);}}

4.Map接口

4.1 Map接口概述

1.Map接口存储的是一对键(key)——值(value)对象,即键值对,提供键(key)到值(value)的映射;

2.Map接口中的key不要求有序,不允许重复。value同样不要求有序,但允许重复。

3.Map接口的常用方法如下:

方法 说明
Object put(Object key,Object value) 将相互关联的一个key和一个value放入该集合,如果此Map接口中已经包含了此key对应的value,则旧值会被替代
Object remove(Object key) 从当前集合中移除与指定key相关的映射,并返回与该key关联的旧value,如果key没有任何关联,则返回null
Object get(Object key) 获得与key关联的value,如果该key不关联任何非null值,则返回null
boolean containsKey(Object key) 判断集合中是否包含指定key
boolean containsValue(Object value) 判断集合中是否包含指定value
boolean isEmpty() 判断集合中是否存在元素
void clear() 清空集合中所有元素
int size() 返回集合元素个数
Set keySet() 获得所有key的集合
Collection value() 获得所有value的集合

4.2 使用HashMap类动态存储数据

1.Map接口中存储的数据都是键——值对,最常用的实现类是HashMap类,优点是查询效率高。

2.遍历HashMap集合可以遍历键集和值集,还可以遍历键值对,有普通for循环、增强for循环和迭代器Iterator三种方式

public static void main(String[] args) {//创建学生对象Student stu1=new Student("张三", 21);Student stu2=new Student("李四", 23);Student stu3=new Student("李华", 32);//创建HashMap对象HashMap hm=new HashMap();//也可以用多态:Map map=new HashMap();hm.put(1, stu1);hm.put(2, stu2);hm.put(3, stu3);//遍历map集合//法一:先获取所有的键:keySet()方法,再通过键集获取对应的值get(key)方法Set keys=hm.keySet();//方式一:增强for循环for(Object obj1:keys){int key1=(int)obj1;Object obj2=hm.get(obj1);Student student=(Student)obj2;System.out.println(key1+"对应的值是:"+student);}System.out.println("-----------------");//方式二:通过迭代器遍历Iterator it=keys.iterator();//把所有的键转移到Iterator中while(it.hasNext()){Object obj3=it.next();int key2=(int)obj3;Object obj4=hm.get(key2);Student student2=(Student)obj4;System.out.println(key2+"对应的值是:"+student2);}System.out.println("--------------------");//法二:先获取键值对:entrySet()方法,再获取键getKey()和值getValue()Set keysValues=hm.entrySet();for (Object object : keysValues) {//向下转型:转成Map.Entry接口Map.Entry me=(Map.Entry)object;//获取键Object obj5=me.getKey();int key3=(int)obj5;//获取值Object obj6=me.getValue();Student student3=(Student)obj6;System.out.println(key3+"对应的值是:"+student3);}

【Java高级特性】集合框架和泛型(一)相关推荐

  1. Java高级特性 集合框架、泛型和Collection(一)(第二十三天)

    集合的使用: 如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象--可以使用Java集合框架 java集合框架: 在java中数据结构是以某种形式将数据组织在一起的集合.他们不仅存储数据 ...

  2. Educoder–Java高级特性(第二章)- 集合框架【笔记+参考代码】

    Educoder–Java高级特性(第二章)- 集合框架[笔记+参考代码] 第一关 编程要求 请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,创建ArrayList集 ...

  3. Java 高级特性 --- 反射

    From:Java 高级特性 --- 反射:https://www.jianshu.com/p/9be58ee20dee From:Java 基础之 --- 反射(非常重要):https://blog ...

  4. Java学习之java高级特性

    From:https://blog.csdn.net/w252064/article/details/79923999 [Java高级特性详解]:https://blog.csdn.net/qq_37 ...

  5. Java高级特性编程及事件_java高级特性是什么

    详细内容 java高级特性主要有集合框架及泛型,实用类,输入和输出处理,注解与多线程,网络编程与XML技术. 集合框架 是一套性能优良.使用方便的接口和类(位于java.util包中)解决数组在存储上 ...

  6. (小白学JAVA之)Java高级特性知识点梳理

    Java高级特性知识点梳理 集合框架和泛型 List接口 ArrayList ArrayList类的常用方法 具体实现步骤 LinkedList LinkedList类的常用方法 具体实现步骤 Set ...

  7. Java高级特性增强-多线程

    请戳GitHub原文: https://github.com/wangzhiwub... 大数据成神之路系列: 请戳GitHub原文: https://github.com/wangzhiwub... ...

  8. 十三、Java高级特性 Lambda表达式 | 接口组成更新 | 方法引用 | 函数式接口

    文章目录 十三.Java高级特性 1.Lambda表达式 1.1体验Lambda表达式[理解] 1.2Lambda表达式的标准格式[理解] 1.3Lambda表达式练习1[应用] 1.4Lambda表 ...

  9. 第4天 java高级特性增强 ---有用 第一遍

    第4天 java高级特性增强 今天内容安排: 1.掌握多线程 2.掌握并发包下的队列 3.了解JMS 4.掌握JVM技术 5.掌握反射和动态代理 java多线程增强 .1. java多线程基本知识 . ...

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

    第一节 JAVA中的集合框架概述 集合的概念,现实生活中:很多事物凑在一起就是一个集合:数学中的集合:具有相同属性事物的总体:JAVA中的集合:是一种工具类,就像是容器,储存任意数量的具有共同属性的对 ...

最新文章

  1. mycat mysql好可用架构_想要学会MyCat高可用集群搭建,但是这些知识点却还玩不明白?...
  2. 关于FI凭证的字段状态
  3. 全局变量名为 param1 var param1Value = webBrowser1.Document.InvokeScript(eval,new String[]{ param1}).To...
  4. Excel数据生成SQL insert语句
  5. 寒流来袭·《求职初体验》
  6. SPSS实现卡方检验
  7. java:布局方法(边界布局)
  8. [转]IE Javascript 脚本失效解决办法
  9. L3HSEC 2022秋季招新赛部分WP
  10. 网易云热歌榜歌名与热评的高频词抓取及词云制作
  11. 【Linux】Linux发行版本的简介与选择
  12. End-to-End Learning From Spectrum Data: A DL Approach for Wireless Signal Identification(阅读笔记)
  13. LCN分布式事务学习0-分布式事务理论基础
  14. 电路的基本概念和分析方法
  15. 【无标题】SimpleDateFormat,以及date的.parse()方法
  16. JavaScript的DOM知识点总结
  17. 第28章 LTDC—液晶显示中英文
  18. 小学生终究干不过富婆?《王者荣耀》返场皮肤厨娘夺冠,猴子落榜
  19. java +Selenium 2 环境搭建
  20. 进化:从孤胆极客到高效团队_极客评论:使用Dia作为Microsoft Visio的免费替代品...

热门文章

  1. Referrer策略
  2. 饼图不显示百分比(%),显示原始数据的处理
  3. 树莓派4b:PWM调速风扇+DIY亚克力板外壳的定制降温方案
  4. 支付宝小程序Swiper 滚动图 带圆点和跳转方式
  5. Linux下安装zsh和oh-my-zsh
  6. linux下mqm用户下S开头日志,Linux下websphere MQ安装
  7. 计算机视觉-图像缩放算法-cuda实现
  8. Python 中文分词并去除停用词
  9. 用java写一个爱心
  10. linux pureftpd 无法上传文件,实现了在pure-ftpd下限制上传文件类型的功能