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

第六章.java集合与泛型

文章目录

  • 1.集合框架
    • 1. Collection 接口存储一组==不唯一,无序==的对象
    • 2. Set接口存储一组==唯一,无序==的对象
    • 3. Map接口存储一组键值对象,提供key到value的映射
  • 2.封装
  • 3.练习题

1.集合框架

  • java集合框架提供了一套性能优良,使用方便的接口和类,它们位于java.util中
  • 在这里插入图片描述
  • 在这里插入图片描述

1. Collection 接口存储一组不唯一,无序的对象

  • (1). List接口存储一组不唯一,有序(插入顺序)的对象
    • list 方法
      • size 大小
      • add 添加
      • remove 移除(//删除方法都可以得到对象)
      • clear 清空(通用)
      • contains 判断
      • get 获取
        - 在这里插入图片描述
    • ArrayList一般会向上转型为List,LinkedList不向上转型,因为有自己的特有方法
    • ArrayList(数组集合)实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素是效率比较高 {默认大小10,扩容50%,数据越大时损失越严重}
package JiHe;import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {List list = new ArrayList();//添加list.add("数据1");list.add(0,"新数据1");list.add(1);//大小list.size();//移除list.remove(1);list.remove("新数据1");//都有返回值,可以选择接收,也可以选择不接收\//判断是否有这样的数据boolean isYou = list.contains(1);//只是判断括号里的数据,不判断地址是否存在System.out.println(isYou);list.add("数据2");list.add("数据3");list.add("数据4");//清空集合
//		list.clear(); System.out.println(list.size());list.add("1111111111");//移除 清空集合 删除后,扩容的空间依旧存在,不变//判断两个集合是否一致list.equals(list); //得到某个下标的值System.out.println(list.get(0));//常用于:for(int i = 0 ; i < list.size() ; i++) {System.out.println(list.get(i));}System.out.println("------------------------");//增强for循环for(Object obj : list) {System.out.println(obj);}}
}
    • LinkedList(链表集合)采用链表存储方式.插入删除元素时效率比较高
      • 相较于ArrayList多了六种方法 (仅限于LinkedList)
        • addFirst()
        • addLast()
        • removeFirst()
        • removeLast()
        • getFirst()
        • getLast()

--------------------LinkedList------------------------------------------------------
package JiHe;import java.util.LinkedList;public class Eq4 {public static void main(String[] args) {LinkedList<String> strList = new LinkedList<String>();strList.add("中国");strList.add("美国");strList.add("日本");strList.add("韩国");//添加首位末位strList.addFirst("添加首位");strList.addLast("添加末位");//移除首位末位strList.removeFirst();strList.removeLast();//获取首位末位strList.removeFirst();strList.getLast();System.out.println(strList.size());}}

2. Set接口存储一组唯一,无序的对象

  • HashSet是Set接口常用的实现类
  • Set中存放的是对象的引用
  • equals()判断两个对象是否相等
package JiHe;import java.util.HashSet;
import java.util.Iterator;public class HashSetTest {public static void main(String[] args) {HashSet<String> strSet = new HashSet<String>();strSet.add("一");strSet.add("二");strSet.add("三");strSet.add("二");strSet.add("三");System.out.println(strSet);//输出是唯一且无序的System.out.println(strSet.size());System.out.println(strSet.remove("一"));
//		System.out.println(strSet.remove(index ));//没有移除下标操作
//		System.out.println(strSet.get("一"));//没有get操作System.out.println(strSet.contains("一"));
//		strSet.clear();//通用System.out.println("--------------------");//可以通过循环得得到值//1.for eachfor(String string :strSet) {System.out.println(strSet);}System.out.println("--------------------");//2.自带的forEachstrSet.forEach(str ->System.out.println(str));System.out.println("--------------------");//3.迭代器Iterator<String> iteStr = strSet.iterator();while(iteStr.hasNext()) {String str = iteStr.next();System.out.println(str);}}}

3. Map接口存储一组键值对象,提供key到value的映射

  • 专门处理键值映射数据的存储,可以根据键实现对值的操作
  • 最常用的实现类是HashMap
    • 遍历Map集合
      • 1.通过迭代器Iterator实现
        • 获取Iterator:Collection接口的Iterator()方法
        • Iterator的方法
        • boolean hasNext():判断是否存在另一个可访问的元素
        • Object next():返回要访问的下一个元素
      • 2.增强for循环
      • 3.forEach()方法
package JiHe;import java.util.HashMap;
import java.util.Map;public class HashMapTest {public static void main(String[] args) {//保证与<>里面类型一致Map<String, Object> map = new HashMap<String, Object>();//创建map集合//1.添加数据map.put("cn", "中国");map.put("usa", "美国");map.put("jp", "日本");map.put("one","一");map.put("two","二");//2.集合大小System.out.println(map.size());map.put("two","2");System.out.println("key值一样"+map.size());//大小一样,不受影响,因为key值不变map.put("three", "三");System.out.println("key值不一样"+map.size());//大小改变,受到影响,因为key值改变//3.获取key,得到valueObject obj = map.get("two");System.out.println(obj);//4.删除//删除方法都可以得到对象//4.1删除key值Object deObject= map.remove("two"); System.out.println("删除key的值"+deObject);//4.2删除key与value(jdk1.8提供)Object deObject2 = map.remove("one","一");System.out.println("删除key与value的值"+deObject2);System.out.println("map集合大小"+map.size());//5.判断是否存在(只能两个分开判断)//5.1判断key值是否存在System.out.println("key值是否存在:"+map.containsKey("one"));//5.2判断value值是否存在System.out.println("value值是否存在:"+map.containsValue("中国"));//6.1foreachfor(String key:map.keySet()) {System.out.println(key+"---"+map.get(key));}System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");//6.2自带forEachmap.forEach((a,b) -> System.out.println(a + "---" + b));//7.清空集合map.clear();//8.判断集合是否为空(前提对象不为null)map = new HashMap<String, Object>();//为空System.out.println("集合是否为空:"+map.isEmpty());Map<String, Eq2Stu> stuMap = new HashMap<>();Eq2Stu stu = new Eq2Stu("张三",100,"嘿嘿");stuMap.put(stu.getNameString(),stu);}} 

2.封装

  • 对于基本数据类型的封装(将基本类型转换为封装类型)
    • //byte short int long float double char boolean
    • //将基本类型封装
    • //Byte Short Integer Long Float Double [前六个父类为Number] Character Boolean
    • 除Character 其它封装类型都可以转换字符串
    • 封装类型与基本类型可以互换,但可能出现空指针异常
    • 字符串转成基本类型是,可能出现数字格式化异常
package JiHe;import java.util.concurrent.atomic.AtomicIntegerArray;public class MyNumber {//封装类型,能与字符串进行转换,除character外int i = 10 ;//基本类型 不能= nullInteger a = null;//引用类型  可以= nullpublic void test() {System.out.println(i);System.out.println(a);a =10;i = a;//封装引用类型 与 基本类型是可以相互转换的 //实际上 i = a.intValue(); 调用了封装类型转基本类型System.out.println(i);}public static void main(String[] args) {new MyNumber().test();int a = new Integer("12");//可以将数字字符串转换成数据类型,不是数字字符串不能转System.out.println(a + 10);double d = Double.parseDouble("12.345");//加上a后,编译正常,运行异常,去除后正常System.out.println(d*10);//封装类型中 只有 Character 例外,不能与字符进行互相转换//		char c = new Character("c");//不能转
//		c = Character.parse//报错new Float("1.1");Float.parseFloat("1.1");//常用此转换Float fff = new Float("11.0");float ff = fff.floatValue() ;//封装类型转基本类型new Byte("1");Byte.parseByte("1");new Short("2");Short.parseShort("2");boolean bb = new Boolean("true1");//除了字符串true,其余字符串转换 都是falseSystem.out.println(bb);}
}
  • 泛型(<限制的类型>)的作用
    • 限制类型录入
    • 避免强制转换出错
//1.泛型集合
package JiHe;public class Dog {private String color;private String strainString2;private int age;//构造方法public Dog(String color, String strainString2, int age) {super();this.color = color;this.strainString2 = strainString2;this.age = age;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public String getStrainString2() {return strainString2;}public void setStrainString2(String strainString2) {this.strainString2 = strainString2;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Dog [color=" + color + ", strainString2=" + strainString2 + ", age=" + age + "]";}}
------------------------------------------------------------------------------------------------------------------------package JiHe;import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;public class TestDog {public static void main(String[] args) {System.out.println("请输入狗的数量");Scanner input = new Scanner(System.in);int num = 0;try {num = input.nextInt();} catch (Exception e) {input.next();num =5;}ArrayList<Dog> dogList = new ArrayList();//<内容为所限制的 类型> 泛型,限制了集合中数据的录入//循环添加狗for(int i = 0 ; i < num ; i ++) {System.out.println("狗的姓名:");String strainString = input.next();System.out.println("狗的年龄");int age = input.nextInt();System.out.println("狗的毛色:");String colorString = input.next();dogList.add(new Dog(colorString, strainString, age));}//计算狗的平均年龄int sumAge = 0;
//		for(Object obj : dogList) {
//			Dog dog = (Dog)obj; 
//			sumAge += dog.getAge();
//		}for(Dog dog : dogList) {System.out.println(dog);sumAge += dog.getAge();}System.out.println("---------------------------------");dogList.forEach(dog -> System.out.println(dog));//jdk1.8以后的方法System.out.println("---------------------------------");double avgAge = sumAge * 1.0 / dogList.size();System.out.println("平均年龄"+ avgAge);}}
*********************************************************************************
2.泛型类
package JiHe;public class Show<T> {//泛型类:使得变量类型灵活public T t;public T getT() {return t;}public void setT(T t) {this.t = t;}public static void main(String[] args) {
//		1.可以传任意类型
//		Show show = new Show<>();
//		show.setT("好好学习");
//		System.out.println(show.getT());
//		2.限制Show<Integer> show = new Show<>();show.setT(1);System.out.println(show.getT());}}

3.练习题

  • 1.将1-100之中的所有正整数存放在集合中,移除3的倍数的数据,再看一下集合的大小
package Test;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class Eq1 {public static void main(String[] args) {List<Integer> lstList = new ArrayList<Integer>();for(int i = 1 ; i <=100 ;i++) {lstList.add(i);}//不知道如何将lstList的值循环输出去判断
//		for(int j = 0 ; j <100 ; j++) {
//			if(lstList %3==0) {
//				lstList.remove(j);
//			}
//		}错误//正确for(int j = 0 ; j < lstList.size() ; j++) {int num = lstList.get(j);//定义一个值去接收if(num %3==0) {lstList.remove(j);}}System.out.println("1-100无三的倍数"+lstList);System.out.println(lstList.size());}
}
  • 2.添加四个学员对象,将学员添加到对象,移除姓名为张三的学员
package JiheTest;public class Eq2Stu {private String name;private int age;private String color;public Eq2Stu() {super();}@Overridepublic String toString() {//Idea与eclipse显示有区别return "{" +"name='" + name + '\'' +", age=" + age +", color='" + color + '\'' +'}';}public Eq2Stu(String name, int age, String color) {this.name = name;this.age = age;this.color = color;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}
}
---------------------------------------------------------
package JiheTest;
import java.util.List;
import java.util.ArrayList;public class Eq2 {public static void main(String[] args){List<Eq2Stu> lstList = new ArrayList();Eq2Stu stu = new Eq2Stu("张三",22,"11");lstList.add(stu);lstList.add(new Eq2Stu("张三",11,"22"));lstList.add(new Eq2Stu("张四",22,"211"));lstList.add(new Eq2Stu("张五",33,"244"));lstList.add(new Eq2Stu("张六",44,"334"));lstList.add(new Eq2Stu("张七",55,"1234"));System.out.println(lstList.remove(1));System.out.println(lstList.size());System.out.println(lstList.get(1));}
}
  • 3.产生50个随机数,将随机数转换成整数,奇数添加到集合中
package Test;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class Eq3 {public static void main(String[] args) {List<Integer> lstList = new ArrayList();for(int i = 0 ; i < 50 ; i++) {int num = (int)(Math.random()*1000);
//			System.out.println(num);if(num % 2 != 0) {lstList.add(num);}}System.out.println(lstList);}}
  • 4.生成班级姓名随机器,名字只能出现一次
    • 首先判断选择哪种方式
package JiHe;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;public class Eq4Test{public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 1. 输入班级学生名单System.out.println("请输入班级学生姓名,用空格分隔:");String input = scanner.nextLine();String[] namesArray = input.split(" ");// 2. 创建列表并打乱顺序List<String> nameList = new ArrayList<>(List.of(namesArray));//将数组转为集合//返回的列表是不可修改的(不能添加.删除,或修改元素Collections.shuffle(nameList);//打乱顺序// 3. 随机点名System.out.println("开始随机点名(输入q退出):");while (!nameList.isEmpty()) {System.out.println("按回车键抽取下一个名字...");String command = scanner.nextLine();if ("q".equalsIgnoreCase(command)) {break;}// 移除并返回列表中的第一个元素String selectedName = nameList.remove(0);System.out.println("被点到的同学是:" + selectedName);if (nameList.isEmpty()) {System.out.println("所有同学已被点完!");}}scanner.close();}
}
  • 5.添加学生对象,通过名称输入学员信息(map)
package JiHe;public class Eq5 {private String name;private int age;private String Id;public Eq5(String name, int age, String id) {super();this.name = name;this.age = age;Id = id;}public String getId() {return Id;}public void setId(String id) {Id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "姓名:" + name + ", 年龄:" + age + ", 学号:" + Id ;}}
-------------------------main----------------------------------------------------------------------
package JiHe;import java.util.HashMap;
import java.util.Scanner;public class Eq5Test {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);HashMap<String, Eq5> strMap = new HashMap<String, Eq5>();while (true) {System.out.println("\n学生管理系统");System.out.println("1. 添加学生");System.out.println("2. 查找学生");System.out.println("3. 显示所有学生");System.out.println("4. 退出");System.out.print("请选择操作: ");int choice = scanner.nextInt();switch (choice) {case 1: {addStudent(scanner, strMap);break;}case 2: {findStudnet(scanner,strMap);break;}case 3: {displayAllStudents(strMap);break;}case 4: {System.out.println("退出系统...");scanner.close();return;}default:System.out.println("无效选择,请重新输入");}}}private static void findStudnet(Scanner scanner,HashMap<String, Eq5>strMap) {System.out.println("请输入要查找的学生姓名:");String name = scanner.next();Eq5 stuEq5 = strMap.get(name);if(stuEq5 != null) {System.err.println("找到该学生信息"+stuEq5);}else {System.out.println("未找到");}}private static void addStudent(Scanner scanner,HashMap<String, Eq5>strMap) {System.out.println("请输入学生姓名");String name = scanner.next();if(strMap.containsKey(name)) {System.out.println("学生姓名存在");return;}System.out.println("输入学生年龄:");int age = scanner.nextInt();scanner.nextLine(); // 消耗换行符System.out.println("请输入学号");String Id = scanner.next();Eq5 stuEq5 = new Eq5(name, age, Id);strMap.put(Id, stuEq5);System.err.println("学生添加成功");}private static void displayAllStudents(HashMap<String, Eq5> strMap) {if (strMap.isEmpty()) {System.out.println("当前没有学生记录!");return;}System.out.println("\n所有学生信息:");for (Eq5 student : strMap.values()) {System.out.println(student);}}
}
  • 6.根据输入的姓名,修改年龄,必须是有效年龄,否则抛出异常,名字不允许重复
package JiHe;import java.util.HashMap;
import java.util.Map;class AgeManager {private Map<String, Integer> nameAgeMap;public AgeManager() {nameAgeMap = new HashMap<>();}/*** 添加或更新姓名和年龄* @param name 姓名* @param age 年龄*/public void addOrUpdateAge(String name, int age)  {// 验证年龄有效性if (age <= 0 || age > 150) {throw new RuntimeException("无效年龄: " + age + "。年龄必须是1-150之间的正整数。");}//        // 检查姓名是否已存在if (nameAgeMap.containsKey(name)) {
//            throw new RuntimeException("姓名 '" + name + "' 已存在,不允许重复。");nameAgeMap.remove(name);}// 添加或更新年龄nameAgeMap.put(name, age);System.out.println("成功添加/更新: " + name + " - " + age + "岁");}/*** 更新已存在的姓名对应的年龄* @param name 要更新的姓名* @param newAge 新的年龄*/public void updateAge(String name, int newAge) throws Exception {// 验证年龄有效性if (newAge <= 0 || newAge > 150) {throw new Exception("无效年龄: " + newAge + "。年龄必须是1-150之间的正整数。");}// 检查姓名是否存在if (!nameAgeMap.containsKey(name)) {throw new Exception("姓名 '" + name + "' 不存在,无法更新。");}// 更新年龄nameAgeMap.put(name, newAge);System.out.println("成功更新: " + name + " 的新年龄为 " + newAge + "岁");}/*** 获取所有姓名和年龄* @return 包含所有记录的字符串*/public String getAllRecords() {return nameAgeMap.toString();}public int getStudentCount() {return nameAgeMap.size();}
}
-----------------------------------------------------------------------main-----------------------------------
package JiHe;import java.util.Scanner;public class Main {public static void main(String[] args) {AgeManager manager = new AgeManager();Scanner input = new Scanner(System.in);System.out.println("学员信息录入中");System.out.println("请输入学员信息(输入'exit'结束输入)");while(true) {try {System.out.println("请输入学员的姓名:");String name = input.next();// 检查是否要退出if (name.equalsIgnoreCase("exit")) {break;}System.out.println("请输入学员的年龄:");int age =0;try {age = input.nextInt();} catch (Exception e) {System.out.println("错误: 年龄必须为数字");continue;}manager.addOrUpdateAge(name, age);System.out.println(manager.getAllRecords());} catch (Exception e) {System.out.println("错误: " + e.getMessage());}}// 提供更新功能if (manager.getStudentCount() > 0) {System.out.println("\n是否要更新学员年龄?(Y/N)");String choice = input.next();if (choice.equals("Y")) {while (true) {System.out.print("\n输入要更新的学员姓名(输入'exit'退出): ");String name = input.next();if (name.equalsIgnoreCase("exit")) {break;}System.out.print("输入新的年龄: ");try {int newAge =input.nextInt();manager.updateAge(name, newAge);}  catch (Exception e) {System.out.println("错误: " + e.getMessage());}}// 显示更新后的信息System.out.println("\n更新后的学员信息:");System.out.println(manager.getAllRecords());}}}
} 
  • 7.循环添加十个字符串,选出第二个字是"声"的添加到集合中
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;public class StrTest {public static void main(String[] args) {System.out.println("请输入十个字符串:");Scanner input = new Scanner(System.in);List<String> lst = new ArrayList<>();for(int i= 1; i<=10; i++){System.out.println("请输入第"+i+"个字符串");String str = input.next();if(str.length()>=2 && str.charAt(1)=='声'){//charAt()lst.add(str);}}System.out.println(lst);}
}

相关文章:

  • UML 状态图:解锁电子图书馆管理系统的高效设计
  • android的 framework 有哪些知识点和应用场景
  • 一键部署k8s之EFK日志收集系统
  • 在 Android 中实现通话录音
  • Flask API 项目 Swagger 版本打架不兼容
  • 02_Flask是什么?
  • Hadoop+Spark 笔记 2025/4/21
  • 【python实用小脚本系列】用Python让鼠标“动起来”:光标自动移动、自动点击、自动图象识别的小技巧
  • CSS 中实现 div 居中有以下几种常用方法
  • ADB -> pull指令推送电脑文件到手机上
  • 大数据学习(109)-Impala 和 Hive 之间的 SQL 差异
  • 机器学习 Day13 Boosting集成学习方法: Adaboosting和GBDT
  • Spark-SQL连接Hive总结及实验
  • 使用SystemWeaver生成SOME/IP ETS ARXML的完整实战指南
  • 23种设计模式-结构型模式之外观模式(Java版本)
  • C++std::map
  • 批量替换多个 Word 文档中的指定图片
  • Spark SQL核心解析:大数据时代的结构化处理利器
  • 奇怪的问题
  • 【大数据分析】Apache Doris高性能实时分析数据库:MPP架构下的多场景应用与优势分析以及部署应用
  • 这家企业首次签约参展进博会,为何他说“中资企业没有停止出海的步伐”
  • 为青少年写新中国成立的故事,刘统遗著《火种》出版
  • 中汽协:杜绝虚假宣传与过度营销,确保用户清晰区别驾驶辅助与自动驾驶
  • 曼谷没有“邻家男孩”:跨境追星族经历的“余震”
  • 史蒂夫·麦奎因透露罹患前列腺癌,呼吁同胞莫受困于男性气概
  • 南阳市委副书记、政法委书记金浩任内落马