Java期末复习小记

个人网站已经开通了https,正在备案中。不出意外十一月底就能上线了,到时候个人博客和一些好玩的小工具都会放在上面。

在这里插入图片描述

  最近忙着复习Java和操作系统,第二篇博客到现在才写完。这次主要是记录最近的Java复习内容,知识点比较散,希望对各位读者有帮助,也便于我考前再回顾一遍。


基础

在这里插入图片描述

main函数参数

在这里插入图片描述

在这里插入图片描述

用split以空格划分字符串;

在这里插入图片描述

Java保留小数输出;

在这里插入图片描述

方法

在这里插入图片描述

构造方法

在这里插入图片描述

JavaBean

在这里插入图片描述

数据类型

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Math类

在这里插入图片描述
在这里插入图片描述

for-each遍历

在这里插入图片描述

字符串

equals()

比较两个字符串是否相同时,要特别注意,我们实际上是想比较字符串的内容是否相同。必须使用equals()方法而不能用==。要忽略大小写比较,使用equalsIgnoreCase()方法。
在这里插入图片描述

数组

在这里插入图片描述

Array.sort() 为升序排列

排序详解:JAVA数组中五种常见排序方法_WYJ的博客-CSDN博客_java数组排序

Static

在这里插入图片描述

Final

在这里插入图片描述

接口和抽象类

接口

在这里插入图片描述

抽象类

在这里插入图片描述

异同

区别:(1)抽象类可以有构造方法,接口中不能有构造方法。(2)抽象类中可以有普通成员变量,接口中没有普通成员变量(3)抽象类中可以包含静态方法,接口中不能包含静态方法(4)
一个类可以实现多个接口,但只能继承一个抽象类。(5)接口可以被多重实现,抽象类只能被单一继承(6)如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法

相同点:(1) 都可以被继承(2) 都不能被实例化(3) 都可以包含方法声明(4)
派生类必须实现未实现的方法

异常

分类与联系

在这里插入图片描述

Throw和throws

在这里插入图片描述

集合

△思维导图△

在这里插入图片描述

在这里插入图片描述

引入

在这里插入图片描述

Collection 接口存储一组不唯一,无序的对象。List接口存储一组不唯一,有序(插入顺序)的对象,允许插入重复的元素和null。Set接口存储一组唯一,无序的对象。SortedSet继承于Set保存有序的集合。Map接口存储一组键值对象,提供key(键)到value(值)的映射。Map.Entry描述在一个Map中的一个元素(键/值对),是一个Map 的内部接口。SortedMap继承于 Map,使 Key保持在升序排列。Enum是一个传统的接口和定义的方法,通过它可以枚举(一次获得一个)对象集合中的元素。这个传统接口已被迭代器取代。
在这里插入图片描述
在这里插入图片描述

Iterator

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

List

在这里插入图片描述

在这里插入图片描述

LinkedList

在这里插入图片描述

以下情况使用 ArrayList :

  • 频繁访问列表中的某一个元素。

  • 只需要在列表末尾进行添加和删除元素操作。

以下情况使用 LinkedList :

  • 你需要通过循环迭代来访问列表中的某些元素。

  • 需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。

LinkedList 继承了 AbstractSequentialList 类。

LinkedList 实现了 Queue 接口,可作为队列使用。

LinkedList 实现了 List 接口,可进行列表的相关操作。

LinkedList 实现了 Deque 接口,可作为队列使用。

LinkedList 实现了 Cloneable 接口,可实现克隆。

LinkedList 实现了 java.io.Serializable
接口,即可支持序列化,能通过序列化去传输。

ArrayList

在这里插入图片描述

Map

Map中不存在重复的key,因为放入相同的key,只会把原有的key-value对应的value给替换掉。虽然key不能重复,但value是可以重复的。遍历Map时,不可假设输出的key是有序的!Map是一种映射表,可以通过key快速查找value。可以通过for
each遍历keySet(),也可以通过for
each遍历entrySet(),直接获取key-value。最常用的一种Map实现是HashMap。
在这里插入图片描述

HashMap

在这里插入图片描述

EnumMap

如果Map的key是enum类型,推荐使用EnumMap,既保证速度,也不浪费空间。

使用EnumMap的时候,根据面向抽象编程的原则,应持有Map接口。

TreeMap/SortedMap

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DXsKWp7r-1637159556044)(media/d17ac6c106cbbefe6d9794b8847a1dca.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GBYW8MHb-1637159556045)(media/95c32f800cef9cfde317508271844255.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rZbjqBQr-1637159556045)(media/e28926ea5bb8f399b3e71c0906e07476.png)]

Properties的使用

在这里插入图片描述

Set

Set用于存储不重复的元素集合,它主要提供以下几个方法:

  • 将元素添加进Set<E>:boolean add(E e)

  • 将元素从Set<E>删除:boolean remove(Object e)

  • 判断是否包含元素:boolean contains(Object e)

Set实际上相当于只存储key、不存储value的Map。我们经常用Set用于去除重复元素。
在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AU0wJeoA-1637159556046)(media/7f0f444d138bac5046f92a395fe01778.png)]

HashSet

在这里插入图片描述

TreeSet

在这里插入图片描述

LinkedHashSet

在这里插入图片描述

Queue

队列接口Queue定义了以下几个方法:

  • int size():获取队列长度;

  • boolean add(E)/boolean offer(E):添加元素到队尾;

  • E remove()/E poll():获取队首元素并从队列中删除;

  • E element()/E peek():获取队首元素但并不从队列中删除。

PriorityQueue

在这里插入图片描述PriorityQueue实现了一个优先队列:从队首获取元素时,总是获取优先级最高的元素。PriorityQueue默认按元素比较的顺序排序(必须实现Comparable接口),也可以通过Comparator自定义排序算法(元素就不必实现Comparable接口)。

Deque

在这里插入图片描述

Deque是一个接口,它的实现类有ArrayDeque和LinkedList。

我们发现LinkedList真是一个全能选手,它即是List,又是Queue,还是Deque。但是我们在使用的时候,总是用特定的接口来引用它,这是因为持有接口说明代码的抽象层次更高,而且接口本身定义的方法代表了特定的用途。

Deque实现了一个双端队列(Double Ended Queue),它可以:

  • 将元素添加到队尾或队首:addLast()/offerLast()/addFirst()/offerFirst();

  • 从队首/队尾获取元素并删除:removeFirst()/pollFirst()/removeLast()/pollLast();

  • 从队首/队尾获取元素但不删除:getFirst()/peekFirst()/getLast()/peekLast();

  • 总是调用xxxFirst()/xxxLast()以便与Queue的方法区分开;

  • 避免把null添加到队列。
    在这里插入图片描述

Vector

在这里插入图片描述

Stack

在这里插入图片描述

在这里插入图片描述

Collections

Collections类提供了一组工具方法来方便使用集合类:

  • 创建空集合;

  • 创建单元素集合;

  • 创建不可变集合;

  • 排序/洗牌等操作。

△Equals方法编写△

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


泛型

Java泛型PECS原则:如果你只需要从集合中获得类型T,使用<? extends
T>通配符,如果你只需要将类型T放到集合中,使用<? super T>通配符,如果你既要获取又要放置元素,则不使用任何通配符。PESC即Producer extends Consumer super。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

泛型与反射

在这里插入图片描述


反射

基本用法

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EiservfK-1637159556058)(media/a18f7fd6a16d015694406c4479dfa53e.png)]
在这里插入图片描述

Class类

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cNuV47Dy-1637159556060)(media/a8b2067fbd580301c04b1f730de9433e.png)]
在这里插入图片描述

在这里插入图片描述

ClassLoader类

在这里插入图片描述


枚举

在这里插入图片描述
在这里插入图片描述


I/O

引语

在这里插入图片描述

File类

在这里插入图片描述

File对象既可以表示文件,也可以表示目录。特别要注意的是,构造一个File对象,即使传入的文件或目录不存在,代码也不会出错,因为构造一个File对象,并不会导致任何磁盘操作。只有当我们调用File对象的某些方法的时候,才真正进行磁盘操作。例如,调用isFile(),判断该File对象是否是一个已存在的文件,调用isDirectory(),判断该File对象是否是一个已存在的目录:

用File对象获取到一个文件时,还可以进一步判断文件的权限和大小:

  • boolean canRead():是否可读;

  • boolean canWrite():是否可写;

  • boolean canExecute():是否可执行;

  • long length():文件字节大小。

当File对象表示一个文件时,可以通过createNewFile()创建一个新文件,用delete()删除该文件。有些时候,程序需要读写一些临时文件,File对象提供了createTempFile()来创建一个临时文件,以及deleteOnExit()在JVM退出时自动删除该文件。

当File对象表示一个目录时,可以使用list()和listFiles()列出目录下的文件和子目录名。listFiles()提供了一系列重载方法,可以过滤不想要的文件和目录。

和文件操作类似,File对象如果表示一个目录,可以通过以下方法创建和删除目录:

  • boolean mkdir():创建当前File对象表示的目录;

  • boolean
    mkdirs():创建当前File对象表示的目录,并在必要时将不存在的父目录也创建出来;

  • boolean delete():删除当前File对象表示的目录,当前目录必须为空才能删除成功。

输入输出流

InputStream并不是一个接口,而是一个抽象类。

public abstract int read() throws IOException;

这个方法会读取输入流的下一个字节,并返回字节表示的int值(0~255)。如果已读到末尾,返回-1表示不能继续读取了。

FileInputStream是InputStream的一个子类。顾名思义,FileInputStream就是从文件流中读取数据。InputStream和OutputStream都是通过close()方法来关闭流。关闭流就会释放对应的底层资源。
在这里插入图片描述

OutputStream还提供了一个flush()方法,它的目的是将缓冲区的内容真正输出到目的地。

其他文件的读写

ZIP

在这里插入图片描述

Classpath资源

在这里插入图片描述

序列化和反序列化

一个Java对象要能序列化,必须实现一个特殊的java.io.Serializable接口,它的定义如下:

public interface Serializable {

}

Serializable接口没有定义任何方法,它是一个空接口。我们把这样的空接口称为“标记接口”(Marker
Interface),实现了标记接口的类仅仅是给自身贴了个“标记”,并没有增加任何方法。

可序列化的Java对象必须实现java.io.Serializable接口,类似Serializable这样的空接口被称为“标记接口”(Marker
Interface);

反序列化时不调用构造方法,可设置serialVersionUID作为版本号(非必需);

Java的序列化机制仅适用于Java,如果需要与其它语言交换数据,必须使用通用的序列化方法,例如JSON。

Reader/Writer

在这里插入图片描述

PrintStream和PrintWriter

System.err是系统默认提供的标准错误输出。

Files类

从Java7开始,提供了Files和Paths这两个工具类,能极大地方便我们读写文件。虽然Files和Paths是java.nio包里面的类,但他俩封装了很多读写文件的简单方法。Files工具类还有copy()、delete()、exists()、move()等快捷方法操作文件和目录。


注解

在这里插入图片描述

关于NULL

在这里插入图片描述

在这里插入图片描述


线程

并发和并行

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

实现方法

在这里插入图片描述

多线程

多线程模型下,要保证逻辑正确,对共享变量进行读写时,必须保证一组指令以原子方式执行:即某一个线程执行时,其他线程必须等待。保证一段代码的原子性就是通过加锁和解锁实现的。Java程序使用synchronized关键字对一个对象进行加锁。
在这里插入图片描述

线程同步 - 廖雪峰的官方网站 (liaoxuefeng.com)


UML类图画法

UMLet的使用 - 简书 (jianshu.com)



PTA复习

判断回文数

在这里插入图片描述

最大公约数和最小公倍数

在这里插入图片描述

字符串去除数字并反转

在这里插入图片描述

使用继承设计:教师类。

在这里插入图片描述

设计一个矩形类Rectangle

在这里插入图片描述

在这里插入图片描述

人口统计

在这里插入图片描述

浅拷贝和深拷贝

在这里插入图片描述

求圆面积自定义异常类

在这里插入图片描述

试试多线程

编写4个线程,第一个线程从1加到25,第二个线程从26加到50,第三个线程从51加到75,第四个线程从76加到100,最后再把四个线程计算的结果相加。


class Count extends Thread{
	
	int start;

	Count(int start) {
		this.start = start;
	}

	@Override
	public synchronized void run() {
		for (int i = start; i < start + 25; i++) {
			Main.sum += i;
		}
	}
}
public class Main{
	public static int sum = 0;
	public static void main(String[] args) throws Exception {
		Count count1 = new Count(1);
		Count count2 = new Count(26);
		Count count3 = new Count(51);
		Count count4 = new Count(76);
		count1.start();
		count1.join();
		count2.start();
		count2.join();
		count3.start();
		count3.join();
		count4.start();
		count4.join();
		System.out.println(sum);
	}
}


BankAccout类的编写

在这里插入图片描述

在这里插入图片描述



参考

CSDN秃秃秃秃秃秃秃头用户
菜鸟教程Java部分
廖雪峰教程Java部分
程序员cxuan的java总结文档
JavaGuide项目

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.javaJava类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yjprolus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值