Java语言程序设计课件 第3章 高级特性_第1页
Java语言程序设计课件 第3章 高级特性_第2页
Java语言程序设计课件 第3章 高级特性_第3页
Java语言程序设计课件 第3章 高级特性_第4页
Java语言程序设计课件 第3章 高级特性_第5页
已阅读5页,还剩122页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章

高级特性CONTENTS目录3.2集合、泛型3.4线程3.3I/O流3.1异常3.1异常3.1.1异常的基本知识-异常的定义和作用定义:异常是程序运行时出现的错误或意外事件,导致程序无法继续正常运行。作用:通过异常机制,捕获并处理异常,防止程序终止,提升程序的健壮性。3.1.1异常的基本知识-异常的分类(1)受检异常(checkedexception)定义:受检异常是在编译时需要明确处理的异常(使用try...catch或throws)。常见类型:•IOException:输入输出异常。•FileNotFoundException:文件未找到。publicclassUncheckedExceptionExample1{publicstaticvoidmain(String[]args){Stringstr=null;try{System.out.println(str.length());//试图访问空对象}catch(NullPointerExceptione){System.out.println("捕获到非受检异常:"+e.getMessage());}}}3.1.1异常的基本知识-异常的分类(2)非受检异常(uncheckedexception)定义:非受检异常(运行时异常)是在编译时不要求明确处理,由程序员根据逻辑自行预防或捕获。常见类型:•NullPointerException:尝试操作空对象。•ArithmeticException:算术错误,如除以零。•IndexOutOfBoundsException:数组或集合索引越界。publicclassUncheckedExceptionExample2{publicstaticvoidmain(String[]args){try{intresult=10/0;//除以零}catch(ArithmeticExceptione){System.out.println("捕获到非受检异常:"+e.getMessage());}}}(3)系统级错误(Error)定义:系统级错误,通常是JVM无法恢复的严重问题,无法通过程序进行处理。常见类型:•OutOfMemoryError:内存不足。•StackOverflowError:递归过深导致栈内存溢出。importjava.util.ArrayList;publicclassErrorExample1{publicstaticvoidmain(String[]args){try{ArrayList<int[]>list=newArrayList<>();while(true){list.add(newint[1000000]);//创建大量大对象,导致内存不足}}catch(OutOfMemoryErrore){System.out.println("捕获到错误:"+e.getMessage());}}}publicclassErrorExample2{publicstaticvoidrecursiveMethod(){recursiveMethod();//无止尽地递归调用}publicstaticvoidmain(String[]args){try{recursiveMethod();}catch(StackOverflowErrore){System.out.println("捕获到错误:"+e.getMessage());}}}3.1.1异常的基本知识-异常的分类3.1.2异常的层次结构Throwable基类与子类Throwable(所有异常和错误的基类),其子类有Error和Exception。1.Error(系统级错误,一般无法通过程序处理来恢复)①StackOverflowError:栈溢出错误,例如递归调用没有正确终止导致栈空间耗尽。②OutOfMemoryError:内存溢出错误,比如申请的内存超出了JVM可分配的内存范围。2.Exception(程序中可预料的异常,可被程序捕获并处理)①RuntimeException:运行时异常,编译时可不强制要求处理。②NullPointerException:空指针异常,当访问空对象的成员或方法时抛出。③IndexOutOfBoundsException:索引越界异常,如数组访问超出了其合法的索引范围。3.非运行时异常(编译时异常,编译阶段就要求必须处理,否则代码无法通过编译)①IOException:输入输出相关异常,如文件读写出现问题等时抛出。②SQLException:数据库操作相关异常,在执行SQL语句等数据库交互出现错误时抛出。(1)ArithmeticException定义:算术错误,如除以零。publicclassArithmeticExceptionExample{publicstaticvoidmain(String[]args){try{intresult=10/0;//除以零会引发ArithmeticException}catch(ArithmeticExceptione){System.out.println("捕获到算术异常:"+e.getMessage());}}}3.1.3常见异常类-1.非受检异常(2)NullPointerException定义:访问空对象的成员或方法。publicclassNullPointerExceptionExample{publicstaticvoidmain(String[]args){try{Stringstr=null;//试图调用null对象的方法System.out.println(str.length());}catch(NullPointerExceptione){System.out.println("捕获到空指针异常:"+e.getMessage());}}}3.1.3常见异常类-1.非受检异常(3)ArrayIndexOutOfBoundsException定义:数组索引越界,如访问了不存在的数组元素。publicclassArrayIndexOutOfBoundsExceptionExample{publicstaticvoidmain(String[]args){try{int[]arr={1,2,3};System.out.println(arr[5]);//访问数组中不存在的索引}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("捕获到数组索引越界异常:"+e.getMessage());}}}3.1.3常见异常类-1.非受检异常(4)ClassCastException定义:尝试将对象强制转换为不兼容的类型。publicclassClassCastExceptionExample{publicstaticvoidmain(String[]args){try{Objectobj="Hello";Integernum=(Integer)obj;//字符串不能转换为整数}catch(ClassCastExceptione){System.out.println("捕获到类型转换异常:"+e.getMessage());}}}3.1.3常见异常类-1.非受检异常(5)IllegalArgumentException定义:方法被调用时传入了非法或不合理的参数。publicclassIllegalArgumentExceptionExample{publicstaticvoidmain(String[]args){try{intage=-1;setAge(age);//传入非法参数}catch(IllegalArgumentExceptione){System.out.println("捕获到非法参数异常:"+e.getMessage());}}publicstaticvoidsetAge(intage){if(age<0||age>150){thrownewIllegalArgumentException("年龄必须在0到150之间!");}}}3.1.3常见异常类-1.非受检异常(1)IOException定义:文件或IO操作失败时抛出,如读写文件出现问题。importjava.io.*;publicclassIOExceptionExample{publicstaticvoidmain(String[]args){try{Filefile=newFile("output.txt");FileWriterwriter=newFileWriter(file);writer.close();//如果关闭流失败,可能抛出IOExceptionwriter.write("Hello,World!");}catch(IOExceptione){System.out.println("捕获到IO异常:"+e.getMessage());}}}3.1.3常见异常类-2.受检异常(2)SQLException定义:数据库操作失败时抛出,如SQL查询语法错误或数据库连接问题。importjava.sql.*;publicclassSQLExceptionExample{publicstaticvoidmain(String[]args){Stringurl="jdbc:mysql://localhost:3306/testdb";Stringuser="root";Stringpassword="password";try{//加载驱动并建立数据库连接Connectionconnection=DriverManager.getConnection(url,user,password);//创建SQL语句并执行查询Stringquery="SELECT*FROMnon_existent_table";Statementstatement=connection.createStatement();ResultSetresultSet=statement.executeQuery(query);//表不存在,抛出异常}catch(SQLExceptione){System.out.println("捕获到SQL异常:"+e.getMessage());}}}3.1.3常见异常类-2.受检异常(3)ClassNotFoundException定义:在运行时试图加载类,但该类未找到时抛出。publicclassClassNotFoundExceptionExample{publicstaticvoidmain(String[]args){try{Class.forName("com.nonexistent.ClassName");//类未找到,抛出异常}catch(ClassNotFoundExceptione){System.out.println("捕获到类加载失败异常:"+e.getMessage());}}}3.1.3常见异常类-2.受检异常(4)FileNotFoundException定义:尝试访问一个不存在的文件时抛出。importjava.io.*;publicclassFileNotFoundExceptionExample{publicstaticvoidmain(String[]args){try{FileReaderreader=newFileReader("non_existent_file.txt");//文件不存在}catch(FileNotFoundExceptione){System.out.println("捕获到文件未找到异常:"+e.getMessage());}}}3.1.3常见异常类-2.受检异常(1)StackOverflowError定义:当方法调用层级过深,导致栈内存耗尽时抛出此错误。通常由无限递归或极深的递归调用引发。publicclassStackOverflowErrorExample{publicstaticvoidrecursiveMethod(){//无限递归调用自身,导致栈溢出recursiveMethod();}publicstaticvoidmain(String[]args){try{recursiveMethod();}catch(StackOverflowErrore){System.out.println("捕获到栈内存溢出错误:"+e.getMessage());}}}3.1.3常见异常类-3.错误(2)OutOfMemoryError定义:当堆内存不足以为对象分配空间时,抛出此错误。通常由分配大量内存或内存泄漏引发。importjava.util.ArrayList;publicclassOutOfMemoryErrorExample{publicstaticvoidmain(String[]args){try{ArrayList<int[]>list=newArrayList<>();while(true){//分配大量内存,最终导致堆内存不足list.add(newint[1000000]);//每次添加1MB的数组}}catch(OutOfMemoryErrore){System.out.println("捕获到堆内存不足错误:"+e.getMessage());}}}3.1.3常见异常类-3.错误3.1.4异常处理-1.异常处理的关键字①try:定义可能抛出异常的代码块。②catch:捕获异常并处理。③finally:始终执行的代码块,用于释放资源或执行清理操作。④throw:显式抛出异常。⑤throws:声明方法可能抛出的异常类型。基本结构如下:try{//可能引发异常的代码}catch(异常类型

变量名){//异常处理代码}finally{//无论是否发生异常,都会执行的代码}publicclassExceptionHandlingExample{publicstaticvoidmain(String[]args){try{intresult=10/0;//可能抛出ArithmeticException}catch(ArithmeticExceptione){System.out.println("捕获到异常:"+e.getMessage());}finally{System.out.println("无论是否有异常,都会执行的finally块。");}}}3.1.4异常处理-2.异常处理的基本结构定义:throw用于显式地抛出异常。publicclassThrowExample{publicstaticvoidcheckNumber(intnumber){if(number<0){thrownewIllegalArgumentException("数字不能为负数!");}}publicstaticvoidmain(String[]args){try{checkNumber(-5);}catch(IllegalArgumentExceptione){System.out.println("捕获到异常:"+e.getMessage());}}}3.1.4异常处理-3.使用throw抛出异常定义:throws用于声明一个方法可能抛出的异常类型,便于调用者进行处理。importjava.io.*;publicclassThrowsExample{publicstaticvoidreadFile(StringfileName)throwsIOException{FileReaderreader=newFileReader(fileName);reader.close();}publicstaticvoidmain(String[]args){try{readFile("non_existent_file.txt");}catch(IOExceptione){System.out.println("捕获到异常:"+e.getMessage());}}}3.1.4异常处理-4.使用throws声明异常一个try块可以配合多个catch块,用于处理不同类型的异常。每个catch块按顺序匹配异常类型。publicclassMultipleCatchExample{publicstaticvoidmain(String[]args){try{int[]arr={1,2};System.out.println(arr[3]);intresult=10/0;}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("捕获到数组索引越界异常:"+e.getMessage());}catch(ArithmeticExceptione){System.out.println("捕获到算术异常:"+e.getMessage());}catch(Exceptione){System.out.println("捕获到其他异常:"+e.getMessage());}}}3.1.4异常处理-5.多个catch块定义:无论是否发生异常,finally块中的代码都会执行,通常用于释放资源。importjava.io.*;publicclassFinallyExample{publicstaticvoidmain(String[]args){FileReaderreader=null;try{reader=newFileReader("non_existent_file.txt");}catch(FileNotFoundExceptione){System.out.println("捕获到异常:"+e.getMessage());}finally{System.out.println("释放资源。");}}}3.1.4异常处理-6.finally块3.1.5自定义异常-1.为什么需要自定义异常?①

更精准的异常描述:Java内置异常无法完全涵盖业务场景。②

增强程序的可读性:通过语义化的异常类名和信息,帮助开发者更清楚地理解问题。③

更细粒度的异常处理:允许针对特定异常类型实现定制化的异常处理逻辑。①

继承Exception:创建受检异常,调用者必须显式捕获或声明。//自定义异常类classInvalidAgeExceptionextendsException{publicInvalidAgeException(Stringmessage){super(message);}}//使用自定义异常publicclassCustomCheckedExceptionExample{publicstaticvoidcheckAge(intage)throwsInvalidAgeException{if(age<18){thrownewInvalidAgeException("年龄未满18岁,不允许注册!");}}publicstaticvoidmain(String[]args){try{checkAge(16);//触发异常}catch(InvalidAgeExceptione){System.out.println("捕获到异常:"+e.getMessage());}}}3.1.5自定义异常-2.创建自定义异常类②

继承RuntimeException:创建非受检异常,调用者可以选择捕获。classNegativeNumberExceptionextendsRuntimeException{publicNegativeNumberException(Stringmessage){super(message);}}//使用自定义异常publicclassCustomUncheckedExceptionExample{publicstaticdoublesquare(intnumber){if(number<0){thrownewNegativeNumberException("输入的数字是负数,无法计算平方!");}returnMath.sqrt(number);}publicstaticvoidmain(String[]args){try{System.out.println("平方结果:"+square(-5));//触发异常}catch(NegativeNumberExceptione){System.out.println("捕获到异常:"+e.getMessage());}}}3.1.5自定义异常-2.创建自定义异常类(1)添加错误代码可以在异常中包含自定义字段,如错误代码。classErrorCodeExceptionextendsException{privateinterrorCode;publicErrorCodeException(Stringmessage,interrorCode){super(message);this.errorCode=errorCode;}publicintgetErrorCode(){returnerrorCode;}}publicclassCustomExceptionWithErrorCode{publicstaticvoidmain(String[]args){try{thrownewErrorCodeException("操作失败",1001);}catch(ErrorCodeExceptione){System.out.println("捕获到异常:"+e.getMessage()+",错误代码:"+e.getErrorCode());}}}3.1.5自定义异常-3.自定义异常的扩展功能(2)嵌套异常(异常链)自定义异常可以包装其他异常作为原因(cause)。classFileProcessingExceptionextendsException{publicFileProcessingException(Stringmessage,Throwablecause){super(message,cause);}}publicclassNestedExceptionExample{publicstaticvoidreadFile(StringfileName)throwsFileProcessingException{try{thrownewNullPointerException("模拟文件读取时发生的空指针异常");}catch(NullPointerExceptione){thrownewFileProcessingException("文件处理失败:"+fileName,e);}}publicstaticvoidmain(String[]args){try{readFile("example.txt");}catch(FileProcessingExceptione){System.out.println("捕获到异常:"+e.getMessage());System.out.println("原始异常原因:"+e.getCause());}}}3.1.5自定义异常-3.自定义异常的扩展功能3.2集合、泛型3.2.1集合的基本概念1.集合的定义在Java中,集合是用来存储和操作数据的容器。Java集合框架(Javacollectionsframework)提供了一种统一的方式来处理对象集合。2.继承关系容器类有两个根接口,分别是Collection和Map,Collection表示单个元素的集合,Map表示键值对的集合。Collection接口是所有单一元素集合类的根接口,表示一个元素的集合。它定义了基本的集合操作,如添加、删除、遍历、判断元素是否存在等。Collection接口本身是一个非常通用的接口,常见子接口:List、Set、Queue、Deque等。与Collection接口不同,Map接口表示一个“键值对”集合,是用于存储键(key)和对应的值(value)的一种数据结构。Map接口并不是Collection接口的子接口,而是一个独立的接口,通常用于存储对象之间的映射关系。3.2.2Collection中的常用方法-1.add(Ee)描述:向集合中添加元素。若元素添加成功,返回true;如果集合不允许重复元素且元素已存在,则返回false(如Set)。List<String>list=newArrayList<>();list.add("apple");list.add("banana");System.out.println(list);//输出:[apple,banana]3.2.2Collection中的常用方法-2.addAll(Collection<?extendsE>c)描述:将指定集合中的所有元素添加到当前集合中。List<String>list1=newArrayList<>();list1.add("apple");list1.add("banana");List<String>list2=newArrayList<>();list2.add("orange");list2.add("grape");list1.addAll(list2);System.out.println(list1);//输出:[apple,banana,orange,grape]3.2.2Collection中的常用方法-3.clear()描述:清空集合中的所有元素。List<String>list=newArrayList<>();list.add("apple");list.add("banana");list.clear();System.out.println(list);//输出:[]3.2.2Collection中的常用方法-4.contains(Objecto)描述:检查集合中是否包含指定的元素。若包含返回true,否则返回false。List<String>list=newArrayList<>();list.add("apple");list.add("banana");System.out.println(list.contains("apple"));//输出:trueSystem.out.println(list.contains("grape"));//输出:false3.2.2Collection中的常用方法-5.containsAll(Collection<?>c)描述:检查当前集合是否包含指定集合中的所有元素。如果当前集合包含所有指定元素返回true。List<String>list1=newArrayList<>();list1.add("apple");list1.add("banana");List<String>list2=newArrayList<>();list2.add("apple");System.out.println(list1.containsAll(list2));//输出:true3.2.2Collection中的常用方法-6.isEmpty()描述:检查集合是否为空。若集合中没有元素,返回true,否则返回false。List<String>list=newArrayList<>();System.out.println(list.isEmpty());//输出:truelist.add("apple");System.out.println(list.isEmpty());//输出:false3.2.2Collection中的常用方法-7.remove(Objecto)描述:从集合中删除指定的元素。如果删除了元素返回true,若元素不存在则返回false。List<String>list=newArrayList<>();list.add("apple");list.add("banana");list.remove("apple");System.out.println(list);//输出:[banana]3.2.2Collection中的常用方法-8.removeAll(Collection<?>c)描述:从当前集合中删除包含在指定集合中的所有元素。List<String>list1=newArrayList<>();list1.add("apple");list1.add("banana");List<String>list2=newArrayList<>();list2.add("banana");list1.removeAll(list2);System.out.println(list1);//输出:[apple]3.2.2Collection中的常用方法-9.retainAll(Collection<?>c)描述:仅保留当前集合中包含在指定集合中的元素。List<String>list1=newArrayList<>();list1.add("apple");list1.add("banana");list1.add("orange");List<String>list2=newArrayList<>();list2.add("banana");list2.add("orange");list1.retainAll(list2);System.out.println(list1);//输出:[banana,orange]3.2.2Collection中的常用方法-10.size()描述:返回集合中元素的数量。List<String>list=newArrayList<>();list.add("apple");list.add("banana");System.out.println(list.size());//输出:23.2.2Collection中的常用方法-11.toArray()描述:将集合中的元素转换为数组。默认返回一个Object[]数组。List<String>list=newArrayList<>();list.add("apple");list.add("banana");Object[]arr=list.toArray();//输出:[apple,banana]System.out.println(Arrays.toString(arr));3.2.2Collection中的常用方法-

12.forEach(Consumer<?superE>action)描述:通过Consumer函数接口对集合中的每个元素执行操作。这是java.util包中的一种常见的流操作方法。List<String>list=newArrayList<>();list.add("apple");list.add("banana");//使用Lambda表达式打印每个元素list.forEach(item->System.out.println(item));//输出://apple//banana3.2.2Collection中的常用方法-13.toArray(T[]a)描述:将集合转换为一个指定类型的数组。如果数组长度不足,创建一个新数组,返回此数组。List<String>list=newArrayList<>();list.add("apple");list.add("banana");String[]arr=list.toArray(newString[0]);System.out.println(Arrays.toString(arr));//输出:[apple,banana]3.2.2Collection中的常用方法-14.iterator()描述:返回一个迭代器(iterator),可以通过迭代器对集合中的元素进行遍历。List<String>list=newArrayList<>();list.add("apple");list.add("banana");Iterator<String>iterator=list.iterator();while(iterator.hasNext()){System.out.println(iterator.next());//输出:apple\nbanana}3.2.2Collection中的常用方法-15.equals(Objecto)描述:判断当前集合与指定集合是否相等。如果两个集合的大小、元素相同,则返回true,否则返回false。List<String>list1=newArrayList<>();list1.add("apple");list1.add("banana");List<String>list2=newArrayList<>();list2.add("apple");list2.add("banana");System.out.println(list1.equals(list2));//输出:true3.2.2Collection中的常用方法-16.hashCode()描述:返回集合的哈希码,用于在哈希集合中定位元素。List<String>list=newArrayList<>();list.add("apple");list.add("banana");System.out.println(list.hashCode());3.2.3List接口常用的实现类在Java中,List接口是有序集合的一种,它允许元素的重复,并且可以通过索引来访问元素。List接口的常见实现类有ArrayList、LinkedList、Vector和Stack等。每种实现类的内部实现方式和特点各不相同,适用于不同的场景。下面我们详细介绍这些实现类及其区别,并通过示例来说明它们的用法和特点。3.2.3List接口常用的实现类-1.ArrayList描述ArrayList是最常用的List实现类之一,它是基于动态数组实现的。支持随机访问,查询速度快。由于内部使用数组存储元素,插入和删除元素时(尤其是在中间位置)需要移动元素,性能相对较差。特点支持快速随机访问;插入和删除操作的性能较差,尤其是在集合中间插入或删除元素时;线程不安全;可以动态扩展数组大小。适用场景适合查找频繁且插入/删除操作较少的场景。3.2.3List接口常用的实现类-1.ArrayListimportjava.util.*;publicclassArrayListExample{publicstaticvoidmain(String[]args){List<String>list=newArrayList<String>();list.add("apple");list.add("banana");list.add("cherry");System.out.println(list);//输出:[apple,banana,cherry]System.out.println(list.get(1));//输出:banana}}3.2.3List接口常用的实现类-2.LinkedList描述:LinkedList是基于双向链表实现的。它提供了比ArrayList更高效的插入和删除操作(特别是在列表的开头和中间),但其随机访问速度较慢,因为它需要从头或尾开始遍历链表。特点:插入和删除操作效率较高,尤其是在列表的开头或中间;随机访问速度较慢,时间复杂度为O(n);线程不安全;可以作为栈、队列使用,提供了addFirst()、addLast()等操作。适用场景:适合插入、删除操作频繁的场景,特别是当操作集中在列表的头部或中部时。importjava.util.*;publicclassLinkedListExample{publicstaticvoidmain(String[]args){List<String>list=newLinkedList<String>();list.add("apple");list.add("banana");list.add("cherry");list.add(1,"orange");//在索引1处插入元素System.out.println(list);//输出:[apple,orange,banana,cherry]list.remove("banana");//删除元素bananaSystem.out.println(list);//输出:[apple,orange,cherry]}}3.2.3List接口常用的实现类-3.Vector描述Vector是基于动态数组实现的,和ArrayList类似。与ArrayList的主要区别是,Vector是线程安全的。每个Vector的操作都使用同步机制,确保在多线程环境下的安全性,但也因此会带来性能上的开销。特点线程安全,适合多线程环境;相比ArrayList,性能较差,因为它的每个方法都进行同步处理;自动扩展容量,默认扩展为原来大小的两倍。适用场景适用于多线程环境下的同步访问,但如果可以避免同步,ArrayList性能更优。示例importjava.util.*;publicclassVectorExample{publicstaticvoidmain(String[]args){List<String>list=newVector<String>();list.add("apple");list.add("banana");list.add("cherry");System.out.println(list);//输出:[apple,banana,cherry]}}3.2.3List接口常用的实现类-4.Stack描述:Stack是Vector的一个子类,提供了栈的实现,遵循“后进先出”(LIFO)原则。它有push()、pop()、peek()等方法用于操作栈。特点:Stack是基于Vector实现的,因此它也是线程安全的;提供了栈特有的操作:push()、pop()、peek();Stack类已经不推荐使用,建议使用Deque接口的ArrayDeque来替代。适用场景:适用于栈(LIFO)数据结构的应用场景,如深度优先搜索(DFS)等。importjava.util.*;publicclassStackExample{publicstaticvoidmain(String[]args){Stack<String>stack=newStack<>();stack.push("apple");stack.push("banana");stack.push("cherry");System.out.println(stack);//输出:[apple,banana,cherry]System.out.println(stack.pop());//输出:cherrySystem.out.println(stack.peek());//输出:banana}}3.2.3List接口常用的实现类-5.CopyOnWriteArrayList描述CopyOnWriteArrayList是java.util.concurrent包下的一个线程安全的List实现类。它采用写时复制(copy-on-write)策略,即在对集合进行修改时会复制一份原集合,并对新集合进行修改。这意味着在多线程环境下读取操作不会被阻塞,写入操作会导致性能下降。特点线程安全,适合多线程环境;读操作非常高效,因为读操作不会被阻塞;写操作效率较低,因为每次写操作都会复制整个数组。适用场景适用于读操作远多于写操作的场景,如缓存、事件监听器等。importjava.util.concurrent.*;publicclassCopyOnWriteArrayListExample{publicstaticvoidmain(String[]args){List<String>list=newCopyOnWriteArrayList<>();list.add("apple");list.add("banana");list.add("cherry");//在并发环境下操作,读操作不会阻塞for(Stringitem:list){System.out.println(item);}}}3.2.3List接口常用的实现类-5.CopyOnWriteArrayListSet接口常用的实现类Set接口实现类HashSet基于哈希表,提供快速的元素添加和查找,但不保证顺序。Set接口实现类LinkedHashSet维护元素的插入顺序,适合需要顺序访问元素的场景。Set接口实现类TreeSet基于红黑树,能够对元素进行排序,适用于需要排序的集合操作。3.2.4Set接口常用的实现类-1.HashSet描述HashSet是最常用的Set实现类,它基于哈希表实现,提供快速的查找、插入和删除操作。HashSet中的元素是无序的,也就是说,元素的插入顺序不一定与其存储顺序一致。特点不允许重复元素;元素的存储顺序是不确定的(无序);通过哈希算法进行元素定位,查找、插入和删除操作的时间复杂度为O(1);线程不安全,若在多线程环境中使用,必须自己保证线程安全。适用场景适用于需要快速查找且不关心元素顺序的场景。importjava.util.*;publicclassHashSetExample{publicstaticvoidmain(String[]args){Set<String>set=newHashSet<>();set.add("apple");set.add("banana");set.add("cherry");set.add("apple");//重复元素,不会被添加//输出:[banana,apple,cherry],元素无序,顺序不确定System.out.println(set);}}3.2.4Set接口常用的实现类-2.LinkedHashSet描述LinkedHashSet是HashSet的一个子类,它保持了元素的插入顺序。它内部使用链表来维护元素的顺序,因此在插入元素时会保留插入的顺序。特点不允许重复元素;元素的存储顺序与插入顺序相同;查找、插入和删除操作的时间复杂度为O(1),但由于需要维护插入顺序,性能略低于HashSet;线程不安全。适用场景适用于需要保持元素插入顺序的场景,如在缓存中保留元素的访问顺序。LinkedHashSet示例代码importjava.util.*;publicclassLinkedHashSetExample{publicstaticvoidmain(String[]args){Set<String>set=newLinkedHashSet<>();set.add("apple");set.add("banana");set.add("cherry");set.add("apple");//重复元素,不会被添加System.out.println(set);//输出:[apple,banana,cherry],元素保持插入顺序}}3.2.4Set接口常用的实现类-3.TreeSet描述TreeSet,基于红黑树的有序Set,支持自然排序或自定义排序。特点TreeSet:无重复、有序,基于红黑树,线程不安全。适用场景适用场景:适用于需要按顺序存储元素的场景,特别是在有排序要求时。importjava.util.*;publicclassTreeSetExample{publicstaticvoidmain(String[]args){Set<String>set=newTreeSet<>();set.add("apple");set.add("banana");set.add("cherry");set.add("apple");//重复元素,不会被添加//输出:[apple,banana,cherry],元素按自然顺序排序System.out.println(set);}}3.2.4Set接口常用的实现类-4.CopyOnWriteArraySet描述CopyOnWriteArraySet:线程安全的Set实现,读写分离,修改时复制底层数组,保障读取不受并发影响。特点线程安全,读多写少场景优选,写操作性能低。适用场景适用场景:适用于读操作频繁且对线程安全有要求的场景。importjava.util.concurrent.*;publicclassCopyOnWriteArraySetExample{publicstaticvoidmain(String[]args){Set<String>set=newCopyOnWriteArraySet<>();set.add("apple");set.add("banana");set.add("cherry");set.add("apple");//重复元素,不会被添加System.out.println(set);//输出:[banana,apple,cherry]}}3.2.5Queue接口常用实现类-1.LinkedList描述LinkedList,双向链表实现,兼容Queue与Deque,支持两端操作。特点LinkedList:队列操作高效,插入删除快,线程不安全。适用场景适用于频繁队列操作,尤其两端插入删除,实现Queue和Deque接口。importjava.util.*;publicclassLinkedListQueueExample{publicstaticvoidmain(String[]args){Queue<String>queue=newLinkedList<>();queue.offer("apple");queue.offer("banana");queue.offer("cherry");System.out.println(queue);//输出:[apple,banana,cherry]System.out.println(queue.poll());//输出:appleSystem.out.println(queue);//输出:[banana,cherry]System.out.println(queue.peek());//输出:banana}}3.2.5Queue接口常用实现类-2.PriorityQueue描述PriorityQueue:基于优先级排序的队列实现,非线程安全,不保证顺序。特点PriorityQueue:支持优先级排序,插入删除O(logn),线程不安全,可自定义排序规则。适用场景适用于需要根据优先级处理元素的场景,比如任务调度、事件驱动等。importjava.util.*;publicclassPriorityQueueExample{publicstaticvoidmain(String[]args){Queue<Integer>queue=newPriorityQueue<>();queue.offer(10);queue.offer(20);queue.offer(15);//输出:[10,20,15],按自然顺序排序System.out.println(queue);System.out.println(queue.poll());//输出:10System.out.println(queue);//输出:[15,20]//自定义排序规则Queue<Integer>reverseQueue=newPriorityQueue<>(Comparator.reverseOrder());reverseQueue.offer(10);reverseQueue.offer(20);reverseQueue.offer(15);System.out.println(reverseQueue);//输出:[20,15,10],按降序排序}}3.2.5Queue接口常用实现类-3.ArrayDeque描述ArrayDeque是基于动态数组实现的双端队列(deque),实现了Queue接口,它提供了队列的标准操作。特点不支持null元素;支持快速的队列操作(如offer()、poll()、peek());适用场景适用于需要高效的非线程安全队列操作的场景。importjava.util.*;publicclassArrayDequeQueueExample{publicstaticvoidmain(String[]args){Queue<String>queue=newArrayDeque<>();queue.offer("apple");queue.offer("banana");queue.offer("cherry");System.out.println(queue);//输出:[apple,banana,cherry]System.out.println(queue.poll());//输出:appleSystem.out.println(queue);//输出:[banana,cherry]System.out.println(queue.peek());//输出:banana}}3.2.5Queue接口常用实现类-4.ConcurrentLinkedQueue描述ConcurrentLinkedQueue是Queue接口的线程安全实现,基于非阻塞算法(CAS)实现。它适用于并发场景,提供高效的无锁队列操作,支持高并发的插入和删除操作。特点线程安全,适用于多线程环境;非阻塞操作,性能优越;支持null元素;时间复杂度通常为O(1)。适用场景适用于高并发环境中的队列操作,尤其是对于插入和删除操作频繁且不需要阻塞的场景。importjava.util.concurrent.*;publicclassConcurrentLinkedQueueExample{publicstaticvoidmain(String[]args){Queue<String>queue=newConcurrentLinkedQueue<>();queue.offer("apple");queue.offer("banana");queue.offer("cherry");System.out.println(queue);//输出:[apple,banana,cherry]System.out.println(queue.poll());//输出:appleSystem.out.println(queue);//输出:[banana,cherry]System.out.println(queue.peek());//输出:banana}}(1)put(Kkey,Vvalue)描述:将指定的键值对插入到Map中。若Map中已存在该键,则更新该键的值。Map<String,Integer>map=newHashMap<>();map.put("apple",1);//添加键值对("apple",1)map.put("banana",2);//添加键值对("banana",2)map.put("apple",3);//更新键"apple"的值为3System.out.println(map);//输出:{apple=3,banana=2}3.2.6Map接口中的常用方法及其常用的实现类-

1.Map接口中的常用方法(2)get(Objectkey)描述:根据指定的键返回与之关联的值。如果该键不存在,则返回null。Map<String,Integer>map=newHashMap<>();map.put("apple",1);map.put("banana",2);System.out.println(map.get("apple"));//输出:1System.out.println(map.get("orange"));//输出:null3.2.6Map接口中的常用方法及其常用的实现类-

1.Map接口中的常用方法(3)containsKey(Objectkey)描述:检查Map中是否包含指定的键。Map<String,Integer>map=newHashMap<>();map.put("apple",1);map.put("banana",2);System.out.println(map.containsKey("apple"));//输出:trueSystem.out.println(map.containsKey("orange"));//输出:false3.2.6Map接口中的常用方法及其常用的实现类-

1.Map接口中的常用方法(4)containsValue(Objectvalue)描述:检查Map中是否包含指定的值。Map<String,Integer>map=newHashMap<>();map.put("apple",1);map.put("banana",2);System.out.println(map.containsValue(1));//输出:trueSystem.out.println(map.containsValue(3));//输出:false3.2.6Map接口中的常用方法及其常用的实现类-

1.Map接口中的常用方法(5)remove(Objectkey)描述:根据指定的键删除Map中的键值对。如果键存在,删除该键值对并返回与该键关联的值。如果键不存在,返回null。Map<String,Integer>map=newHashMap<>();map.put("apple",1);map.put("banana",2);System.out.println(map.remove("apple"));//输出:1System.out.println(map);//输出:{banana=2}3.2.6Map接口中的常用方法及其常用的实现类-

1.Map接口中的常用方法(6)size()描述:返回Map中键值对的数量。Map<String,Integer>map=newHashMap<>();map.put("apple",1);map.put("banana",2);System.out.println(map.size());//输出:23.2.6Map接口中的常用方法及其常用的实现类-

1.Map接口中的常用方法(7)clear()描述:清空Map中的所有键值对。Map<String,Integer>map=newHashMap<>();map.put("apple",1);map.put("banana",2);map.clear();System.out.println(map);//输出:{}3.2.6Map接口中的常用方法及其常用的实现类-

1.Map接口中的常用方法(8)keySet()描述:返回Map中所有键的Set集合。Map<String,Integer>map=newHashMap<>();map.put("apple",1);map.put("banana",2);System.out.println(map.keySet());//输出:[apple,banana]3.2.6Map接口中的常用方法及其常用的实现类-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论