目录
计算机
硬件
运算器
控制器
存储器
输入设备
输出设备
软件
系统软件
应用软件
和计算机的交互方式
触屏操作
语言识别
人脸识别
指纹识别
图形化界面
命令行交互
和计算机交互的语言
机器语言
高级语言
Java语言概述
Java语言特点
java环境的搭建
注释
关键字
标识符
常量
变量
数据类型
字符类
字符串类
进制
运算符
键盘录入
获取随机数
流程控制
方法
数组
面向对象思想
类和对象
构造方法
代码块
final关键字
内部类
包
权限修饰符
抽象类
接口
jar包
API
StringBuilder
基本类的包装类
自动装箱、拆箱
正则表达式
常用类型
异常
可变参数
集合
数据结构
泛型
Collections工具类
File类
递归
IO流
文件的拷贝
高效流
close和flush的区别
流
Properties和IO流相结合
IO流总结
多线程
网络编程
虚拟机类加载机制
反射
Java8接口新特性
Lambda表达式
函数式接口
Optional类型
注解
Eclipse快捷键
自定义快捷键的生成
数据库的概述
数据库DB
数据库管理系统DBMS
Sql语句分类
计算机
可以进行运算的机器 电子计算机
硬件
硬件主要是表示一些可以看得见摸得着的一些设备
运算器
可以进行一些数据的计算和逻辑的计算
控制器
用来控制数据或者指令的一个硬件
存储器
存储器等于运行内存+存储内存
输入设备
鼠标键盘
什么是输入?什么是输出? 数据从其它设备进入运行内存; 数据从运行内存到其它设备就是输出
跟存储内存无关
输出设备
显示器 打印机
软件
软件就是表示看不见摸不着的一些功能
系统软件
使用的各种操作系统 Windows mac Linux
应用软件
生活中的各种程序app 管理系统 京东 淘宝 qq 微信
和计算机的交互方式
触屏操作
语言识别
人脸识别
指纹识别
图形化界面
命令行交互
补充 tab 补全名称 上箭头或者下箭头 可以选择上一条命令或者下一条命令 cls清屏 exit 关闭命令提示符窗口
和计算机交互的语言
和计算机交互的语言称之为编程语言
机器语言
机器语言全是由0和1组成的语言,也是计算机可以是别的唯一语言 数据:可以通过各种阿拉伯数字来表示,再转成二进制,都是0或者1 指令:对应的有一个指令集,每一个指令都可以通过一个数据来表示,也可以转成二进制,都是0或者1
高级语言
高级语言:将各种数据和指令,也可以通过一个个英语单词来表示,每个英语单词即可以表示一些数据,也可以表示一些指令,通过特定的语法讲这些英语单词联系起来,就形成一套语言,写代码就和说英语一样
java C语言 c# PY PHP
Java语言概述
起源: 二十世纪九十年代 1990 sun公司接手一个关于嵌入式的项目 Green->C语言->oak(橡树)->java java语言之父:詹姆斯.高斯林
Java语言特点
java环境的搭建
下载jdk(Oracle官网 www.oracle.com) 注意事项: 不建议安装到c盘 安装路径中尽量不要有空格以及其它字符 安装jdk之后,不需要再安装jre,jdk中集成了jre运行环境 验证:在jdk的bin目录下,打开命令提示符窗口,在窗口中输入java -version,出现对应的版本号,表示安装成功
注释
对程序进行解释说明的部分
注释使用的原因: 方便去分析理解代码 可以通过注释对问题的思路进行描述
写代码尽量都加上注释
注释的特点: 注释不会被编译器编译 不会被运行器运行
关键字
概念:被赋予了具有特殊含义的英语单词 注意事项: 全部都是小写 起名的时候不要和关键字重名 有两个保留字 goto const 写法和定义的写法必须一致
标识符
自己起的名字就是标识符 标志符 标识符的组成: 英文字母大小写 $ _ 1234567890 规则:不要和关键字重名 数字不能开头
常量
概述:在代码运行的过程中,值不会发生改变的值
变量
概述:在代码运行过程中,一个名字表示的值可以发生变化
格式: 数据类型 变量名 = 变量值
说明: 数据类型:用来表示给变量在内存中分配多大的内存空间
变量名:给值起一个名字 =: 赋值符号
变量值: 需要存储或者保存的数据
使用变量的原因: 在程序中,有一些具有特殊含义的数据可以不断的发生变化,比如年龄,身高,体重,这些可以发生改变的数据。如果通过一个常量来表示不合理
这些可以发生变化的数据,可以通过一个不变的名字来表示,以后需要变化时,可以修改变量中的数据值
定义一个变量的过程,其实就是在内存中分配一段空间的过程 给变量赋值的过程,其实就是往空间中存值得过程 使用变量的过程,其实就是获取空间中存储值的过程 改变值的过程,其实就是将空间中的值替换的过程
变量是有作用域的: 作用域:起作用的范围 在哪一个大括号中定义变量,就只能在哪一个大括号中使用这个变量 变量在同一个作用域中不能重复定义,不能重名 变量必须先赋值后使用,变量定义和赋值可以分为两行去完成 如果需要定义多个相同数据类型的变量,可以在一行定义
数据类型
java语言是一个强类型语言,在定义一个变量或者数据时,需要强制的给这个变量指定分配多大的内存空间数据类型就是决定给一个变量分配多大空间的作用
整数的默认类型 int类型 4字节 随便定一个整数,默认为int类型 如果需要表示一个很大的整数,可以在整数的后面加一个L,不会认为int默认为long
小数的默认类型: double类型 8字节 随便定义一个小数,默认为double类型 如果需要表示一个单精度的小数,可以在小数的后面加一个大写的F,默认float
字符类
字符常量:使用单引号引起来的单个符号 char
计算机只可以识别二进制的数字 0和1组成,每一个字符都可以对应一个十进制的整数,将这个十进制的整数,再通过对进制的转换,将十进制转为二进制,计算机可以识别
每一个字符和每一个整数对应的关系,称为编码表或者字符集
字符到数字是编码 数字到字符是解码
字符串类
使用双引号引起来的一系列字符 字符串对应的数据类型string 字符串类型不仅可以表示一个变量,也可以和其它类型的数据进行+计算:不是加法运算而是拼接 如果字符串类型和其他类型的数据+,先将其他类型的数据转为字符串类型再拼接
-
String
-
equal(参数) 比较两个字符串是否一样 -
equalsIgnoreCase(参数) 忽略大小写比较是否一样 -
isEmpty() 判断调用者字符串是否为空 -
contains(参数) 判断调用者字符串是否包含参数字符串 -
startsWith(参数) 判断是否以参数开头 -
endsWith(参数) 判断是否以参数结尾 -
substring(int i,int j) 截取参数中的内容 -
substring(i) 从指定的位置开始往后截取 位置都从0开始 -
toUpperCase() 将调用者转为大写 -
toLowerCase() 将调用者转为小写
进制
概念:对信息或者数据进位的一个制度
转换有一个关系:计算的规则 系数*基数的权次幂再相加 说明 系数:各个位上的值是多少系数就是多少 基数:当前这个书是几进制,基数就是几 权:用来表示每位上的数字的一个重要程度的标志 从右往左依次递增,最小权0,从0往左依次递增
二进制转十进制 1100: 02^0+02^1+12^2+12^3
八进制转十进制 35: 58^0+38^1
十六进制转十进制 af: 1516^0 +1016^1
十进制转为其他进制 1计算的规则: 除基倒取余 2说明: 除:除法运算 基:要转为几进制,基就是几 取余:两个数相除的余数,反过来取,合在一起
十进制倒二进制 11 1100 0 l60_ 0 l30_ 1 l15 1 l7 1 l3_ 1 l1 0
-
十进制 十进制:0-9 逢十进一 -
二进制 二进制:0和1 逢二进一 -
八进制 八进制:0-7 逢八进一 -
十六进制 十六进制:0-9abcdef 逢f(16)进一
运算符
概述:对数据做各种操作或者逻辑运算的符号
-
算术运算符 + 相加运算 字符串的拼接 表示正数 - 减法运算 表示负数
-
自增自减运算符 分类++ -- 注意事项: ++和--就是表示变量本身加1或者减1 如果某个变量自增或者自减是单独作为一句存在时,++或者--放在变量的后面或者变量的前面没有任何区别,都是自加一或者自减一 如果某个变量自增或者自减不是单独作为一句存在,++或者--放在前面或者后面,计算方式不同: 符号放在变量的后面:先取值,后运算/ 符号放在变量的前面,先运算后取值 -
赋值运算符 分类 基础的赋值运算符:= 将右边的赋值给左边 扩展的赋值运算符:+= -+ *= /= %= 先将符号左右两边的值,先进行对应的运算,再赋值给左边 -
比较运算符 用来比较数据之间的关系。 比较运算符的结果只有两个: true false 分类 基础的比较运算符:
< >= <=(都只可以在数值之间比较 只能比较 整数 小数 字符) 扩展的比较运算符: ==(比较两边的数据是否一样) !=比较两边的数据是否不一样 注意事项: 可以在数值之间比较,也可以在字符串之间比较,或者布尔之间比较,但是不能不同类之间比较
-
逻辑运算符 1 概念:对表达式做一些逻辑的处理和判断 2 分类:& | ! && || 3 &:逻辑与 如果符号左右两边的表达式结果都为真,运算的结果为真 如果符号左右两边有一个结果为假,结果为假 4 |:逻辑或 如果符号左右两边的表达式结果都为假,运算结果为假 如果符号两边的表达式结果有一个为真,结果就为真 5 !:逻辑非 表达式的结果为真 取假 表达式的结果为假 取真 6 &&:逻辑短路与 左右两边的表达式结果为真,整个的结果为真否则为假 特点: 如果符号左边的表达式结果为假,右边的表达式不会执行,直接取假 如果符号左边的表达式结果为真,右边的表达式会执行,根据后面的取值 7 逻辑短路或 左右两边的表达式结果都为假,整个的结果都为假否则为真 特点: 如果符号左边的表达式结果为真,右边的表达式就不会执行,直接取真 如果符号左边的表达式结果为假,右边的表达式会执行,根据后面的取值 -
位移运算符 1概念:通过移动位数来表示数据的变化 2分类: << >> >>> 3 <:左移运算符 某个数据左移一位,扩大2倍 4>:右移运算符 某个数据右移一位,缩小2倍 即可以操作正数,也可以操作负数 5 >>>: 无符号右移运算 向右移动一位,缩小2倍 只可以操作正数,不可以操作负数 -
三元运算符 三元运算符,三目运算符 元:可以操作的数据或者表达式 三元运算符:可以操作三个数据或者表达式的符号 格式:表达式1?表达式2:表达式3; 逻辑 先执行表达式1,结果要么为真,要么为假 如果表达式1结果为真,执行表达式2,将表达式2的结果作为整个表达式的结果 如果表达式1结果为假,跳过表达式2,执行表达式3,将表达式3的结果作为整个表达式的结果 6 注意事项: 表达式1必须是一个布尔表达式,运算的结果为真,或者为假的表达式 表达式2和表达式3,只要有一个结果就行
键盘录入
在程序启动之后,可以让用户给变量输入一些数据,用户录入的结果是几,在代码中就使用几 步骤 导包:import java.util.Scanner; 创建对象:Scanner sc = new Scanner(System.in); 使用键盘录入的方法:int x = sc.nextInt(); 使用录入的x值 3.注意事项: 导包必须在类的上面导 nextInt方法表示需要录入一个数据,如果不录入就一直等待 录入之后的结果,可以做任何操作
获取随机数
在程序启动之后,可以获取一个数字 步骤 导包:import java.util.Random; 创建对象:Random r = new Random(); 调用方法获取值:int x = r.nextInt(); 使用获取的随机数x 3.注意事项; 如果没有指定的范围,默认的范围是int类型的范围 想要指定一个范围,在nextInt方法的括号中写入一个指定的数字k,范围就是0-k -1 方法的参数中只可以传递一个正数,不可以传递负数,如果想要表示负的范围,只能通过对应的运算来控制
流程控制
流程:在程序中用来表示代码执行的顺序 流程控制:控制代码执行的顺序就是流程控制
-
顺序结构 顺序结构:代码从上往下,从左往右依次执行(也是代码默认的执行顺序) -
分支结构 分支结构:在代码执行的时候,可能碰到某种情况,情况的结果不同,可能执行不同的分支(代码写的多,执行的少)
-
if语句 1 if语句的第一种格式: if(条件表达式){ 语句体; } 2:执行流程 先执行条件表达式,结果要么为真,要么为假 如果结果为真,执行语句体 如果结果为假,不执行语句体 执行后面的其它代码 2 if语句的第二种格式 if(){ 语句体1; }else{ 语句体2; } 执行流程 先计算条件表达式的值,要么为真,要么为假 如果结果为真,执行语句体1 如果结果为假,执行语句体2 3if语句的第三种格式 if(条件表达式1){ 语句体1 }else if(条件表达式2){ 语句体2 }else if(条件表达式3){ 语句体3 } ... else{ 语句体n; } 执行流程: 先执行条件表达式1 如果表达式1的结果为真,执行语句体1,直接结束if语句 如果表达式1的结果为假,判断条件表达式2 如果表达式2的结果为假,执行语句体2,直接结束if语句 如果表达式2的结果为假,往后继续判断条件表达式 如果后续的表达式结果为真,就执行对应的语句体,执行之后,结束if语句 如果表达式都为假,就执行else语句体n -
if语句和switch语句的区别 if语句相对比较强大,可以对任何判断使用 switch语句做一些区间的判断比较麻烦,但是做一些离散型的匹配相对简单 如果使用if语句做一些离散的匹配,效率太低 -
switch语句 switch语句格式 switch(表达式){ case 常量1: 语句体1; case 常量1: 语句体1; break; ... default: 语句体n; } 执行流程: 先执行表达式,获取表达式的值 判断获取的值,和常量1是否一样 如果一样执行语句体1,执行break,结束整个switch语句 如果获取的值和常量1不相等,将值和常量2判断是否一样 如果值和常量2相等,就执行语句体2,执行break,结束整个switch语句 如果值和常量2不相等,继续往后匹配其它常量,有一样的就执行对应的语句体,执行break结束 如果匹配没有一个相等的,就执行语句体n; switch语句注意事项 表达式的结果必须是以下几类:byte short int long string 枚举类型(enum) case后面只可以定义常量,不可以定义变量 break表示中断,执行break就直接结束整个switch语句,如果不添加break,直接执行后面的内容,发生case穿透 default语句表示默认的情况,可以加也可以不加:::如果加,至少能执行一句;如果不加,可能一句执行不到 default语句可以放在switch语句的前面,后面或者中间,不管放在什么位置,都是最后去匹配,如果放在前面或者中间的话,需要在语句体的后面加上break,防止发生穿透
-
循环结构 如果某些代码需要反复的执行,可以使用循环结构的格式,来完成代码的简化
-
for循环 格式 for(初始化语句 ; 条件表达式 ; 初始化变量的变化){ 循环体语句; } 说明: 初始化语句:一般声明一个变量用来记录从几开始,循环了多少次 条件表达式:循环何时停止何时继续,通过条件表达式来控制 初始化变量的变化:让初始化变量进行变化 循环体语句:哪些代码需要反复执行,这段代码就是循环体语句 for循环注意事项 for循环后面不要加分号,一旦加上分号就不能控制循环体语句 循环体语句可以是任意操作 条件表达式必须是一个布尔表达式,必须获取一个真或者假 初始化变量的变化,可以是增加,可以是减少,但是一定要朝着结束循环的方向变化 如果循环体语句只有一句,可以省略大括号,如果有多久,也可以省略大括号,但是只执行第一句 -
while循环 1格式 初始化变量; while(条件表达式){ 循环体语句; 初始化变量的变化; } -
do...while循环 1格式: 初始化变量; do{ 循环体语句; 初始化变量的变化; }while(条件表达式); -
死循环 1 概述:循环一直继续,无法停止 2 分类: for格式的死循环 for( ; ; ){ 循环体语句; } while格式的死循环
while(ture){
循环体语句; } 3 注意事项 死循环的后面不能写任何其他语句,因为死循环无法停止,后面的语句无法执行,编译报错 一般使用while的死循环 4 为什么是用死循环 当编程的时候不知道什么时候要停止,没有一个结束的标志时,可以使用死循环,当需要停止的时候,可以用跳转语句结束死循环。 服务器的设计中,一般也会用到死循环 -
跳转语句 概述:用来结束循环的几个关键字 分类: continue; 结束本次循环,继续下一次循环 break; 结束break所在的那一层循环 return; 结束方法 System.exit(0); 结束虚拟机 -
嵌套循环 在一次循环中,循环体语句又是一个循环 格式 for( 初始化语句1; 条件表达式1 ; 初始化变量1的变化){ for( 初始化语句2; 条件表达式2 ; 初始化变量2的变化){ 循环体语句; } } 特点: 外层循环的条件表达式控制外层循环的次数 内层循环的条件表达式控制内层循环的次数 外层循环循环一次,内层循环循环初始化变量2控制的次数 整个循环结束的标志是-----条件表达式1结果为假
方法
1 概述:就是可以完成某一段功能的代码段 2 原因:如果有一些代码以后经常使用,可以将这段代码通过一个大括号括起来,然后再给这个大括号起一个名字,以后想要使用这段代码,只需用这个名字即可
3 好处 提高代码复用性 可以提高数据的安全性,提高封装性 可以降低代码的复杂程度
-
方法的定义 1 格式 修饰符 返回值类型 方法名称 (参数列表){ 方法体; return语句; } 2 说明: 修饰符:统一先写为:public static 返回值类型:方法既然是一个功能,就有可能有数据的产出,这些产出的数据是什么类型,返回值类型就定义为什么类型 方法名称:给代码段起一个名字。小驼峰命名法 参数列表:方法是一个功能,要像让方法完成指定的功能,就有可能要提供一些资源,资源就通过参数列表来定义 方法体:用来完成功能的具体逻辑代码 return语句:将产出的数据进行返回,返回给调用者 -
方法的调用 1 格式: 方法名(参数); 2 分类: 直接调用:直接使用方法名即可;当方法没有数据的产出时,只需要调用方法名即可 输出调用:直接将方法的调用写在输出语句中即可;方法有返回值,只需要去展示或者输出一次,就可以使用这种方式 赋值调用:使用一个变量将方法返回的结果进行接收;如果返回值以后会多次反复使用,使用赋值调用 总结: 不调用就不会执行 如果方法定义中需要一些参数(资源),在调用时就要传递对应的实际参数的数据 -
方法的注意事项 1 方法的定义: 方法之间是平级关系,不能嵌套定义 方法可以使用嵌套顶用(可以在一个方法中,使用另一个方法) 方法定义的先后,没有任何区别,先试用哪一个,就先执行哪一个 2 参数列表 形式参数:在定义方法时,带着数据类型的变量,用来接收以后传递的真实数据 实际参数:在使用方法时,传递的一些具体的数据 (1)实际参数和形式参数是对应的 (2)多个形参或者实参,中间使用逗号分隔 3 return语句 结束方法;返回参数 return后面跟着的数据的数据类型要和返回值类型保持一致 如果方法没有返回数据,将返回值定义为void,也可以将return语句写为return; 或者省略不写 谁调用方法,返回的数据就返回给谁 return语句一定是在最后 -
栈内存 栈内存的特点 方法先进后出,后进先出 一次同时只能执行一个方法 -
方法的重载 1、Overload 重载 2 、概述:在同一个类中,多个方法的方法名相同,参数列表不同,与返回值类型无关 3、说明: 在同一个类中:重载只能在一个类中发生 方法名相同:多个方法的名字一模一样,大小写也一样 参数列表不同:参数的数量不同,参数的类型不同,参数的类型顺序不同 与返回值无关:判断方法之间是否重载,不要考虑返回值类型 4、使用重载的原因 如果没有重载:在一个类中,定义了多个具有相同功能的方法,需要给不同的方法取不同的名字,后续再调用的时候考虑是用哪一个名字,这样做麻烦 如果有重载:在一个类型,需要定义多个具有相同功能的方法,可以给这些方法起一个相同的名字,以后只需要使用一个名字调用即可,在调用的时候,具体调用哪一个方法,根据传递的参数列表来区分
数组
-
数组的概述 用来存储相同数据类型的一个容器,这个容器有规律的存放数据 -
数组的定义 数据类型[] 数组名称 = new 数据类型[长度]; 数据类型 数组名称[] = new 数据类型[长度]; 数据类型:表示当前数组中用来存放哪一类数据 []:表示一个一维数组 数组名称:给数组起一个名字 =:赋值符号 new:表示一个关键字,用来创建的意思 [长度]:表示当前数组中可以存放多少个数据 -
数组的初始化 数组的初始化就是给数组分配空间并赋值 分类 有动态初始化和静态初始化 动态初始化:、 数组的定义 : 数据类型[] 数组名称 = new 数据类型[长度]; 数组的赋值:数组名称[索引] = 元素值; 注意事项:动态初始化定义数组之后,如果数组中的位置没有赋值会有一个默认值 int:0 , double:0.0 ,char:'',String:null,boolean:false 静态初始化:格式 数据类型[] 数组名称 = new 数据类型[]{元素值的罗列}; 简写格式 数据类型[] 数组名称 = {元素值的罗列}; -
数组的内存 注意事项:虽然两个数组等号后面的内容相同,但是一旦碰到new关键字,就需要重新开辟第二段数组空间,并不是指向同一个数组 两个引用指向同一个数组: 引用表示地址 指针 引用数据类型的变量:用来存储数据地址的变量 两个引用指向同一个数组: 其中一个引用修改了数组中的内容,另一个在引用访问时,数据是修改之后的,两个引用可以访问一个数组,访问相同的一些数据
-
jvm java虚拟机执行java语言的容器 -
分类
-
栈内存 栈内存:执行方法的区域。先进后出,后进先出 -
堆内存 用来存放大量数据的区域。数组对象 -
方法区 用来执行或者存放字节码对象的区域 -
本地方法区 本地方法区:java虚拟机加载系统资源的区域 -
计数器/寄存器 用来给cpu分配空间的
-
数组的异常 数组异常:在操作数组的时候,遇到的各种问题
-
数组索引越界异常 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException 原因: 访问了不存在的索引 -
空指针异常 Exception in thread "main" java.lang.NullPointerException 原因:数组的地址为空,还要通过空地址访问数组中的元素 解决,在访问数组之间 , 先判断数组是否为空
-
数组的操作
-
数组的遍历 概述:将数组中的元素逐个获取 思路:通过循环获取数组中的每个元素的索引,再通过索引结合结合名称获取对应的元素 数组有一个自带的属性:数组名.length 获取数组长度的属性 -
数组的最值 思路:需要定义一个变量,用来存储最大值或者最小值,再逐个获取数组中的元素,两两进行比较,数据比较大的继续在变量存储,比完一轮之后变量中存的就是最大值 注意事项:在定义存储最大值的变量时,变量中不能定义为无关元素,需要定义成数组中的某一个元素 -
数组元素的交换 给ID能够两个所以,交换两个元素索引对应的元素 思路:声明一个第三方变量,用来交换 -
数组的反转 概述:将数组中的元素逆序存储 1:如何定义两个变量,一个从头开始,一个从尾开始,头部元素索引可以为0,尾部length-1 ,当交换两个元素之后,可以让0索引+1,让length-1-1,然后依次移动知道两者一样 2.如何交换两个对称的元素 可以声明第三方变量 -
数组元素的获取 概述:给定一个元素,查询该元素在数组中的位置(索引) 思路:先获取数组中的每一个元素,逐个要和查询的值进行比较,,如果相等,就保存该元素的索引,如果不等,就继续比较下一个,直到将每个元素比完为止 -
数组的排序 1排序:将数组中的元素从小到大或者从大到小进行排序 2冒泡排序:先遍历数组,再在遍历数组的时候判断比较大小 i 和 i+1 比较,设一个第三方变量
-
二维数组 二维数组:二维数组中的每一个位置存储的并不是数据本身,而是一个个一维数组的地址 动态初始化: int arr = new int3; 静态初始化: int arr={{0,1},{10,20},{2,3,4},null};
面向对象思想
概述:面向对象是java语言编程使用的一种解决问题的编程套路,是一个编程思路 面向过程和面向对象区别: 面向过程:注重解决问题的基本步骤,强调解决问题的过程;比如:碰到一个问题,要考虑每一步怎么去完成
面向对象:注重解决问题的主体,强调找一个主体去完成,比如:碰到一个问题,不需要考虑具体的步骤,考虑如何找到一个主体
面向对象和面相过程的具体关系 面向对象是更高一层的编程思想:面向对象是基于面向过程的,需要先有面向过程,才能有对象去使用
类和对象
-
类 类的定义,一个类型都无非是从两点进行定义和表示: 属性:表示当前类型的一些概括和介绍 在java语言中,都是通过一个个变量来定义定义变量和之前不一样,需要在类中方法外定义(成员变量) 行为:表示当前类型的一些功能,可以做哪些事情 在java语言中,通过一个个方法来表示行为和功能 表示类型的方法:修饰符 特点:不管是带着主方法的测试类还是非测试类,还是自己定义的类型也好,在编译之后都会生成一个对应名称的.class字节码文件 -
对象 1概述:对象表示某一个类型的实例,表示一个真实的事物,具体事物 2、创建对象的格式: 类型名 对象名 = new 类型名(); 3、说明 创建哪一个类的实例,就写那一个类的名字 对象名:起一个名字 小驼峰 =:将右边的对象地址赋值给左边的对象名 new:关键字 创建对象的关键字 类型():构造方法 对象访问属性 对象名.属性名 对象属性赋值 对象名.属性名 = 值; 对象访问方法 对象名.方法名(); 成员变量没有赋值可以有一个默认值: String:null 整数:0 小数:0.0 字符:’‘ 布尔:false 两个对象 注意事项 两个类型指向两个对象,之间互不影响 类型的字节码文件加载一次即可,后续需要反复使用,可以使用第一次加载的 两个引用指向同一个对象 两个引用指向同一个对象,其中一个引用将对象中的数据进行修改,另外一个引用访问的是修改之后的结果,因为两引用公用一个对象中的数据
-
成员变量 在类中方法外定义的变量 在对象中创建空间,对象在堆内存中,成员变量在堆内存中 生命周期随着对象的创建而存在,随着对象的消失而消失(当没有引用指向内存中的对象时,对象会被垃圾回收机制回收掉) 成员变量有默认值 -
局部变量 在主方法中定义的变量 在栈内存中分配空间存储值 随着方法的调用而存在,随着主方法的出栈而消失 局部变量没有默认值,必须先赋值才能使用 -
匿名对象 再创建对象之后,不适用引用接收,就是一个匿名对象 格式: new 类型名(); 使用场景: (1)如果类型中的某个方法,只需要调用一次,可以使用匿名对象调用 ?????好处:可以少创建一个对象的引用,节约栈内存空间 (2)如果调用某个方法,方法需要接受一个对象,在调用方法时,可以创建一个匿名 ?????对象直接传递。
?????好处:节约内存空间
?
(3)如果定义某一个方法,方法需要返回某一个对象,可以直接创建一个匿名对象进 ?????行返回。 ????好处:解决内存空间 -
静态 1、如果没有静态: 某个类型的每一个对象中,都有一个相同的属性值,就需要在每一个对象中给这个相同 ????的属性值,都开辟一段空间来进行存储。 弊端: ????(1)浪费内存空间 ????(2)如果需要修改这个相同的属性值,每个对象都需要进行修改,数据维护麻烦 2、有静态: 如果某个类型中的每一个对象中都有一个相同的属性值,可以将该属性定义为静态 一旦定义为静态之后,该静态变量就在方法区中开辟空间存储数据 好处: ???(1)解决堆内存空间 ???(2)如果需要赋值或者需要修改只需要操作一次即可,数据维护起来比较容易
-
特点 静态使用static关键字来表示 静态变量随着类的加载就存在 静态变量是在对象的创建之前就已经存在,可以被访问 某个类型中的静态变量可以被该类所有对象所共享 静态可以被类名直接调用,也可以被对象调用 静态方法的特点 通过static 修饰的方法就是一个静态方法 跟静态特点相同 -
注意事项 静态方法不能访问非静态变量,可以访问静态变量 静态方法随着类的加载就可以被调用,这时对象还没创建,非静态变量就还没有存在,就不能被访问 静态方法中,不能调用非静态方法 因为非静态方法可以访问访问非静态变量,如果静态方法可以访问非静态方法,就相当于静态方法可以间接地访问非静态变量 静态方法中不能存在this关键字 this表示当前对象,静态方法可以被调用的时候,对象可能还没有被创建,this不知道指向哪一个对象 总结:静态不能访问非静态
-
静态变量 静态变量属于类,随着类的加载存在,在方法区中存储,生命周期随着字节码对象回收,可以通过类名调用,也可以通过对象调用 -
非静态变量 非静态变量属于对象,在堆内存中存储,生命周期随着对象的创建存在,随着对象的回收消失,只能通过对象调用
构造方法
概述:在创建一个对象时,构造方法可以给对象中的属性初始化
别名:构造器 构造函数
格式: 修饰符 方法名(参数列表){ 方法体语句 } 说明: (1)修饰符:public (2)方法名:和类名一模一样 (3)参数列表:要和那些属性赋值,就定义那些变量 (4)方法体语句:给属性赋值的操作
特点: 构造方法是在创建对象时,由虚拟机默认调用 构造方法不能自己手动调用 一个对象只能调用一次构造方法
注意事项 1、如果类中没有定义任何构造方法,系统默认提供一个空参构造 2、如果在类中定义个任意一个构造方法,系统不再提供另外一个 3、一般在类中既要提供空参构造,也要提供有参构造(利用方法的重载) 如果在创建对象时,传递参数,就会默认调用有参构造给属性赋值 如果在创建对象时,不传递参数,就会默认调用空参构造
代码块
1、使用一对大括号括起来的代码都是代码块 ?????代码块放在不同的位置,有不同的名称和不同的作用
-
局部代码块 1、概述:在主方法中定义的代码块称为是局部代码块。 2、作用: 限定变量的生命周期,随着代码块的结束,代码块中定义的变量会被回收 节省内存空间 3、注意事项: (1)在代码块中定义的变量,在代码块之外不能使用 (2)在代码块外定义的变量,在代码块中修改了变量的值,随着代码块的结束,变量 ?????值是修改之后的。 -
构造代码块 1、概述:在类中方法外定义的代码块 2、特点: (1)在创建对象的时候,由虚拟机默认调用构造代码块 (2)构造代码块是在构造方法之前被调用 (3)构造代码块是随着对象的创建被执行,所以创建一次对象,构造代码块执行一次 3、作用: (1)可以给属性赋值 (2)可以将空参构造和有参构造的公同内容定义在构造代码块中 -
静态代码块 1、概述:在类中方法外定义的代码块 2、格式: static{ } 3、特点: (1)静态代码块是在类加载的时候,被虚拟机默认调用 (2)在对象创建之前就已经被执行 (3)静态代码块中可以访问静态属性,但是不能访问非静态 (4)静态代码块随着类的加载执行,所以在程序的执行过程中,一个类型只需要加载 ?????一次,所以静态代码块只执行一次。 4、作用: (1)可以给静态变量赋值 (2)静态代码块中可以定义只需要加载一次的资源(加载驱动) -
同步代码块
final关键字
1、概述:最终的,最后的 2、作用: 修饰类型 修饰方法 修饰变量 3、修饰类型: 一旦一个类型被final修饰之后,变为一个最终类,不能有子类 4、修饰方法: 一个方法方法被修饰之后,不能被重写,但是可以被子类继承 5、修饰变量: 一个变量被修饰之后,就变为了一个常量 常量必须等于某一个值,该常量的值也不能被修改 因此这个被fianl修饰的变量,就变为了一个符号常量(有名字的常量)
内部类
1、概述:将类型定义在方法的内部或者类的内部就是一个内部类 ?????在方法A中定义个类型B,类型B就是一个内部类 ?????在类A中定义一个类型B,类型B也是一个内部类
-
成员内部类
-
普通的成员内部类 1、概述:在类中直接定义一个不加任何修饰符的类型 2、特点: (1)内部类中,可以直接访问外部类的成员 (2)在外部类中,要想访问内部类的成员,需要创建内部类的对象才可以访问 (3)在其他类中,要想访问内部类的成员,需要先创建外部类的对象,然后需要再创建内部类的对象 (4)内部类的对象不能访问外部类的成员 -
私有的成员内部类 1、在类中定义一个内部类,类可以通过private修饰 2、特点: (1)在私有的成员内部类中,可以直接访问外部类的成员 (2)在其他类中,要想访问私有内部类的成员,不能直接通过外部类的对象去访问, ?需要在外部类中提供一个访问私有内部类的公共的访问方法,通过公共的方法可 ?????以访问私有内部类的成员 在类中私有内部类以外创建一个方法,在方法里创建私有成员内部类的对象(给私有的成员内部类提供一个公共的访问方式) -
静态的成员内部类 1、概述:在类中定义一个内部类,内部类通过static来修饰 2、特点: (1)在静态的内部类中,不能直接访问外部类的非静态成员,如果需要访问外部类的 ?????非静态成员,可以创建一个外部类的对象去访问。 (2)在静态的内部类中,可以直接访问外部类的静态成员 (3)如果需要在外部类中访问静态内部类的成员,需要分析要访问的成员是否是静态 ?????的,如果要访问的成员是静态的,就不需要创建内部类对象,否则需要创建 (4)如果在其他类中,想要访问静态内部类的成员,不需要创建外部类的对象,只需 ?????要创建内部类对象即可。 ?????格式: ?????外部类名.内部类名 对象名 = new 外部类名.内部类名(); (5)一个类型是否需要创建对象,跟当前类是否是静态无关,跟要访问的成员是否是 ?????静态有关,如果要访问的成员是静态,就不需要创建对象,否则需要
-
局部内部类 1、概述:在主方法中定义的内部类 2、特点: (1)局部内部类不能定义为私有的或者静态的 (2)局部内部类中,可以直接访问方法中定义的数据 (3)局部内部类中,可以定义私有的和普通的成员,但是不能定义静态的成员 (4)局部内部类不能在其他方法中直接访问,需要在内部类所在的方法中提供对象和 ??????访问方式 总结:只要是一个类型,在编译之后都会生成一个独立的.class文件 -
匿名内部类 1、概述:没有名字的类型 ????匿名内部类是属于局部内部类的一种 2、格式: new 父类类名(接口名){ ????对父类或者接口方法1的重写 对父类或者接口方法1的重写 }; 父类引用(接口引用) = new 父类类名(接口名){
????对父类或者接口方法1的重写
对父类或者接口方法1的重写
}; 3、使用场景: 如果只需要对接口或者父类中的抽象方法调用一次,可以匿名内部类方式创建一个匿名 对象来简化操作
包
1、概述:用来分类管理代码资源的文件夹,也可以参与编译器的编译 2、效果: 一旦给类型加上包之后,类的全类名发生变化: 全类名 = 包名 + 类名 3、作用: (1)分类管理类文件 (2)可以在不同包中起相同的类名 4、包的使用方式: (1)在使用一个类型时,如果在当前包中使用这个类型,直接写类名即可 ?????因为首先会默认在当前包中寻找有没有该类,如果有就可以直接使用 (2)--如果在其他包中要使用某个类型,需要使用全类名 ?????????--如果反复的使用此类,每次都要将一个很长的名字进行书写,他复杂 ?????????--为了简化这个操作,可以使用导包语句来进行操作 ?????????--导包方式:import 要使用类的全类名 ????????????导包之后,可以在当前类中直接使用名字即可 (3)注意事项:可以使用*通配符将整个包中的类全部导入,但是不建议使用 5、包的命名方式: 在一个工程中,只要包是唯一的即可 一般都是全小写 6、声明包: 只要在某一个包中定义了一个类型,就需要在文件的第一行定义当前类在哪一个包下
权限修饰符
1、概述:用来修饰类型、接口、变量、等内容的一个修饰的符号
抽象类
1、抽象:抽取相同的或者相似的内容
-
抽象方法 (1)只有方法的声明,没有方法的实现内容,为了表示这个方法是一个抽象方法,所 ?????以使用一个关键字abstract修饰。 将来子类中都有自己的实现方式,父类中定义的实现内容不需要使用,所以就干 ?????脆只定义一个方法的声明即可。 -
特点 1、可以定义抽象方法的类型就是一个抽象类,为了表示一个抽象类,也需要使用一个关键 字abstract来修饰。 2、抽象类和抽象方法的关系: 抽象方法必须在抽象类中定义 抽象类中可以不存在抽象方法 抽象类中既可以定义抽象方法,也可以定义非抽象方法 3、抽象类不能实例化(创建对象) 因为如果抽象类可以创建对象,就可以调用自己的方法 如果调用了抽象方法,那么没有实现内容去执行 4、抽象类子类的前途: 如果子类重写完父类中定义的每一个抽象方法,子类就变为一个普通类,可以正常创建 ???对象 如果子类没有重写完父类中定义的抽象方法,子类就只能定义为一个抽象类,不能创建 ???对象 5、虽然类型是一个抽象类,但是和其他类一样编译之后,形成一个独立的字节码文件
-
模板设计模式 1、设计模式:Java程序员,解决问题,或者设计类型,设计代码所需要的一个编程套路。 2、模板设计模式:抽象类的一个应用: 如果一些类型中有一些相同的内容,可以将这些相同的内容抽取到抽象类中定义,不同 的内容也可以定义为抽象方法在父类中定义。相同内容可以让子类继承,不同内容可以 让子类重写。
接口
1、概述: 生活中的角度: ????接口其实就是表示一类规则,想要使用某些事物,就需要满足规则所需要的要求, ????否则就不能使用。 Java语言: ????用来定义规则特殊类型 ????专门用来定义方法规则的特殊类型 专门用来定义抽象方法的特殊类型 2、好处: (1)接口本身表示一类规则,一旦将规则定义好之后,只需要按照接口中的规则实现 ?????对应的功能即可。 接口可以降低类与类之间的耦合性。
-
定义 1、接口的定义:需要使用一个关键字 interface -
接口和抽象方法的关系 1、接口和抽象方法的关系: (1)接口中只能定义抽象方法,如果不加abstract,接口可以默认提供 (2)不能定义非抽象方法 -
特点 1、接口本身不能实例化(创建对象) 2、接口没有子类,但是接口可以有实现类 (1)如果一个类型想要实现一个接口,需要使用implements (2)以后接口和类之间不是子父类的关系,而是接口和实现类的关系 (3)如果一个类型实现一个接口之后,这个类型中,就可以继承接口中的抽象方法 、接口在编译时候,同样会生成对应的字节码文件
-
接口的实现类前途 1、接口的实现类前途: (1)如果实现类重写了接口中的每一个抽象方法,就变为一个普通类 (2)如果实现类没有重写完每一个抽象方法,这个类就变为一个抽象类 -
类、接口互相的关系
-
类与类 1、类与类之间: 继承关系??extends 继承特点:可以单继承、不能多继承、可以多层继承 -
类与接口 1、类与接口: 实现关系?implements 实现特点:可以单实现,可以多实现,不可以多层实现 ?????多实现:多个接口之间使用逗号分隔即可 ?????????????实现了多个接口之后,多个接口的抽象方法,实现类都可以继承 ?????????????如果多个接口中有一些相同的方法声明,实现类只需要重写一个即可 ?????不可以多层实现:一个类型实现一层之后,那就是类与类的关系 ?????一个实现类,可以在继承一个父类之后,可以同时实现多个接口 -
接口与接口 1、接口与接口: 继承关系 特点:可以单继承,可以多继承,可以多层继承 ??????可以多继承:每一个父类的抽象方法,子类都可以继承 ??????可以多层继承:最底层的子接口,可以拥有以上所有父类和间接父类的抽象方法 -
抽象类与接口 1、抽象类和接口的区别: (1)抽象类/类:一般定义物体本身固有的属性和行为 (2)接口:一般定义物体通过扩展或者学习得来的行为
jar包
-
定义 用来存放编译好的字节码文件的压缩包 是java语言专用的压缩包 -
为何定义 1)Java源代码在编译之后,会生成对应的.class文件,.class文件中包含了该类定义 ?????? 的各种属性和方法,所以可以脱离源代码使用 (2)脱离源代码使用需要一定条件: 需要将.Class文件打成jar包 (3)如何生成jar包: (1)选中需要导出的文件,export -> java -> jar file->选择导出的位置,起一个名字即可 (2)生成的jar包是一个压缩包,里面就有选择导出的字节码文件 (4)如何使用jar包: (1)在当前工程下,创建一个文件夹 lib (2)将需要导入的jar包,直接复制到lib文件夹中 (3)选中导入的jar包,右键->build path->add to build path ?????当工程中,出现一个对应名称的奶油瓶,表示加载成功 -
类库 存放jar包的文件夹
API
API: Application Programming Interface 应用程序编程接口
StringBuilder
-
概述 概述:用来表示字符串的类型 -
特点 是一个可变的的字符序列 在lang包不需要导包 此类中维护也是一个字符数组,用来存储字符串类型 -
String、StringBuilder区别
-
相同点 两个类型都可以表示字符串 -
不同点 String是不可变的字符序列,本类中没有提供修改成员变量的方法 StringBuilder是可变的字符序列,因为类中提供了修改成员变量的方法 -
拼接效率的区别 1、效果: (1)使用String类型拼接字符串效率低 ????(2)使用StringBuilder类型拼接字符串效率高 2、原因: (1)String类型是一个不可变的字符序列,不能在对象本身基础上进行拼接数据 ?????????系统会默认提供一个StringBuilder对象,拼接,拼接之后转为String对象 (2)StringBuilder类型是一个可变的字符序列,可以在对象本身基础上拼接数据
-
StringBuilder、StringBuffer区别
-
相同点 都可以表示可变的字符序列 两个类型中的方法都一样 -
不同点
-
版本不同 StringBuilder:jdk1.5出现 StringBuffer:jdk1.0出现 -
线程安全不同 StringBuilder线程不安全(单线程中用的多一点) StringBuffer线程安全(多线程中多一点) -
效率不同 StringBuilder使用效率高 StringBuffer使用效率低
-
构造方法
-
StringBuilder() 创建一个初始值为空的字符串对象,数组的初始大小为16 -
StringBuilder(int c) 创建一个初始值为空的字符串对象,数组的初始大小为c -
StringBuilder(String str) 创建一个初始值为str的字符串对象,数组初始值大小为str.length+16
-
获取长度方法 概述:StringBuilder对象中维护的是一个字符数组,所以可以获取字符数组的长度和元素的个数
-
capacity() 返回对象的初始容量 -
length() 返回字符串对象
-
常用的方法
基本类的包装类
自动装箱、拆箱
-
装箱 装箱:将基本数据类型包装为引用数据类型的对象
-
拆箱 拆箱:将引用数据类型的对象转为基本数据类型
正则表达式
常用类型
-
Math
-
System
-
BigInteger
-
BigDecimal
-
Date
-
概述 Date是表示时间的类型,此类可以表示特定的瞬间,精确到毫秒.是java中提供的 ????? 表示时间日期数据的对象 -
特点 (1)此类在java.util包,需要导包 ????(2)此类大部分方法已经过时,由Calendar类型代替 -
构造方法
-
Date() 分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒) -
Date(long date) 分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为" ???????????????????历元(epoch)",即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定 ???????????????????毫秒数。
-
常用方法
-
getTime() 返回自1970 年1月1日 00:00:00 GMT 以来此 Date 对象表示的 ??????????????????毫秒数 -
setTime(long time) 设置此Date对象,以表示 1970 年1月1日 00:00:00 GMT ?????????????????????????以后 time 毫秒的时间点
-
SimpleDateFormat
-
Calendar
-
NumberFormat
异常
可变参数
-
概述 可变参数又称参数个数可变,用作方法的形参出现,name方法参数个数就是可变的了,方法的参数类型已经确定,个数不确定,我们可以使用可变参数 -
好处 由于参数数目不稳定,使用可变参数函数能缩短编码,灵活性和易用性较高 -
格式 修饰符 返回值类型 方法名(数据类型...变量名){ 方法体 } -
注意事项 可变参数底层是使用数组实现的 如果方法中存在多个参数,只能存在一个可变参数 一个方法的参数列表中,只能存在一个可变参数 在传递实际参数时,数据类型要和可变参数的数据类型对应
集合
数据结构
-
栈
-
概述 栈概述:stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作 -
特点 先进后出,(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素)。 -
相关概念
-
队列
-
数组
-
概述 Array:是有序的元素序列,数组是在内存中开辟一段连续的空间,并在次空间中放元素 -
特点 特点: (1)查找元素快:可以通过指定的索引快速查询当前元素所在的位置,并访问元素 ?????????????????因为只需要通过要访问的索引,计算地址即可,通过计算之后的地 ?????????????????址,就可以直接找到要查询的元素 (2)增删元素慢: ?????如果需要增加一个元素,就会重新新建一个容量+1的数组,将数组中的元素复制 ?????????到新数组中,再将需要添加的元素添加到指定位置。 ?如果需要删除一个元素,就重新新建一个容量为-1的数组,将不删除的其他元素 ?????????复制到新数组中。
-
链表
-
概述 链表:linkedList,由一系列结点node(链表中每一个元素称为结点)组成,节点可以在运行时动态生成 -
组成及分类 每个节点包括两个部分:一个是存储数据元素的数据域,另一个是存储上一个结点或者下一个结点地址的指针域 双向链表就是即可以存储上一个结点也可以存储下一个节点的链表 单向链表是只可以存储下一个节点的链表 -
特点 查找元素慢:想查找某个元素,需要通过开始连接的结点,依次向后查找指定的元素 增删元素快:增加元素只需要修改上一个节点的地址为新节点的地址即可 删除元素只需要修改上一个节点的地址即可
-
哈希表
泛型
-
概念 概念:是一个未知的数据类型,是一个参数化类型 -
使用场景 使用场景:需要定义一个类型,类型中的属性所属的数据类型不确定,或者类中的方法 参数和返回值类型并不确定,使用一个符号来表示这个不确定的类型,这个符号就称之 为泛型。 -
使用 泛型的使用: 在使用带着泛型的类型时,需要确定这个泛型是哪一个类型。确定是哪一个类型,类中 就只能使用对应的类型。 -
好处 可以提高代码的扩展性 不需要对获取的每个数据进行强转 提前将问题暴露在编译期 -
注意事项 前后两个泛型要保持一致 如果前面的泛型确定了类型,后面的泛型可以不用写 泛型要定义在类后的尖括号中 泛型只能表示引用数据类型,不能表示基本数据类型 -
泛型类
-
泛型方法
-
泛型通配符
Collections工具类
File类
递归
IO流
1、凡是操作数据输入和输出的对象所属的类型,都属于IO的范围。
文件的拷贝
1、文件拷贝:将一个文件中的信息,复制到另外一个文件中
-
思路 先通过文件字节输出流将信息读取到内存中,再通过文件字节输出流将信息写出到另外 一个目标文件中 -
文件拷贝效率提升
-
效率慢的原因 一个字节需要IO两次,读一次写一次,如果要拷问的字节有很多,需要iO文件个数两 倍的次数。 -
提升思路 一次多读几个字节,多写几个字节。使用read(byte[] b)的方法和write(byte[] b)的方法, 多读几个多写几个来提升效率。
-
使用大数组拷贝问题 1、使用大数组拷贝问题: 数组将来需要再虚拟机中开辟空间, 如果数组的大小太大,将来对空间的要求比较高, 可能空间也不够用,所以不能使用大数组拷贝。所以只能使用小数组拷贝文件。 -
使用小数组拷贝问题 使用小数组拷贝问题: 但是使用小数组拷贝数据的时候,应该是读几个数据写出几个数据,所以需要使用 write(byte[] b,0,len)这个方法来写出数据,避免多写出数据,造成发生数据的错误。
-
注意 使用小数组拷贝文件,一般指定数组的大小一般为1024的整数倍。
-
使用场景 如果只需要拷贝文件,使用字节流拷贝即可 如果需要查看某个文件中的信息,或者修改某个文件中的信息,使用字符流来读,来写 出信息。 -
非纯文本文档 纯文本文件:全是以字符的方式来表示数据的文件 非纯文本文件:图片,视频,音频等不是以字符的方式来表示数据的文件
高效流
close和flush的区别
流
-
转换流
-
标准输入输出流
-
打印流
-
对象序列化、反序列化
Properties和IO流相结合
-
Properties
-
结合的方法
-
load(Reader reader) 从输入字符流读取属性列表(键和元素对) -
load(InputStream in) 从输入字节流读取到属性列表(键和元素对) -
store(Writer writer,String comments) 将此属性列表(键和元素对)写出到Properties文件 -
store(OutputStream out,String comments) 将此属性列表(键和元素对)写出Properties文件
IO流总结
-
输入和输出 IO输入和输出:数据进入运行内存--->输入 数据从运行内存中到其他设备-->输出 -
字节流 字节输入流 InputStream File... read() read(byte[] bs) read(byte[] bs,int index,int len) 字节输出流 OutputStream File... Write() Write(byte[] bs) Write(byte[] bs,int index, int len) 文件拷贝 先使用输入流,读取每个字节,在使用输出流将当前这个字节写出到另一个文件 提升效率:可以多读几个,多写几个。小数组拷贝 使用高效缓冲流 需要刷新数据,或者关流 -
字符流 使用原因:使用字节流写字符串,需要转换字节数组(稍微麻烦) 字符输入流Reader File... read() read(char[] ch) read(char[] ch,int index,int len) close() 字符输出流Writer File... writer(int i) writer(String s) 文件拷贝:只能拷贝纯文本文件(不建议拷贝),不能拷贝其他文件 高效缓冲流: BufferedReader: readLine() BufferedWriter:newLine() -
转换流 转换输入流:可以指定编码格式,读取信息 转换输出流:可以指定编码格式写出信息 -
标准输入流、输出流 System.in:输入流,默认数据源是键盘 System.out :输出流,默认数据写到控制台 -
打印流 打印字节流 PrintStream: 可以使用父类的方法,写出一个字节 也可以使用print println可以写任何类型的数据 打印字符流: PrintWriter: 可以使用父类的方法,写出一个字节 也可以使用print println 可以写出任何类型的数据 将构造的第二个参数设置为true,可以实现自动刷新 (但是只能用在println) -
对象序列化流 序列化:ObjectOutputStream:writerObject() 反序列化: ObjectInputStream:readObject() 注意: 要想序列化某一个类型对象,此类型需要继承序列化接口 如果需要更改类型,一般需要在类中声明一个序列化ID 如果某个属性不需要序列化:trinsent -
Properties 如果需要将键值对数据写出到目标文件:store 如果需要读取键值对数据:load -
关流 jdk1.7 层层嵌套 jdk1.8 try{ }{
}
多线程
网络编程
虚拟机类加载机制
反射
Java8接口新特性
Lambda表达式
-
概念 1、概念: 本质上是一个对象,可以当作是匿名内部类创建的对象的简写格式。 -
格式 1、格式: (参数)->{方法体}
-
举例 (1)如果抽象方法没有参数,方法体只有一句: 方法体外的大括号可以省略。 ????格式:()->方法体语句; (2)如果抽象方法中有一个参数: 参数的类型可以省略,参数外的小括号可以省略 ????格式:参数名->{方法体语句}; (3)如果方法的参数有多个: ????参数外的小括号不能省略,参数类型可以省略,方法体外的大括号可以省略。 ????格式:(参数名称)->方法体语句; (4)如果方法有返回值: 直接在方法体中的大括号中对数据进行return即可 格式:(参数名称)->{ ????????方法体语句: ????????return语句; }; (5)如果方法需要返回值,而且方法体只有一句: 可以将大括号和return关键字一起省略 ????????格式:(参数名称)->要返回的数据; -
Landba表达式和匿名内部类的区别 如果接口中只有一个抽象方法,即可以使用匿名内部类创建,也可以使用lambda创建、、、、如果接口中有多个抽象方法,那么只能使用匿名内部类创建 在传递实际参数时,如果形参是接口,可以使用lambda表达式传递,也可以使用匿名内部类传递、、、如果形参是某一类型,只能使用匿名内部类传递(原因,不能使用lambda表达式创建抽象类的子类对象) 匿名内部类会在磁盘中生成一个字节码文件,lambda表达式则没有 -
方法引用
函数式接口
-
概念 一个接口中如果只有一个抽象方法,name这个接口就是一个函数式接口 -
注解 通过注解检测一个接口是否是一个函数式接口 @FunctionalInteface 在接口上直接加上注解,如果这个接口是一个函数式接口则不报错,否则编译报错 -
使用场景 Lanbda表达式的使用前提 可以将函数式接口定义为方法的形参,再调用方法时,可以将利用Lambda表达式当做实参进行传递 可以将函数式接口定义为方法的返回值类型,在调用方法时,可以利用lambda表达式返回数据 -
内置的函数式接口
Optional类型
注解
Eclipse快捷键
1、ctrl + n:新建工程、包、类和文件等内容 2、Ctrl + shift + f:格式化代码 3、Ctrl + shift + o:自动导包、删除没有用的包 4、Ctrl + /:单行注释,取消单行注释 5、Ctrl + shift + / :多行注释 6、Ctrl + shift + \ :取消多行注释 7、Alt + ↑:向上移动一行 8、Alt + ↓:向下移动一行 9、Ctrl + alt + ↑:向上复制一行 10、Ctrl + alt + ↓ :向下复制一行 11、Ctrl + d:删除一整行 12、Alt + shift + r:整体修改某个标识符名称 13、F2:可以修改文件名称,并且将所有关联的位置一起修改 14、alt+/ 内容辅助建 15、shift+enter 光标往下一行
自定义快捷键的生成
1、生成自定义属性的get 和set 方法 alt + shift + s??r 2、生成空参构造: alt + shift + s?c 3、生成有参构造: alt + shift + s?o
数据库的概述
数据库DB
数据库管理系统DBMS
-
Mysql -
Oracle -
SqlServer -
DB2
Sql语句分类
-
数据库定义语言DDL -
数据库操作语言DML -
数据库查询语言DQL -
数据库控制语言DCL
注:【有需要xmind或者md文件版本的朋友可以私聊】
? ? ? ?【希望可以给到需要的人帮助,一起加油】
|