还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
程序设计概述Java欢迎参加程序设计课程!本课程将带领大家系统地学习编程语言的Java Java基础知识与应用技巧作为当今最流行的编程语言之一,在各个领域都Java有广泛应用本课程将从基础语法、面向对象编程到高级特性,全方位讲解编程Java Java的核心概念和实践技能年春季学期,我们将共同探索的奥秘,2025Java为您的编程之旅打下坚实基础课程目标掌握基础Java通过系统学习,掌握编程的基础知识和语法结构,能够理解和分析简单的Java Java代码,为进一步学习打下基础理解面向对象深入理解面向对象编程的核心概念,包括封装、继承和多态,掌握如何设计和实现类与对象独立开发能力通过大量的实践练习,培养独立开发简单应用程序的能力,能够解决实际编程Java问题进阶准备为未来学习更高级的技术(如框架、分布式系统等)打下坚实的技术基础Java课程内容概览基础知识与环境配置Java学习的基本概念,搭建开发环境,了解、和的关系Java JDK JRE JVM语法基础Java掌握数据类型、变量、运算符、流程控制等基础语法知识面向对象编程特性深入学习类与对象、封装、继承、多态等面向对象核心概念与常用类库Java API熟悉标准库,包括集合框架、操作、多线程等常用Java IOAPI程序设计实践Java通过实际项目练习,综合应用所学知识,提升编程实战能力简介Java1年诞生1995由公司的詹姆斯高斯林()领Sun Microsystems·James Gosling导的团队创建,最初用于数字电视机顶盒等消费电子产品2年收购2010公司以亿美元收购,成为Oracle74Sun MicrosystemsJava Oracle的重要技术资产3年最新版2023发布,带来更多新特性和性能优化,继续保持其技术活力Java21作为一种广泛使用的编程语言,已拥有全球超过万活跃开发者从智能Java1200手机到企业服务器,超过亿台设备正在运行应用程序,彰显其强大的生态150Java系统和市场影响力的特点Java面向对象平台无关性是一种纯面向对象的语言,支持封Java一次编写,到处运行(Write Once,装、继承和多态等面向对象的核心特性,)是最大的特点Run AnywhereJava使代码更加模块化和可重用程序编写一次后,可以在不同的系统平台上运行,无需修改代码简单易学语法设计清晰简洁,摒弃了指针Java等复杂概念,相比更易掌握,降低C++高性能了编程难度通过(即时编译)技术,虚拟JIT Java安全可靠机能够在运行时将字节码转换为高效的强类型机制,异常处理,自动内存管理机器码,提供接近本地代码的执行效率和垃圾回收等特性,使程序更加健Java壮和安全、和JDKJREJVMJDK,包含和开发工具Java DevelopmentKit JREJRE,包含和类库Java RuntimeEnvironment JVMJVM,执行字节码Java VirtualMachine Java(开发工具包)是面向开发人员的完整工具集,包含编译器、调试器等开发工具,以及完整的开发程序必须安装JDK Java JRE JavaJDK(运行环境)提供了运行程序所需的最小环境,包含和核心类库如果只需运行程序而不开发,只需安装即可JRE Java Java JVM JavaJRE(虚拟机)是平台无关性的核心,负责将字节码转换为特定平台的机器码并执行不同操作系统有不同的实现,但都能执行相JVMJava Java JVM同的字节码Java搭建开发环境Java下载安装JDK从官方网站获取最新Oracle JDK配置环境变量设置和变量JAVA_HOME Path安装开发工具选择合适的如或IDE Eclipse IntelliJ验证环境运行测试安装是否成功Hello World搭建开发环境是学习编程的第一步目前最流行的有(免费开源)、(专业版收费,社区版免费)和(免Java JavaJava IDEEclipseIntelliJIDEA NetBeans费开源)初学者可以从这些中选择一个开始学习IDE在安装完成后,建议通过编写简单的程序来验证环境是否正确配置如果程序能够成功编译和运行,说明开发环境已经准备就绪Hello World第一个程序Java HelloWorld代码示例程序结构解析公共类定义•public classpublic class HelloWorld{方法程序入口•mainpublic staticvoid mainString[]args{打印输出System.out.printlnHello,World!;•System.out.println}}编写完成后,需要通过命令将源代码编译成字节码文件(),然后通过javac HelloWorld.java HelloWorld.class java命令运行程序编译过程会检查代码是否存在语法错误,运行时需要加载类文件并执行HelloWorld JVM初学者常见问题包括大小写错误(区分大小写)、文件名与类名不一致、分号丢失、中英文符号混用等解决方法是仔细检查Java语法,严格按照编码规范编写代码Java程序基本结构Java包声明位于程序第一行,使用关键字,定义类所在的命名空间,如package packagecom.example.project;导入语句使用关键字引入需要使用的类,如import importjava.util.Scanner;类定义使用关键字定义一个类,如class public class MyProgram方法声明在类内部定义方法,如public voiddisplayMessage方法入口main程序执行的起点public staticvoid mainString[]args程序遵循严格的文件与类名对应规则一个公共类必须与文件名完全一致例如,如果文件名为,则其中的公共类必须命名为Java MyProgram.java MyProgram包命名通常采用反向域名方式,如,这样可以避免命名冲突语句可以单独导入特定类,也可以使用通配符导入整个包的所有类com.company.project import基本语法规则Java标识符与关键字标识符是用户自定义的名称,用于命名类、方法和变量关键字是预定义的、有特殊意Java义的单词,如、、等,不能用作标识符public classif区分大小写对大小写敏感,、和是三个不同的标识符方法名和变量名通常Java countCount COUNT以小写字母开始,类名以大写字母开始类名与文件名公共类名必须与文件名完全一致(包括大小写)一个源文件中只能有一个公共类,但Java可以有多个非公共类注释类型支持三种注释单行注释(),多行注释()和文档注释()文档注Java///**//***/释可以生成格式的文档HTML API推荐使用驼峰命名法类名使用大驼峰(首字母大写),方法和变量名使用小驼峰(首字母小Java写)常量通常全部大写,单词间用下划线分隔良好的代码缩进和格式有助于提高代码的可读性和可维护性数据类型基本类型类型字节位范围默认值到byte18-1281270到short216-32,768032,767到int432-2^312^31-10到long864-2^632^63-10L单精度浮点float
4320.0f双精度浮点double
8640.0d到char216065,535\u0000或boolean-1true falsefalse中的基本数据类型是语言内置的、直接存储值的类型整型(、、、)用于表示整数,Java byteshort intlong浮点型(、)用于表示小数,用于表示单个字符,用于表示真假值float doublechar boolean在中,不同基本类型之间可以进行转换自动类型转换(隐式转换)发生在从小范围类型到大范围类型的Java赋值中,而强制类型转换(显式转换)需要使用转换运算符,可能会导致数据精度丢失数据类型引用类型类()接口()Class Interface用户定义的复合数据类型,是创建对象的模板例如、等都是定义方法签名但不实现的抽象类型,用于实现多重继承接口只包含常量和抽String Scanner类类定义了对象的属性(状态)和方法(行为)象方法(后也可包含默认方法和静态方法)Java8数组()枚举()Array Enum存储同类型数据的容器,可以是基本类型数组,也可以是引用类型数组特殊的类,表示一组命名的常量枚举可以有构造方法、属性和方法,每个枚Java数组是对象,有属性表示长度举常量实际上是该枚举类型的实例length引用类型与基本类型的主要区别引用类型是对象,存储在堆内存中,变量保存的是对象的引用(地址);基本类型直接存储值,通常在栈内存中引用类型可以调用方法,有空值,而基本类型没有方法,不能为null null提供了基本类型对应的包装类(如、等),可以在基本类型和引用类型之间进行自动装箱和拆箱,便于在需要对象的场合使用基本数据Java IntegerDouble变量与常量变量声明与初始化变量作用域//声明//类变量(静态变量)int count;static intglobalCount;//声明并初始化double price=
29.99;//实例变量//多个变量同时声明private String name;int x,y,z=100;//局部变量void method{int localVar=10;}变量命名规则必须以字母、下划线或符号开头,后跟字母、数字、下划线或符号;不能使用关键字;遵循小驼峰命名法(首字母小写)良好的变量名应当具有$$Java描述性,能够清晰表达变量的用途常量使用关键字定义,一旦初始化后就不能再被修改类常量通常使用修饰,表示该常量在整个类中共享且不可变常量命名通常使用全大写字母,多个final staticfinal单词之间用下划线分隔,如MAX_VALUE变量的生命周期与其作用域相关类变量与类同在,实例变量与对象同在,局部变量仅在其声明的块或方法内有效运算符算术运算符关系运算符逻辑运算符位运算符(加),(减),(等于),(不等于),(与),(或),(非)(按位与),(按位或),+-*==!=||!|(乘),(除),(取(大于),(小于),(按位异或),(按位/%^~余),(自增),(大于等于),(小取反),(左移),++--==(自减)于等于)(右移),(无符号右移)三元运算符()是中唯一的三目运算符,其语法为条件表达式表达式表达式当条件为真时返回表达式的值,否则返回表达式的值:Java1:212例如int max=aba:b;运算符有优先级顺序,通常算术运算符优先级高于关系运算符,关系运算符优先级高于逻辑运算符建议使用括号明确表达运算顺序,提高代码可Java读性例如result=a+b*c/d-e;流程控制条件语句语句ifif condition{//当条件为真时执行}语句if-elseif condition{//当条件为真时执行}else{//当条件为假时执行}语句if-else if-elseif condition1{//条件1为真时执行}else ifcondition2{//条件1为假且条件2为真时执行}else{//条件1和条件2都为假时执行}语句switch-caseswitch expression{case value1://表达式等于value1时执行break;case value2://表达式等于value2时执行break;default://表达式不等于任何case值时执行}流程控制循环语句循环while先判断条件,只有条件为真时才执行循环体适用于事先不知道具体循环次数的情况while condition{//循环体}循环do-while先执行一次循环体,再判断条件保证循环体至少执行一次do{//循环体}while condition;循环for结构清晰,适合已知循环次数的情况包含初始化、条件和更新三部分for initialization;condition;update{//循环体}增强型循环()是引入的语法糖,专门用于遍历数组或集合,语法更简洁它不提供索引信息,也不能修改集合中的元素for foreachJava5for ElementTypeelement:collection{...}语句用于提前退出循环,语句用于跳过当前循环的剩余部分,直接开始下一次循环在嵌套循环中,和默认只影响最内层循环,可以使用标签()指定影响哪一层循环break continuebreak continuelabel数组数组的声明与创建数组初始化//声明数组//静态初始化int[]numbers;int[]values={10,20,30};//创建并分配空间//动态初始化numbers=new int
[5];String[]names=new String
[3];//声明并创建names
[0]=张三;int[]scores=new int
[10];names
[1]=李四;names
[2]=王五;数组是对象,具有属性表示数组长度数组一旦创建,其长度不可改变数组元素有默认值数值型为,布尔型为,引用型为数组索Java length0false null引从开始,访问超出范围的索引会抛出异常0ArrayIndexOutOfBoundsException多维数组实际上是数组的数组二维数组可以看作矩阵,声明方式为(创建行列的矩阵)多维数组的每一维int[][]matrix=new int
[3]
[4];34Java长度可以不同,这种情况下创建的是不规则数组工具类提供了许多实用方法,如(排序)、(二分查找)、(比较数组)、(填充数组)和(转换为字Arrays sortbinarySearch equalsfill toString符串表示)等,简化了数组的常见操作字符串处理类String不可变字符序列,一旦创建不能修改StringBuilder可变字符序列,不同步,单线程使用StringBuffer可变字符序列,同步安全,多线程使用字符串可以通过两种方式创建字符串字面量(如)和使用关键字(如)前者会使用字符串常量池,相String s=hello;new Strings=new Stringhello;同内容的字符串共享同一个对象;后者在堆内存中创建新对象,即使内容相同也是不同对象常用字符串操作方法包括(获取长度)、(获取指定位置字符)、(提取子串)、(查找子串位置)、(比较内length charAtsubstring indexOfequals容)、(忽略大小写比较)、(去除两端空白)、(转换大小写)、(分割字符串)等equalsIgnoreCase trimtoUpperCase/toLowerCase split在需要频繁修改字符串的场景,应使用或,它们提供了、、等方法来高效修改字符内容,避免创建过多临时StringBuilder StringBufferappend insertdelete对象导致的性能问题面向对象编程基础封装继承将数据和操作数据的方法绑定在一起,对外允许一个类(子类)获取另一个类(父类)部隐藏实现细节,只暴露必要的接口的属性和方法,实现代码重用抽象多态专注于对象的关键特性而忽略非本质细节,同一个行为具有多个不同表现形式,允许不提取共同特征形成类同类对象对同一消息作出不同响应面向对象编程()是一种以对象为中心的编程范式,将问题分解为一组对象,通过对象之间的交互来解决问题类是对象的模板,定义了对象OOP的属性(状态)和方法(行为);对象是类的实例,代表具体实体良好的面向对象设计应遵循原则单一职责原则()、开闭原则()、里氏替换原则()、接口隔离原则()和依赖倒置SOLID SRPOCP LSPISP原则()这些原则有助于创建易于维护、扩展和重用的代码结构DIP类的定义public classStudent{//成员变量(属性)private intid;private String name;private int age;//构造方法public Student{//默认构造方法}public Studentintid,Stringname,int age{this.id=id;this.name=name;this.age=age;}//成员方法public voidstudy{System.out.printlnname+正在学习;}public voiddisplayInfo{System.out.println学生ID:+id;System.out.println姓名:+name;System.out.println年龄:+age;}//getter和setter方法public intgetId{return id;}public voidsetIdint id{this.id=id;}public StringgetName{return name;}public voidsetNameString name{this.name=name;}public intgetAge{return age;}public voidsetAgeint age{this.age=age;}}类的声明语法包括类修饰符(如、等)、关键字和类名一个完整的类通常包含成员变量(表示对象的状态)、构造方法(用于创建和初始化对象)和成员public abstractclass方法(定义对象的行为)对象与内存分配堆内存栈内存用于存储对象实例,由所有线程共享,垃圾回收的主要区域所用于存储局部变量、方法参数和方法调用,由线程私有基本类有通过关键字创建的对象都分配在堆内存中堆内存大小可型变量和对象引用存储在栈内存中栈内存遵循后进先出new以在启动时通过参数调整()的原则,方法调用结束时自动释放JVM LIFO对象创建过程包括类加载(如果类尚未加载)、分配内存(在堆上分配空间)、初始化(将分配的内存空间初始化为默认值)、Java执行构造方法(初始化对象)和建立对象引用(栈上的引用变量指向堆上的对象实例)通过垃圾回收机制自动管理内存,当对象不再被引用时(没有任何变量引用该对象),垃圾回收器会在适当的时机回收该对象占Java用的内存空间程序员不需要手动释放内存,减少了内存泄漏和悬挂指针等问题内存管理最佳实践包括避免创建不必要的对象、使用对象池复用对象、尽早释放不再使用的对象引用、避免内存泄漏(如监听器未移除、静态集合未清理等)封装public所有类都可以访问protected同包和子类可以访问default同包内可以访问private仅本类内可以访问封装是面向对象编程的核心原则之一,指的是将数据(属性)和操作数据的方法(行为)包装在一个单元中,并对外部隐藏实现细节在中,通过将成员变量声明为,Java private并提供的和方法来实现封装public gettersetter封装的优点包括提高代码的安全性(防止直接修改属性)、增加灵活性(可以在中添加验证逻辑)、提升代码的可维护性(实现细节变化不影响外部调用)、实getter/setter现数据验证(在中验证输入值的合法性)setter实践建议始终将类的成员变量声明为,提供必要的方法访问;在方法中添加数据验证;考虑使用只读属性(只提供而不提供);不要暴露可private publicsetter gettersetter变对象的引用(返回可变对象的副本)继承父类(基类超类)/被继承的类,定义通用特性和行为关键字extends表示继承关系,子类父类extends子类(派生类)继承父类的特性,可以添加新特性或重写方法关键字super引用父类的成员变量和方法,调用父类构造器//父类public classAnimal{protected Stringname;public AnimalStringname{this.name=name;}public voideat{System.out.printlnname+正在进食;}}//子类public classDog extendsAnimal{private String breed;public DogStringname,Stringbreed{supername;//调用父类构造器this.breed=breed;}@Overridepublic voideat{super.eat;//调用父类方法System.out.println狗粮真好吃;}public voidbark{System.out.printlnname+汪汪叫;}}多态方法重载同一个类中定义多个同名但参数列表不同的方法,编译时绑定重载方法必须有不同的参数数量或类型,返回类型可以相同也可以不同方法重写子类重新实现父类的方法,运行时绑定重写方法必须有相同的签名(名称、参数列表)和兼容的返回类型,访问修饰符不能更严格向上转型子类引用赋值给父类变量,自动进行允许使用父类变量引用子类对象,但只能访问父类定义的成员向下转型父类引用转换为子类类型,需要显式转换必须确保引用的实际对象是目标子类类型,否则会抛出ClassCastException异常多态是面向对象的核心特性,允许不同的对象对同一消息作出不同的响应中的多态主要通过方法重写和动态绑定实现Java例如调用的方法Animal animal=new Dog;animal.makeSound;//Dog makeSound运算符用于检查对象是否是特定类型的实例,返回布尔值在向下转型前使用检查类型是良好的编程习instanceof instanceof惯,可以避免例如ClassCastException ifanimal instanceofDog{Dog dog=Dog animal;dog.bark;}抽象类与方法抽象类特点示例代码使用关键字声明•abstractabstract classShape{不能被实例化,只能被继承•protected Stringcolor;•可以包含抽象方法和普通方法可以有构造方法,成员变量//构造方法•public ShapeStringcolor{子类必须实现所有抽象方法•this.color=color;}//抽象方法,没有方法体public abstractdouble area;//普通方法,有方法体public voiddisplayColor{System.out.println颜色是:+color;}}class Circleextends Shape{private double radius;public CircleStringcolor,doubleradius{supercolor;this.radius=radius;}//实现抽象方法@Overridepublic doublearea{return Math.PI*radius*radius;}}抽象类是不完整的类,定义共同的属性和行为,但部分行为的具体实现留给子类抽象方法只有声明没有实现,使用关键字修饰,子类必须提供具体实现abstract抽象类与普通类的区别抽象类不能被实例化;抽象类可以包含抽象方法;抽象类可以没有抽象方法;继承抽象类的子类必须实现所有抽象方法,除非子类也是抽象类接口接口定义接口实现默认方法静态方法使用关键字定义,只类使用关键字实引入的新特性,接口可起接口可以包含静态方interface implementsJava8Java8包含抽象方法和常量(现接口,必须实现所有抽象方以包含有实现体的默认方法法,属于接口本身,通过接口Java8前)接口中的方法默认是法一个类可以实现多个接口,(使用关键字)允许名调用提供与接口相关的工default,常量默认是弥补单继承的限制接口演化而不破坏现有实现具方法public abstractJavapublic staticfinal接口抽象类接口只能包含常量、抽象方法、默认方法和静态方法,不能有构造方法和成员变量;接口支持多实现,而类只支持单继承;接口更专注于定义能做VS什么,抽象类更专注于是什么接口的主要用途定义行为规范;实现解耦合;实现多重继承;实现回调机制接口是多态的重要基础,通过接口编程可以提高代码的灵活性和可维护性Java内部类成员内部类静态内部类局部内部类和匿名内部类定义在类内部的非静态类,可以访问外部类的所有成用修饰的内部类,不依赖外部类实例,不能直局部内部类定义在方法内部,只在方法内可见匿名static员,包括私有成员需要先创建外部类实例才能创建接访问外部类的非静态成员可以直接创建实例,不内部类没有名字,用于创建接口或抽象类的实现类的内部类实例内部类对象中隐含着对外部类对象的引需要先创建外部类实例主要用于将内部类与外部类对象,通常用于事件处理和回调两者都可以访问外用关联,同时减少对外部类实例的依赖部方法的局部变量,但变量必须是或事实上的finalfinal内部类的主要应用场景封装实现细节,对外隐藏;更好地组织代码结构,表示有一部分的关系;实现回调,访问外部类的状态;提高代码的灵活性和可读性,特别是在事件处理中使用内部类的注意事项内部类会增加类文件数量(编译后生成额外的文件);内存占用可能增加(成员内部类实例持有外部类实例的引用);过度使用会增加class代码的复杂性,应谨慎使用异常处理异常层次结构顶层是,下分和Throwable ExceptionError检查型异常编译时必须处理,子类(不含)Exception RuntimeException非检查型异常运行时可能发生,子类RuntimeException异常处理机制try-catch-finally,throws,throwtry{//可能抛出异常的代码File file=new Filetest.txt;FileInputStream fis=new FileInputStreamfile;//处理文件...}catch FileNotFoundExceptione{//处理特定异常System.err.println文件未找到:+e.getMessage;e.printStackTrace;}catch IOExceptione{//处理更一般的异常System.err.printlnIO错误:+e.getMessage;}finally{//无论是否发生异常都会执行//通常用于清理资源if fis!=null{try{fis.close;}catch IOExceptione{e.printStackTrace;}}}集合框架概述集合框架层次结构集合与数组的区别集合框架主要包含两个核心接口(单个元素的集合)和(键值对的集集合存储的是对象引用,而非基本类型(需使用包装类);集合大小动态可变,数组大小固定;Java CollectionMap合)下有(有序集合)、(无重复元素集合)和(队列)等子接口集合提供更丰富的和功能;集合可以存储不同类型对象(不推荐),数组只能存储同一类型;Collection ListSet QueueAPI每个接口有多个具体实现类,如、、等集合通常比数组有更高的内存开销ArrayList HashSetHashMap集合的遍历方式使用迭代器();增强循环();表达式和流(及以后);普通循环(仅适用于等有索引的集合)每种方式有其适用场景,Iterator forforeach LambdaAPI Java8for List如需要在遍历过程中修改集合,应使用迭代器的方法remove引入泛型后,集合可以在编译时进行类型检查,提高了类型安全性使用泛型指定集合中元素的类型这样可以防止将错误类型的对象添加到集合Java5List names=new ArrayList;中,同时避免了类型转换集合框架List集合框架SetHashSet基于实现,无序集合,不保证元素顺序,允许元素,提供最佳性能(复杂度)元素需要正确实现和方法HashMap nullO1hashCode equalsLinkedHashSet基于实现,维护插入顺序,性能略低于但仍是复杂度在需要保持插入顺序的场合使用LinkedHashMap HashSetO1TreeSet基于(红黑树)实现,有序集合,元素按自然顺序或自定义比较器排序,不允许元素,操作复杂度为TreeMap null Olog n//创建并使用HashSetSet hashSet=new HashSet;hashSet.add苹果;hashSet.add香蕉;hashSet.add橙子;hashSet.add苹果;//重复元素不会被添加System.out.printlnhashSet;//输出无序//创建并使用TreeSetSet treeSet=new TreeSet;treeSet.add苹果;treeSet.add香蕉;treeSet.add橙子;System.out.printlntreeSet;//输出按字母顺序的特性是不允许重复元素,通过元素的方法判断元素是否相同常用于去重、检查元素是否存在等场景的哈希冲突处理使用链表和红黑树(后),当链表长度超过阈值(默认)且总容量大于某个值时,链表会转换为红黑树以提高性能Set equalsSet HashSetJava88集合框架MapHashMap基于哈希表实现,无序键值对集合,允许键和值,非线程安全,提供平均的访问性能null nullO1Java后内部结构为数组链表红黑树,当链表长度超过阈值会转换为红黑树8+/LinkedHashMap继承自,维护键的插入顺序或访问顺序(可配置)比稍慢但迭代更高效可用于实HashMap HashMap现缓存等需要顺序的场景LRUTreeMap基于红黑树实现,有序键值对集合,按键的自然顺序或自定义比较器排序不允许键,提供的nullOlogn时间复杂度适用于需要按键排序的场景Hashtable早期实现,同步且线程安全,不允许键或值性能不如,已被后者替代现代null ConcurrentHashMap并发应用应避免使用Hashtable接口的常用方法包括(添加键值对)、(获取值)、(删除键值对)、Map putget remove(检查是否包含键值)、(获取键集值集键containsKey/containsValue/keySet/values/entrySet//值对集)、(获取大小)等新增、、、等便捷方法size Java8getOrDefault forEachcompute merge选择合适的实现取决于具体需求需要最高性能且不在意顺序,选择;需要保持插入顺序,选择Map HashMap;需要按键排序,选择;需要线程安全,选择LinkedHashMap TreeMapConcurrentHashMapJava IO字节输入流字节输出流1及其子类,读取字节数据及其子类,写入字节数据InputStream OutputStream2字符输出流字符输入流4Writer及其子类,写入字符数据3Reader及其子类,读取字符数据包提供了一套完整的输入输出处理机制字节流和字符流是两个基本的流类别字节流()以字节为单位处理数据,适合处理二进制文件;字符Java IOInputStream/OutputStream流()以字符为单位处理数据,适合处理文本文件,并可处理不同字符编码Reader/Writer文件操作常用类用于读写二进制文件;用于读写文本文件;引入的类提供了更多现代化的文件操作方法FileInputStream/FileOutputStream FileReader/FileWriter Java7Files缓冲流()通过内部缓冲区提高性能,应当优先使用BufferedInputStream/BufferedOutputStream/BufferedReader/BufferedWriter IO模型包括阻塞(传统模型,线程等待完成);非阻塞(,支持多路复用);异步(,支持回调通知完成)引入的Java IO IOIOIO JavaNIO IOJava AIOJava7try-with-语句简化了资源管理resources IOtry FileInputStreamfis=new FileInputStreamfile.txt{...}泛型编程泛型类泛型方法publicclassBox{publicclassUtil{private Titem;public staticvoid printArrayE[]array{for Eelement:array{public voidsetItemT item{System.out.printelement+;this.item=item;}}System.out.println;}public TgetItem{}return item;}//使用泛型方法}Integer[]intArray={1,2,3};String[]strArray={Hello,World};//使用泛型类Util.printArrayintArray;Box stringBox=new Box;Util.printArraystrArray;stringBox.setItemHello;String str=stringBox.getItem;泛型允许在编译时检查类型安全性,避免运行时类型转换错误,提高代码可读性和重用性的泛型是通过类型擦除实现的,编译器在编译时删除所有泛型类型信息,将泛型类型替换为其边界类型(默认为)Java Object这种实现方式保证了与旧代码的兼容性,但也带来了一些限制泛型通配符用于增加灵活性表示或其子类型(上界通配符),适用于读取场景;表示或其父类型(下界通配符),适用于写入场景;表示任何类型(无界通配符),适用于不关心具体类型的场景T T泛型的限制不能创建泛型数组;不能创建泛型异常类;不能使用运算符检查泛型类型;静态成员不能使用类的泛型参数;基本类型不能作为泛型类型参数(需使用包装类)instanceof多线程基础新建状态()New线程对象已创建但尚未启动可运行状态()Runnable线程已启动,等待分配时间片CPU阻塞状态()Blocked线程等待获取监视器锁等待状态()Waiting线程等待其他线程的特定操作计时等待()Timed Waiting线程等待指定的时间6终止状态()Terminated线程执行完成或异常退出提供了两种创建线程的基本方法继承类(重写方法)和实现接口(将实例传递给构造器)一般推荐使用接口方式,因为只支持单继承,使用Java Threadrun RunnableRunnable ThreadRunnable Java可以避免限制类的继承关系引入的框架和线程池提供了更高级的线程管理机制Runnable Java5Executor线程优先级()影响线程获得时间的机会,但不保证执行顺序中优先级范围是,默认为线程优先级依赖于操作系统实现,不同系统行为可能不同常见线程问题包括Thread.setPriority CPUJava1-105死锁(两个或多个线程互相等待对方持有的资源)、饥饿(线程长时间无法获取资源)和活锁(线程一直在处理,但无法继续向前)线程同步关键字接口synchronized Lock内置的同步机制,可以修饰方法或代码块方法锁定整个对象实例或引入的显式锁机制,提供比更灵活的锁操作是最Java synchronizedJava5synchronized ReentrantLock类(静态方法);块可以指定锁对象,范围更精确,性能更好底层实现使常用实现,支持公平非公平锁、可中断锁、超时锁等高级特性使用时需要手动加锁和解synchronized/用监视器锁()锁,通常在块中释放锁Monitor finally关键字原子类volatile保证变量对所有线程的可见性,防止指令重排序,但不能保证原子性当一个线程修改包提供的无锁并发类,如、等java.util.concurrent.atomic AtomicIntegerAtomicLong变量,所有线程立即看到最新值适用于状态标志等简单场景,不适合复合操作通过原子指令(操作)实现线程安全,性能优于锁机制,适用于计数器等简单并volatile CPUCAS发场景线程间通信机制包括方法,用于线程等待和唤醒,必须在块中使用;接口,与配合使用,提供更灵活的等待通知机制;wait/notify/notifyAll synchronizedCondition Lock/,线程安全的队列,支持生产者消费者模式;,用于线程协调的同步工具类BlockingQueue/CountDownLatch/CyclicBarrier/Semaphore内存模型()规定了多线程如何通过内存进行交互,定义了线程间的可见性、原子性和有序性保证理解有助于编写正确的并发程序和诊断并发问题之后的并发工具类Java JMMJMM Java5大大简化了多线程编程,应优先使用这些高级而非自己实现底层同步机制API反射机制获取对象Class通过三种方式对象、类名、全限定类名.getClass.class Class.forName检查类信息获取类名、修饰符、包信息、父类、接口、注解等访问成员获取构造方法、字段、方法,并可操作私有成员动态操作创建实例、调用方法、修改字段值//获取Class对象Class cls=Class.forNamejava.util.ArrayList;//创建实例Object list=cls.newInstance;//获取方法Method addMethod=cls.getMethodadd,Object.class;//调用方法addMethod.invokelist,反射测试;//获取并修改私有字段Field field=cls.getDeclaredFieldsize;field.setAccessibletrue;//允许访问私有成员int size=intfield.getlist;反射的主要应用场景包括框架开发(如依赖注入、映射);动态代理机制(面向切面编程);注解处理;类加载器和热部署;中Spring MyBatisORM AOPJDBC的驱动加载;的代码提示和补全功能反射使程序具有自省能力,能够在运行时检查和操作类、接口、字段和方法IDE反射虽然强大但也有缺点性能开销较大(较直接调用慢几倍到几十倍);破坏了封装性(可以访问私有成员);缺少编译时类型检查;代码可读性和可维护性降低在性能敏感的应用中应谨慎使用反射,或采用缓存等优化措施注解内置注解自定义注解元注解提供的标准注解(标记方法覆盖父使用定义注解类型,可以包含属性(类似用于注解其他注解的注解(指定注解保Java@Override@interface@Retention类方法)、(标记已过时的元素)、方法声明)注解可以应用于类、方法、字段、参数等留策略)、(指定注解适用元素)、@Deprecated@Target(抑制编译器警告)、多种程序元素通常与反射机制配合使用,在运行时解(注解是否包含在文档中)、@SuppressWarnings@Documented(标记函数式接口)、析注解并执行相应操作在框架开发中广泛应用,如(注解是否被子类继承)、@FunctionalInterface@Inherited@Repeatable(抑制可变参数警告)等这些注解通的、等(注解是否可重复使用)这些元注解控制着自定义注@SafeVarargs Spring@Component@Autowired常用于与编译器交互解的行为和使用方式注解处理器是用于解析和处理注解的代码可以在编译时处理(通过)或运行时处理(通过反射)编译时注解处理用于代码生APT-Annotation ProcessingTool API成、验证等,如;运行时注解处理用于配置、依赖注入等,如和Lombok SpringHibernate注解的使用大大简化了应用的开发,使代码更加简洁和声明式现代框架大量使用注解来减少配置文件和样板代码,提高开发效率但过度使用注解也可能导致JavaJava魔法代码,降低可读性和可维护性,应当平衡使用表达式Lambda语法Lambda或parameters-expression parameters-{statements;}函数式接口只有一个抽象方法的接口,可以用标记@FunctionalInterface方法引用通过操作符引用已有方法,如::Object::method变量捕获可访问外部变量,但变量必须是Lambda effectively final//传统匿名类写法button.addActionListenernew ActionListener{@Overridepublic voidactionPerformedActionEvent e{System.out.println按钮被点击;}};//Lambda表达式写法button.addActionListenere-System.out.println按钮被点击;//方法引用示例List names=Arrays.asList张三,李四,王五;names.forEachSystem.out::println;提供了许多内置函数式接口(接收返回)、(接收无返回)、(接收返回)、(无参数返回)、Java8Predicate Tboolean ConsumerT FunctionT RSupplier T(比较两个对象)等这些接口在和集合操作中广泛使用Comparator TStream API表达式的最佳实践保持简短清晰,复杂逻辑应使用方法引用或传统方法;优先使用标准函数式接口而非自定义接口;注意变量捕获的限制(只能访问Lambda final或变量);避免过度嵌套导致代码难以理解;合理使用方法引用简化代码effectivelyfinalLambdaStream API创建流中间操作终端操作从集合、数组、生成函数或通道创建等等I/O filter,map,sorted,distinct,limit forEach,collect,reduce,count,min,maxList names=Arrays.asList张三,李四,王五,赵六,张七;//使用Stream API过滤并收集结果List filtered=names.stream.filtername-name.startsWith张//中间操作过滤.mapString::toUpperCase//中间操作转换.sorted//中间操作排序.collectCollectors.toList;//终端操作收集//使用并行流提高处理效率long count=names.parallelStream.filtername-name.length
1.count;是引入的处理数据集合的强大功能,提供了声明式而非命令式的数据处理方式不存储数据,而是在源数据上执行操作;支持链式调用,操作通常是延迟执行的();只能遍历Stream APIJava8Stream lazyevaluation一次,使用后即关闭常用的中间操作包括(过滤元素)、(转换元素)、(扁平化嵌套流)、(排序)、(去重)、(调试)、(限制数量)、(跳过元素)等这些操作不会执行流,只是filter mapflatMap sorteddistinct peeklimit skip设置操作管道常用的终端操作包括(遍历)、(收集到集合)、(归约)、(统计)、(匹配条件)、(查找元素)等forEach collectreduce count/min/max/sum/average anyMatch/allMatch/noneMatch findFirst/findAny执行终端操作后,流被消费,不能再次使用日期时间Java API传统(包)新(包)API java.util APIjava.time类表示特定的时间点,精确到毫秒不含时间的日期•Date•LocalDate类日期时间的操作工具,处理日历字段不含日期的时间•Calendar/•LocalTime日期格式化和解析组合日期和时间•SimpleDateFormat•LocalDateTime时区处理带时区的日期时间•TimeZone•ZonedDateTime时间戳,机器时间视图问题设计不一致、非线程安全、可变性导致并发问题、格式化复杂、时区处理困难•Instant时间段(秒、纳秒)•Duration日期段(年、月、日)•Period日期时间格式化•DateTimeFormatter//Java8日期时间API示例//创建日期时间LocalDate date=LocalDate.of2023,9,15;LocalTime time=LocalTime.of13,45,20;LocalDateTime dateTime=LocalDateTime.ofdate,time;//获取当前日期时间LocalDate today=LocalDate.now;LocalDateTime now=LocalDateTime.now;//日期时间操作LocalDate nextWeek=today.plusWeeks1;LocalDate lastMonth=today.minusMonths1;//日期时间格式化DateTimeFormatter formatter=DateTimeFormatter.ofPatternyyyy年MM月dd日HH:mm:ss;String formatted=now.formatformatter;日期时间的优点不可变对象(线程安全);明确分离日期、时间和时区;更丰富的操作方法;更好的格式化工具;基于标准的一致性设计在新项目中,应当优先使用包而非旧Java8API ISOjava.time API编程JDBC加载驱动使用加载数据库驱动类Class.forName建立连接通过获取连接DriverManager.getConnection创建语句创建、或Statement PreparedStatementCallableStatement执行SQL执行查询、更新等操作,处理结果集关闭资源关闭结果集、语句和连接//使用try-with-resources自动关闭资源try//建立连接Connection conn=DriverManager.getConnectionjdbc:mysql://localhost:3306/mydb,user,password;//创建PreparedStatementPreparedStatement pstmt=conn.prepareStatementSELECT*FROM usersWHERE age;{//设置参数pstmt.setInt1,18;//执行查询try ResultSetrs=pstmt.executeQuery{//处理结果集while rs.next{Stringname=rs.getStringname;intage=rs.getIntage;System.out.printlnname+:+age;}}}catch SQLExceptione{e.printStackTrace;}基础Java Web客户端(浏览器)发送请求,解析HTTP HTML/CSS/JavaScriptServlet/JSP2处理请求,生成动态内容容器Web管理生命周期,提供运行环境Servlet数据库存储应用数据是应用的基础,是处理请求和响应的类生命周期包括初始化()、服务()和销毁()核心接口和类包括接口、Servlet Java Web WebJava Servletinit servicedestroy Servlet抽象类和类开发者通常继承并重写、等方法处理不同请求GenericServlet HttpServletHttpServlet doGetdoPost HTTP()是一种生成动态网页的技术,将代码嵌入到中在首次访问时被转换为并编译元素包括指令()、脚本元素JSP JavaServerPages JavaHTML JSPServlet JSP%@...%()、表达式()、声明()和动作()现代开发中,逐渐被等模板引擎替代%...%%=...%%!...%Web JSPThymeleaf()是应用常用的设计模式(模型)处理业务逻辑和数据访问;(视图)负责结果展示;(控制器)接收请求并协调MVC Model-View-Controller JavaWeb Model View Controller和是一种基于的设计风格,使用方法(、、、)表示操作,资源使用标识,状态通过状态码表示ModelViewRESTful APIHTTP APIHTTP GETPOST PUTDELETE URIHTTP网络编程Java编程通信网络编程Socket HTTPNIO是网络通信的端点,提供了基于提供了多种客户端早期的和提供了非阻塞的能力替代Socket JavaTCP JavaHTTP APIURL JavaNIO IOChannel的和类,以及基于的类(功能有限);,支持双向通信;用于数据读写;Socket ServerSocketUDP URLConnectionStream Buffer和类类(增强的特性支实现多路复用,单线程管理多连接DatagramSocket DatagramPacketTCP HttpURLConnectionHTTP SelectorNIO通信流程服务器创建监听持);引入的类(现代化,适合高并发连接场景,如聊天服务器、游戏服务器Socket ServerSocketJava9HttpClient API端口;客户端创建连接服务器;建立连接后支持异步请求);第三方库如等等框架在基础上提供了更高级的抽Socket ApacheNetty NIO双方通过输入输出流交换数据;通信完成后关闭连、等(功能更强大)象,简化了编程HttpClient OkHttpNIO接服务通常使用这些实现客户端RESTful API网络编程的实际应用范围广泛服务器和客户端、远程过程调用()、消息队列、文件传输、实时通信应用等在高并发场景下,需要考虑线程JavaWebRPC模型、模型、连接池等技术选型,以及网络异常、超时处理、序列化等问题IO常用设计模式设计模式是解决软件设计中常见问题的可复用解决方案单例模式确保一个类只有一个实例,提供全局访问点,常用于配置管理、线程池、缓存等工厂模式将对象的创建与使用分离,客户端只需知道接口而非具体实现,增加灵活性和可维护性观察者模式定义了对象间的一对多依赖关系,当对象状态改变时自动通知依赖对象,的事件处理机制就是基于此模式策略模式定义一系列算法并使其可互换,算法可独立于使用它的客户Java端而变化,方法就使用了此模式适配器模式允许接口不兼容的类一起工作,通过包装类提供兼容接口,如中的连接字节流和字符流Collections.sort Java IO InputStreamReader设计模式在标准库中广泛使用模式(集合框架)、模式(流)、模式(动态代理)、模式()、模式Java IteratorDecorator I/O ProxyTemplate MethodAbstractList Command()等学习和应用设计模式有助于提高代码质量,但不应过度使用,应根据实际需求选择合适的模式Runnable应用开发实践Java系统设计需求分析架构设计、类设计、数据库设计、接口设计明确功能需求和非功能需求,如性能、安全性、1可用性等编码实现根据设计文档编写代码、单元测试3部署与维护测试与调试应用部署、监控、维护、升级功能测试、集成测试、性能测试、安全测试项目开发通常采用敏捷开发方法,如、看板等,强调迭代开发、持续集成和频繁交付版本控制系统(如)用于管理源代码;构建工具(如Java ScrumGit、)用于管理依赖和构建过程;工具(如、)用于自动化构建、测试和部署Maven GradleCI/CD JenkinsGitHub Actions应用开发的最佳实践包括遵循编码规范(如);编写完善的单元测试();进行代码审查;使用静态代码分析工具(如Java GoogleJava StyleJUnit、);记录详细日志;编写清晰的文档;进行性能优化;定期重构代码等这些实践有助于提高代码质量和开发效率SonarQube FindBugs新特性概述Java版本发布时间主要特性年表达式、、新日期时Java82014Lambda StreamAPI间、接口默认方法API年模块系统、、集合工厂方法、Java92017Jigsaw JShell私有接口方法年局部变量类型推断、垃圾收集器改进、Java102018var应用类数据共享年客户端、字符串新方法、Java112018HTTP API参数的局部变量语法Lambda年表达式标准、文本块预览、Java142020Switch预览、模式匹配预览Record年标准、密封类预览、Java162021RecordVector、垃圾收集器改进API年密封类标准、模式匹配预览、移Java17LTS2021Switch除实验性和编译器AOT JIT年虚拟线程、记录模式、字符串模板、顺序集Java21LTS2023合、结构化并发模块系统()是引入的重大变化,旨在提高安全性、可维护性和性能模块通过文件定义,声明其Java ProjectJigsaw Java9module-info.java依赖和导出的包文本块是引入的特性,支持多行字符串字面量,提高了代码可读性,特别适合语句、、等Java15SQL HTMLJSON类型是引入的不可变数据类,自动提供构造函数、、、和方法,减少了样板代码密封类Record Java16getter equalshashCode toString()是引入的特性,允许类限制哪些类可以继承它,提高了类型系统的表达能力的新特性不断增强语言的表达能力Sealed ClassesJava17Java和性能,同时保持与旧版本的兼容性性能优化Java代码优化调优多线程优化JVM避免创建不必要的对象;使用调整堆大小(,);避免线程竞争和锁争用;减少锁-Xms-Xmx而非连接;配置垃圾收集器(、粒度;使用无锁数据结构;避免StringBuilder StringSerial合理使用局部变量;避免过度使、、等);调整线程过多导致上下文切换开销;Parallel CMSG1用递归;优化循环结构;合理使新生代和老年代比例;调整线程合理设置线程池参数;使用并行用集合类;正确关闭资源;栈大小;设置合适的编译参数;流处理大数据集;利用任务分割Java JIT避免过度同步;使用基本类型而使用逃逸分析和内联优化;了解和合并框架;理解内存可见性和非包装类型;选择合适的数据结内存模型和垃圾收集机制有序性JVM构和算法性能监控使用自带工具如、、JDK jpsjstat、;使用、jmap jstackJVisualVM等可视化工具;使用JMC Java进行深度分析;Flight Recorder使用性能剖析工具如、YourKit;添加应用级监控如JProfiler、等;实Prometheus Grafana施日志和指标收集分析内存优化是性能优化的重要方面避免内存泄漏(如缓存未清理、监听器未移除、未清理等);减少对象大小Java ThreadLocal(如使用原生类型、优化对象结构);避免过度装箱拆箱;使用对象池复用对象;合理设置缓存大小和过期策略;了解内存分JVM配和回收机制数据库访问优化也至关重要使用连接池;优化语句;合理使用索引;批量操作替代单条操作;使用预编译语句;控制事务范围;SQL设置合理的隔离级别;缓存常用数据;实施分库分表等策略性能优化应当基于实际测量而非猜测,先确定瓶颈再有针对性地优化学习资源Java推荐书籍在线资源《核心技术》(凯霍斯特曼)官方文档•Java·S·•Oracle Java《》(约书亚布洛克)慕课网、极客时间等在线课程平台•Effective Java·•《编程思想》(布鲁斯埃克尔)上的开源项目•Java·•GitHub Java《深入理解虚拟机》(周志明)问答社区•Java•Stack Overflow《并发编程实战》(布莱恩格茨等)、等技术博客平台•Java·•InfoQ DZone《》(罗伯特马丁)技术社区(如、掘金、知乎等)•Clean Code·C·•Java CSDN学习的有效方法包括从基础开始,先掌握核心语法;多动手编写代码,实践是最好的学习方式;参与开源项目,阅读优质源码;解Java决实际问题,而非仅学习理论;与其他开发者交流,加入社区;保持持续学习的习惯,技术更新快;构建个人项目,应用所学知识推荐的学习路线首先掌握基础语法和面向对象编程;学习标准库(集合、、并发等);学习数据库访问技术(、JavaJavaJava IOJDBC框架);学习开发(、等);了解常用设计模式和架构知识;学习性能优化和知识;探索特定领域如微服ORM WebServlet SpringJVM务、大数据、云原生等根据个人兴趣和职业规划调整学习重点课程总结核心知识点回顾本课程系统地介绍了编程语言的基础知识和高级特性,从语法基础到面向对象编程,从集合框架到并发编程,从操作到网络编程,全面覆盖了开发的核心领域通过理解这些概念,你已JavaIOJava经具备了进行应用开发的基本能力Java学习方法建议学习编程最重要的是实践建议你将学到的每个概念都通过编写代码来巩固;多阅读优质开源项目的代码;主动思考和解决问题,而不仅仅是复制答案;保持对新技术的好奇心;与其他学习者交流经验;定期回顾和总结,形成自己的知识体系未来发展方向掌握基础后,你可以向多个方向发展企业级应用开发(生态系统);移动应用开发;大数据处理(、等);微服务架构(、等);云原Java SpringAndroid HadoopSpark SpringCloud Dubbo生应用(、等);或深入研究优化和性能调优选择符合个人兴趣和市场需求的方向深入学习Kubernetes DockerJVM通过本课程的学习,你已经建立了编程的基础知识框架记住,编程能力的提升需要不断实践和积累经验鼓励你开始尝试独立完成小型项目,逐步培养解决实际问题的能力Java欢迎随时提问和交流,祝你在编程的道路上取得成功!下次课程见Java。
个人认证
优秀文档
获得点赞 0