![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java笔记
文章平均质量分 81
天上的云川
博客分享积累,记录成长,欢迎讨论
展开
-
MapStruct使用指北
MapStruct 是一个注释处理器,它被插入到 Java 编译器中,可以在命令行构建(Maven、Gradle 等)中使用,也可以在 IDE 中使用。MapStruct 使用合理的默认值,但在配置或实现特殊行为时会避开您的方式。与其他映射框架相比,MapStruct 在编译时生成 bean 映射,这确保了高性能,允许快速的开发人员反馈和彻底的错误检查。MapStruct的原理是生成和我们自己写的代码一样的代码,这意味着这些值是通过简单的。生成的映射代码使用简单的方法调用,因此速度快、类型安全且易于理解。原创 2023-02-14 23:44:03 · 670 阅读 · 0 评论 -
常见的函数式接口介绍
了解常见的函数式接口原创 2022-06-17 21:19:23 · 1341 阅读 · 0 评论 -
比较器java.util.Comparator
自然排序:java.lang.Comparable定制排序:java.util.Comparator我们可能在写程序的时候会有对对象排序的一个需求,可能是根据某个对象的某个属性进行比较排序。举例:比如有10个手机商品对象,我们要把这个对象按照价格进行一个从小到大的排序。对象类public class Phone{ // 商品编号 private int ph_no; // 为了方便举例,使用int类型表示价格。 // 注意真实开发中价格应该使用 // java.math.Big.原创 2022-03-15 19:02:52 · 1642 阅读 · 0 评论 -
JDBC中的各个对象介绍其作用
DriverManager对象的功能1、注册驱动:靠苏我们的程序该使用哪个数据库的jar包Class.forName("com.mysql.jdbc.Driver");这里出现了一个问题:明明这个步骤仅仅是把Driver的字节码文件加载进内存,而注册驱动的方法是DriverManager的一个静态方法,但是为什么我们却说这一步的是为了注册驱动呢?加载驱动的方法:解释:通过查看源代码:发现在静态代码块当中执行了DriverManager中的registerDriver方法来注册驱动。而原创 2020-11-09 21:18:39 · 458 阅读 · 0 评论 -
打印流PrintStream
java.io.PrintStream:是打印流,PrintStream为其他输出流添加了功能,是他们能够方便的打印各种数据值的表示PrintStream的特点只负责数据的输出,不负责数据的读取与其他输出流不同,PrintStream永远不会抛出IOException有特有的方法,print(打印输出任意类型的值),println(打印输出任意类型的值并换行)PrintStream的构造方法PrintStream(File file) 创建具有指定文件且不带自动行刷新的新打印流。Pri原创 2020-11-05 16:37:54 · 242 阅读 · 0 评论 -
java.io.InvalidClassException异常如何处理?
1、解决方法:可序列化类可以通过声明名为 “serialVersionUID” 的字段(该字段必须是静态 (static)、最终 (final) 的 long 型字段)显式声明其自己的 serialVersionUID:ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;通俗来说就是,自己定义一个UID2、图片为出现异常的过程的示意:...原创 2020-11-05 16:12:12 · 650 阅读 · 1 评论 -
瞬态关键字transient
回顾static关键字静态关键字static优先于非静态加载到内存当中(在使用的过程当中静态的东西优先于对象进入内存)注意以下是新内容:被static关键字修饰的成员变量不能被序列化,序列化的都是对象,如果被static修饰的话它不属于对象举例示范public class Person implements Serializable { String name = "张三"; static int age = 18; @Override public String原创 2020-11-05 16:00:03 · 368 阅读 · 0 评论 -
对象的反序列化流ObjectInputStream
该流位于API中java,io.ObjectInputStream,作用是将文件中的对象,反序列化为,以流的方式读取出来ObjectInputStream中的构造方法ObjectInputStream(InputStream in)创建从指定 InputStream 读取的 ObjectInputStreamObjectInputStream中特有的成员方法Object readObject()从 ObjectInputStream 读取对象ObjectInputStream的使用步骤创建Ob原创 2020-11-05 11:44:15 · 398 阅读 · 0 评论 -
对象的序列化流ObjectOutputStream
该流位于API文档中的java.io.ObjectOutputStream,该类继承于OutputStream他的作用就是把对象以流的方式写入到文件中保存ObjectOutputStream中的构造方法ObjectOutputStream(OutputStream out)创建写入指定 OutputStream 的 ObjectOutputStream特有的成员方法:void writeObject(Object obj)将指定的对象写入 ObjectOutputStreamObjectOutp原创 2020-11-05 10:54:32 · 219 阅读 · 0 评论 -
字符输出转换流OutputStreamWriter
什么是字符输出转换流?位于api文档中的java.io.OutputStreamWriter下,该流是字符流通向字节流的桥梁,可以使用指定的charset将要写入流中的字符编码成字节。(这是个编码的过程,把能看懂的字符转换为看不懂的字节)字符输出转换流继承字符流,所以能使用字符输出流中的方法字符输出转换流中的构造方法:OutputStreamWriter(OutputStream out)创建使用默认字符编码的 OutputStreamWriterOutputStreamWriter(Outpu原创 2020-11-05 10:16:20 · 1501 阅读 · 0 评论 -
编码引出的问题
在IDEA当中使用FileReader读取项目中的文本文件的时候,由于IDEA的默认编码表是UTF-8编码,所以没有任何问题,但是当读取一个本地的windows文本中的文件的时候,由于windows系统默认的是GBK编码,所以会出现乱码举例示范如下:已知我么在保存b.txt文件的时候选择的是系统默认编码表,内容是:你好呀public static void main(String[] args) throws IOException { FileReader fr = new Fil原创 2020-11-04 20:18:27 · 116 阅读 · 0 评论 -
字节输出缓冲流BufferedOutputStream
假设a.txt中有abcd四个字符,如果我们想要把这四个字符全部读取完的话,那么我们无论是字符输入流还是字节输入流,通过read这个方法读取的时候,会通过JVM虚拟机调用read这个方法,然后通过JVM虚拟机来调用OS(系统)中的读取方法,然后再通过OS系统区调用到我们的第一个字符a,然后再原路返回,这个过程十分繁琐,如果我们要把a.txt中的字符都读取完毕的话那么我们需要执行五次像这样的操作,效率十分低下由此我们引入了缓冲流缓冲流的基本原理给基本的字节输入流增加一个缓冲区(也就是数组)提高基本的字节原创 2020-11-04 19:45:29 · 604 阅读 · 0 评论 -
Properties集合的介绍和使用
什么是Properties集合?Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。Properties集合是一个唯一和io流相结合的集合可以使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储可以使用Properties集合中的load方法,把硬盘中保存的文件(键值对),读取到集合中使用使用Properties集合存储数据,遍历取出Properties集合中的数据Pr原创 2020-11-03 21:37:19 · 2004 阅读 · 0 评论 -
流中的异常处理
在jdk1.7之前使用try…catch finally处理流中的异常示范jdk1.7之前如何处理流中的异常public static void main(String[] args) { FileWriter fw = null; try { fw = new FileWriter("e:\\a.txt"); fw.write("测试"); } catch (IOException e) {原创 2020-11-03 20:52:55 · 589 阅读 · 0 评论 -
字符输出流Writer
字符输出流Writerjava.io.Writer字符输出流,是所有字符输出流的顶层的父类,并且是一个抽象方法,这个父类中定义了一些共性的方法子类共性的成员方法void write(char[] cbuf) 写入字符数组void write(int c) 写入单个字符void write(String str) 写入字符串void write(String str, int off, int len) 写入字符串的某一部分abstract void write(char[] cbuf, in原创 2020-11-03 19:57:02 · 631 阅读 · 0 评论 -
字符输入流Reader
因为我们再使用字节流读取文件的内容的时候,一次只能读取一个字节,但是如果内容是中文的话,可能会产生乱码的情况如下所示:已知a.txt文本文档中的内容为:你好啊 public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("d:\\a.txt"); int len = 0; while ((len = fis.re原创 2020-11-02 20:47:20 · 358 阅读 · 0 评论 -
字节输入流InputStream
字节输入流(InputStream)java.io.InputStream抽象类是表示字节输入流的所有类的超类,注意该类是个抽象类子类共性的成员方法1、public void close()方法作用:关闭输入流并释放与该流有关的所有系统资源2、public int read()方法作用:一次读一次字节,读完指针后移一位,读取到末尾返回-13、public int read(byte[ ] b)方法作用:从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中参数的作用是什么?起到了缓冲原创 2020-10-31 16:52:12 · 817 阅读 · 4 评论 -
字节流输出流OutputStream
字节输出流(OutputStream)java.io.OutputStream抽象类是表示字节输出流的所有类的超类,注意该类是个抽象类子类共性的成员方法1、public void close()方法作用:关闭输出流并释放与此流相关联的任何系统资源2、public void flush()方法作用:刷新此输出流并强制任何缓冲的输出字节被写出3、public void write(byte[ ] b)方法作用:将b.length字节从指定的字节数组中写入此输出流4、public void w原创 2020-10-31 15:27:11 · 1566 阅读 · 0 评论 -
IO概述
什么是IO?I就是input即输入,O就是output即输出。输入就是硬盘中的数据到内存中;输出就是内存中的数据存储到硬盘中。流指的是方向流向IO的分类根据数据的流向分为输出流和输入流1、输出流:把数据从内存中存入到硬盘上的2、输入流:把硬盘中的数据读取到内从中根据数据类型分为字节流和字符流1、字节流:以字节为单位,读写数据的流2、字符流:以字符为单位,读写数据的流顶级父类们 输入流输出流字节流字节输入流InputStream字节输出流OutStrea原创 2020-10-31 14:07:07 · 114 阅读 · 0 评论 -
FileFilter过滤器的原理和使用
情景如下:假设c盘下有个文件夹abcabc中包含abc.txt文件和abc.java文件这两个文件以及a文件夹和b文件夹a文件夹中包含a.txt文件和a.javab文件夹中包含b.txt文件和b.java我们需要打印出以.java结尾的文件路径实现过程public static void main(String[] args){ File file = new File("c:\\abc"); getAllFile(file);}public static void getAllFil原创 2020-10-31 13:49:55 · 981 阅读 · 0 评论 -
递归
什么是递归?递归其实就是方法自己调用自己递归分为两种1、直接递归public static void main(String[] args){ a(); // 直接自己调用自己}public static void a(){ a();}2、间接递归public static void main(String[] args){ a();// 通过b方法调用a方法}public static void a(){ b();}public static void b(){ a(原创 2020-10-30 16:32:32 · 106 阅读 · 0 评论 -
JDBC简单介绍
什么是JDBC?概念:JDBC就是Java DataBase Connectivity 就是数据库连接,使用Java来操作数据库本质:JDBC其实就是官方(sun公司)定义了一套操作所有关系型数据库的规则,即定义了一个接口。各个数据库公司自己来实现这个接口,提供数据库驱动jar包(数据库驱动就是数据库公司自己所定义的实现类)。快速入门基本步骤导入驱动jar包注册驱动获取数据库连接对象 Connection定义sql语句获取执行sql语句的对象 Statement执行sql,接收返回结果原创 2020-10-28 20:44:18 · 135 阅读 · 0 评论 -
File类
什么是File类?File类位于java.io.File类,File类是文件和目录路径名的抽象表示,主要是用于文件和目录的创建、查找和删除等操作File类的四个字段分别是什么1. static String pathSeparator表示与系统有关的路径分隔符,为了方便,它被表示为一个字符串。在windows系统中路径的分隔符是分号;在Linux系统中路径的分隔符是冒号2、static char pathSeparatorChar表示与系统有关的路径分隔符。3、static String s原创 2020-10-27 21:05:37 · 1093 阅读 · 0 评论 -
Lambda表达式是干什么的?如何使用?
函数式编程思想概述“函数式编程是一种编程范式。它把计算当成是数学函数的求值,从而避免改变状态和使用可变数据。它是一种声明式的编程范式,通过表达式和声明而不是语句来编程”1、面向对象的编程思想:做一件事情,找一个能解决这个事情的对象,调用对象的方法,完成事情2、函数式的编程思想:只要能获取到结果,谁去做,怎么做的都不重要,重视的是能不能的到结果,不重视过程冗余的Runnable代码冗余指的就是多余的1、传统写法public static void main(String[] args) {原创 2020-10-27 18:31:44 · 1117 阅读 · 1 评论 -
线程池
线程池思想概述我们使用线程的时候就直接区创建,这样实现起来非常的简便,但是就会有一个问题:如果并发的线程数量足够多,并且每个线程都是执行一个时间很短的任务就结束了,那么这样频繁的区创建线程就会大大降低系统的效率,因为频繁的创建线程和销毁线程需要时间。由此引入了线程池的概念,用来解决这个问题,创建一个执行完不会销毁的线程来重复利用。线程池概念1、线程池是什么?线程池其实就是一个可以容纳多个线程的容器,其中的线程可以反复的使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多的资源2、合理利原创 2020-10-25 20:50:36 · 81 阅读 · 0 评论 -
线程状态
线程状态概述线程可以处于下列状态之一:NEW至今尚未启动的线程处于这种状态。RUNNABLE正在 Java 虚拟机中执行的线程处于这种状态。BLOCKED受阻塞并等待某个监视器锁的线程处于这种状态。WAITING无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。TIMED_WAITING等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。TERMINATEDTERMINATED已退出的线程处于这种状态。在给定时间点上,一个线程只能处于一种状态。这些状态原创 2020-10-25 19:33:48 · 108 阅读 · 0 评论 -
等待唤醒机制
线程间通信1、什么是线程间的通信?多个线程在处理同一个资源,但是处理的动作(线程任务)却不相同比如:线程A用来生成包子,线程B用来吃包子,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消费,那么线程A与线程B之间就存在线程通信问题2、为什么要处理线程间的通信?多个线程并发执行时,在默认情况下CPU时随机却换线程的,当我么你需要多个线程来共同完成一件任务,并且我们希望他们有规律的执行,那么多线程之间需要一些协调通信,一次来帮我们达到多线程共同操作同一份数据3、如何保证线程间通原创 2020-10-24 20:05:37 · 327 阅读 · 0 评论 -
线程安全
线程安全1、线程安全是什么?如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,这就是线程安全问题2、举例说明电影院买票,假设电影院作为总共100个3、代码实现卖票的例子// 使用Runnable接口创建新的线程public class RunnableImpl implements Runnable { // 定义了一个多线程的共享数据 private int ticket = 100; // 创原创 2020-10-24 19:42:49 · 85 阅读 · 0 评论 -
多线程
并发与并行1、什么是并发?指两个或者多个事件在同一时间段内发生画图说明:举例:电脑在执行任务的时候,在同一时间段内交替执行2、什么是并行?指两个或多个事件在同一时刻发生(同时发生)画图说明:两个cpu同时执行任务线程与进程1、什么是进程?是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程冲创建到运行再到消亡的过程2、什么是线程?线程是进程中的一个执行单原创 2020-10-24 17:29:01 · 88 阅读 · 0 评论 -
线程
多线程的原理举例说明// 创建一个Thread类的子类public class MyThread extends Thread{ // 在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程后要做什么) @Override public void run(){ for (int i = 0; i< 20;i++){ System.out.println("run:" + i); }}public static void main(String[原创 2020-10-24 16:14:37 · 99 阅读 · 0 评论 -
自定义异常
概述java给我们提供的异常类,不够我们使用,我们需要自己定义一些异常类1、格式public class XXXException extends Exception或者RuntimeException{ 添加一个空参数的构造方法 添加一个带异常信息的构造方法}举例说明:2、注意事项自定义异常类一般都是以Exception结尾,说明该类是一个异常类自定义异常类,必须继承Exception或者RuntimeException① 继承Exception:那么自定义的异常类就是一个编译原创 2020-10-22 20:31:38 · 130 阅读 · 0 评论 -
异常的处理
抛出异常throw1、作用:可以使用throw关键字在指定的方法中抛出指定的异常2、使用格式:throw new xxxException("异常产生的原因");3、注意事项:throw关键字必须写在方法的内部throw关键字后面new的对象必须是Exception或者Exception的子类对象throw关键字抛出指定的异常对象,我们就必须处理这个异常对象① throw关键字后面创建的是RuntimeException或者是RuntimeException的子类对象,我们可以不处理,原创 2020-10-22 10:53:46 · 189 阅读 · 0 评论 -
异常
异常的概念指的是程序在执行过程中,出现的非正常情况,最终会导致JVM的非正常停止。在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出一个异常对象。Java处理异常的方式就是中断处理。异常指的并不是语法上的错误,如果我们在编写代码的时候语法出现了错误,编译时不会通过的,不会产生字节码文件,根本不能运行异常体系异常机制其实是帮助我们找到程序中的问题,异常的根类是java.lang.Throwable,其下有两个子类:java.lang.Error与java.lang.E原创 2020-10-22 10:19:58 · 209 阅读 · 0 评论 -
Debug中各个按钮的快捷键的作用
f8:逐行执行程序f7:进入到方法中shift+f8:跳出方法f9:跳到下一个断点,如果没有下一个断点那么就结束程序ctrl+f2:退出debug模式,停止程序原创 2020-10-21 20:43:11 · 1307 阅读 · 0 评论 -
of方法添加元素
使用of方法来添加元素是JDK9的新特性List接口,Set接口,Map接口:里面增加了一个静态方法of,可以给集合一次性添加多个元素static <E> List <E> of (E...elements)使用前提:当集合中存储的元素的个数已经确定了,不再改变的时候才能使用of方法,因为使用了of方法后集合中的元素个数不能改变注意:of方法只适用于List接口,Set接口,Map接口,不适用于接口的实现类of方法的返回值是一个不能改变的集合,集合不能再通过add方法原创 2020-10-21 20:35:43 · 620 阅读 · 0 评论 -
Map接口及其实现类HashMap、LinkedHashMap和Hashtable的简单介绍
一、Map集合的特点Map集合是一个双列集合,一个元素包含两个值(一个是key,一个是value)Map集合的特点Map集合中的元素,key和value的数据类型可以相同也可以不同Map集合中的元素,key是不允许重复的,value是可以重复的Map集合中的元素,key和value是一一对应的Map的常用方法1、public V put (K key, V value)方法作用:把指定的键与指定的值添加到Map集合中返回值V的含义:存储键值对的时候,key如果不重复,返回值v是null;原创 2020-10-21 19:40:28 · 322 阅读 · 0 评论 -
Collections集合工具类的常用方法
常用功能public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加多个元素public staticvoid shuffle(List<?> list):打乱集合的顺序public static void sort(List<T> list):将集合中元素按照默认规则排序public static void sort(List<T> list, Compa原创 2020-10-20 20:21:53 · 366 阅读 · 0 评论 -
可变参数
什么是可变参数?可变参数是JDK1.5之后出现的新特性,用于表示同种类型的参数有很多个使用前提当方法的参数列表数据类型已经确定的时候,但是参数的个数并不确定,我们就可以使用可变参数使用格式修饰符 返回值类型 方法名(数据类型...变量名){ 方法体}可变参数的原理可变参数的底层就是一个数组,根据传递参数个数的不同,会创建不同长度的数组,来存储这些参数,传递的参数可以是零到多个举例说明创建了一个能传递任意个数的参数的方法用于求出他们的和public static void main(原创 2020-10-19 20:36:51 · 215 阅读 · 0 评论 -
HashSet集合及LinkedHashSet集合
什么是Set接口?Set接口继承了Collection接口,Set不允许存储重复的元素,并且Set接口是无序的,没有索引,也就没有带索引的方法。1、HashSet集合HashSet集合的特点:① 不允许存储重复的元素② 没有索引,没有带索引的方法,也不能使用for循环遍历③ 是一个无序集合,存储元素和取出元素的顺序可能不一致④ 底层是一个哈希表结构哈希值哈希值是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到的地址,不是数据实际存储的物理地址),在Obje原创 2020-10-19 20:05:24 · 1144 阅读 · 0 评论 -
List接口及其各个实现的集合类
Collection中的常用子类有java.util.List集合和java.util.Set集合List集合一、List接口的特点有序的集合,存储元素和取出元素的顺序是一致的(比如存储123,全部取出的顺序也是123)有索引,包含了一些带索引的方法允许存储重复的元素二、List接口中带索引的方法public void add(int index, E element):将指定的元素,添加到该集合中的指定位置上public E get(int index):返回集合中指定位置的元素p原创 2020-10-19 16:35:32 · 189 阅读 · 0 评论