JavaSE基础知识笔记(上)

一.Java入门
1.关于CMD常见命令
盘符切换:盘符名称+冒号 查看当前路径的内容:dir 进入目录:cd 目录 回退上一级目录:cd … 进入
多级目录:cd 目录1\目录2 回退到盘符目录:cd \ 清屏:cls 推出cmd:exit
2.环境变量
想要在任何目录下都可以打开指定软件,就可以把软件的路径配置到环境变量里
3.JDK里的目录 JDK分为过渡版本和长期支持版本(LTS)
bin:该路径下存放了各种工具 conf:该路径下存放了相关配置文件 include:该路径下存放了一些平
台特定的头文件
jmods:该路径下存放了各种模块 legal:该路径下存放了个模块的授权文件 lib:该路径下存放了工
具的一些补充jar包
4.JAVA
JavaSE:Java语言的(标准版),用于桌面应用的开发,是其他两个版本的基础
JavaME:Java语言的(小型版),用于嵌入式电子设备或者小型移动设备,列入电视剧 微波炉等,以凉
JavaEE:Java语言的(企业版),用于web方向的网站开发
Java的主要特性:面向对象() 安全性 多线程(同时做多件事) 简单易用 开源(代码公开) 跨平台(通过虚拟
机实现)
5.JDK和JRE
JVM(Java Virtual Machine):Java虚拟机,真正运行Java程序的地方
JRE(Java Runtime Environment):Java的运行环境,包括:JVM、核心类库、运行工具
JDK(Java Development Kit):Java开发工具包,包括:JVM、核心类库(Java写好的东西,可以直接
用)、开发工具[ javac(编译),java(运行),jdb(调试)]
Java编译成class文件,然后在虚拟机上运行,就不需要再开发,所以JDK里面一些工具可以不需要,
为了节省空间所以就有了JRE
包含关系:JDK包含JRE、JRE包含JVM
二.Java基础概念
1.注释 //是单行注释 /* /是多行注释 /* */是文档注释
2.关键字 被Java赋予了特定含义的英语单词
关键字特点:关键字的字母都是小写、在常见编译器中有不同的颜色标记
3.字面量 告诉程序员数据在程序中的书写格式
字面量类型:整数 小数 字符串(" ") 字符(’ ‘) 布尔 空(null不能直接打印,要用字符串的形式进行打印)
特殊字面量:’\t’(制表符,在打印的时候,把前面字符串的长度补齐到8,或者是8的倍数。最少补1个
空格,最多补8个空格)
4.计算机的存储规则
文本(数字、字母、汉字)均以二进制存储,字母和汉字对应各码表里的值再转化为二进制,存在电
脑里,不同进制在代码中的表现

二进制:由0和1组成,代码中以0b开头 十进制:0~9,不加任何前缀
八进制:由0~7组成,代码中以0开头 十六进制:由09还有af组成,代码中以0x开头
(用二进制的由来,以前计算机看图灵纸孔,无孔1有孔0,现在计算机看电压大小,大于3.3v的为1,
小于为0,这样只用表示两个状态,轻松些)
image图片,采用光学三原色存储(红,绿,蓝),可以写成十进制或者十六进制表达式
(255,255,255) (FFFFFF),每个像素就是一块三原色组合
sound声音,对应波形图,波形图每一个点有一个数字对应
5.数据类型 分基本数据类型和引用数据类型
基本数据类型
如果要定义一个long类型的变量,要在数据值的后面加上一个L作为后缀,L可以大写或小写,建议大
写,float要加F做后缀。运算时,若可能溢出,建议在第一个数后加L。(Biginteger类型 存数大小没有
限制)。浮点类型不能精确表示数据,运算时有可能会发生舍入误差,精确场合不能用。(BigDecimal
类型 用于存小数,基本上没有误差)。char采用Unicode编码格式,一个字符对应一个码,表现的形式
是字符char,但本质是码int(ASCII a=97 A=65 0=48)
整数和小数的取值范围大小关系:double>float>long>int>short>byte。
6.标识符
命名规则:由字母、数字、下划线、美元符号($)组成,不能数字开头,不能是关键字,区分大小写
7.输入基本类型数据
用Scanner类创建一个对象 Scanner reader=new Sacanner(System.in);
然后reader对象就可以调用下列方法,读取用户在命令行输入的各种基本类型数据:
第一套体系:nextByte()、nextShort()、nextInt()、nextLong()、nextFloat()、nextDouble()、
nextBoolean()、next() 遇到空格,制表符,回车就停止接受。这些符号后面的数据就不会接受了
第二套体系: nextLine();接收字符串 可以接收空格,制表符,遇到回车才停止接受数据
键盘录入的两套体系不能混用的 弊端:先用nextInt,再用nextLine会导致下面的nextLine接受不到数

三.运算符和表达式
对字面量或者变量进行操作的符号 用运算符把字面量或变量连接起来符合Java语法的句子称为表达式
1.算术运算符(+ - * / %)
在代码中,如果由小数参与计算,结果有可能不准确 (之后补充为什么有这种现象)。
(1) “+”操作的三种情况(数字相加、字符串相加、字符相加)
①数字相加:
数字进行运算时,数据类型不一样不能运算,需要转成一样的,才能运算 (强制类型转换或者隐式类型
转换)
隐式类型转换:小类型传给大类型(本质就是在要转换的数的二进制数前补上相应的0。例如byte的10
二进制为0000 1010转为short型就为 0000 0000 0000 1010)。byte short char三种类型的数据在

运算的时候,都会直接先提升为int,然后在进行运算。例如:byte a=10;byte b=20 byte c=(byte)
(a+b) a,b的类型被转为int型 所以要强转为byte 不然就报错
强制类型转换:大传小(本质就是删去0)。标数据类型 变量名=(目标数据类型) 被强转的的数据
②字符串相加:
当"+“操作中出现字符串时,这个”+“是宇符串连接符,而不是算术运算符了。会将前后的数据进行拼
接,井产生一个新的字符串
连续进行“+”操作时,从左到右逐个进行。例如:1+99+“np”+20+30 输入的是
“100np2030”
③字符相加:当字符进行“+”操作时,会先通过ASCII码表查询对应的数字再进行计算
注意看是单引号还是双引号
(2)“-” “” “/” “%”没啥,字符串只有“+”操作 2.自增自减运算符(“++” “–”)
3.赋值运算符("=、+=、-=、
=、/=、%=” ):+=、-=、=、/=、%= 底层都隐藏了一个强制类型
转换。例如:short s=1; s+=1;等于s=(short)(s+1);
4.关系/比较运算符(“==、!=、>、>=、<、<=”):结果都是Boolean型,要么true,要么false 5.逻
辑运算符(“& | ^ ! && ||”)
6.三元运算符(? 😃:关系表达式?表达式:表达式;
7.运算符优先级:
8.原码、反码、补码:-128无原码和反码,只有补码为1000000(补码还能多记录一个特殊的
值-128,因为补码是相当于错位来放反码的,-127为10000001,然后多出来的10000000就被定义
为-128,所以我们说一个字节的取值范围为-128到127)。计算机中的存储和计算都是以补码的形式
进行的
9.位运算符(“&逻辑与 |逻辑或 <<左移,低位补0 >>右移,高位补0或1 >>>无符号右移,高位补0”):
左移几次相当于一个数乘以2的n次方。列如:200左移两次等于200
2^2=800。右移就是除法
四.判断和循环
流程控制语句(顺序结构、分支结构、循环结构)
①.分支语句(if、switch):if注意点如果对一个boolean类型进行判断,不要用==号,直接把变量写在
小括号里
switch注意点:default的位置不一定是写在最下面的,我们也可以写在任意位置,只不过习惯会写在最下
面,写在别的位置时,要加上break;case穿透就是句子中没有break导致的,如果多个case语句的语句
体重复了,就可以用; switch新特性,只有jdk12及以后版本才有:case 条件,条件 -> {},这个可以
不用加break;switch括号内只能支持byte,short,int,char,String(jdk7),枚举(jdk5)
②.循环语句(for、while、do…while)
循环高级综合练习(无限循环、跳转控制语句):无限循环就是死循环for(;😉、while(true)、
do…while(true);跳转控制语句:continue、break;
若循环中if语句中有break就是跳出循环,switch中有break是跳出switch

嵌套循环:一般多行多列使用,常常外层控制行,内层控制列;建议:嵌套层数越少越好,一般只用
到两层,三层及少
五.数组
数组:引用数据类型,是一种容器,可以用来储存同种数据类型的多个值,定义了长度就不可变
1.数据的初始化
①静态初始化:
完整格式:数据类型[] 数组名=new 数据类型[]{元素1,元素2,元素3}; 简化格式:数据类型[] 数组名=
{元素1,元素2,元素3};
②动态初始化:
格式:数据类型[] 数组名=new 数据类型[数组长度];
数组名记载的是堆空间的地址值,所以输出数组名的时候输出的地址值
2.数组的内存图
只要是new出来的一定是在堆里面开辟了一个小空间,如果new了多次,那么在堆里面有多个小空
间,每个小空间中都有各自的数据
两个数组指向同一个空间的内存图:
当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次访问
的时候都是修改之后的结果了
扩展:解释一下地址值的格式含义例如:[D@776ec8df
[:表示当前是一个数组 D:表示当前数组里面的元素都是double类型的 @:表示一个间隔符号(固定
格式) 776ec8df:数组真正的地址值
扩展:idea提供的自动的快速生成数组的遍历方法=数据名.fori;快速生成主函数=m;快速生成输出
=sout;CTRL+Alt+L自动格式化代码;CTRL+Alt+M自动生成方法;CTRL+Shift+/ 快速注释 ;
alt+insert快速生成标准Javabean;先选中要生成循环或处理异常的代码,然后Ctrl+Alt+T快速生成
处理的方式
扩展:数组默认初始化的规律:整数类型的默认初始化为0;小数类型的默认初始化为0.0;字符类型
的默认初始化为’/u0000’ 空格;boolean类型的默认初始化为false;引用数据类型的默认初始化为
null;
3.数组的复制(java提供的)
方法(①更灵活) 输出b:0001234000
方法②(更简单)输出b:123
方法②的衍生——数组的扩容(创建一个更大的新的数组,并将源数组数据复制进去)
4.数组的排序 5.Arrays.toString()将数组转换为字符串输出

六.二维数组
当我们需要把数据分组管理的时候,就需要用到二维数组
1.二维数据的初始化
①静态初始化
完整格式:数据类型[][] 数组名=new 数据类型[][]{{元素1,元素2,元素3},{元素1,元素2,元素3}}; 简化格
式:数据类型[][] 数组名={{元素1,元素2,元素3},{元素1,元素2,元素3}};
②动态初始化:
数据类型[][] 数组名=new 数据类型[一维数组个数][一维数组中可以放多少个元素];
2.获取元素
arr[i][j]——arr: 二维数组 i: 二维数组的索引,获取出来的是里面的一维数组 j: 表示一维数组中的索
引,获取出来的就是真正的元素
System.out.printIn(arr[0]);表示获取二维数组中的第一个一维数组(输出的是地址值)
System.out.printIn(arr[0][0]);表示获取第一个一维数组中0索引的元素
3.二维数组的遍历
for (int i = 0; i < arr.length; i++) { 外循环:遍历二维数组,得到里面的每一个一维数组
for (int j = 0; j < arr[i].length; j++) { 内循环:遍历一维数组,得到里面的每一个元素 } }
4.二维数组的内存图
特殊情况二:当arr[1]=arr2;赋值完后,二维数组自动创建的0022和0033就会变为垃圾从内存消失
七.方法
封装一段特定的业务逻辑功能,可以重复利用,方法是程序中最小的执行单元,方法提高代码的可维
护性,减少代码重复
1.方法的格式
修饰词 返回值类型 方法名(参数){方法体; return 返回值 } 只要到return就是直接结束方法
有参可以使方法更灵活
形参:形式参数,是指方法定义中的参数 实参:实际参数,方法调用中的参数
2.方法的重载
同一个类中(继承的子类中写也算),方法名相同,参数不同(包括:个数不同、类型不同、顺序不
同)的方法。与返回值无关。
①在调用重载方法时,Java虚拟机会通过参数的不同来区分同名的方法
②把相同功能的方法名起成一样的名字——好处:定义方法时不用那么多单词了,调用方法时也不用
这么麻烦
3.方法的内存
Java的内存分配(虚拟机)

①方法调用的基本内存原理——先进栈的后出栈,例如子弹装入弹夹那样
②基本数据类型和引用数据类型的内存原理
基本数据类型(整数、浮点数、布尔、字符):变量里面存储的是真实的数据,数据值是存储在自己
的空间中 特点:赋值给其他变量,赋的真实的值
引用数据类型(只要new出来的):变量(自己空间)里面存储的是地址值,数据值是存储在其他空间中
的。 特点:赋值给其他变量,赋的是地址值
③方法传递基本数据类型和引用数据类型的内存原理
传递基本数据类型时,传递的是真实的数据,形参的改变,不影响实际参数的值,如果想改变,就要
用先前的值去接收返回的值
传递引用数据类型时,传递的是地址值,形参的改变,影响实际参数的值
八.OO:面向对象——OOA:面向对象分析 ;OOD:面向对象设计;OOP:面向对象编程
面向: 拿、找 对象:能干活的东西 面向对象编程: 拿东西过来做对应的事情
1.类和对象
类:是对象共同特征的描述(设计图)。对象:是软件中真实存在的具体东西。
在Java中,必须先设计类,才能获得对象 类是对象的模板,对象是类的具体的实例
2.如何得到对象
public class 类名 {成员变量(代表属性的,一般是名词)
成员方法(代表行为的,一般是动词 ) }
类:是一种引用数据类型,所以创建对象时和创建数组一样用new关键字。
类名 对象名 = new 类名(); 数据类型 引用类型变量 指向 对象
3.拿到对象后能做什么——对象.成员变量; 对象.成员方法(…)
4.定义类的补充注意事项
①用来描述一类事物的类,专业叫做: Javabean类。在Javabean类中,是不写main方法的。
②编写main方法的类,叫做测试类我们可以在测试类中创建iavabean类的对象并进行赋值调用。
③一个java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成
为代码文件名(实际开发中建议还是一个文件定义一个class类)
④成员变量的完整定义格式是: 修饰符 数据类型 变量名称 = 初始化值;一般无需指定初始化值,存在
默认值 成员变量会默认初始化,局部变量不会必须赋值
5.面向对象三大特征——封装,继承(十一.4),多态(十一.5)
封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为,例如:人关门,关门和开门的
方法就应该写在门的类里,人对象再调用这些方法,别的对象也可以调用这些方法了。
好处:降低我们的学习成本,可以少学、少记,或者说压根不用学,不用记对象有哪些方法,有需要
时去找就行。让编程变得很简单,有什么事,找对象,调方法就行。例如:要对String类型做操作,直

接找相应的方法即可
6.private关键字——为了成员变量的安全性
是一个权限修饰符;可以修饰成员(成员变量和成员方法);被private修饰的成员只能在本类中才能访
问。
针对于每一个私有化的成员变量,都要提供get和set方法——set方法: 给成员变量赋值;get方法: 对
外提供成员变量的值
7.this关键字
Javabean类中分成员变量和局部变量,如果有同样的变量名,如果不用this关键字,就会按就近原
则,那个变量离的近就用那个,用this关键字就可以使用成员变量了。例如:this.age=age; 左边代表
成员变量,右边的就用就近原则。非静态的方法有一个隐藏的this,this就是一个局部变量·
8.构造方法——构造方法也叫作构造器、构造函数。
作用:创造对象的时候,由虚拟机自动调用,给成员变量进行初始化的,构造函数存在的意义就是为了
方便new的时候直接传参数,比如Student s = new Student (18,刘亦菲)
①构造方法的格式——public class 类名{ 修饰词 类名(参数){ 方法体; } }
无参数构造方法:初始化的对象时,成员变量的数据均采用默认值。
有参数构造方法:在初始化对象的时候,同时可以为对象进行赋值。
②特点:方法名与类名完全相同;没有任何返回值类型;没有具体的返回值 (不能由retrun带回结果数
据)
③执行时机:创建对象的时候由虚拟机调用,不能手动调用构造方法;每创建一次对象,就会调用一
次构造方法
④注意
定义时:如果我们自己没有写任何的构造方法,那么虚拟机给我们加一个空参构造方法,如果定义了
有参构造方法,系统将不再提供默认的构造方法(及不提供无参构造方法,需要自己写)
重载:带参构造方法和无参数构造方法,两者方法名相同,但是参数不同,这叫做构造方法的重载。
使用方式:建议在任何时候都手动写上空参和带全部参数的构造方法。
9.标准JavaBean类
①类名需要见名知意 ②成员变量使用private修饰 ③提供至少两个构造方法(无参构造方法、带全部参
数的构造方法)④成员方法(提供每一个成员变量对应的setXxx()/getXxx()、如果还有其他行为,也
需要写上)
10.对象内存图
先从方法区加载class文件,然后在栈中运行main方法
11.this的内存原理——this的作用: 区分局部变量和成员变量;this的本质: 代表方法调用者的地址值
12.

九.字符串和API(Application Programming Interface): 应用程序编程接口
JavaAPI:指的就是JDK 中提供的各种功能的Java类
简单理解:API就是别人已经写好的东西,我们不需要自己编写,直接使用即可
API帮助文档:帮助开发人员更好的使用API和查询API的一个工具
1.String概述
java.lang.String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都为此类的对象,会自
己导入
注意:字符串的内容是不会发生改变的,它的对象在创建后不能被更改
String a ="尼古拉斯”; String b=“程序员”; System.out.printIn(a + b);这创建了三个字符串
String a =“尼古拉斯”; a =“三连”; 创建了两个字符串 第二个a是创建了一个新的字符串 并没修改前
面的a
2.创建String对象的两种方式
①直接赋值 String s=“aaaaaa”(用的最多)
②new 1.2基本没有用 3.4用。需求:我要修改字符串的内容,用char构造;需求:我们一般要把字节信息
进行转成字符串,此时就要用到byte个构造了 char[] 数组变为String类型 不能用toString不然输出的就
是地址值;String s2=new String(“点赞”)创建了两个对象,先创建一个在串池中,再new以一个
3.内存图 注意: StringTable(串池)在JDK7版本开始从方法区中挪到了堆内存
直接赋值:当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在 不存在:创建新的 存在:复

new 每new一次都是开辟了一个小空间,容易浪费内存空间
4.String的比较
①不能用比较,因为号比较的实质是:基本数据类型比较的是数据值,引用数据类型比较的是地
址值
列如:String s1 = “abc”;String s2 = “abc”;System.out.println(s1 == s2); //true
String s1 = new String(“abc”); //记录堆里面的地址值 String s2 = “abc”;//记录串池中的地址值
System.out.printIn(s1 == s2); //false
String s1 = sc.next();//底层实际上是new出来的值 String s2 = “abc”; //System.out.printIn(str1 ==
str2);//false
②boolean equals方法(要比较的字符串)——完全一样结果才是true,否则为false
boolean equalslgnoreCase(要比较的字符串)——忽略大小写的比较
5.String的遍历 idea快捷方式:字符串名.length().fori
public char charAt(int index): 根据索引返回字符 public int length(): 返回此字符串的长度//这里的
length是方法 数组的长度:数组名.length//这里的length是一个属性不用加()
6.String的其他方法
String substring(int beginIndex, int endIndex)截取 String substring(int beginIndex) 截取到末尾
注意点:包头不包尾,包左不包右,只有返回值才是截取的小串

String replace(元值,新值) 替换;String trim()去除字符串两边空白符;String toUpperCase():将当前
字符串中的英文部分给转换为全大写;String toLowerCase():将当前字符串中的英文部分给转换为全
小写;boolean startsWith(String s):判断当前字符串是否是以给定的字符串(s)开头的;boolean
endsWith(String s):判断当前字符串是否是以给定的字符串(s)结束的;int indexOf(String s,int x)检
索s在str中第1次出现的位置,从x开始找;int lastIndexOf(String s)检索s在str中最后一次出现的位
置;static String valueof(数据类型 a):将其它数据类型转换为string; 注意点:只有返回值才是替换之后
的结果; (正则表达式中还有三个相关方法)
7.StringBuilder
StringBuilder 可以看成是一个容器,创建之后里面的内容是可变的 作用:提高字符串的操作效率
使用StringBuilder的场景:1.字符串的拼接2.字符串的反转
①StringBuilder的构造方法
public StringBuilder()创建一个空白可变字符串对象,不含有任何内容 public StringBuilder(String
str) 根据字符串的内容,来创建可变字符串对象
②StringBuilder常用方法
public StringBuilder append (任意类型) 添加数据,并返回对象本身
public StringBuilder replace(int a,int b,String str) 替换部分内容(包左不包右)
public StringBuilder delete(int a,int b) 删除部分内容(包左不包右)
public StringBuilder insert(int a,任意类型) 在下标a的位置插入数据
public StringBuilder reverse() 反转容器中的内容
public int length() 返回长度(字符出现的个数)
public String toString() 通过toString0就可以实现把StringBuilder转换为String
③打印
StringBuilder sb=new StringBuilder(); System.out.println(sb); //输出空值 不是地址值
因为StringBuilder是Java已经写好的类,java在底层对他做了一些特殊处理,打印对象不是地址值而
是属性值。(具体操作看十二.4.①重写toString)
StringBuilder sb=new StringBuilder(”哈哈哈"); System.out.println(sb); //输出哈哈哈
扩展:链式编程:当我们在调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法
列如:int len = getString().substring(1),replace( target: “A”, replacement: “o”).length();
8.StringJoiner
Stringjoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的
作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用,JDK8出现的
①StringJoiner的构造方法
public StringJoiner (间隔符号) 创建一个StringJoiner对象,指定拼接时的间隔符号
public StringJoiner (间隔符号,开始符号,结束符号) 创建一个StringJoiner对象,指定拼接时的间隔
符号开始符号、结束符号

StringJoiner sj=new StringJoiner(“—”,“[”,“e”); sj.add(“aaa”).add(“bbb”).add(“123”);
System.out.println(sj);//输出:[aaa—bbb—123e
②StringJoiner 的成员方法
public StringJoiner add (添加的内容) 添加数据,并返回对象本身
public int length() 返回长度( 字符出现的个数)
public String toString() 返回一个字符串(该字符串就是拼接之后的结果)
9.字符串相关的底层原理
原理1:字符串存储的内存原理 原理2::==号比较的到底是什么? 1.2上面有
原理3:字符串拼接的底层原理 建议:拼接字符串用StringBuilder或StringJoiner,不要直接+
没有变量参与:String s=“a”+“b”+“c” 触发字符串的优化机制,在编译成class文件后,就已经是最终
的结果abc了,会复用串池中的字符串.
有变量参与:String s1=“a”;String s2=s1+“b”; 分两种:
jdk8之前:系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接拼接后,
再调用其toString方法转换为String类型,而tostring方法的底层是直接new了一个字符串对象。——
s2=new StringBuilder().append(s1).append(“b”).toString(); //每有一个变量参与就会创建一次
jdk8之后:系统会预估要字符串拼接之后的总大小,把要拼接的内容都放在数组中,此时也是产生一
个新的字符串。
如果很多字符串变量拼接,不要直接+,在底层会创建多个对象,浪费时间,浪费性能.
原理4: StringBuilder提高效率原理图
所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存
原理5: StringBuilder源码分析 //容量: 最多装多少 //长度: 已经装了多少
默认创建一个长度为16的字节数组,添加的内容长度小于16,直接存,添加的内容大于16会扩容(原来
的容量*2+2),如果扩容之后还不够,以实际长度为准
十.集合
用来存储数据,数组一旦定义后就是一个长度无法改变的容器,集合是一个会自动扩容的容器,刚开始
长度为0(具体看十三.4.①)
1.集合存储数据类型的特点
可以直接存引用数据类型,存基本数据类型要将其变为对应的包装类,再存入集合
基本数据类型对应的包装类:将首字母大写即可,两个例外:int——integer,char——character
2.集合和数组的对比
长度:数组长度固定;集合长度可变。 存储类型:数组基本和引用数据类型均可;集合引用可,基本要
变为对应的包装类
3.ArrayList 泛型:限定集合中存储数据的类型
①创建集合对象: ArrayList<泛型> list=new ArrayList<>();
ArrayList al=new ArrayList<>(); System.out.println(al);//输出:[]

ArrayList是iava已经写好的一个类,这个类在底层做了一些处理,打印对象不是地址值,而是集合中
存储数据内容,/在展示的时候会拿[]把所有的数据进行包裹(具体操作看十二.4.①重写toString)
②成员方法
十一.OO进阶
1.static——静态,是Java中的一个修饰符,可以修饰成员方法,成员变量
被static修饰的成员变量,叫做静态变量:特点:被该类所有对象共享;不属于对象(成员变量属于对
象),属于类 调用方式:类名调用 (推荐);对象名调用
被static修饰的成员方法,叫做静态方法:特点:多用在测试类和工具类中,Javabean类中很少会用
调用方式:类名调用 (推荐);对象名调用
静态变量是随着类的加载而加载的,优先于对象出现的,非静态,跟对象有关的
注意:静态方法中,只能访问静态。非静态方法可以访问所有。静态方法中没有this关键字(非静态的
方法有一个隐藏的this,由虚拟机将方法调用者地址值赋值给this,所以能调用同一类中的属性或方
法)静态变量定义后是可以调用再次修改的,静态方法可以重载但不能重写。
强行调用show()方法 没有调用show()方法的对象。何时用: 所有对象所共的数据(图片、音频、视频等)
2.工具类——帮助我们做一些事情的,但是不描述任何事物的类
类名见名知意 私有化构造方法:因为只需要帮助做事情,所以不用创建对象 方法定义为静态:方便调

3.重新认识main方法
public:被JVM调用,访问权限足够大 static:被JVM调用,不用创建对象,直接类名访问因为main方法
是静态的,所以测试类中其他方法也需要是静态的 void:被JVM调用,不需要给JVM返回值 main:一个
通用的名称,虽然不是关键字,但是被JVM识别 String[] args(字符串数组,数组名 args):以前用于接
收键盘录入数据的,现在没用
4.继承
java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起继承关系,
public class Student extends Person {},Student称为子类 (派生类),Person称为父类(基类或超
类)。
①好处:可以把多个子类中重复的代码抽取到父类中了,提高代码的复用性子类可以在父类的基础
上,增加其他的功能,使子类更强大。
②什么时候用继承:当类与类之间,存在相同(共性)的内容,并满足子类是父类中的一种,就可以
考虑使用继承,来优化代码
③特点:java只支持单继承,不支持多继承,但支持多层继承;每一个类都直接或者间接的继承于
object(没有继承关系的类,虚拟机会加一个默认的继承关系);
私有的成员变量能被继承下来,但不能直接使用;
父类会创建一个虚方法表将非private,非static,非final的方法放入其中,再继承给子类

④继承中成员变量和成员方法访问特点: 就近原则:先在局部位置找,本类成员位置找,父类成员位置
找,逐级往上。
如果出现了重名的成员变量怎么办?this调用: 就近原则。super调用: 代表父类的存储空间,直接找父
类。System.out.println(name);System.out.println(this.name);System.out.printIn(super .name);
⑤继承中构造方法的访问特点:父类中的构造方法不会被子类继承,但是可以通过super调用;子类中
所有的构造方法默认先访问父类中的无参构造,再执行自己(子类在初始化的时候,有可能会使用到
父类中的数据,如果有,赋值后再继承过去,如果父类没有完成初始化,子类将无法使用父类的数
据)。
怎么调用父类构造方法的? 子类构造方法的第一行语句默认都是: super()//调用父类构造方法,不写也
存在,且必须在第一行;如果想调用父类有参构造,必须手动写super进行调用。
⑥方法的重写——当父类的方法不能满足子类现在的需求时,需要进行方法重写
书写格式:在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方
法。
@Override重写注解——@Override是放在重写后的方法上,校验子类重写时语法是否正确,加上注
解后如果有红色波浪线,表示语法错误,建议重写方法都加@Override注解,代码安全,优雅。
基本类型返回值必须相同,引用类型有大小,父大子小;方法重写的本质——覆盖虚方法表中的方法
5.多态——对象的多种形态
①使用多态的前提条件:有继承/实现关系;有父类引用指向子类对象(父类类型 对象名称 = 子类对
象);有方法的重写
②好处:使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。
弊端:不能调用子类的特有功能(报错原因看③调用成员方法)解决方案:变回子类类型就可以了//细
节:强转换的时候不能瞎转,如果转成其他类的类型,就会报错//转换的时候用instanceof关键字进行
判断
a instanceof Dog d//先判断a是否为Dog类型,如果是,则强转成Dog类型,转换之后变量名为d//
如果不是,则不强转,结果直接是false
③多态调用成员的特点:
调用成员变量:编译看左边,运行也看左边
编译看左边:javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有
编译失败。运行也看左边: java运行代码的时候,实际获取的就是左边父类中成员变量的值
调用成员方法:编译看左边,运行看右边
编译看左边:iavac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有
编译失败。运行看右边: java运行代码的时候,实际上运行的是子类中的方法。
理解:Animal a = new Dog();//现在用a去调用变量和方法//而a是Anima1类型的,所以默认都会从
animal的这个类中去找//成员变量:在子类的对象中,会把父类的成员变量也继承下的。父: name 子:
name//成员方法:如果子类对方法进行了重写,那么在虚方法表中是会把父类的方法进行覆盖的。
6.包

包就是文件夹。用来管理各种不同功能的java类,方便后期代码维护
①包名的书写规则: 公司域名反写+包的作用,需要全部英文小写,见名知意。 com.itheima.domain
②使用其他类的规则(import)
使用同一个包中的类时,不需要导包。使用java.lang包中的类时,不需要导包。其他情况都需要导
包。如果同时使用两个包中的同名类,需要用全类名(包名+类名,例如:
com.itheima.domain.teacher())
7.final关键字(最终)
final修饰方法:表明该方法是最终方法,不能被重写。final修饰类:表明该类是最终类,不能被继承。
final修饰变量:叫做常量,只能被赋值一次
①常量——实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性,常和static一起使用
(static final)
常量的命名规范:单个单词:全部大写。多个单词:全部大写,单词之间用下划线隔开 ctrl+shift+u变换大
小写
细节:final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。final修饰的变量是引用类型:
那么变量存储的地址值不能发生改变,对象内部的可以改变。核心:常量记录的数据是不能发生改变的
public static int num = 5;//静态变量;System.out.println(Ioo.num) //执行的操作:先加载Ioo.class
到方法区中,静态变量num一并存储在静态区中,再到方法区中获取num的值并输出
public static final int COUNT = 5; //常量(静态常量)System.out.println(Ioo.COUNT);编译器在编译
时会将常量直接替换为具体的值,效率高
1)修饰成员变量时,只能声明同时初始化或在构造方法中初始化
2)修饰局部变量时,只要在用之前初始化即可
8.权限修饰符——用来控制一个成员能够被访问的范围的,可以修饰成员变量(局部变量不行),方
法,构造方法,内部类
实际开发中,一般只用private和public,成员变量私有,方法公开
特例:如果方法中的代码是抽取其他方法中共性代码。这个方法一般也私有。
9.代码块
局部代码块、构造代码块、
静态代码块:格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次
使用场景:在类加载的时候,做一些数据初始化的时候使用
给实例变量初始化建议写在构造方法中,给静态变量初始化建议写在静态块中。如果将静态变量放构
造方法就会每new一个对象,就会读取一次,特别影响性能,放静态块中,无论new多少次,只读取
一次
10.抽象方法和抽象类
抽象方法:将共性的行为(方法) 抽取到父类之后,由于每一个子类执行的内容是不一样所以,在父类
中不能确定具体的方法体该方法就可以定义为抽象方法。强制让子类按照某种格式重写

抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类
①定义格式
抽象方法:public abstract 返回值类型 方法名(参数列表);//没有方法体
抽象类:public abstract class 类名{}
②注意
抽象类不能创建对象(实例化);可以有构造方法(作用:子类对象创建时,给抽象父类属性赋值
的。过程:看继承4.⑤);抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类;抽象类的子
类,要么重写抽象类中的所有抽象方法,要么是抽象类
③抽象用于规范代码的,防止子类共性方法名多难以调用,直接看父类的就可以了
11.接口
①定义和使用
关键字interface定义:public interface 接口名 {}
使用:接口和类之间是实现关系,通过implements关键字表示public class 类名implements 接口名
{}
②注意
接口不能实例化;接口的子类(实现类),要么重写接口中的所有抽象方法,要么是抽象类;接口和类的
实现关系,可以单实现,也可以多实现:public class 类名 implements 接口名1,接口名2{};实现类
还可以在继承一个类的同时实现多个接口:public class 类名 extends 父类implements 接口名1,接
口名2;
③成员的特点
成员变量:只能是常量 默认修饰符:public static final。
构造方法:没有构造方法
成员方法:只能是抽象方法 默认修饰符:public abstract
④接口和类之间的关系 多个接口中有重名的方法,重写一个即可
类和类的关系:继承关系,只能单继承,不能多继承,但是可以多层继承
类和接口的关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口和接口的关系:继承关系,可以单继承,也可以多继承
⑤接口新增方法
JDK7以前: 接口中只能定义抽象方法;
JDK8的新特性:接口中可以定义有方法体的方法(用于接口升级时,防止强制性重写,不重写也可以使
用接口中默认方法)
允许在接口中定义默认方法还有静态方法,需要使用关键字 default、static修饰 作用: 解决接口升
级的问题
接口中默认方法和静态方法的定义格式
格式: public default 返回值类型 方法名(参数列表){} 范例: public default void show(){}
格式: public static 返回值类型 方法名(参数列表)[ } 范例: public static void show(){ }

接口中默认方法的注意事项
默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字
定义时default不能省略,定义static不能省略
如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
静态方法只能通过接口名调用,不能通过实现类名或者对象名调用,static方法不用且不能重写
JDK9的新特性:接口中可以定义私有方法 (用于JDK8中,默认方法和静态方法里重复的代码抽取出
来,又不想给外界提供)
接口中私有方法的定义格式
格式1:private 返回值类型方法名(参数列表){} 范例1: private void show(){}
格式2:private static 返回值类型方法名(参数列表){} 范例2: private static void method(){}
⑥接口的应用
接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了
当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态,遵循多态
的调用特点
⑦适配器设计模式:解决接口与接口实现类之的矛盾问题
设计模式就是解决各种问题的套路
当一个接口中抽象方法过多,但是我只要使用其中一部分的时候,就可以适配器设计模式
书写步骤:编写中间类XXXAdapter,实现对应的接口对接口中的抽象方法进行空实现,让真正的实现
类继承中间类,并重写需要用的方法,为了避免其他类创建适配器类的对象,中间的适配器类用
abstract进行修饰
12.内部类
类的五大成员:属性、方法、构造方法、代码块、内部类(分:成员内部类,静态内部类,局部内部
类,匿名内部类)
内部类的访问特点:内部类可以直接访问外部类的成员,包括私有;外部类要访问内部类的成员,必
须创建对象,内部类是有字节码文件的
什么时候用到内部类:B类表示的事物是A类的一部分,且B单独存在没有意义,比如: 汽车的发动机,
ArrayList的迭代器,人的心脏等等
①成员内部类——写在成员位置,属于外部类的成员
注意:成员内部类可以被一些修饰符所修饰,比如: private,默认,protected,public,static等。
在成员内部类里面,JDK16之前不能定义静态变量,JDK 16开始才可以定义静态变量。
获取成员内部类对象:
方法一:在外部类中编写方法,对外提供内部类的对象(用于private修饰时)
package OOday01; package OOday01;
public class Outer { public class test {
String name; public static void main(String[] args) {
private class Inter { static int a = 10;} Outer o=new Outer();

public Inter getInstance() { return new Inter(); } } System.out.println(o.getInstance()); }}
方法二:直接创建格式
格式:外部类名.内部类名 对象名=new 外部类对象.内部类对象;
范例: Outer.Inner oi = new Outer().new Inner(); 外部类对象(调用者,调用成员内部类对象)
外部类成员变量和内部类成员变量重名时,在内部类如何访问:外部类名.this.变量名
②静态内部类(是一种特殊的成员内部类 )
静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的,需要创建对象。
获取静态内部类对象的格式:外部类名.内部类名 对象名=new 外部类名.内部类名();
调用静态内部类中非静态方法的格式:先创建对象,用对象调用
调用静态内部类中静态方法的格式:外部类名.内部类名.方法名(); (也可用对象名调用)
③局部内部类 (没用)
1.将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量
2.外界是无法直接使用,需要在方法内部创建对象并使用。
3.该类可以直接访问外部类的成员,也可以访问方法内的局部变量
④匿名内部类(本质就是隐藏了名字的内部类,可以写在成员位置,也可以写在局部位置)
格式: new 被继承的类名或者接口名(){ 重写方法;};(其中包含三部分:继承\实现,方法重写,创
建对象) 整体就是一个类的子类对象或者接口的实现类对象
使用场景
当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,如果实现类只要使用
一次,就可以用匿名内部类简化代码
注意: 匿名内部类中不能修饰外面局部变量的值,因为在此处该变量会默认为final的
十二.常用API
1.Math——帮助我们用于进行数学计算的工具类(私有化构造方法,所有的方法都是静态的)
public static int abs(int a)/absExact(inta) 获取参数绝对值
public static double ceil(double a)/floor(double a) 向上/下取整
public static int round(float a) 四舍五入
public static int max(int a,int b)/min(int a,int b) 获取两个int值中的较大/小值
public static double pow(double a,double b) 返回a的b次幂的值
public static double sqrt(double a)/cbrt(double a) 返回a的平方根/立方根
public static double random() 返回值为double的随机值,范围[0.0,1.0)
2.System——工具类,提供了一些与系统相关的方法
public static void exit(int status) 终止当前运行的 java 虚拟机 //0: 表示当前虚拟机是正常停止 //非
0: 表示当前虚拟机异常停止
public static long currentTimeMillis() 返回当前系统的时间毫秒值形式 从UTC时间开始计算

public static void arraycopy(数据源数组,起始索引,目的地数组,起始索引,拷贝个数) 数组拷贝
(五.3有用过)
3.Runtime——表示当前虚拟机的运行环境
public static Runtime getRuntime() 当前系统的运行环境对象
public void exit(int status) 停止虚拟机
public int availableProcessors() 获得CPU的线程数
public long maxMemory()/totalMemory()/freeMemory() JVM能/以及/剩余从系统中获取总内存
大小 (单位byte)
public Process exec(string command) 运行cmd命令 shutdown : 关机 //加上参数才能执行//-s : 默
认在1分钟之后关机//-s -t 指定时间 :指定关机时间//-a : 取消关机操作//-r: 关机并重启 例如:
Runtime.getRuntime().exec(“notepad”)
4.Object——Object是Java中的顶级父类。所有的类都直接或间接的继承于Object类
顶级父类中只有无参的构造方法,所以子类的构造方法都是默认访问父类的无参构造
①public String toString() 返回对象的字符串表示形式
关于为什么重写toString()方法:
System.out.println(stu)//输出地址 System:类名 out: 静态常量 System.out:获取打印的对象
printIn():方法 参数: 表示打印的内容
println核心逻辑:当我们打印一个对象的时候,底层会调用对象的tostring方法,把对象变成字符串,
然后再打印在控制台上,打印完毕换行处理,输出地址值。
思考: 默认情况下,因为object类中的tostring方法返回的是地址值,所以,默认情况下,打印一个对
象打印的就是地址值,但是地址值对于我们是没什么意义的?我想要看到对象内部的属性值?(String、
StringBuilder、StringJoiner、ArrayList<>等相关方法Java都已经重写了toString方法,使用输出的
是属性值)
处理方案: 重写父类object类中的tostring方法
例如: class Student{public String toString(){ return name+“,”+age; } } class test{ m{
System.out.println(stu)}}//输出的就是属性值,如:张三,18、
toString方法的结论:如果我们打印一个对象,想要看到属性值的话,那么就重写tostring方法就可以
了,在重写的方法中,把对象的属性值进行拼接。
②public boolean euals(object obj) 比较两个对象是否相等 重写equals()的基本原则:原则上要比较
两个对象的属性值是否相同,两个对象必须是同一类型的,若类型不同则返回false
结论:比较对象时,如果没有重写equals方法,那么默认使用object中的方法进行比较,比较的是地址
值是否相等,一般来讲地址值对于我们意义不大,所以我们会重写,重写之后比较的就是对象内部的
属性值了。(String里面的equals方式是Java已经重写过的,只能比较两个字符串之间是否相等,例
如用String a="abc"比较b=new StringBuilder(“abc”),a.equals(b)直接返回false,用的是String里的
equals,底层先比较是不是同一个对象,不是,再比较双方是不是字符串,是再比较内部属性,
StriingBuilde中没有重写equals,默认使用Object中的)(重写equals方法直接在对应的类中用
ALT+insert生成)

③protected Object clone(int a)(浅克隆) 对象克隆——把A对象的属性值完全拷贝给B对象,也叫
对象拷贝,对象复制
浅克隆:不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来
深克隆:基本数据类型拷贝过来,字符串复用,引用数据类型会重新创建新的
6.正则表达式——(可在API文档里面搜pattern找相关用途)
①boolean matchs(String regex)判断是否满足正则表达式(regex)
写正则表达式时,拿着一个正确的数据,从左到右依次去写。(用插件any-rule可以直接生成想要的正
则表达式,生成后把前面的^和后面的 删除 , 表 示从开头开始匹配, 删除,^表示从开头开始匹配, 删除,示从开头开始匹配,表示一直比配到末尾,matchs()
方法默认从头匹到尾,然后在生成的表达式里加一个\,JAVA中默认两个\等于一个,一个\是转义字
符,生成的注意修改成自己想要的);
例如:验证手机号码:String regex1=“1[3-9]\d{9}”;//第一部分: 1 表示手机号码只能以1开头//第二
部分: [3-9] 表示手机号码第二位只能是3-9之间的//第三部分: \d{9} 表示任意数字可以出现9次,也只
能出现9
②String replaceAll(String regex,String s):替换将当前字符串中满足正则表达(regex)的部分给替换为
指定字符串(s)
String line=“123.456.789”;System.out.println(line.replaceAll(“\.”,“u”));//输出:123u456u789
③String[] split(String regex):拆分,将当前字符串中按照满足正则表达式(regex)的部分进行拆分,将
拆分出的以String[]形式返回
String line=“123.456.789”; System.out.println(Arrays.toString(line.split(“\.”)));//输出:[123,
456, 789] 用于将String数组转换为String进行输出
String line=“.123.456…78…9…”;System.out.println(Arrays.toString(line.split(“\.”)));//输出:[,
123, 456, , 78, , , 9]
//最开始就是可拆分项(.),那么数组第1个元素为空符串//如果连续两个(两个以上) 可拆分项,那么中
间也会拆出一个空字符串//如果末尾连续多个可拆分项,那么拆出的空字符串被忽略
7.包装类
①java定义了8个包装类,目的就是为了解决基本数据类型不能直接参与面向对象开发的问题,使基本
类型可以通过包装类的形式存在
包括:Byte、Short、Integer、Long、Boolean、Float、Double、Character,其中Character和
Boolean是直接继承自Object的,其余6个包装类继承自Number类,其中都重写了equals方法,
(Integer.value0f()会复用-128到127范围内的数据— 使用valueof() 更多一些),integer用的最多
获取Integer对象的方式 (了解)
public Integer(int value) /(String s) 根据传递的整数/字符串创建一个Integer对象
public static Integer valueof(int i)/(String s)/(String s,int radix) 根据传递的整数/字符串/字符
串和进制创建一个Integer对象
②JDK1.5推出了一个新特性: 自动拆装箱。当编译器编译时若发现是基本类型与包装类型之间相互赋
值,则自动补齐代码完成转换工作,这个过程称为自动拆装箱。

③包装类常用操作
public static String toBinaryString / toOctalString / toHexString(int i) 得到二/八/十六进制
可以通过包装类来获取基本类型的取值范围(用法:相关类型 变量名=相关类型包装
类.MAX_VALUE/MIN_VALUE)。
包装类可以将字符串类型转换为对应的基本类型(方法: public static int parselnt(String s))
十三.集合进阶
1.集合体系结构
Collection(单列集合:添加数据时,每次只能添加一个元素):Collection是单列集合的祖宗接口,它
的功能是全部单列集合都可以继承使用的。
Map(双列集合:添加数据时,每次添加一对数据)(在Java下,六.集合进阶)
2.Collection集合
①Collection常用方法:
public boolean add(E e) / addAll(集合) 把给定的对象添加到当前集合中 / 把给定的集合全部添加到
当前集合中
public void clear()清空集合中所有的元素
public boolean remove(E e)把给定的对象在当前集合中删除
public boolean contains(object obj)判断当前集合中是否包含给定的对象
public boolean isEmpty()判断当前集合是否为空
public int size()返回集合中元素的个数/集合的长度 public boolean retainAll/removeAll(object
obj) 取/删交集
注意点:Collection是一个接口,我们不能直接创建他的对象。所以,现在我们学习他的方法时,只能创
建他实现类的对象。例如:Collection coll = new ArrayList<>();
添加元素:细节1:如果我们要往List系列集合中添加数据,那么方法永远返回true,因为List系列的是
允许元素重复的;细节2:如果我们要往Set系列集合中添加数据,如果当前要添加元素不存在,方法返
回true,表示添加成功。如果当前要添加的元素已经存在,方法返回false,表示添加失败。
删除:细节1:因为Collection里面定义的是共性的方法,所以此时不能通过索引进行删除。只能通过元
素的对象进行删除。细节2: 方法会有一个布尔类型的返回值,删除成功返回true,删除失败返回false
判断元素是否包含:细节: 底层是依赖equals方法进行判断是否存在的,但是如果存的是自定义对象,
没有重写equas方法(自定义对象的toString方法也没有重写),那么默认使用object类中的equals方
法进行判断,所以,如果集合中存储的是自定义对象,也想通过contains方法来判断是否包含,那么
在javabean类中,一定要重写equals方法。
②Collection的遍历方式(迭代器遍历、增强for遍历、Lambda表达式遍历):没有普通for遍历是因
为不能通用于set系列集合
Ⅰ 迭代器遍历(迭代器不依赖索引,迭代器在java中的类是lterator,迭代器是集合专用的遍历方式)
Collection集合获取迭代器:Iterator iterator() 返回迭代器对象,默认指向当前集合的0索引。

lterator中的常用方法:boolean hasNext() 判断当前位置是否有元素,有元素返回true,没有元素返
回false;E next()获取当前位置的元素,并将迭代器对象移向下一个位置,使用next()方法时,迭代器
才移动一次位置;void remove()从选代器指向的 collection 中移除选代器返回的最后一个元素
注意:迭代器创建的时候,指针默认指向第一个元素;迭代器遍历完毕,指针不会复位;循环中只
能用一次next方法;迭代器遍历时,不能用集合的方法进行增加或者删除,添加没有办法,可以用迭
代器提供的remove方法进行删除。
Ⅱ 增强for遍历
它是JDK5之后出现的,其内部原理就是一个iterator迭代器,为了简化迭代器的代码书写的,所有的单
列集合和数组才能用增强for进行遍历
格式:for (元素的数据类型 变量名 : 数组或者集合){sout(变量名);}
注意点:变量名其实就是一个第三方变量,在循环的过程中依次表示集合中的每一个数据;修改增
强for中的变量,不会改变集合中原本的数据
Ⅲ Lambda表达式遍历:(参数列表)->{方法体} 用forEach()方法
得益于JDK8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式
注意:不是任何时候匿名内部类都可以换成lambda,仅当实现的接口中只有一个抽象方法时可以使用。
如果方法体只有一句代码,方法体的"{}"可以忽略不写,如果这句话含有return关键字那么也要一同忽
略,如果方法的参数只有1个,那么”()"可以忽略不写
三种通用的遍历方式的选择:在遍历的过程中需要删除元素,使用迭代器,仅仅想遍历,那么使用增
强for或Lambda表达式。
3.List集合
①List集合的特有方法
Collection的方法List都继承了。
List集合因为有索,所以多了很多索引操作的方法:
void add(int index,E element) 在此集合中的指定位置插入指定的元素 细节:原来索引上的元素会
依次往后移
E remove(int index) 删除指定索引处的元素,返回被删除的元素 细节:如果方法出现了重载现
象,优先调用,实参跟形参类型一致的那个方法。
E set(int index,Eelement) 修改指定索引处的元素,返回被修改的元素
E get(int index) 返回指定索引处的元素
E subList(int from,int toIndex) 截取成子集,修改子集内容,原集也会改变,相当于子集与原集
是指向同一个引用。原集合增删之后,子集将不能再进行任何操作了,若操作则发生并发修改异常,
需要重新获取子集
注意点:List和Collection都是接口,所以只能创建他实现类对象:List list=new
ArrayList<>();

②list集合的遍历方式(迭代器遍历、增强for遍历、Lambda表达式遍历、列表迭代器遍历、普通for
循环 (因为List集合存在索引))
Ⅰ 前三种和Collection一模一样,普通for(size方法跟get方法还有循环结合的方式,利用索引获取到
集合中的每一个元素)
Ⅱ 列表迭代器遍历
五种遍历方式的选择:在遍历的过程中需要删除元素,请使用迭代器,在遍历的过程中需要添加元
素,请使用列表迭代器,仅仅想遍历,那么使用增强for或Lambda表达式,如果遍历的时候想操作索
引,可以用普通for
4.ArrayList集合(ArrayList底层是数组结构的,查询性能更好(直接下标查找物理地址)、增删性能不太
好)
底层原理:
Ⅰ利用空参创建的集合,在底层创建一个默认长度为0的数组
Ⅱ添加第一个元素时,底层会创建一个新的长度为10的数组
Ⅲ存满时,会扩容1.5倍(创建新的一个数组,将之前的值赋值过去)
Ⅳ如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准
5.LinkedList集合(底层数据结构是双链表,查询慢(因为只知道首尾,只能根据前者找下一个),增删
快,但是如果操作的是首尾元素,速度也是极快的)
链表里面的元素分为三个部分:头接点(存前一个元素的地址)、元素、尾接点(存后一个元素的地址),
然后再像火车车厢那样依次连接起来
常用方法和ArrayList一样,只是底层存储不同
public void addFirst / addLast(E e) 在该列表开头插入指定的元素 / 将指定的元素追加到此列表的末

public E getFirst / getLast() 返回此列表中的第/最后一个元素
public E removeFirst / removeLast() 从此列表中删除并返回第/最后一个元素
6.数组与集合的转换
数组转换为集合:集合=Arrays.asList(包装类名) ;底层指向的同一个引用,改变一方另一方也会
改变,只能修改数值大小,不能增减数值多少,因为数组是不可变的
集合转换位数组:包装类 数组名=集合名.toArray(new 包装类[大小]);若参数数组元素个数==集
合元素个数,那就正常转换,若参数数组元素个数<集合元素个数,那也正常转换(按照集合大小给数
组),若参数数组元素个数集合元素个数,那也正常转换,同时在末尾补默认值。
7.List集合的排序
Collections.sort(List list)方法: 可以对list集合进行自然排序(从小到大),但是其要求List集合中的元素
必须是可比较的,若元素不可比较则直接发生编译错误。判断是否可以比较的标准为元素是否实现了
Comparable接口。在实际开发中,我们一般是不会让我们自己定义的类去实现Comparable接口的,
因为这对我们的程序有侵入性。数值比大小,英文字符串和中文比首字母ASCII码大小,若首字母相
同,则比较第2个字符,Javabean类自定义比较方法

侵入性: 当我们调用某个API功能时,其要求我们为其修改其它额外的代码,这个现象就叫做侵入性。
侵入性越强则越不利于程序的后期维护,应避免。
建议:使用重载的Collections.sort(List list, Comparator c)方法,可以通过Comparator来自定义比
较规则(通过内部类实现),内部比较Java已经写好
Collections.reverse(List list)方法:可以将list集合进行反转(元素位置已经变了) JDK1.8,List集合自
身提供了sort()方法进行排序,用法一样;
8.set集合——想去重,就用set集合
List list=new ArrayList<>(); list.add(“one”);list.add(“two”);
list.add(“three”);list.add(“one”); Set set=new HashSet<>(); set.addAll(list);//自动去重

一.Java入门
1.关于CMD常见命令
盘符切换:盘符名称+冒号 查看当前路径的内容:dir 进入目录:cd 目录 回退上一级目录:cd … 进入
多级目录:cd 目录1\目录2 回退到盘符目录:cd \ 清屏:cls 推出cmd:exit
2.环境变量
想要在任何目录下都可以打开指定软件,就可以把软件的路径配置到环境变量里
3.JDK里的目录 JDK分为过渡版本和长期支持版本(LTS)
bin:该路径下存放了各种工具 conf:该路径下存放了相关配置文件 include:该路径下存放了一些平
台特定的头文件
jmods:该路径下存放了各种模块 legal:该路径下存放了个模块的授权文件 lib:该路径下存放了工
具的一些补充jar包
4.JAVA
JavaSE:Java语言的(标准版),用于桌面应用的开发,是其他两个版本的基础
JavaME:Java语言的(小型版),用于嵌入式电子设备或者小型移动设备,列入电视剧 微波炉等,以凉
JavaEE:Java语言的(企业版),用于web方向的网站开发
Java的主要特性:面向对象() 安全性 多线程(同时做多件事) 简单易用 开源(代码公开) 跨平台(通过虚拟
机实现)
5.JDK和JRE
JVM(Java Virtual Machine):Java虚拟机,真正运行Java程序的地方
JRE(Java Runtime Environment):Java的运行环境,包括:JVM、核心类库、运行工具
JDK(Java Development Kit):Java开发工具包,包括:JVM、核心类库(Java写好的东西,可以直接
用)、开发工具[ javac(编译),java(运行),jdb(调试)]
Java编译成class文件,然后在虚拟机上运行,就不需要再开发,所以JDK里面一些工具可以不需要,
为了节省空间所以就有了JRE
包含关系:JDK包含JRE、JRE包含JVM
二.Java基础概念
1.注释 //是单行注释 /* /是多行注释 /* */是文档注释
2.关键字 被Java赋予了特定含义的英语单词
关键字特点:关键字的字母都是小写、在常见编译器中有不同的颜色标记
3.字面量 告诉程序员数据在程序中的书写格式
字面量类型:整数 小数 字符串(" ") 字符(’ ‘) 布尔 空(null不能直接打印,要用字符串的形式进行打印)
特殊字面量:’\t’(制表符,在打印的时候,把前面字符串的长度补齐到8,或者是8的倍数。最少补1个
空格,最多补8个空格)
4.计算机的存储规则
文本(数字、字母、汉字)均以二进制存储,字母和汉字对应各码表里的值再转化为二进制,存在电
脑里,不同进制在代码中的表现

二进制:由0和1组成,代码中以0b开头 十进制:0~9,不加任何前缀
八进制:由0~7组成,代码中以0开头 十六进制:由09还有af组成,代码中以0x开头
(用二进制的由来,以前计算机看图灵纸孔,无孔1有孔0,现在计算机看电压大小,大于3.3v的为1,
小于为0,这样只用表示两个状态,轻松些)
image图片,采用光学三原色存储(红,绿,蓝),可以写成十进制或者十六进制表达式
(255,255,255) (FFFFFF),每个像素就是一块三原色组合
sound声音,对应波形图,波形图每一个点有一个数字对应
5.数据类型 分基本数据类型和引用数据类型
基本数据类型
如果要定义一个long类型的变量,要在数据值的后面加上一个L作为后缀,L可以大写或小写,建议大
写,float要加F做后缀。运算时,若可能溢出,建议在第一个数后加L。(Biginteger类型 存数大小没有
限制)。浮点类型不能精确表示数据,运算时有可能会发生舍入误差,精确场合不能用。(BigDecimal
类型 用于存小数,基本上没有误差)。char采用Unicode编码格式,一个字符对应一个码,表现的形式
是字符char,但本质是码int(ASCII a=97 A=65 0=48)
整数和小数的取值范围大小关系:double>float>long>int>short>byte。
6.标识符
命名规则:由字母、数字、下划线、美元符号($)组成,不能数字开头,不能是关键字,区分大小写
7.输入基本类型数据
用Scanner类创建一个对象 Scanner reader=new Sacanner(System.in);
然后reader对象就可以调用下列方法,读取用户在命令行输入的各种基本类型数据:
第一套体系:nextByte()、nextShort()、nextInt()、nextLong()、nextFloat()、nextDouble()、
nextBoolean()、next() 遇到空格,制表符,回车就停止接受。这些符号后面的数据就不会接受了
第二套体系: nextLine();接收字符串 可以接收空格,制表符,遇到回车才停止接受数据
键盘录入的两套体系不能混用的 弊端:先用nextInt,再用nextLine会导致下面的nextLine接受不到数

三.运算符和表达式
对字面量或者变量进行操作的符号 用运算符把字面量或变量连接起来符合Java语法的句子称为表达式
1.算术运算符(+ - * / %)
在代码中,如果由小数参与计算,结果有可能不准确 (之后补充为什么有这种现象)。
(1) “+”操作的三种情况(数字相加、字符串相加、字符相加)
①数字相加:
数字进行运算时,数据类型不一样不能运算,需要转成一样的,才能运算 (强制类型转换或者隐式类型
转换)
隐式类型转换:小类型传给大类型(本质就是在要转换的数的二进制数前补上相应的0。例如byte的10
二进制为0000 1010转为short型就为 0000 0000 0000 1010)。byte short char三种类型的数据在

运算的时候,都会直接先提升为int,然后在进行运算。例如:byte a=10;byte b=20 byte c=(byte)
(a+b) a,b的类型被转为int型 所以要强转为byte 不然就报错
强制类型转换:大传小(本质就是删去0)。标数据类型 变量名=(目标数据类型) 被强转的的数据
②字符串相加:
当"+“操作中出现字符串时,这个”+“是宇符串连接符,而不是算术运算符了。会将前后的数据进行拼
接,井产生一个新的字符串
连续进行“+”操作时,从左到右逐个进行。例如:1+99+“np”+20+30 输入的是
“100np2030”
③字符相加:当字符进行“+”操作时,会先通过ASCII码表查询对应的数字再进行计算
注意看是单引号还是双引号
(2)“-” “” “/” “%”没啥,字符串只有“+”操作 2.自增自减运算符(“++” “–”)
3.赋值运算符("=、+=、-=、
=、/=、%=” ):+=、-=、=、/=、%= 底层都隐藏了一个强制类型
转换。例如:short s=1; s+=1;等于s=(short)(s+1);
4.关系/比较运算符(“==、!=、>、>=、<、<=”):结果都是Boolean型,要么true,要么false 5.逻
辑运算符(“& | ^ ! && ||”)
6.三元运算符(? 😃:关系表达式?表达式:表达式;
7.运算符优先级:
8.原码、反码、补码:-128无原码和反码,只有补码为1000000(补码还能多记录一个特殊的
值-128,因为补码是相当于错位来放反码的,-127为10000001,然后多出来的10000000就被定义
为-128,所以我们说一个字节的取值范围为-128到127)。计算机中的存储和计算都是以补码的形式
进行的
9.位运算符(“&逻辑与 |逻辑或 <<左移,低位补0 >>右移,高位补0或1 >>>无符号右移,高位补0”):
左移几次相当于一个数乘以2的n次方。列如:200左移两次等于200
2^2=800。右移就是除法
四.判断和循环
流程控制语句(顺序结构、分支结构、循环结构)
①.分支语句(if、switch):if注意点如果对一个boolean类型进行判断,不要用==号,直接把变量写在
小括号里
switch注意点:default的位置不一定是写在最下面的,我们也可以写在任意位置,只不过习惯会写在最下
面,写在别的位置时,要加上break;case穿透就是句子中没有break导致的,如果多个case语句的语句
体重复了,就可以用; switch新特性,只有jdk12及以后版本才有:case 条件,条件 -> {},这个可以
不用加break;switch括号内只能支持byte,short,int,char,String(jdk7),枚举(jdk5)
②.循环语句(for、while、do…while)
循环高级综合练习(无限循环、跳转控制语句):无限循环就是死循环for(;😉、while(true)、
do…while(true);跳转控制语句:continue、break;
若循环中if语句中有break就是跳出循环,switch中有break是跳出switch

嵌套循环:一般多行多列使用,常常外层控制行,内层控制列;建议:嵌套层数越少越好,一般只用
到两层,三层及少
五.数组
数组:引用数据类型,是一种容器,可以用来储存同种数据类型的多个值,定义了长度就不可变
1.数据的初始化
①静态初始化:
完整格式:数据类型[] 数组名=new 数据类型[]{元素1,元素2,元素3}; 简化格式:数据类型[] 数组名=
{元素1,元素2,元素3};
②动态初始化:
格式:数据类型[] 数组名=new 数据类型[数组长度];
数组名记载的是堆空间的地址值,所以输出数组名的时候输出的地址值
2.数组的内存图
只要是new出来的一定是在堆里面开辟了一个小空间,如果new了多次,那么在堆里面有多个小空
间,每个小空间中都有各自的数据
两个数组指向同一个空间的内存图:
当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次访问
的时候都是修改之后的结果了
扩展:解释一下地址值的格式含义例如:[D@776ec8df
[:表示当前是一个数组 D:表示当前数组里面的元素都是double类型的 @:表示一个间隔符号(固定
格式) 776ec8df:数组真正的地址值
扩展:idea提供的自动的快速生成数组的遍历方法=数据名.fori;快速生成主函数=m;快速生成输出
=sout;CTRL+Alt+L自动格式化代码;CTRL+Alt+M自动生成方法;CTRL+Shift+/ 快速注释 ;
alt+insert快速生成标准Javabean;先选中要生成循环或处理异常的代码,然后Ctrl+Alt+T快速生成
处理的方式
扩展:数组默认初始化的规律:整数类型的默认初始化为0;小数类型的默认初始化为0.0;字符类型
的默认初始化为’/u0000’ 空格;boolean类型的默认初始化为false;引用数据类型的默认初始化为
null;
3.数组的复制(java提供的)
方法(①更灵活) 输出b:0001234000
方法②(更简单)输出b:123
方法②的衍生——数组的扩容(创建一个更大的新的数组,并将源数组数据复制进去)
4.数组的排序 5.Arrays.toString()将数组转换为字符串输出

六.二维数组
当我们需要把数据分组管理的时候,就需要用到二维数组
1.二维数据的初始化
①静态初始化
完整格式:数据类型[][] 数组名=new 数据类型[][]{{元素1,元素2,元素3},{元素1,元素2,元素3}}; 简化格
式:数据类型[][] 数组名={{元素1,元素2,元素3},{元素1,元素2,元素3}};
②动态初始化:
数据类型[][] 数组名=new 数据类型[一维数组个数][一维数组中可以放多少个元素];
2.获取元素
arr[i][j]——arr: 二维数组 i: 二维数组的索引,获取出来的是里面的一维数组 j: 表示一维数组中的索
引,获取出来的就是真正的元素
System.out.printIn(arr[0]);表示获取二维数组中的第一个一维数组(输出的是地址值)
System.out.printIn(arr[0][0]);表示获取第一个一维数组中0索引的元素
3.二维数组的遍历
for (int i = 0; i < arr.length; i++) { 外循环:遍历二维数组,得到里面的每一个一维数组
for (int j = 0; j < arr[i].length; j++) { 内循环:遍历一维数组,得到里面的每一个元素 } }
4.二维数组的内存图
特殊情况二:当arr[1]=arr2;赋值完后,二维数组自动创建的0022和0033就会变为垃圾从内存消失
七.方法
封装一段特定的业务逻辑功能,可以重复利用,方法是程序中最小的执行单元,方法提高代码的可维
护性,减少代码重复
1.方法的格式
修饰词 返回值类型 方法名(参数){方法体; return 返回值 } 只要到return就是直接结束方法
有参可以使方法更灵活
形参:形式参数,是指方法定义中的参数 实参:实际参数,方法调用中的参数
2.方法的重载
同一个类中(继承的子类中写也算),方法名相同,参数不同(包括:个数不同、类型不同、顺序不
同)的方法。与返回值无关。
①在调用重载方法时,Java虚拟机会通过参数的不同来区分同名的方法
②把相同功能的方法名起成一样的名字——好处:定义方法时不用那么多单词了,调用方法时也不用
这么麻烦
3.方法的内存
Java的内存分配(虚拟机)

①方法调用的基本内存原理——先进栈的后出栈,例如子弹装入弹夹那样
②基本数据类型和引用数据类型的内存原理
基本数据类型(整数、浮点数、布尔、字符):变量里面存储的是真实的数据,数据值是存储在自己
的空间中 特点:赋值给其他变量,赋的真实的值
引用数据类型(只要new出来的):变量(自己空间)里面存储的是地址值,数据值是存储在其他空间中
的。 特点:赋值给其他变量,赋的是地址值
③方法传递基本数据类型和引用数据类型的内存原理
传递基本数据类型时,传递的是真实的数据,形参的改变,不影响实际参数的值,如果想改变,就要
用先前的值去接收返回的值
传递引用数据类型时,传递的是地址值,形参的改变,影响实际参数的值
八.OO:面向对象——OOA:面向对象分析 ;OOD:面向对象设计;OOP:面向对象编程
面向: 拿、找 对象:能干活的东西 面向对象编程: 拿东西过来做对应的事情
1.类和对象
类:是对象共同特征的描述(设计图)。对象:是软件中真实存在的具体东西。
在Java中,必须先设计类,才能获得对象 类是对象的模板,对象是类的具体的实例
2.如何得到对象
public class 类名 {成员变量(代表属性的,一般是名词)
成员方法(代表行为的,一般是动词 ) }
类:是一种引用数据类型,所以创建对象时和创建数组一样用new关键字。
类名 对象名 = new 类名(); 数据类型 引用类型变量 指向 对象
3.拿到对象后能做什么——对象.成员变量; 对象.成员方法(…)
4.定义类的补充注意事项
①用来描述一类事物的类,专业叫做: Javabean类。在Javabean类中,是不写main方法的。
②编写main方法的类,叫做测试类我们可以在测试类中创建iavabean类的对象并进行赋值调用。
③一个java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成
为代码文件名(实际开发中建议还是一个文件定义一个class类)
④成员变量的完整定义格式是: 修饰符 数据类型 变量名称 = 初始化值;一般无需指定初始化值,存在
默认值 成员变量会默认初始化,局部变量不会必须赋值
5.面向对象三大特征——封装,继承(十一.4),多态(十一.5)
封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为,例如:人关门,关门和开门的
方法就应该写在门的类里,人对象再调用这些方法,别的对象也可以调用这些方法了。
好处:降低我们的学习成本,可以少学、少记,或者说压根不用学,不用记对象有哪些方法,有需要
时去找就行。让编程变得很简单,有什么事,找对象,调方法就行。例如:要对String类型做操作,直

接找相应的方法即可
6.private关键字——为了成员变量的安全性
是一个权限修饰符;可以修饰成员(成员变量和成员方法);被private修饰的成员只能在本类中才能访
问。
针对于每一个私有化的成员变量,都要提供get和set方法——set方法: 给成员变量赋值;get方法: 对
外提供成员变量的值
7.this关键字
Javabean类中分成员变量和局部变量,如果有同样的变量名,如果不用this关键字,就会按就近原
则,那个变量离的近就用那个,用this关键字就可以使用成员变量了。例如:this.age=age; 左边代表
成员变量,右边的就用就近原则。非静态的方法有一个隐藏的this,this就是一个局部变量·
8.构造方法——构造方法也叫作构造器、构造函数。
作用:创造对象的时候,由虚拟机自动调用,给成员变量进行初始化的,构造函数存在的意义就是为了
方便new的时候直接传参数,比如Student s = new Student (18,刘亦菲)
①构造方法的格式——public class 类名{ 修饰词 类名(参数){ 方法体; } }
无参数构造方法:初始化的对象时,成员变量的数据均采用默认值。
有参数构造方法:在初始化对象的时候,同时可以为对象进行赋值。
②特点:方法名与类名完全相同;没有任何返回值类型;没有具体的返回值 (不能由retrun带回结果数
据)
③执行时机:创建对象的时候由虚拟机调用,不能手动调用构造方法;每创建一次对象,就会调用一
次构造方法
④注意
定义时:如果我们自己没有写任何的构造方法,那么虚拟机给我们加一个空参构造方法,如果定义了
有参构造方法,系统将不再提供默认的构造方法(及不提供无参构造方法,需要自己写)
重载:带参构造方法和无参数构造方法,两者方法名相同,但是参数不同,这叫做构造方法的重载。
使用方式:建议在任何时候都手动写上空参和带全部参数的构造方法。
9.标准JavaBean类
①类名需要见名知意 ②成员变量使用private修饰 ③提供至少两个构造方法(无参构造方法、带全部参
数的构造方法)④成员方法(提供每一个成员变量对应的setXxx()/getXxx()、如果还有其他行为,也
需要写上)
10.对象内存图
先从方法区加载class文件,然后在栈中运行main方法
11.this的内存原理——this的作用: 区分局部变量和成员变量;this的本质: 代表方法调用者的地址值
12.

九.字符串和API(Application Programming Interface): 应用程序编程接口
JavaAPI:指的就是JDK 中提供的各种功能的Java类
简单理解:API就是别人已经写好的东西,我们不需要自己编写,直接使用即可
API帮助文档:帮助开发人员更好的使用API和查询API的一个工具
1.String概述
java.lang.String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都为此类的对象,会自
己导入
注意:字符串的内容是不会发生改变的,它的对象在创建后不能被更改
String a ="尼古拉斯”; String b=“程序员”; System.out.printIn(a + b);这创建了三个字符串
String a =“尼古拉斯”; a =“三连”; 创建了两个字符串 第二个a是创建了一个新的字符串 并没修改前
面的a
2.创建String对象的两种方式
①直接赋值 String s=“aaaaaa”(用的最多)
②new 1.2基本没有用 3.4用。需求:我要修改字符串的内容,用char构造;需求:我们一般要把字节信息
进行转成字符串,此时就要用到byte个构造了 char[] 数组变为String类型 不能用toString不然输出的就
是地址值;String s2=new String(“点赞”)创建了两个对象,先创建一个在串池中,再new以一个
3.内存图 注意: StringTable(串池)在JDK7版本开始从方法区中挪到了堆内存
直接赋值:当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在 不存在:创建新的 存在:复

new 每new一次都是开辟了一个小空间,容易浪费内存空间
4.String的比较
①不能用比较,因为号比较的实质是:基本数据类型比较的是数据值,引用数据类型比较的是地
址值
列如:String s1 = “abc”;String s2 = “abc”;System.out.println(s1 == s2); //true
String s1 = new String(“abc”); //记录堆里面的地址值 String s2 = “abc”;//记录串池中的地址值
System.out.printIn(s1 == s2); //false
String s1 = sc.next();//底层实际上是new出来的值 String s2 = “abc”; //System.out.printIn(str1 ==
str2);//false
②boolean equals方法(要比较的字符串)——完全一样结果才是true,否则为false
boolean equalslgnoreCase(要比较的字符串)——忽略大小写的比较
5.String的遍历 idea快捷方式:字符串名.length().fori
public char charAt(int index): 根据索引返回字符 public int length(): 返回此字符串的长度//这里的
length是方法 数组的长度:数组名.length//这里的length是一个属性不用加()
6.String的其他方法
String substring(int beginIndex, int endIndex)截取 String substring(int beginIndex) 截取到末尾
注意点:包头不包尾,包左不包右,只有返回值才是截取的小串

String replace(元值,新值) 替换;String trim()去除字符串两边空白符;String toUpperCase():将当前
字符串中的英文部分给转换为全大写;String toLowerCase():将当前字符串中的英文部分给转换为全
小写;boolean startsWith(String s):判断当前字符串是否是以给定的字符串(s)开头的;boolean
endsWith(String s):判断当前字符串是否是以给定的字符串(s)结束的;int indexOf(String s,int x)检
索s在str中第1次出现的位置,从x开始找;int lastIndexOf(String s)检索s在str中最后一次出现的位
置;static String valueof(数据类型 a):将其它数据类型转换为string; 注意点:只有返回值才是替换之后
的结果; (正则表达式中还有三个相关方法)
7.StringBuilder
StringBuilder 可以看成是一个容器,创建之后里面的内容是可变的 作用:提高字符串的操作效率
使用StringBuilder的场景:1.字符串的拼接2.字符串的反转
①StringBuilder的构造方法
public StringBuilder()创建一个空白可变字符串对象,不含有任何内容 public StringBuilder(String
str) 根据字符串的内容,来创建可变字符串对象
②StringBuilder常用方法
public StringBuilder append (任意类型) 添加数据,并返回对象本身
public StringBuilder replace(int a,int b,String str) 替换部分内容(包左不包右)
public StringBuilder delete(int a,int b) 删除部分内容(包左不包右)
public StringBuilder insert(int a,任意类型) 在下标a的位置插入数据
public StringBuilder reverse() 反转容器中的内容
public int length() 返回长度(字符出现的个数)
public String toString() 通过toString0就可以实现把StringBuilder转换为String
③打印
StringBuilder sb=new StringBuilder(); System.out.println(sb); //输出空值 不是地址值
因为StringBuilder是Java已经写好的类,java在底层对他做了一些特殊处理,打印对象不是地址值而
是属性值。(具体操作看十二.4.①重写toString)
StringBuilder sb=new StringBuilder(”哈哈哈"); System.out.println(sb); //输出哈哈哈
扩展:链式编程:当我们在调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法
列如:int len = getString().substring(1),replace( target: “A”, replacement: “o”).length();
8.StringJoiner
Stringjoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的
作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用,JDK8出现的
①StringJoiner的构造方法
public StringJoiner (间隔符号) 创建一个StringJoiner对象,指定拼接时的间隔符号
public StringJoiner (间隔符号,开始符号,结束符号) 创建一个StringJoiner对象,指定拼接时的间隔
符号开始符号、结束符号

StringJoiner sj=new StringJoiner(“—”,“[”,“e”); sj.add(“aaa”).add(“bbb”).add(“123”);
System.out.println(sj);//输出:[aaa—bbb—123e
②StringJoiner 的成员方法
public StringJoiner add (添加的内容) 添加数据,并返回对象本身
public int length() 返回长度( 字符出现的个数)
public String toString() 返回一个字符串(该字符串就是拼接之后的结果)
9.字符串相关的底层原理
原理1:字符串存储的内存原理 原理2::==号比较的到底是什么? 1.2上面有
原理3:字符串拼接的底层原理 建议:拼接字符串用StringBuilder或StringJoiner,不要直接+
没有变量参与:String s=“a”+“b”+“c” 触发字符串的优化机制,在编译成class文件后,就已经是最终
的结果abc了,会复用串池中的字符串.
有变量参与:String s1=“a”;String s2=s1+“b”; 分两种:
jdk8之前:系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接拼接后,
再调用其toString方法转换为String类型,而tostring方法的底层是直接new了一个字符串对象。——
s2=new StringBuilder().append(s1).append(“b”).toString(); //每有一个变量参与就会创建一次
jdk8之后:系统会预估要字符串拼接之后的总大小,把要拼接的内容都放在数组中,此时也是产生一
个新的字符串。
如果很多字符串变量拼接,不要直接+,在底层会创建多个对象,浪费时间,浪费性能.
原理4: StringBuilder提高效率原理图
所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存
原理5: StringBuilder源码分析 //容量: 最多装多少 //长度: 已经装了多少
默认创建一个长度为16的字节数组,添加的内容长度小于16,直接存,添加的内容大于16会扩容(原来
的容量*2+2),如果扩容之后还不够,以实际长度为准
十.集合
用来存储数据,数组一旦定义后就是一个长度无法改变的容器,集合是一个会自动扩容的容器,刚开始
长度为0(具体看十三.4.①)
1.集合存储数据类型的特点
可以直接存引用数据类型,存基本数据类型要将其变为对应的包装类,再存入集合
基本数据类型对应的包装类:将首字母大写即可,两个例外:int——integer,char——character
2.集合和数组的对比
长度:数组长度固定;集合长度可变。 存储类型:数组基本和引用数据类型均可;集合引用可,基本要
变为对应的包装类
3.ArrayList 泛型:限定集合中存储数据的类型
①创建集合对象: ArrayList<泛型> list=new ArrayList<>();
ArrayList al=new ArrayList<>(); System.out.println(al);//输出:[]

ArrayList是iava已经写好的一个类,这个类在底层做了一些处理,打印对象不是地址值,而是集合中
存储数据内容,/在展示的时候会拿[]把所有的数据进行包裹(具体操作看十二.4.①重写toString)
②成员方法
十一.OO进阶
1.static——静态,是Java中的一个修饰符,可以修饰成员方法,成员变量
被static修饰的成员变量,叫做静态变量:特点:被该类所有对象共享;不属于对象(成员变量属于对
象),属于类 调用方式:类名调用 (推荐);对象名调用
被static修饰的成员方法,叫做静态方法:特点:多用在测试类和工具类中,Javabean类中很少会用
调用方式:类名调用 (推荐);对象名调用
静态变量是随着类的加载而加载的,优先于对象出现的,非静态,跟对象有关的
注意:静态方法中,只能访问静态。非静态方法可以访问所有。静态方法中没有this关键字(非静态的
方法有一个隐藏的this,由虚拟机将方法调用者地址值赋值给this,所以能调用同一类中的属性或方
法)静态变量定义后是可以调用再次修改的,静态方法可以重载但不能重写。
强行调用show()方法 没有调用show()方法的对象。何时用: 所有对象所共的数据(图片、音频、视频等)
2.工具类——帮助我们做一些事情的,但是不描述任何事物的类
类名见名知意 私有化构造方法:因为只需要帮助做事情,所以不用创建对象 方法定义为静态:方便调

3.重新认识main方法
public:被JVM调用,访问权限足够大 static:被JVM调用,不用创建对象,直接类名访问因为main方法
是静态的,所以测试类中其他方法也需要是静态的 void:被JVM调用,不需要给JVM返回值 main:一个
通用的名称,虽然不是关键字,但是被JVM识别 String[] args(字符串数组,数组名 args):以前用于接
收键盘录入数据的,现在没用
4.继承
java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起继承关系,
public class Student extends Person {},Student称为子类 (派生类),Person称为父类(基类或超
类)。
①好处:可以把多个子类中重复的代码抽取到父类中了,提高代码的复用性子类可以在父类的基础
上,增加其他的功能,使子类更强大。
②什么时候用继承:当类与类之间,存在相同(共性)的内容,并满足子类是父类中的一种,就可以
考虑使用继承,来优化代码
③特点:java只支持单继承,不支持多继承,但支持多层继承;每一个类都直接或者间接的继承于
object(没有继承关系的类,虚拟机会加一个默认的继承关系);
私有的成员变量能被继承下来,但不能直接使用;
父类会创建一个虚方法表将非private,非static,非final的方法放入其中,再继承给子类

④继承中成员变量和成员方法访问特点: 就近原则:先在局部位置找,本类成员位置找,父类成员位置
找,逐级往上。
如果出现了重名的成员变量怎么办?this调用: 就近原则。super调用: 代表父类的存储空间,直接找父
类。System.out.println(name);System.out.println(this.name);System.out.printIn(super .name);
⑤继承中构造方法的访问特点:父类中的构造方法不会被子类继承,但是可以通过super调用;子类中
所有的构造方法默认先访问父类中的无参构造,再执行自己(子类在初始化的时候,有可能会使用到
父类中的数据,如果有,赋值后再继承过去,如果父类没有完成初始化,子类将无法使用父类的数
据)。
怎么调用父类构造方法的? 子类构造方法的第一行语句默认都是: super()//调用父类构造方法,不写也
存在,且必须在第一行;如果想调用父类有参构造,必须手动写super进行调用。
⑥方法的重写——当父类的方法不能满足子类现在的需求时,需要进行方法重写
书写格式:在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方
法。
@Override重写注解——@Override是放在重写后的方法上,校验子类重写时语法是否正确,加上注
解后如果有红色波浪线,表示语法错误,建议重写方法都加@Override注解,代码安全,优雅。
基本类型返回值必须相同,引用类型有大小,父大子小;方法重写的本质——覆盖虚方法表中的方法
5.多态——对象的多种形态
①使用多态的前提条件:有继承/实现关系;有父类引用指向子类对象(父类类型 对象名称 = 子类对
象);有方法的重写
②好处:使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。
弊端:不能调用子类的特有功能(报错原因看③调用成员方法)解决方案:变回子类类型就可以了//细
节:强转换的时候不能瞎转,如果转成其他类的类型,就会报错//转换的时候用instanceof关键字进行
判断
a instanceof Dog d//先判断a是否为Dog类型,如果是,则强转成Dog类型,转换之后变量名为d//
如果不是,则不强转,结果直接是false
③多态调用成员的特点:
调用成员变量:编译看左边,运行也看左边
编译看左边:javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有
编译失败。运行也看左边: java运行代码的时候,实际获取的就是左边父类中成员变量的值
调用成员方法:编译看左边,运行看右边
编译看左边:iavac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有
编译失败。运行看右边: java运行代码的时候,实际上运行的是子类中的方法。
理解:Animal a = new Dog();//现在用a去调用变量和方法//而a是Anima1类型的,所以默认都会从
animal的这个类中去找//成员变量:在子类的对象中,会把父类的成员变量也继承下的。父: name 子:
name//成员方法:如果子类对方法进行了重写,那么在虚方法表中是会把父类的方法进行覆盖的。
6.包

包就是文件夹。用来管理各种不同功能的java类,方便后期代码维护
①包名的书写规则: 公司域名反写+包的作用,需要全部英文小写,见名知意。 com.itheima.domain
②使用其他类的规则(import)
使用同一个包中的类时,不需要导包。使用java.lang包中的类时,不需要导包。其他情况都需要导
包。如果同时使用两个包中的同名类,需要用全类名(包名+类名,例如:
com.itheima.domain.teacher())
7.final关键字(最终)
final修饰方法:表明该方法是最终方法,不能被重写。final修饰类:表明该类是最终类,不能被继承。
final修饰变量:叫做常量,只能被赋值一次
①常量——实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性,常和static一起使用
(static final)
常量的命名规范:单个单词:全部大写。多个单词:全部大写,单词之间用下划线隔开 ctrl+shift+u变换大
小写
细节:final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。final修饰的变量是引用类型:
那么变量存储的地址值不能发生改变,对象内部的可以改变。核心:常量记录的数据是不能发生改变的
public static int num = 5;//静态变量;System.out.println(Ioo.num) //执行的操作:先加载Ioo.class
到方法区中,静态变量num一并存储在静态区中,再到方法区中获取num的值并输出
public static final int COUNT = 5; //常量(静态常量)System.out.println(Ioo.COUNT);编译器在编译
时会将常量直接替换为具体的值,效率高
1)修饰成员变量时,只能声明同时初始化或在构造方法中初始化
2)修饰局部变量时,只要在用之前初始化即可
8.权限修饰符——用来控制一个成员能够被访问的范围的,可以修饰成员变量(局部变量不行),方
法,构造方法,内部类
实际开发中,一般只用private和public,成员变量私有,方法公开
特例:如果方法中的代码是抽取其他方法中共性代码。这个方法一般也私有。
9.代码块
局部代码块、构造代码块、
静态代码块:格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次
使用场景:在类加载的时候,做一些数据初始化的时候使用
给实例变量初始化建议写在构造方法中,给静态变量初始化建议写在静态块中。如果将静态变量放构
造方法就会每new一个对象,就会读取一次,特别影响性能,放静态块中,无论new多少次,只读取
一次
10.抽象方法和抽象类
抽象方法:将共性的行为(方法) 抽取到父类之后,由于每一个子类执行的内容是不一样所以,在父类
中不能确定具体的方法体该方法就可以定义为抽象方法。强制让子类按照某种格式重写

抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类
①定义格式
抽象方法:public abstract 返回值类型 方法名(参数列表);//没有方法体
抽象类:public abstract class 类名{}
②注意
抽象类不能创建对象(实例化);可以有构造方法(作用:子类对象创建时,给抽象父类属性赋值
的。过程:看继承4.⑤);抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类;抽象类的子
类,要么重写抽象类中的所有抽象方法,要么是抽象类
③抽象用于规范代码的,防止子类共性方法名多难以调用,直接看父类的就可以了
11.接口
①定义和使用
关键字interface定义:public interface 接口名 {}
使用:接口和类之间是实现关系,通过implements关键字表示public class 类名implements 接口名
{}
②注意
接口不能实例化;接口的子类(实现类),要么重写接口中的所有抽象方法,要么是抽象类;接口和类的
实现关系,可以单实现,也可以多实现:public class 类名 implements 接口名1,接口名2{};实现类
还可以在继承一个类的同时实现多个接口:public class 类名 extends 父类implements 接口名1,接
口名2;
③成员的特点
成员变量:只能是常量 默认修饰符:public static final。
构造方法:没有构造方法
成员方法:只能是抽象方法 默认修饰符:public abstract
④接口和类之间的关系 多个接口中有重名的方法,重写一个即可
类和类的关系:继承关系,只能单继承,不能多继承,但是可以多层继承
类和接口的关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口和接口的关系:继承关系,可以单继承,也可以多继承
⑤接口新增方法
JDK7以前: 接口中只能定义抽象方法;
JDK8的新特性:接口中可以定义有方法体的方法(用于接口升级时,防止强制性重写,不重写也可以使
用接口中默认方法)
允许在接口中定义默认方法还有静态方法,需要使用关键字 default、static修饰 作用: 解决接口升
级的问题
接口中默认方法和静态方法的定义格式
格式: public default 返回值类型 方法名(参数列表){} 范例: public default void show(){}
格式: public static 返回值类型 方法名(参数列表)[ } 范例: public static void show(){ }

接口中默认方法的注意事项
默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字
定义时default不能省略,定义static不能省略
如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
静态方法只能通过接口名调用,不能通过实现类名或者对象名调用,static方法不用且不能重写
JDK9的新特性:接口中可以定义私有方法 (用于JDK8中,默认方法和静态方法里重复的代码抽取出
来,又不想给外界提供)
接口中私有方法的定义格式
格式1:private 返回值类型方法名(参数列表){} 范例1: private void show(){}
格式2:private static 返回值类型方法名(参数列表){} 范例2: private static void method(){}
⑥接口的应用
接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了
当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态,遵循多态
的调用特点
⑦适配器设计模式:解决接口与接口实现类之的矛盾问题
设计模式就是解决各种问题的套路
当一个接口中抽象方法过多,但是我只要使用其中一部分的时候,就可以适配器设计模式
书写步骤:编写中间类XXXAdapter,实现对应的接口对接口中的抽象方法进行空实现,让真正的实现
类继承中间类,并重写需要用的方法,为了避免其他类创建适配器类的对象,中间的适配器类用
abstract进行修饰
12.内部类
类的五大成员:属性、方法、构造方法、代码块、内部类(分:成员内部类,静态内部类,局部内部
类,匿名内部类)
内部类的访问特点:内部类可以直接访问外部类的成员,包括私有;外部类要访问内部类的成员,必
须创建对象,内部类是有字节码文件的
什么时候用到内部类:B类表示的事物是A类的一部分,且B单独存在没有意义,比如: 汽车的发动机,
ArrayList的迭代器,人的心脏等等
①成员内部类——写在成员位置,属于外部类的成员
注意:成员内部类可以被一些修饰符所修饰,比如: private,默认,protected,public,static等。
在成员内部类里面,JDK16之前不能定义静态变量,JDK 16开始才可以定义静态变量。
获取成员内部类对象:
方法一:在外部类中编写方法,对外提供内部类的对象(用于private修饰时)
package OOday01; package OOday01;
public class Outer { public class test {
String name; public static void main(String[] args) {
private class Inter { static int a = 10;} Outer o=new Outer();

public Inter getInstance() { return new Inter(); } } System.out.println(o.getInstance()); }}
方法二:直接创建格式
格式:外部类名.内部类名 对象名=new 外部类对象.内部类对象;
范例: Outer.Inner oi = new Outer().new Inner(); 外部类对象(调用者,调用成员内部类对象)
外部类成员变量和内部类成员变量重名时,在内部类如何访问:外部类名.this.变量名
②静态内部类(是一种特殊的成员内部类 )
静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的,需要创建对象。
获取静态内部类对象的格式:外部类名.内部类名 对象名=new 外部类名.内部类名();
调用静态内部类中非静态方法的格式:先创建对象,用对象调用
调用静态内部类中静态方法的格式:外部类名.内部类名.方法名(); (也可用对象名调用)
③局部内部类 (没用)
1.将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量
2.外界是无法直接使用,需要在方法内部创建对象并使用。
3.该类可以直接访问外部类的成员,也可以访问方法内的局部变量
④匿名内部类(本质就是隐藏了名字的内部类,可以写在成员位置,也可以写在局部位置)
格式: new 被继承的类名或者接口名(){ 重写方法;};(其中包含三部分:继承\实现,方法重写,创
建对象) 整体就是一个类的子类对象或者接口的实现类对象
使用场景
当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,如果实现类只要使用
一次,就可以用匿名内部类简化代码
注意: 匿名内部类中不能修饰外面局部变量的值,因为在此处该变量会默认为final的
十二.常用API
1.Math——帮助我们用于进行数学计算的工具类(私有化构造方法,所有的方法都是静态的)
public static int abs(int a)/absExact(inta) 获取参数绝对值
public static double ceil(double a)/floor(double a) 向上/下取整
public static int round(float a) 四舍五入
public static int max(int a,int b)/min(int a,int b) 获取两个int值中的较大/小值
public static double pow(double a,double b) 返回a的b次幂的值
public static double sqrt(double a)/cbrt(double a) 返回a的平方根/立方根
public static double random() 返回值为double的随机值,范围[0.0,1.0)
2.System——工具类,提供了一些与系统相关的方法
public static void exit(int status) 终止当前运行的 java 虚拟机 //0: 表示当前虚拟机是正常停止 //非
0: 表示当前虚拟机异常停止
public static long currentTimeMillis() 返回当前系统的时间毫秒值形式 从UTC时间开始计算

public static void arraycopy(数据源数组,起始索引,目的地数组,起始索引,拷贝个数) 数组拷贝
(五.3有用过)
3.Runtime——表示当前虚拟机的运行环境
public static Runtime getRuntime() 当前系统的运行环境对象
public void exit(int status) 停止虚拟机
public int availableProcessors() 获得CPU的线程数
public long maxMemory()/totalMemory()/freeMemory() JVM能/以及/剩余从系统中获取总内存
大小 (单位byte)
public Process exec(string command) 运行cmd命令 shutdown : 关机 //加上参数才能执行//-s : 默
认在1分钟之后关机//-s -t 指定时间 :指定关机时间//-a : 取消关机操作//-r: 关机并重启 例如:
Runtime.getRuntime().exec(“notepad”)
4.Object——Object是Java中的顶级父类。所有的类都直接或间接的继承于Object类
顶级父类中只有无参的构造方法,所以子类的构造方法都是默认访问父类的无参构造
①public String toString() 返回对象的字符串表示形式
关于为什么重写toString()方法:
System.out.println(stu)//输出地址 System:类名 out: 静态常量 System.out:获取打印的对象
printIn():方法 参数: 表示打印的内容
println核心逻辑:当我们打印一个对象的时候,底层会调用对象的tostring方法,把对象变成字符串,
然后再打印在控制台上,打印完毕换行处理,输出地址值。
思考: 默认情况下,因为object类中的tostring方法返回的是地址值,所以,默认情况下,打印一个对
象打印的就是地址值,但是地址值对于我们是没什么意义的?我想要看到对象内部的属性值?(String、
StringBuilder、StringJoiner、ArrayList<>等相关方法Java都已经重写了toString方法,使用输出的
是属性值)
处理方案: 重写父类object类中的tostring方法
例如: class Student{public String toString(){ return name+“,”+age; } } class test{ m{
System.out.println(stu)}}//输出的就是属性值,如:张三,18、
toString方法的结论:如果我们打印一个对象,想要看到属性值的话,那么就重写tostring方法就可以
了,在重写的方法中,把对象的属性值进行拼接。
②public boolean euals(object obj) 比较两个对象是否相等 重写equals()的基本原则:原则上要比较
两个对象的属性值是否相同,两个对象必须是同一类型的,若类型不同则返回false
结论:比较对象时,如果没有重写equals方法,那么默认使用object中的方法进行比较,比较的是地址
值是否相等,一般来讲地址值对于我们意义不大,所以我们会重写,重写之后比较的就是对象内部的
属性值了。(String里面的equals方式是Java已经重写过的,只能比较两个字符串之间是否相等,例
如用String a="abc"比较b=new StringBuilder(“abc”),a.equals(b)直接返回false,用的是String里的
equals,底层先比较是不是同一个对象,不是,再比较双方是不是字符串,是再比较内部属性,
StriingBuilde中没有重写equals,默认使用Object中的)(重写equals方法直接在对应的类中用
ALT+insert生成)

③protected Object clone(int a)(浅克隆) 对象克隆——把A对象的属性值完全拷贝给B对象,也叫
对象拷贝,对象复制
浅克隆:不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来
深克隆:基本数据类型拷贝过来,字符串复用,引用数据类型会重新创建新的
6.正则表达式——(可在API文档里面搜pattern找相关用途)
①boolean matchs(String regex)判断是否满足正则表达式(regex)
写正则表达式时,拿着一个正确的数据,从左到右依次去写。(用插件any-rule可以直接生成想要的正
则表达式,生成后把前面的^和后面的 删除 , 表 示从开头开始匹配, 删除,^表示从开头开始匹配, 删除,示从开头开始匹配,表示一直比配到末尾,matchs()
方法默认从头匹到尾,然后在生成的表达式里加一个\,JAVA中默认两个\等于一个,一个\是转义字
符,生成的注意修改成自己想要的);
例如:验证手机号码:String regex1=“1[3-9]\d{9}”;//第一部分: 1 表示手机号码只能以1开头//第二
部分: [3-9] 表示手机号码第二位只能是3-9之间的//第三部分: \d{9} 表示任意数字可以出现9次,也只
能出现9
②String replaceAll(String regex,String s):替换将当前字符串中满足正则表达(regex)的部分给替换为
指定字符串(s)
String line=“123.456.789”;System.out.println(line.replaceAll(“\.”,“u”));//输出:123u456u789
③String[] split(String regex):拆分,将当前字符串中按照满足正则表达式(regex)的部分进行拆分,将
拆分出的以String[]形式返回
String line=“123.456.789”; System.out.println(Arrays.toString(line.split(“\.”)));//输出:[123,
456, 789] 用于将String数组转换为String进行输出
String line=“.123.456…78…9…”;System.out.println(Arrays.toString(line.split(“\.”)));//输出:[,
123, 456, , 78, , , 9]
//最开始就是可拆分项(.),那么数组第1个元素为空符串//如果连续两个(两个以上) 可拆分项,那么中
间也会拆出一个空字符串//如果末尾连续多个可拆分项,那么拆出的空字符串被忽略
7.包装类
①java定义了8个包装类,目的就是为了解决基本数据类型不能直接参与面向对象开发的问题,使基本
类型可以通过包装类的形式存在
包括:Byte、Short、Integer、Long、Boolean、Float、Double、Character,其中Character和
Boolean是直接继承自Object的,其余6个包装类继承自Number类,其中都重写了equals方法,
(Integer.value0f()会复用-128到127范围内的数据— 使用valueof() 更多一些),integer用的最多
获取Integer对象的方式 (了解)
public Integer(int value) /(String s) 根据传递的整数/字符串创建一个Integer对象
public static Integer valueof(int i)/(String s)/(String s,int radix) 根据传递的整数/字符串/字符
串和进制创建一个Integer对象
②JDK1.5推出了一个新特性: 自动拆装箱。当编译器编译时若发现是基本类型与包装类型之间相互赋
值,则自动补齐代码完成转换工作,这个过程称为自动拆装箱。

③包装类常用操作
public static String toBinaryString / toOctalString / toHexString(int i) 得到二/八/十六进制
可以通过包装类来获取基本类型的取值范围(用法:相关类型 变量名=相关类型包装
类.MAX_VALUE/MIN_VALUE)。
包装类可以将字符串类型转换为对应的基本类型(方法: public static int parselnt(String s))
十三.集合进阶
1.集合体系结构
Collection(单列集合:添加数据时,每次只能添加一个元素):Collection是单列集合的祖宗接口,它
的功能是全部单列集合都可以继承使用的。
Map(双列集合:添加数据时,每次添加一对数据)(在Java下,六.集合进阶)
2.Collection集合
①Collection常用方法:
public boolean add(E e) / addAll(集合) 把给定的对象添加到当前集合中 / 把给定的集合全部添加到
当前集合中
public void clear()清空集合中所有的元素
public boolean remove(E e)把给定的对象在当前集合中删除
public boolean contains(object obj)判断当前集合中是否包含给定的对象
public boolean isEmpty()判断当前集合是否为空
public int size()返回集合中元素的个数/集合的长度 public boolean retainAll/removeAll(object
obj) 取/删交集
注意点:Collection是一个接口,我们不能直接创建他的对象。所以,现在我们学习他的方法时,只能创
建他实现类的对象。例如:Collection coll = new ArrayList<>();
添加元素:细节1:如果我们要往List系列集合中添加数据,那么方法永远返回true,因为List系列的是
允许元素重复的;细节2:如果我们要往Set系列集合中添加数据,如果当前要添加元素不存在,方法返
回true,表示添加成功。如果当前要添加的元素已经存在,方法返回false,表示添加失败。
删除:细节1:因为Collection里面定义的是共性的方法,所以此时不能通过索引进行删除。只能通过元
素的对象进行删除。细节2: 方法会有一个布尔类型的返回值,删除成功返回true,删除失败返回false
判断元素是否包含:细节: 底层是依赖equals方法进行判断是否存在的,但是如果存的是自定义对象,
没有重写equas方法(自定义对象的toString方法也没有重写),那么默认使用object类中的equals方
法进行判断,所以,如果集合中存储的是自定义对象,也想通过contains方法来判断是否包含,那么
在javabean类中,一定要重写equals方法。
②Collection的遍历方式(迭代器遍历、增强for遍历、Lambda表达式遍历):没有普通for遍历是因
为不能通用于set系列集合
Ⅰ 迭代器遍历(迭代器不依赖索引,迭代器在java中的类是lterator,迭代器是集合专用的遍历方式)
Collection集合获取迭代器:Iterator iterator() 返回迭代器对象,默认指向当前集合的0索引。

lterator中的常用方法:boolean hasNext() 判断当前位置是否有元素,有元素返回true,没有元素返
回false;E next()获取当前位置的元素,并将迭代器对象移向下一个位置,使用next()方法时,迭代器
才移动一次位置;void remove()从选代器指向的 collection 中移除选代器返回的最后一个元素
注意:迭代器创建的时候,指针默认指向第一个元素;迭代器遍历完毕,指针不会复位;循环中只
能用一次next方法;迭代器遍历时,不能用集合的方法进行增加或者删除,添加没有办法,可以用迭
代器提供的remove方法进行删除。
Ⅱ 增强for遍历
它是JDK5之后出现的,其内部原理就是一个iterator迭代器,为了简化迭代器的代码书写的,所有的单
列集合和数组才能用增强for进行遍历
格式:for (元素的数据类型 变量名 : 数组或者集合){sout(变量名);}
注意点:变量名其实就是一个第三方变量,在循环的过程中依次表示集合中的每一个数据;修改增
强for中的变量,不会改变集合中原本的数据
Ⅲ Lambda表达式遍历:(参数列表)->{方法体} 用forEach()方法
得益于JDK8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式
注意:不是任何时候匿名内部类都可以换成lambda,仅当实现的接口中只有一个抽象方法时可以使用。
如果方法体只有一句代码,方法体的"{}"可以忽略不写,如果这句话含有return关键字那么也要一同忽
略,如果方法的参数只有1个,那么”()"可以忽略不写
三种通用的遍历方式的选择:在遍历的过程中需要删除元素,使用迭代器,仅仅想遍历,那么使用增
强for或Lambda表达式。
3.List集合
①List集合的特有方法
Collection的方法List都继承了。
List集合因为有索,所以多了很多索引操作的方法:
void add(int index,E element) 在此集合中的指定位置插入指定的元素 细节:原来索引上的元素会
依次往后移
E remove(int index) 删除指定索引处的元素,返回被删除的元素 细节:如果方法出现了重载现
象,优先调用,实参跟形参类型一致的那个方法。
E set(int index,Eelement) 修改指定索引处的元素,返回被修改的元素
E get(int index) 返回指定索引处的元素
E subList(int from,int toIndex) 截取成子集,修改子集内容,原集也会改变,相当于子集与原集
是指向同一个引用。原集合增删之后,子集将不能再进行任何操作了,若操作则发生并发修改异常,
需要重新获取子集
注意点:List和Collection都是接口,所以只能创建他实现类对象:List list=new
ArrayList<>();

②list集合的遍历方式(迭代器遍历、增强for遍历、Lambda表达式遍历、列表迭代器遍历、普通for
循环 (因为List集合存在索引))
Ⅰ 前三种和Collection一模一样,普通for(size方法跟get方法还有循环结合的方式,利用索引获取到
集合中的每一个元素)
Ⅱ 列表迭代器遍历
五种遍历方式的选择:在遍历的过程中需要删除元素,请使用迭代器,在遍历的过程中需要添加元
素,请使用列表迭代器,仅仅想遍历,那么使用增强for或Lambda表达式,如果遍历的时候想操作索
引,可以用普通for
4.ArrayList集合(ArrayList底层是数组结构的,查询性能更好(直接下标查找物理地址)、增删性能不太
好)
底层原理:
Ⅰ利用空参创建的集合,在底层创建一个默认长度为0的数组
Ⅱ添加第一个元素时,底层会创建一个新的长度为10的数组
Ⅲ存满时,会扩容1.5倍(创建新的一个数组,将之前的值赋值过去)
Ⅳ如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准
5.LinkedList集合(底层数据结构是双链表,查询慢(因为只知道首尾,只能根据前者找下一个),增删
快,但是如果操作的是首尾元素,速度也是极快的)
链表里面的元素分为三个部分:头接点(存前一个元素的地址)、元素、尾接点(存后一个元素的地址),
然后再像火车车厢那样依次连接起来
常用方法和ArrayList一样,只是底层存储不同
public void addFirst / addLast(E e) 在该列表开头插入指定的元素 / 将指定的元素追加到此列表的末

public E getFirst / getLast() 返回此列表中的第/最后一个元素
public E removeFirst / removeLast() 从此列表中删除并返回第/最后一个元素
6.数组与集合的转换
数组转换为集合:集合=Arrays.asList(包装类名) ;底层指向的同一个引用,改变一方另一方也会
改变,只能修改数值大小,不能增减数值多少,因为数组是不可变的
集合转换位数组:包装类 数组名=集合名.toArray(new 包装类[大小]);若参数数组元素个数==集
合元素个数,那就正常转换,若参数数组元素个数<集合元素个数,那也正常转换(按照集合大小给数
组),若参数数组元素个数集合元素个数,那也正常转换,同时在末尾补默认值。
7.List集合的排序
Collections.sort(List list)方法: 可以对list集合进行自然排序(从小到大),但是其要求List集合中的元素
必须是可比较的,若元素不可比较则直接发生编译错误。判断是否可以比较的标准为元素是否实现了
Comparable接口。在实际开发中,我们一般是不会让我们自己定义的类去实现Comparable接口的,
因为这对我们的程序有侵入性。数值比大小,英文字符串和中文比首字母ASCII码大小,若首字母相
同,则比较第2个字符,Javabean类自定义比较方法

侵入性: 当我们调用某个API功能时,其要求我们为其修改其它额外的代码,这个现象就叫做侵入性。
侵入性越强则越不利于程序的后期维护,应避免。
建议:使用重载的Collections.sort(List list, Comparator c)方法,可以通过Comparator来自定义比
较规则(通过内部类实现),内部比较Java已经写好
Collections.reverse(List list)方法:可以将list集合进行反转(元素位置已经变了) JDK1.8,List集合自
身提供了sort()方法进行排序,用法一样;
8.set集合——想去重,就用set集合
List list=new ArrayList<>(); list.add(“one”);list.add(“two”);
list.add(“three”);list.add(“one”); Set set=new HashSet<>(); set.addAll(list);//自动去重

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值