
Java 基础知识、数据库知识、框架知识
文章平均质量分 80
Vighzhen
在校大学生
展开
-
面向对象设计原则
面向对象设计原则S.O.L.I.D简写 全拼 中文翻译 SRP The Single Responsibility Principle 单一责任原则 OCP The Open Closed Principle 开放封闭原则 LSP The Liskov Substitution Principle 里氏替换原则 ISP The Interface Segregation Principle 接口分离原则 DIP T原创 2022-03-18 15:59:16 · 92 阅读 · 0 评论 -
面向对象关系
类图以下类图使用PlantUML绘制,更多语法及使用请参考:https://plantuml.com/。泛化关系(Generalization)用来描述继承关系,在 Java 中使用 extends 关键字。@startumltitle Generalizationclass Vihicalclass Carclass TrunckVihical <|-- CarVihical <|-- Trunck@enduml实现关系(Real原创 2022-03-18 15:53:45 · 164 阅读 · 0 评论 -
面向对象思想三大特性
三大特性封装1.封装概述利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。 数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节, 只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节, 但可以通过对象对外提供的接口来访问该对象。2.优点减少耦合:可以独立地开发、测试、优化、使用、理解和修改 减轻维护的负担:可以更容易被程序员理解,并且在调试的时候可以不影响其他模块 有效地调节性能:可以通过剖析确定哪些模块影响了系统的性能 提高软件的可原创 2022-03-18 15:46:40 · 156 阅读 · 0 评论 -
面向对象的结构型
结构型1.适配器(Adapter)lntent把一个类接口转换成另一个用户需要的接口。Class DiagramTarget:定义客户端需要的跟特定领域相关的接口。Adaptee:已经存在的接口,通常能满足客户端的功能要求, 但是接口与客户端要求的特定领域接口不一致,需要被适配。Adapter:适配器,把Adaptee适配成为Client需要的Target。lmplementation1美国的电饭煲是在电压为 110V 下工作,而中国的电饭煲在电压 220原创 2022-03-18 15:29:30 · 278 阅读 · 0 评论 -
面向对象的行为型
1. 责任链(Chain Of Responsibility)Intent使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 将这些对象连成一条链,并沿着这条链发送该请求,直到有一个对象处理它为止。Class DiagramHandler:定义处理请求的接口,并且实现后继链(successor)Implementationpublic abstract class Handler { protected Handler successo..原创 2022-03-17 23:16:24 · 217 阅读 · 0 评论 -
面向对象的创建型
创建型1.单例(SingIeton)Intent确保一个类只有一个实例,并提供该实例的全局访问点。Class Diagram使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。ImplementationI 懒汉式-线程不安全以下实现中,私有静态变量 uniqueInstance 被延迟实例化,这样做的好处是,如果没有用到该类,那么就不会实例化 unique原创 2022-02-25 20:29:29 · 136 阅读 · 0 评论 -
面向对象的设计模式
概论设计模式是解决问题的方案,学习现有的设计模式可以做到经验复用。拥有设计模式词汇,在沟通时就能用更少的词汇来讨论,并且不需要了解底层细节。设计模式脑图原创 2022-02-25 19:52:11 · 254 阅读 · 0 评论 -
Java I/O 方式
Java I/O 方式BIO & NIO & AIOJava IO 的方式通常分为阻塞的 BIO(Blocking IO)、同步非阻塞的 NIO(New IO) 和异步非阻塞的 AIO(Asynchronous IO)。JDK1.4 之前只支持 BIO,JDK1.4 以后开始支持 NIO,JDK1.7 开始支持 AIO。1.BIOBIO 是同步阻塞的。服务器的模式为一个连接一个线程。客户端有连接请求时,就需要启动一个线程进行处理。如果这个连接不做任何事情,就会造成不必原创 2022-02-24 19:31:01 · 211 阅读 · 0 评论 -
NIO & AIO
一、NIONIO(New I/O)即新的输入/输出库是在 JDK 1.4 中引入的,弥补了原来的 I/O 的不足,提供了高速的、面向块的 I/O。NIO 核心组件: 通道(Channels) 缓冲区(Buffers) 选择器(Selectors) 流与块I/O 与 NIO 最重要的区别是数据打包和传输的方式,I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。面向流的 I/O 一次处理一个字节数据:一个输入流产生一个字节数据,一个输出流消费一个字节数据。原创 2022-02-24 19:28:45 · 220 阅读 · 0 评论 -
网络的操作
网络操作Java 中的网络支持:InetAddress:用于表示网络上的硬件资源,即 IP 地址; URL:统一资源定位符; Sockets:使用 TCP 协议实现网络通信; Datagram:使用 UDP 协议实现网络通信。InetAddress没有公有的构造函数,只能通过静态方法来创建实例。InetAddress.getByName(String host);InetAddress.getByAddress(byte[] address);public class Ne原创 2022-02-24 19:13:38 · 278 阅读 · 0 评论 -
对象的操作
对象操作序列化 & 反序列化如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,这些场景都需要用到序列化。序列化就是将数据结构或对象转换成二进制字节流的过程。反序列化将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程。序列化:ObjectOutputStream.writeObject() 反序列化:ObjectInputStream.readObject()不会对静态变量进行序列化,因为序列化只是保存对象的状态原创 2022-02-24 19:08:38 · 97 阅读 · 0 评论 -
字符的操作
字符操作编码与解码编码就是把字符转换为字节,而解码是把字节重新组合成字符。如果编码和编码过程使用不同的编码方式那么就出现了乱码。GBK 编码中,中文字符占 2 个字节,英文字符占 1 个字节; UTF-8 编码中,中文字符占 3 个字节,英文字符占 1 个字节; UTF-16be 编码中,中文字符和英文字符都占 2 个字节。UTF-16be 中的 be 指的是 Big Endian,也就是大端。相应地也有 UTF-16le,le 指的是 Little Endian,也就是小端。Ja原创 2022-02-24 19:06:48 · 174 阅读 · 0 评论 -
字节的操作
字节操作字节输出流FileOutputStream创建输出流对象OutputStream 流对象是一个抽象类,不能实例化。所以,我们要找一个具体的子类 :FileOutputStream。 查看FileOutputStream的构造方法:FileOutputStream(File file) FileOutputStream(String name)创建字节输出流对象了做了几件事情: 调用系统功能去创建文件 创建字节输出流对象 把该字节输出流对象引用指向这个原创 2022-02-24 19:01:03 · 378 阅读 · 0 评论 -
磁盘的操作
磁盘操作我们要想实现IO的操作,就必须知道硬盘上文件的表现形式。而Java就提供了一个类File供我们使用。File对象File:用于表示文件和目录的信息,但是它不表示文件的内容。构造方法:File(String pathname) //根据一个路径得到File对象File(String parent, String child) //根据一个目录和一个子文件/目录得到File对象File(File parent, String child) //根据一个父File对象和一个子文件/原创 2022-02-24 18:55:29 · 106 阅读 · 0 评论 -
Java I/O 概览
I/O介绍I/O(Input/Outpu) 即输入/输出。学术的说 I/O 是信息处理系统(计算机)与外界(人或信息处理系统)间的通信。如计算机,即 CPU 访问任何寄存器和 Cache 等封装以外的数据资源都可当成 I/O ,包括且不限于内存,磁盘,显卡。软件开发中的 I/O 则常指磁盘、网络 IO。同步 & 异步同步、异步是消息通知机制。同步:同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。 异步:异步就是发起一个调用后,立刻得到被调用者的回应表示已接收.原创 2022-02-24 18:52:42 · 114 阅读 · 0 评论 -
Java并发实践
一、死锁线程死锁死锁是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象。假设线程 A 持有资源 1,线程 B 持有资源 2,它们同时都想申请对方的资源,那么这两个线程就会互相等待而进入死锁状态。使用 Java 代码模拟上述死锁场景:public class Resources { public static final Object resource1 = new Object(); // 资源 1 public static final O原创 2022-02-23 15:15:19 · 227 阅读 · 0 评论 -
Java并发线程池
线程池Executor 框架Executor 框架是在 Java5 中引入的,通过该框架来控制线程的启动,执行,关闭,简化并发编程。Executor 基于生产者-消费者模式,提交任务的线程相当于生产者,执行任务的线程相当于消费者。同时,Executor 的实现还提供了对任务执行的生命周期管理的支持。 Executor 接口。Eexcutor 框架的基础,将任务提交和任务执行解耦。 ExecutorService 接口。继承自 Executor 接口,具备管理执行器和任原创 2022-02-23 14:59:56 · 116 阅读 · 0 评论 -
并发容器 & 并发工具
一、并发容器CopyOnWriteArrayList1.读写分离写操作在一个复制的数组上进行,读操作还是在原数组中进行,读写分离,互不影响。写操作需要加锁,防止并发写入时导致写入数据丢失。写操作结束之后需要把原数组指向新的复制数组。//写操作://通过过创建底层数组的新副本来实现的。//当 List 需要被修改的时候,并不修改原有内容,而是对原有数据进行一次复制,将修改的内容写入副本。//写完之后,把原数组指向新的复制数组。//这样可以保证写操作实在一个复制的数组上进行,而原创 2022-02-23 14:53:55 · 1038 阅读 · 0 评论 -
原子操作类
原子操作类Atomiclnteger 源码解析java.util.concurrent.atomic下的所有原子操作类都实现了 CAS。AtomicInteger 内部维护一个变量Unsafe:private static final Unsafe unsafe = Unsafe.getUnsafe(); Unsafe 类中可以执行以下几种操作:分配内存,释放内存。allocateMemory,reallocateMemory,freeMemory 挂起和唤醒线程。被封装在 L.原创 2022-02-23 14:34:41 · 354 阅读 · 0 评论 -
Lock 体系
Lock 体系AQSAQS(AbtsractQueueSynchronized) 即同步队列器。AQS 是一个抽象类,本身并没有实现任何同步接口的,只是通过提供同步状态的获取和释放来供自定义的同步组件使用。AQS 的实现依赖内部的双向队列(底层是双向链表),称为同步队列。如果当前线程获取同步状态失败,则会将该线程以及等待状态等信息封装为 Node,将其加入同步队列的尾部,同时阻塞当前线程,当同步状态释放时,唤醒队列的头结点。AQS 使用 CAS 对该同步状态进行原子操作实现对其值的修原创 2022-02-23 14:27:37 · 128 阅读 · 0 评论 -
并发关键字
并发关键字关键词一:volatile可以这样说,volatile 关键字是 Java 虚拟机提供的轻量级的同步机制。功能volatile 有 2 个主要功能:可见性。一个线程对共享变量的修改,其他线程能够立即得知这个修改。普通变量不能做到这一点,普通变量的值在线程间传递需要通过主内存来完成。 禁止指令重排序。底层原理加入 volatile 关键字时,会多出lock 前缀指令, 该 lock 前缀指令相当于内存屏障,内存屏障会提供 3 个功能:在执行到内存屏障这句指令时,在其.原创 2022-02-23 14:18:56 · 131 阅读 · 0 评论 -
并发的理论
并发理论Java 内存模型Java 内存模型(即 Java Memory Model,简称 JMM)试图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范。CPU缓存CPU 缓存的是内存数据用于解决 CPU 处理速度和内存不匹配的问题。通常情况下,当一个 CPU 需要读取主存数据时,它会将主存的数据读到 CPU 缓存中,甚至可能将缓存中的部分内容读到它的内部寄存器中,然后.原创 2022-02-23 14:01:58 · 1262 阅读 · 0 评论 -
进程和线程
一、进程和线程进程进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。在 Java 中,当启动 main 方法时其实就是启动了一个 JVM 的进程,而 main 方法所在的线程就是这个进程中的一个线程,称为主线程。进程是资源分配的基本单位。每一个进程都有它自己的内存空间和系统资源。线程线程与进程相似,但线程是一个比进程更小的执行单位,是进程中的单个顺序控制流,是一条执行路径。一个进程如果只有一条执行路径,则称为单原创 2022-02-23 13:56:16 · 170 阅读 · 0 评论 -
Java 程序编译和运行过程
Java 程序编译和运行过程Java程序从 .java 文件创建到程序运行要经过两大过程:.java 文件由编译器编译成 .class文件 字节码由 JVM 解释运行编译过程.java 源文件会被 Java编译器进行编译为.class文件:Java 编译一个类时,如果这个类所依赖的类还没有被编译,编译器会自动的先编译这个所依赖的类,然后引用。如果 Java 编译器在指定的目录下找不到该类所依赖的类的 .class文件或者 .java源文件,则会报 "Cant found sysbol"原创 2022-02-22 14:27:09 · 3686 阅读 · 2 评论 -
类的加载机制
类的生命周期从类被加载到虚拟机内存中开始,到释放内存总共有 7 个阶段:加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using),卸载(Unloading)。其中验证,准备,解析三个部分统称为连接(Linking)。类的加载过程类是在运行期间第一次使用时动态加载的,而不是一次性加载所有类。因为如果一次性加载,那么会占用很多的内存。类加载过程包括加载、连接和初始化这 3原创 2022-02-22 14:11:11 · 126 阅读 · 0 评论 -
类文件结构
类文件结构类文件概述JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件,即类文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。字节码并不针对一种特定的机器,因此 Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。类文件结构根据 JVM 规范,Class 文件通过 ClassFile 定义:ClassFile { u4原创 2022-02-22 14:03:27 · 116 阅读 · 0 评论 -
内存分配与回收策略
内存分配与回收策略HotSpot 虚拟机 GC 分类针对 HotSpot 虚拟机的实现,GC 可以分为 2 大类: 部分收集(Partial GC) 新生代收集(Minor GC/ Young GC):回收新生代,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快。 老年代收集(Major GC/ Old GC):只对老年代进行垃圾收集。需要注意的是 Major GC 在有的语境中也用于指代 Full GC。只有 CMS 的并发清除存在这个模式..原创 2022-02-22 13:58:29 · 170 阅读 · 0 评论 -
垃圾收集 (Garbage Collection,GC)
垃圾收集 (Garbage Collection,GC)垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后就会消失,因此不需要对这三个区域进行垃圾回收。判断一个对象是否可以被回收堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断哪些对象已经死亡(即不能再被任何途径使用的对象)。引用计数算法为对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回原创 2022-02-21 00:00:00 · 2114 阅读 · 0 评论 -
Java 运行数数据区域
Java 运行数数据区域Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK 1.8 和之前的版本略有不同:JDK 1.7 之前运行时常量池逻辑包含字符串常量池存放在方法区 JDK 1.7 字符串常量池被从方法区中拿到了堆,运行时常量池剩下的内容还在方法区 JDK1.8 HotSpot 虚拟机移除了永久代,采用元空间(Metaspace)代替方法区,这时候字符串常量池还在堆,运行时常量池还在方法区,只不过方法区的实现从永久代变成了元空间。程.原创 2022-02-21 00:00:00 · 148 阅读 · 0 评论 -
容器源码分析 - 并发容器
容器源码分析 - 并发容器以下源码分析基于 JDK 1.8。CopyOnWriteArrayList1、读写分离写操作在一个复制的数组上进行,读操作还是在原始数组中进行,读写分离,互不影响。写操作需要加锁,防止并发写入时导致写入数据丢失。写操作结束之后需要把原始数组指向新的复制数组。public boolean add(E e) { //加锁 final ReentrantLock lock = this.lock; lock.lock(); tr原创 2022-02-20 00:15:00 · 431 阅读 · 0 评论 -
容器源码分析 - Map
容器源码分析 - Map以下源码分析基于 JDK 1.8。HashMap为了便于理解,以下源码分析以 JDK 1.7 为主。1.存储结构内部包含了一个 Entry 类型的数组 table。transient Entry[] table;Entry 存储着键值对。它包含了四个字段,从 next 字段我们可以看出 Entry 是一个链表。 即数组中的每个位置被当成一个桶,一个桶存放一个链表。HashMap 使用拉链法来解决冲突, 同一个链表中存放哈希值相同的 Entry。原创 2022-02-20 00:15:00 · 344 阅读 · 0 评论 -
容器源码分析
容器源码分析 - List以下源码分析基于 JDK 1.8。ArrayList1. 概览实现了 RandomAccess 接口,因此支持随机访问。这是理所当然的,因为 ArrayList 是基于数组实现的。public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.SerializableC原创 2022-02-20 00:15:00 · 329 阅读 · 0 评论 -
容器中的设计模式
容器中的设计模式迭代器模式Collection 继承了 Iterable 接口,其中的 iterator() 方法能够产生一个 Iterator 对象,通过这个对象就可以迭代遍历 Collection 中的元素。从JDK 1.5 之后可以使用 foreach 方法来遍历实现了 Iterable 接口的聚合对象。List<String> list = new ArrayList<>();list.add("a");list.add("b");for (.原创 2022-02-20 00:15:00 · 392 阅读 · 0 评论 -
Java容器概览
Java容器概览容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。CollectionCollection 集合体系图:1.Set TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。 但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。 HashSet:基于哈希表实现,支持快速查找,但不支原创 2022-02-20 00:15:00 · 109 阅读 · 0 评论 -
七、正则表达式
正则表达式概述是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。其实就是一种规则。组成部分规则字符在java.util.regex Pattern类中:Pattern API常见组成规则1.字符元字符 说明 x 字符 x \ 反斜线字符 \n 新行(换行)符 ('\u000A') \r 回车符 ('\u000D') 2.字符类元字符 说明 [abc] a、b 或 c(简单类) [^ab原创 2022-02-19 10:47:59 · 91 阅读 · 0 评论 -
六、泛型-Generics
泛型的概念在集合中存储对象并在使用前进行类型转换是多么的不方便。泛型防止了那种情况的发生。 它提供了编译期的类型安全,确保你只能把正确类型的对象放入集合中,避免了在运行时出现ClassCastException。 不使用泛型 /*** 这样做的一个不好的是Box里面现在只能装入String类型的元素,今后如果我们需要装入Integer等其他类型的元素,* 还必须要另外重写一个Box,代码得不到复用,使用泛型可以很好的解决这个问题。*/public class Box { pr..原创 2022-02-19 10:40:29 · 465 阅读 · 0 评论 -
五、异常-Exception
异常的概念Java 异常是一个描述在代码段中发生异常的对象,当发生异常情况时,一个代表该异常的对象被创建并且在导致该异常的方法中被抛出,而该方法可以选择自己处理异常或者传递该异常。异常继承体系Throwable 可以用来表示任何可以作为异常抛出的类,分为两种:Error和Exception。Error:通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些错误时,建议终止程序; Exception:通常情况下是可以被程序处理的,捕获后可能恢复,并且在程序中应该尽可能地去处理...原创 2022-02-19 01:00:00 · 399 阅读 · 0 评论 -
Java 常见类 II
阵列Arrays 是针对数组进行操作的工具类。常用成员方法public static String toString(int[] a) //把数组转成字符串public static void sort(int[] a) //对数组进行排序public static int binarySearch(int[] a,int key) //二分查找其中,toString() 源码如下:public static String toString(int[] a) { if原创 2022-02-19 00:00:00 · 367 阅读 · 0 评论 -
四、Java常见类 I
对象Object类是类层次结构的根类。每个类都使用 Object 作为超类。每个类都直接或者间接的继承自Object类。Object 中常用方法有:public int hashCode() //返回该对象的哈希码值。// 注意:哈希值是根据哈希算法计算出来的一个值,这个值和地址值有关,但是不是实际地址值。public final Class getClass() //返回此 Object 的运行时类public String toString() //返回该对象的字符串表示。p原创 2022-02-19 00:00:00 · 278 阅读 · 0 评论 -
三、final 和 静态 关键字
一、最终关键字1. 数据声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。对于基本类型,final 使数值不变; 对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的 final int x = 1;// x = 2; // cannot assign value to final variable 'x'final A y = new A();y.a = 1; 2. 方法 声明方法不能被子类重写。原创 2022-02-18 10:50:17 · 138 阅读 · 0 评论