java笔记总结纸质版 第1篇
定义在类内部、方法内部或局部代码块内部的类,用来辅助外部实例运算,封装局部数据,或局部的运算逻辑。
非静态内部类、属于实例的内部类 非静态内部类实例,必须依赖于一个外部类的实例才能存在。
静态内部类 静态内部类,与普通的类没有区别。
局部内部类
局部定义的类型,类似于局部变量,有作用范围,只能在局部代码块内使用这种类型
局部内部类中,使用外面的局部变量,必须加 final,,缺省。
匿名内部类
Weapon w = new Weapon() {...};
1
{} - 匿名类
new - 新建匿名类的实例
Weapon - 父类型
() - super(),可传参数super(1,2,3)
java笔记总结纸质版 第2篇
File
封装一个磁盘路径字符串,提供了一组对文件、文件夹的操作方法,可以封装文件夹路径、文件路径、不存在的路径。 {path=“d:/abc”}
方法
getName() 获取文件名
getPatrent() 获取父目录
getAbsolutePath()完整路径
length() 文件字节量,对文件夹无效,会返回假数据
isFile() 判断是否是文件
isDirectory()是否是文件夹
创建、删除
createNewFile()新建文件,文件已存在不会新建,返回false;文件夹不存在会出现异常
mkdirs()逐层创建多层文件夹
delete()删除文件、空目录
目录列表
list()得到String[] 包含所有文件名 [“”, “”, “”]
listFiles() 得到 File[],包含所有文件的封装的File对象 [{…}, {…}, {…}]
流 Stream
数据的读写操作(io操作),抽象成数据在管道中流动
单方向流动
输入流,只能用来读取数据(读入内存)
输出流,只能用来输出数据(内存数据向外输出)
只能从头到尾,顺序流动一次,不能反复流动,如果要重复流动,可以重新创建新的流
InputStream,OutputStream
字节流的抽象父类
方法:
write(int b) 只输出int四个字节中,末尾的一个字节值 [1][2][3][4] —> [4]
write(byte[], start, length) 输出byte[] 数组中,从start开始的length个字节值
read() 读取一个字节值,补三个0字节,变成int [4] —> [1][2][3][4],读取结束后,再读取会返回 -1。
read(byte[] buff) 按数组的长度,读取一批字节值,存放到指定的数组中,并返回这一批的字节数量,读取结束后,再读取会返回 -1。
FileInputStream,FileOutputStream — 文件流
ObjectInputStream,ObjectOutputStream —对象序列化、反序列化
序列化 把一个对象的信息,按固定的字节格式,变成一串字节序列输出
方法:
writeObject(Object obj) 把对象变成一串字节序列输出
readObject() 读取序列化数据,反序列化恢复对象
Serializable 接口——被序列化的对象,必须实现 Serializable 接口
不序列化的变量
Static — 属于类,不随对象被序列化输出
Transient —临时,只在程序运行期间,在内存中存在,不会被序列化持久保存
字符编码
ASC-II 0到 127,英文、指令字符
iso-8859-1 Latin-1 西欧编码 ,把ASC-II扩展到255
CJK 编码 亚洲编码,中日韩
GBK 国标码 英文单字节,中文双字节
Unicode 万国码 常用表,双字节 生僻字 三字节或四字节
UTF-8 Unicode 的传输格式 Unicode Transformation format英文,单字节某些字符,双字节;中文,三字节;特殊符号,四字节
Java的char类型是 Unicode
Java的转码运算
InputStreamReader,OutputStreamWriter
字符编码转换流 OutputStreamWriter — 把Java的Unicode编码字符,转成其他编码输出
InputStreamReader —读取其他编码字符,转成Unicode字符
java笔记总结纸质版 第3篇
极端的抽象类,结构设计工具,用来解耦合,隔离现实
Implements代替extends
Interface 代替class
接口的定义:
公开的抽象方法 公开的常量 公开的内部类、内部接口
1)接口只能定义常量
2)接口只能定义抽象方法
3)接口只能继承接口,不能继承普通的类和抽象类
4)接口是没有构造方法
注意:
1)在接口中定义常量时,可以不用final static修饰,因为编译器在编译时会自动加上。
2)在接口中定义抽象方法时可以省略abstract关键字,编译器在编译时同样会加上。
类可以同时继承多个接口
接口和接口的继承
java笔记总结纸质版 第4篇
比较简单此处不单独罗列
引用数据类型:数组,类,接口
char :Unicode编码的字符,或字符的整数编码,必须用单引号
float默认值是;
double默认值是;
基本类型字面值规则
1.整数字面值是int类型,如果右侧赋值超出int范围,需要做转型处理
,short,char 三种比int小的整数,在自身范围内可以直接赋值。
byte d=1+3 正确,1+3编译器会自动转成4
3.浮点数字面值是double;浮点数转成整数会直接舍弃小数点后位数。
4.字面值后缀,L D F
5.字面值前缀,0b 二进制;0x 16进制;0 8进制; \u char 类型16进制
基本类型的运算规则
1.计算结果的数据类型与运算中的最大类型一致。
,short,char三种比int小的整数,计算时会自动转成int
做加法运算时,数据类型会自动转成int,除了自增加自减不进行转化外,其它情况都是无long型时,所有非int类型转成int类型;有long类型时,都转成long类型。
char类型相加,提升为int类型。
3.整数运算溢出。 得负数最小值
4.浮点数运算不精确
5.浮点数特殊值 infinity 整数除0 ;Nan 负数开方
基本类型的类型转换
数字类型之间可以互相转换,从小到大自动转换,从大到小需要强制转型。
double d = 245; float d=100;自动转型
运算符
&& :逻辑与(短路与),两边同为真结果才为真,短路与:左边是假,右边忽略不执行
& :不管左边结果是什么都要执行右边(&的左右两边都要参与运算)
|| :逻辑或(短路或),两边只要有一个真结果就是真,短路或:左边是真,右边忽略不执行
java笔记总结纸质版 第5篇
封装错误信息的对象
错误信息:类型、提示消息、行号
异常的继承结构
捕获异常
throw 手动抛出异常,执行异常的抛出动作 类似 return;当程序出现逻辑错误,不自动创建并抛出异常,可以手动判断逻辑错误,手动创建异常对象并抛出。
底层的异常往上层抛,在上层处理
异常包装
捕获的异常对象,包装成其他类型再做抛出,多种类型简化成一种类型,不能抛出的异常包装成能抛出的异常再抛。
RuntimeException 和 其他Exception
RuntimeException— 非检查异常,编译器不检查是否有异常处理代码,存在默认的抛出管道
其他异常 — 编译器检查是否有处理代码,不处理,不能编译。
java笔记总结纸质版 第6篇
用来存放一组数据的数据结构
数组的缺点: 长度固定 ; 访问方式单一只能下标访问; 前面增删数据操作繁琐
集合的继承结构:
Collection 是对象集合, Collection 有两个子接口 List 和 Set,
List 可以通过下标 (1,2…) 来取得值,值可以重复,而 Set 只能通过游标来取值,并且值是不能重复的
ArrayList , Vector , LinkedList 是 List 的实现类
ArrayList 是线程不安全的, Vector 是线程安全的,这两个类底层都是由数组实现的
LinkedList 是线程不安全的,底层是由链表实现的
Map 是键值对集合
HashTable 和 HashMap 是 Map 的实现类
HashTable 是线程安全的,不能存储 null 值
HashMap 不是线程安全的,可以存储 null 值
ArrayList
数组列表,封装了一个数组,及其操作代码和更便捷的方法,内部数组默认初始容量10 放满后,倍增长
add(数据)— 添加数据;get(int i)—访问指定下标数据; remove(int i)移除指定位置数据,返回被移除的数据; remove(数据)— 找到第一个相等的数据,找到移除并返回true,找不到返回false; size() 元素的数量;iterator() 辅助新建迭代器
效率
访问任意位置效率高,增删数据效率可能降低
LinkedList — 双向链表
和ArrayList有相同的方法
LinkedList 两端数据操作方法
addFirst(数据);addLast(数据);getFirst();getLast();removeFisrt()
removeLast()
效率
两端效率高
HashMap — 哈希表、散列表 (面试必问) ★ ★ ★ ★ ★
存放键值对数据,用键来快速定位数据,来提取键对应的值
键:不重复,无序
Hashmap中的key-value都是储存中entry数组中的
Hashmap的实现不是同步的,意味着它不是线程安全的
Hashmap的实例有两个参数影响其性能:初始容量,和加载因子
方法
put(key,value)放入键值对数据,重复的键会覆盖旧值
get(key)获得键对应的值,键不存在,得到null
remove(key)移除键值对数据,返回被移除的值
size()键值对的数量
哈希运算过程
hashCode()
hashCode()是object的方法,默认实现是用内存地址作为哈希值
可以重写方法来获得相同的哈希值
哈希运算中要有相同的哈希值,才能保证计算出相同下标值,并且要equals()也要相等(equals方法也要重写),才可以覆盖旧值,否则会链表连接。
重写hashCode的惯用算法:(是变量的值)
java笔记总结纸质版 第7篇
内存地址不可变,可以修饰常量、类、方法
1. final 常量:值不可变,但引用类型因为保存的是地址,所以内容可以变。
final Point a = new Point(3,4);
= 30;//对
= 40;//对
2. final 方法不能在子类重写,但可以被继承。;final不能用于修饰构造方法,父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
3. final 类 不能被继承,没有子类
Static — 静态 共享的数据
静态成员属于类,而不属于实例
用类来调用静态成员
用实例来调用实例成员
() () ()
静态方法中不能直接调用实例的成员(非静态),只能用实例调用
静态初始化块
静态变量保存在方法区类的空间中,只保存一份可以在所有实例_享的数据
对象的加载过程
加载类
1.加载父类,为父类静态变量分配内存 – 后台执行不可见
2. 加载子类,为子类静态变量分配内存
3. 执行父类静态变量的赋值运算,和静态初始化块
4. 执行子类静态变量的赋值运算,和静态初始化块
新建实例
5. 新建父类实例,为父类实例变量分配内存
6. 新建子类实例,为子类实例变量分配内存
7. 执行父类的实例变量赋值运算
8. 执行父类的构造方法
9. 执行子类的实例变量赋值运算
10. 执行子类的构造方法
java笔记总结纸质版 第8篇
在进程内部,并行执行的任务
创建线程(两种方式)
继承 Thread
实现 Runnable
继承 Thread
编写 Thread 的子类,并重写 run() 方法。启动之后,自动运行 run() 方法中的代码
实现 Runnable
实现 Runnable 接口,实现它的 run() 方法,Runnable 封装在线程中执行的代码,新建线程对象时,把Runnable对象放在线程内,启动
线程的状态
线程的方法
() 获得正在执行的线程实例
(毫秒值) 让正在执行的线程,暂停指定的毫秒值时长
getName(),setName() 线程名
start() 启动线程 interrupt() 打断线程的暂停状态
join() 当前线程暂停,等待被调用的线程结束
setDaemon(true) 后台线程、守护线程
JVM虚拟机退出条件,是所有前台线程结束,当所有前台线程结束,虚拟机会自动退出
不会等待后台线程结束 例如:垃圾回收器是一个后台线程。
线程同步 synchronized
让多个线程共享访问数据时,步调一致的执行。一个线程修改时,其他线程等待修改完成后才能执行;一个线程访问时,其他线程等待访问结束
任何实例,都有一个“同步锁”,synchronized 关键字,要求一个线程必须抢到同步锁才能执行
生产者、消费者模型
线程之间传递数据
等待和通知方法必须在synchronized 代码内调用, 等待和通知的对象,必须是加锁的对象。
————————————————
java笔记总结纸质版 第9篇
switch:只能判断byte short char int enum 之后的string。
从成立的case 无条件穿透所有的case包括default直到结束或者遇到break中断跳出循环;
如果所有条件都不成立,则执行default
for循环
break 和 continue
Break 中断、跳出循环和switch
Continue 跳过后面的代码 继续进入循环的下一轮执行
for-each循环
数组遍历、集合迭代遍历的语法简化
java笔记总结纸质版 第10篇
什么是引用类型?Integer是引用类型,那int是什么类型?int是基本数据类型,不是引用类型。这就是为什么java中没有List
,而只有List
。
举一反三:其他8种基本数据类型byte、short、int、long、float、double、char也都不是引用类型,所以8种基本数据类型都不能作为List的形参。但String、数组、class、interface是引用类型,都可以作为List的形参,所以存在List
接口类型的集合、List
数组类型的集合、List
类的集合。但不存在list
、list
等基本类型的集合。
这个后面的参数类型也是有规范的
T:任意类型 type E:集合中元素的类型 element K:key-value形式 key V: key-value形式 value
泛型类型是固定的,某些场景下使用起来不太灵活,于是,通配符就来了! 通配符可以允许参数类型变化。
接口(interface): 有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。
接口(interface)是抽象方法和常量值的定义的集合。
从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
面向对象的语言基本上都可以实现接口。C++中,没有特定的关键词如interface
来定义接口类,但是可以间接通过多继承抽象类来实现。
在继承体系中,一个类只能继承一个父类。而对于接口而言,一个类是可以实现多个接口的,这叫做接口的多实现。并且,一个类能继承一个父类,同时实现多个接口。
相同点: 都是不断向上抽取而来的。
不同点:
虽然 SpringMVC 的底层是以 Servlet 为基础的,是 JavaWeb 容器的基石,但直接使用Servlet 越来越少。
Servlet(Server Applet),全称Java Servlet。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
Servlet接口定义了Servlet与servlet容器之间的契约。这个契约是:Servlet容器将Servlet类载入内存,并产生Servlet实例和调用它具体的方法。
一个简单的Servlet的生命周期: init( )
=>service( )
=>destory()
Servlet是把HTML语句一行一行输出,随着互联网的不断发展,一个普通的HTML文件可能就达到好几百行。所以Sun公司开发出了动态网页生成技术,使得可以在HTML文件里内嵌JAVA代码,这就是现在的JSP技术。
JSP 在实际开发中,主要是作为 MVC 模型中的V(View)层出现的。它本来是为 Java 后端程序员开发前端界面而生的,但随着技术的发展,前后端分离的流行,JSP 的生命周期已经到头了。
JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。 JSP可以编译成Servlet,主要用于实现Java web应用程序的用户界面部分。JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。 JSP是Servlet的扩展,在没有JSP之前,就已经出现了Servlet技术。Servlet是利用输出流动态生成HTML页面,包括每一个HTML标签和每个在HTML页面中出现的内容。
浏览器发送一个 HTTP 请求给服务器。
Web 服务器识别出这是一个对 JSP 网页的请求,并且将该请求传递给 JSP 引擎。
JSP 引擎从磁盘中载入 JSP 文件,然后将它们转化为 Servlet。
JSP 引擎将 JSP 文件编译成可执行的Servlet类,并将原始请求传递给 Servlet 引擎。
Web 服务器的某组件将会调用 Servlet 引擎,然后载入并执行 Servlet 类。在执行过程中,Servlet 产生 HTML 格式的输出并将其内嵌于 HTTP response 中上交给 Web 服务器。
Web 服务器以静态 HTML 网页的形式将 HTTP response 返回到浏览器中。
Web 浏览器处理 HTTP response 中动态产生的HTML网页。
JSP生命周期测试代码:
<%= initString%>
<%= serviceString%>
<%= destroyString%>
java笔记总结纸质版 第11篇
封装
1 类:模板、图纸 。类中定义对象的属性数据(成员变量),方法(成员方法)
类第一次使用时会加载到方法区
2 对象:从模板中创建的具体实例,实例是数据的打包
新建实例时,在堆内存中新分配内存空间给这个实例
3引用变量:理解成“遥控器”,保存一个实例的内存地址(引用变量保存在栈),引用变量的特殊值:null 不保存任何实例的内存地址
4构造方法:新建实例对象时,立即执行的一个特殊方法;构造方法必须和类同名,并且没有返回值类型。
一个类中必须有构造方法,自己没定义,系统会添加默认构造方法,构造方法一般用来给属性赋值
5 构造方法重载
一个类中可以定义多个不同参数的构造方法,是方法重载的一种体现
6 方法重载Overload:同名不同参,与返回值类型无关,所有方法都可以重载
7 this关键字: 特殊引用,引用当前对象的地址
this(…):构造方法之间的调用,必须是首行代码,如果有多个构造方法,会通过this(…)调取下面的所有构造方法,完成赋值。
注意this不能在静态方法中使用
继承
Java的继承是单继承多实现,只能继承一个父类(如果不继承其他类,默认继承object类),但可以实现多个接口
1.不能继承的有:构造方法,私有成员
过程:先新建父类对象,再新建子类对象,两者作为一个整体对象,调用成员时,先找子类,再找父类
2.方法重写:override
继承的方法,在子类中重新定义父类中的方法(只能在子类重写),方法名相同,参数的个数和类型也必须相同,返回值类型也必须相同。
方法重写返回值类型如果是基本类型应与父类的一致;重写要求方法名完全相同,返回值类型如果是基本类型或无返回值时必须一致。
3.父类的构造方法
新建子类对象时会先新建父类对象,也会先执行父类的构造方法
默认执行父类的无参构造,默认隐含调用super();
new Student() 默认执行父类无参构造
new Student(……)默认执行父类无参构造
手动调用父类的有参构造,super(参数):父类没有无参构造时必须手动调用
() 方法重写时,调用父类中同一个方法的代码
Super(参数) 调用父类的构造方法,默认调用父类无参构造super(),手动调用有参构造super(),必须是首行代码
注意super不能在静态方法中使用
多态
一个对象具有多种形态的表现,多态的前提是必须有继承。
void f(父类型 o1) { }
把一个子类型的实例当做父类型来处理,所有的子类型都可以传递到该方法,被当做父类型处理;作用:一致的类型
1. 类型的转换
A. 向上转型
子类的实例转成父类型,用父类型的引用变量,来引用子类实例,向上转型后,只能调用父类定义的通用成员,子类特有成员被隐藏
B. 向下转型
已经转成父类型的子类实例,转回子类型为了对子类型进行特殊处理
2. Instanceof 运行期类型识别
当多种子类型都被当做父类型来处理,要对某种子类型进行特殊处理,可以先判断其真实类型再向下转型——对真实类型,及其父类型判断,都返回true。格式:
java笔记总结纸质版 第12篇
Map 中的 Key 可以全部分离出来,存储到 Set 中 来进行访问 ( 因为 Key 不能重复 ) 。
Map 中的 value 可以全部分离出来,存储在 Collection 的任何一个子集合中 (value 可能有重复 ) 。
Map 中键值对的 Key 不能直接修改, value 可以修改,如果要修改 key ,只能先将该 key 删除掉,然后再来进行重新插入。
TreeMap 和 HashMap 底层实现逻辑不同,所以插入时间、删除时间、插入方法等都不相同。两者均为线程不安全(Hashmap有一个线程安全版本Hashtable)。
备注1:key(确切说第一组键值对)用数组,相同key的value(第二组键值对往后)用链表。每发生一次hash冲突,链表的长度都会+1,当链表的长度大于特定长度后,会将链表转化为红黑树以提高检索效率。
Iterator:迭代接口
数组工具类和集合工具类中提供的工具方法sort方法都给出了含有Comparator接口的重载方法。
demo如下:
使用总结:在可以使用 Comparator实例 的地方,new Comparator<注意这里泛型要写>
然后覆写 compare方法即可。
在List或数组中的对象如果没有实现Comparable接口时,那么就需要调用者为需要排序的数组或List设置一个Compartor,Compartor的compare方法用来告诉代码应该怎么去比较两个实例,然后根据比较结果进行排序。
java笔记总结纸质版 第13篇
String是封装char[] 数组的对象
1.字符串创建
2.字符串的常量池
String s1 = “abcd” 字符串的字面值写法。第一次使用一个字符串字面值时,会在字符串常量池中新分配内存,再次使用相同字面值时,直接访问常量池中存在的对象,而不会重复创建
3.字符串 中的Equals 和 “==”
“==”比较内存地址
Equals 看父类中的方法,object中的默认方法是比较内存地址,String类中重写了父类方法比较的是字符内容。如下说明:
4.字符串不可变且字符串连接效率低,每次连接都会新建字符串对象
5.字符串的常用方法
: 可变的字符序列,封装char[]数组,提供了一组方法,可以对内部封装的字符进行修改,常用来代替字符串做高效的字符串连接
java笔记总结纸质版 第14篇
属于object类,用来存放一组数据的数据结构,数组是最基本的一种数据结构但不是基本数据类型,数组是相同数据类型组成的集合,数组中的元素按线性顺序排序
1 数组的创建
数组创建后若未指定初始值,则会依据数组类型的不同来设置默认值
新建int[]数组,长度6,默认值都是0,数组的起始地址值保存在变量a。
2 数组的长度属性
数组一旦创立,长度不可变
最大下标
允许0长度的数组
3 二维数组
存放数组的数组
只建一个外围数组长度3,3个位置都是null,之后可以建新数组放入内部。
4 Arrays 数组工具类
5 数组 复制