当前位置: 首页 > news >正文

21、JAVA进阶——集合(2)

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。

🍎个人主页:乐趣国学的博客

🍊个人信条:不迁怒,不贰过。小知识,大智慧。

💞当前专栏:JAVA开发者成长之路

✨特色专栏:国学周更-心性养成之路

🥭本文内容:JAVA进阶——集合(2)

更多内容点击👇

                       JAVA进阶——集合(1)

                       JAVA入门——异常

目录

一、Collections类

  1、解释

  2、对集合元素排序与查找

  3、替换集合元素

二、认识泛型

  1、 泛型的定义

  2、 泛型在集合中的应用

三、深入泛型

  1、 定义泛型类、泛型接口和泛型方法

  2、 多个参数的泛型类

  3、 从泛型类派生子类

四、集合框架和泛型章节总结


一、Collections类

  1、解释

        (1)Collections类是Java提供的一个集合操作工具类。它包含了大量的静态方法,用于实现对集合元素的排序、查找和替换等操作。

        (2)Collections和Collection是不同的,前者是集合的操作类,后者是集合接口。

  2、对集合元素排序与查找

        (1)排序是针对集合的一个常见需求。要排序就要知道两个元素哪个大哪个小。在Java中,如果要实现一个类的对象之间比较大小,那么这个类就要实现Comparable接口。

        (2)Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo()方法被称为它的自然比较方法。

        (3)compareTo()方法用于比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

        (4)compareTo()方法的定义语法格式如下

                int compareTo(Object obj);

                -->参数obj:obj是要比较的对象

                -->返回值:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象返回不同的值

        (5)实现Collections接口的对象列表(和数组)可以通过Collections.sort()方法(和Arrays.sort()方法)进行自动排序。

        (6)元素之间可以比较大小之后,就可以使用Collections类的sort()方法对元素进行排序操作了。Map接口本身是无序的,不能对Map接口做排序操作;List接口是有序的,可以对List接口进行排序。

        (7)使用binarySearch()方法可以查找集合中的元素,但是在使用binarySearch()方法之前需要使用sort()方法对集合进行排序,否则不能保证查找结果的正确性。

package cn.bdqn.demo04;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

public class CollectionsDemo01 {
	public static void main(String[] args) {
		ArrayList<String> al=new ArrayList<String>();
		al.add("sdf");
		al.add("gfd");
		al.add("htr");
		al.add("jhj");
		al.add("kyt");
		al.add("ewf");

		System.out.println("*****排序前*****");
		for (String string : al) {
			System.out.println(string);
		}
		System.out.println("*****排序后*****");
		Collections.sort(al);		
		Iterator<String> it=al.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
		
		System.out.println("gfd在第"+(Collections.binarySearch(al, "gfd")+1)+"位");
	}
}

  3、替换集合元素

        可以使用Collections类的静态方法fill()方法把集合中的所有元素都替换为相同的元素。

二、认识泛型

        (1)泛型是JDK1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,使代码可以应用于多种类型。

        (2)Java语言引入泛型的好处是安全简单,且所有强制转换都是自动和隐式进行的,提高了代码的重用率。

  1、 泛型的定义

        (1)将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性。这就是泛型。泛型的本质就是参数化类型。

        (2)泛型的定义语法格式如下:

                类1或者接口<类型实参> 对象 = new 类2<类型实参>();

                注意:

                        -->“类2”可以是“类1”本身,可以是“类1”的子类,还可以是接口的实现类。

                        -->“类2”的类型实参必须和“类1”中的类型实参相同。

        (3)例如:ArrayList<String> list = new ArrayList<String>();

            上述代码表示创建一个ArrayList集合,当规定该集合中存储的元素类型必须为String类型。

  2、 泛型在集合中的应用

        (1)JDK1.5中已经改写了集合框架中的所有接口和类,增加了对泛型的支持,也就是泛型集合。

        (2)使用泛型集合在创建集合对象时指定集合中元素的类型,从集合中取出元素时无需进行强制类型转换,并且如果把非指定类型对象放入到集合中,会出现编译错误。

        (3)List和ArrayList的泛型形式是List<E>和ArrayList<E>,ArrayList<E>与ArrayList类的常用方法基本一样。

        (4)Map与HashMap也有它们的泛型形式,即Map<K,V>和HashMap<K,V>,因为它们的每一个元素都包含两个部分,及key和value,所以,在应用泛型时,要同时指定key的类型和value的类型,K表示key的类型,V表示value的类型。HashMap<K,V>操作数据的方法与HashMap基本一样。

        (5)泛型使集合的使用更方便,也提升了安全:

                -->存储数据时进行严格类型检查,确保只有合适类型的对象才能存储在集合中。

                -->从集合中检索对象时,减少了强制类型转换。

package cn.bdqn.demo03;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashMapDemo02 {

	public static void main(String[] args) {
		//创建3个Student类对象
		Student stu1 = new Student("张三", 18);
		Student stu2 = new Student("李四", 19);
		Student stu3 = new Student("如花", 20);
		
		//创建集合容器
		HashMap<String, Student> map = new HashMap<String, Student>();
		
		//将学生对象和其英文名称存储到集合中
		map.put("JackMa", stu1);
		map.put("TomLei", stu2);
		map.put("MissDong", stu3);
		
		//遍历map集合
		//获取键的集合,然后通过键来找值
		Set<String> keys=map.keySet();
		for(String key:keys){
			Student student1 =map.get(key);
			System.out.println(key+"对应的学生:"+student1);
		}
		
		System.out.println("---------------------");
		
		Iterator<String> it = keys.iterator();
		while(it.hasNext()){
			String key2=it.next();
			Student student2 =map.get(key2);
			System.out.println(key2+"对应的学生:"+student2);
		}
		
		System.out.println("---------------------");
		
		//map集合的第3种遍历方式
		Set<Map.Entry<String,Student>> keyValues=map.entrySet();
		for(Map.Entry<String,Student> me:keyValues){
			//获取键
			String key= me.getKey();
			//获取值
			Student student =me.getValue();
			System.out.println(key+"对应的学生:"+student);
		}

	}

}

三、深入泛型

        (1)在集合中使用泛型只是泛型多种应用的一种,在接口、类、方法等方面也有着泛型的广泛应用。

        (2)泛型的本质就是参数化类型,参数化类型的重要性在于允许创建一些类、接口和方法,其操作的数据类型被定义为参数,可以在真正使用时指定具体的类型。

        参数化类型:参数化类型包含一个类或者接口,以及实际的类型参数列表。

        类型变量:是一种非限定性标识符,用来指定接口或者方法的类型。

  1、 定义泛型类、泛型接口和泛型方法

        (1)对于一些常常处理不同类型数据转换的接口或者类,可以使用泛型定义,如Java中的List接口。

        (2)定义泛型接口或类的过程,与定义一个接口或者类相似。

              1)泛型类

                概念:泛型类简单地说就是具有一个或者多个类型参数的类。

                语法:
                                    访问修饰符 class className<TypeList>

                    TypeList表示类型参数列表,每个类型变量之间以逗号分隔。

                举例:
                                    public class GenericClass<T>{······}

                创建泛型类实例:
                                    new className<TypeList>(argList);

                    TypeList表示定义的类型参数列表,每个类型变量之间以逗号分隔。

                    argList表示实际传递的类型参数列表,每个类型变量之间同样以逗号分隔。

                举例:
                                    new GenericClass<String>("this is String Object");

              2)泛型接口

                概念:泛型接口就是拥有一个或者多个类型参数的接口。泛型接口的定义方式与定义泛型类类似。

                语法:
                                    访问修饰符 interface interfaceName<TypeList>

                    TypeList表示由逗号分隔的一个或多个类型参数列表。

                举例:
                                    public interface TestInterface<T>{

                                           public T print(T t);

                                    }

                泛型类实现泛型接口:
                                    访问修饰符 class className<TypeList> implements                 interfaceName<TypeList>

              3)泛型方法

                概述:

                一些方法常常需要对某一类型数据进行处理,若处理的数据乐行不确定,则可以通过泛型方法的方式来定义,达到简化代码、提高代码重用性的目的。

                泛型方法实际上就是带有类型参数的方法。

                定义泛型方法与方法所在的类、或者接口是否是泛型类或者泛型接口没有直接的关系,也就是说无论是泛型类还是非泛型类,如果需要就可以定义泛型方法。

                语法:
                                访问修饰符 <类型参数> 返回值 方法名(类型参数列表)

                注意:
                                类型变量放置在访问修饰符与返回值之间。

                举例:
                                public <String> void showName(String s){}

  2、 多个参数的泛型类

        (1)泛型类的类型参数可以有一个或者多个。

        (2)比如HashMap<K,V>就有两个类型参数,一个指定key的类型,一个指定value的类型。

  3、 从泛型类派生子类

        (1)面向对象的特征同样适用于泛型类,所以泛型类也可以继承。

        (2)继承了反省类的子类,必须也是泛型类。

        (3)继承泛型类的语法格式:class 子类<T> extends 父类<T>{}

四、集合框架和泛型章节总结

        1、 集合弥补了数组的缺陷,它比数组更灵活实用,而且不同的集合适用于不同场合。

        2、 Java集合框架共有3大类接口,即Map接口、List接口和Set接口。

        3、 ArrayList和数组采用相同的存储方式,它的特点是长度可变且可以存储任何类型的数据,它的优点在于遍历元素和随机访问元素的效率较高。

        4、 LinkedList类采用链表存储方式,优点在于插入、删除元素时效率较高。

        5、 Iterator为集合而生,专门实现集合的遍历,它隐藏了各种集合实现类的内部细节,提供了遍历集合的统一编程接口。

        6、 HashMap类是最常用的Map实现类,它的特点是存储键值对数据,优点是查询指定元素效率高。

        7、 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,使代码可以应用于多种数据类型。

        8、 使用泛型集合在创建集合对象时指定集合中元素的类型,从集合中取出元素时无需进行强制类型转换。

        9、 在集合中使用泛型只是泛型多种应用的一种,在接口、类、方法等方面也有着泛型的广泛应用。

        10、 如果数据类型不确定,可以通过泛型方法的方式,达到简化代码、提高代码重用性的目的。


        码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识,请关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

相关文章:

  • 【牛客刷题-算法】NC32 求平方根 (又是辛苦debug的一天)
  • Verilog学习笔记
  • SAP PI PO 接口常见问题处理:应用程序使用内容计划
  • 临床预测之logictic回归 1-2
  • 计算机学院第一周语法组及算法组作业
  • 【Pandas 数据分析 1】快速入门
  • Python中计算程序的运行时间——timeit模块
  • 第十三届蓝桥杯JavaB组省赛——最大子矩阵 (AC)
  • 【CMake】第2篇 CMake构建.h与.cpp文件
  • Kmeans
  • 【C++】C++11的那些新特性
  • 【数据结构 | 入门】线性表与链表 (问题引入实现算法优化)
  • vmware虚拟机中的archlinux无法播放声间的解决办法
  • 深度学习常用的backbone有哪些
  • 君正X2000/X1600主控CPU方案有哪些场景?行业迈向人机交互智能时代来啦!
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 2017 年终总结 —— 在路上
  • Cumulo 的 ClojureScript 模块已经成型
  • download使用浅析
  • ES6 学习笔记(一)let,const和解构赋值
  • iOS 系统授权开发
  • Joomla 2.x, 3.x useful code cheatsheet
  • Python - 闭包Closure
  • Python学习之路16-使用API
  • vue-cli3搭建项目
  • Web标准制定过程
  • 回顾2016
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 前端面试总结(at, md)
  • 嵌入式文件系统
  • 驱动程序原理
  • 深度学习入门:10门免费线上课程推荐
  • 时间复杂度与空间复杂度分析
  • 使用 QuickBI 搭建酷炫可视化分析
  • 终端用户监控:真实用户监控还是模拟监控?
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • Mac 上flink的安装与启动
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • (七)Knockout 创建自定义绑定
  • (全注解开发)学习Spring-MVC的第三天
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • ./configure,make,make install的作用
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .net知识和学习方法系列(二十一)CLR-枚举
  • :中兴通讯为何成功
  • @property python知乎_Python3基础之:property
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题