Java,从入门到入土
文章平均质量分 74
Java学习的笔记分享
二狗mao
一个大一的软工人,方向是Java后端开发,关注必回关。上的是b站上尚硅谷的,博客当笔记写,笔记内容都是尚硅谷课上的。来自井冈山大学
展开
-
JDBC学习,从入门到入土
数据库连接池是个容器,负责分配、管理数据库连接(Connection)它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏资源重用提升系统响应速度避免数据库连接遗漏。原创 2023-12-21 16:10:42 · 1056 阅读 · 0 评论 -
Java,Stream API的使用
Stream是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。Stream和Collection集合的区别:Collection是一种静态的内存数据结构,讲的是数据,而Stream是有关计算的,讲的是计算。集合主要面向内存,储存在内存中。Stream主要面向CPU,通过CPU实现计算。Stream API关注的是多个数据的计算(排序、查找、过滤、映射、遍历等)。集合关注的是数据的存储。原创 2023-12-01 20:35:10 · 870 阅读 · 0 评论 -
Java,Lambda表达式、方法引用和构造器引用
>的左边:lambda形参列表,参数的类型都可以省略。如果形参只有一个,则括号( )也可以省略。->的右边:lambda体,对应着重写的方法体。当方法体只有一条语句时,大括号{}可以省略。如果只有一条return语句,则大括号{}和return一并省略。原创 2023-11-30 19:30:21 · 961 阅读 · 0 评论 -
Java,File类与IO流,处理流:缓冲流、转换流、数据流、对象流
自定义类想要实现 序列化机制,需要满足:①自定义类需要实现Serializable接口(Serializable属于一个标识接口)。②要求自定义类声明一个全局常量:static final long serialVersionUID = (某个long类型的值,用来作为表示自定义类的唯一性的标识);③要求自定义类的属性也必须是可序列化的。·对于基本数据类型的属性:默认可序列化。原创 2023-11-26 12:04:47 · 1148 阅读 · 0 评论 -
Java,反射机制与反射的应用
有时对象的编译时类型和运行时类型是不一致的。比如在使用多态的场景下,有一个Object类型的数组,其中的元素有着各种不同的类型,而调用相应的元素的方法时,比如调用toString方法时,希望调用的是各个元素相对应的类型的toString方法。如果用instanceof来创建if判断再进行相应的强转再进行调用,当类型太多时,就太繁琐,也易出错。这时便要用到反射机制。原创 2023-11-29 20:15:13 · 939 阅读 · 0 评论 -
Java,File类与IO流,FileReader和FileWriter、FileInputStream和FileOutput的使用
如果是读取操作,可能会出现问题(因为文本文件的读取操作中涉及到比如汉字的信息时,由于汉字在Unicode编码中占三个字节,不是相应汉字的三个字节一起读取时,会出现乱码,此时应该使用字符流来操作)。读取时有一些地方要进行异常处理,若使用throws的方式,出现异常时会导致后面的close操作无法执行,可能导致内存的泄露。在new FileWriter( )构造器中,在参数加了指定的File对象后,若参数再加上true,则对File对象代表的文件是做追加操作,即在原来的文件上增加输出内容。原创 2023-11-24 19:15:14 · 994 阅读 · 0 评论 -
Java,File类与IO流,File类与IO流的概述
File定义在java.io包下。·一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录(俗称文件夹),与平台无关。·File能新建、删除、重命名文件和目录,但File不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入输出流。·File对象可以作为参数传递给流的构造器。·想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。原创 2023-11-23 17:11:37 · 240 阅读 · 1 评论 -
Java,数据结构与集合源码,关于Map接口的实现类(HashMap、LinkedHashMap)
HashMap中的所有key之间是不可重复的、无序的。所有的key构成一个Set集合。HashMap中的所有的value彼此之间是可重复的、无序的。所有的value构成一个Collection集合。HashMap中的一对key-value,就构成了一个entry。Map中的entry是不可重复的、无序的。所有的entry就构成了一个Set集合。原创 2023-11-23 17:10:49 · 109 阅读 · 0 评论 -
Java,数据结构与集合源码,关于List接口的实现类(ArrayList、Vector、LinkedList)的源码剖析
如果需要的底层数组长度大,又知道大概的数组长度需求,使用此指定底层数组长度的构造器可以避免频繁的新建的数组,让程序效率提高。①处在new时,底层初始化了Object类型的数组elementData,初始化长度为10,即Object[ ] elementData = new Object[10];①处在new时,底层初始化了Object类型的数组elementData,初始化长度为10,即Object[ ] elementData = new Object[10];即element[1] = "BB";原创 2023-11-22 11:30:12 · 455 阅读 · 0 评论 -
Java,数据结构与集合源码,数据结构概述
package 数据结构.链表.单向链表;//记录下一个元素//记录下一个元素//尾节点没有下一个元素,next赋值为nullclass Node//用于记录本节点的数据Node next;//用于记录下一个元素。原创 2023-11-21 21:23:10 · 326 阅读 · 0 评论 -
Java,泛型
jdk5.0中,集合框架在声明接口和实现类时,使用了泛型,在实例化集合对象时,如果没有使用泛型,则认为操作的时Object类型的数据。实例化时,可以指明泛型参数的类型,一旦指明了泛型的类型,则在泛型类中使用泛型参数的位置,都替换为指定的类型。⑤子类和父类名处都写,且其中有内容都是相同的不指明类型的参数的基础上,子类名处的中,用逗号分隔,加上其他的不指明类型的参数。此格式代表不确定A的泛型类型的类型,此类型是A的所有确定泛型类型的类型的父类,可以与其他确定泛型类型的类型体现多态性。原创 2023-11-21 10:33:03 · 58 阅读 · 0 评论 -
Java,集合框架,关于Map接口与Collections工具类
int binarySearch(List list,T key,Comparator c)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且集合也事先必须是按照c比较器规则进行排序过的,否则结果不确定。int binarySearch(List list,T key)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且必须是可比较大小的,即支持自然排序的。可以按照添加的key-value中的key元素的指定的属性的大小进行遍历。原创 2023-11-19 19:46:43 · 186 阅读 · 0 评论 -
Java,集合框架,关于Collection接口(子接口List和Set)
(11) boolean retainAll(Collection coll):从当前集合中删除两个集合中不同的元素,使得当前集合仅保留与col(集合中的元素相同的元素,即当前集合中仅保留两个集合的交集。(9) boolean remove(object obj):从当前集合中删除第一个找到的与obj对象equals返回true的元素。要求元素所属的类一定要重写equals( )。(10)boolean removeAl(Collection coll):从当前集合中删除所有与coll集合中相同的元素。原创 2023-11-18 10:25:06 · 474 阅读 · 0 评论 -
Java,常用类与API,比较器与其他常用类的使用
(6)String substring(int start, int end):截取当前字符序列[start,end)(7)String toString0:返回此序列中数据的字符串表示形式(8) void setLength(int newLength):设置当前字符序列长度为newLength。int nextInt(int n):返回一个伪随机数,它是取自此随机数生成器序列的、在0(包括)和指定值(不包括)之间均匀分布的int值。void gc( ):该方法的作用是请求系统进行垃圾回收。原创 2023-11-16 11:57:11 · 82 阅读 · 0 评论 -
Java,常用类与API,日期时间API的使用
withDayOfMonth( )/withDay0fYear( )/withMonth()/withYear( ):将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象。获取当前时间对应的毫秒数。getHours( )/getMinute( )/getSecond( ):获得当前对象对应的小时、分钟、秒。使用方法now( )/now(Zone zone)或of(xx,xx,xx,xx,xx,xxx).parse(CharSequence text):将指定格式的字符序列解析为一个日期、时间。原创 2023-11-15 21:24:02 · 94 阅读 · 0 评论 -
Java,常用类与API,String类
public String(byte[ ] bytes,String charsetName) :通过使用指定的字符集解码当前参数中的字节数组来构造新的String。即新创建的字符串是该参数字符串的副本。①⑦:String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。①③int indexOf(String str,int fromIndex):返回指定子字符串在此字符串中第一次出现的索引,从指定的索引开始。原创 2023-11-13 21:23:31 · 106 阅读 · 1 评论 -
Java,多线程,线程的创建方式三、四:实现Callable与线程池
思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回线程池中。线程池使得线程可以复用,即执行完一个任务,并不被销毁,而是可以继续执行其他的任务。如果在主线程中需要获取分线程call( )的返回值,则此时的主线程是阻塞状态的。(因为执行完的线程并未销毁,而是可以继续执行其他的任务)·Callable使用了泛型参数,可以指明具体的call( )的返回值类型。与之前的方式的对比:与Runnable的方式对比的好处。·可以设置相关的参数,对线程中的线程进行管理。接口的实现类的对象作为传递到。原创 2023-11-12 17:02:38 · 340 阅读 · 0 评论 -
Java,多线程,线程的通信机制
结束阻塞的方式:wait( ) 到达指定时间自动结束阻塞 或 通过被notify唤醒,结束阻塞。一旦执行此方法,就会唤醒被wait( )的线程中优先级最高的那个。·使用在同步代码块或同步方法中:wait( ) 一旦执行,会释放同步监视器。·使用的场景不同:wait( ) 只能使用在同步代码块或同步方法中。·此三个方法的使用,必须是在同步代码块或同步方法中。·声明的位置:wait( ) 声明在Object类中,sleep( ) 声明在Thread类中。一旦执行此方法,就会唤醒所有被wait的线程。原创 2023-11-12 11:29:35 · 85 阅读 · 0 评论 -
Java,多线程,线程安全的懒汉式、死锁、ReentrantLock的使用以及一些知识点补充
后面的线程判断时,未完全创建的对象也被判断为非空,对象的创建就会失败。·public Thread(Runnable target) :分配一个指定创建线程的目标对象(实现了Runnable接口的类的对象,并且该对象实现了Runnable中的run方法)。·join( ) :在线程a中通过线程b调用join( ),意味着线程a进入阻塞状态,直到线程b执行结束,线程a才结束阻塞状态,继续执行。不同的线程分别占用对方的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。原创 2023-11-11 21:47:08 · 170 阅读 · 0 评论 -
Java,多线程,线程的同步机制
要解决这种问题,必须保证一个线程(假设是线程一)在操作ticket的过程中,其他线程必须等待,直到线程一操作ticket结束以后,其他线程才可以进来继续操作ticket。·需要被同步的代码,在被synchronized包裹以后,就使得一个线程在操作这些代码的过程中,其他线程必须等待。例如,线程一(窗口一)操作ticket的过程中,尚未结束的情况下,其他的线程也参与进来对ticket进行操作。·同步监视器,俗称锁,哪个线程获取了锁,哪个线程就能执行需要被同步的代码。线程的安全问题与线程的同步机制。原创 2023-11-11 19:35:00 · 123 阅读 · 0 评论 -
Java,多线程,线程的两种创建方式
一个进程中的多个线程共享相同的内存单元,它们从一个堆中分配对象,可以访问相同的变量和对象。但多个线程操作共享的系统资源就可能会带来安全的隐患。Java语言的JVM允许程序运行多个线程,使用java.lang.Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。①每个线程都是通过某个特定的Thread对象的run( )方法来完成操作的,因此把run( )方法称为线程执行体。①定义Thread的子类,并重写该类的run( )方法,该run( )方法的方法体就代表了线程需要完成的任务。原创 2023-11-10 19:47:19 · 134 阅读 · 0 评论 -
Java,异常处理的两种方式与自定义异常类
但是,此throws的方式,仅仅是将出现的异常抛给了此方法的调用者。//子类重写的方法中可以抛出父类中被重写的方法的抛出的异常类型的子类的异常类型,但是子类中的方法不能抛出不是父类中被重写的方法的抛出的异常类型的子类的异常类型。①子类重写的方法中可以抛出父类中被重写的方法的抛出的异常类型的子类的异常类型,但是子类中的方法不能抛出不是父类中被重写的方法的抛出的异常类型的子类的异常类型。//由于finally语句的运行的必然性,最后运行的语句一定是finally中的语句,所以此情况下,最后放回的是0.原创 2023-11-07 09:01:00 · 543 阅读 · 1 评论 -
Java,异常处理,异常的概述
Java把不同的异常用不同的类表示,一旦出现某种异常,就创建该异常类型的对象,并且抛出(throw)。Exception(异常):其他因程序错误或偶然的外在因素导致的一般性问题,需要使用针对性的代码进行处理,使程序继续运行。实在无法避免的,要编写相应的代码进行异常的检测、以及异常的处理,保证代码的健壮性。包含了异常的类型、异常的原因、异常出现的位置、在开发和调试阶段都得使用printStackTrace。异常指的是程序在执行过程中,出现的非正常的情况,如果不处理最终会导致jvm的非正常停止。原创 2023-11-06 10:34:06 · 83 阅读 · 0 评论 -
Java,面向对象,包装类
除了直接将变量的基本数据类型变量的值传入Interger包装类中,还可以将String类型的值转化为相应的基本数据类型,但是不能不符合相应的数据类型的格式(比如Interger里不能写"abc"," "里面应该是一个整型值的相应的字符串。包装类可以将基本数据类型的变量的值包装到对象中(使得基本数据类型的变量具备引用数据类型变量的相关特征)。//3.String类型转换为包装类、基本数据类型(通过调用parseXxx的方法)//基本数据类型和包装类类型转换为String类型。原创 2023-11-05 16:33:49 · 146 阅读 · 0 评论 -
Java,面向对象,枚举类
情况②:枚举类实现接口,在枚举类的每个对象中重写接口中的方法。操作:在对象后面加上{},在{}里面重写接口中的方法,即为在对象中重写接口中的方法。String name( ) : 默认返回当前枚举对象的名称,当toString被重写了,想获得枚举类对象的名称,即用name( )情况①:枚举类实现接口,在枚举类中重写接口中的抽象方法。当通过不同的枚举类的对象调用此方法时,执行的时是一个方法。枚举类型本质上也是一种类,只不过这个类的对象是有限的、固定的几个,不能让用户随意创建。声明当前类的对象的实例变量。原创 2023-11-04 20:51:33 · 168 阅读 · 0 评论 -
Java,面向对象,内部类
匿名的对象以父类为引用类型,但是后面有写了新的方法,再根据多态性,可知创建的其实是一个匿名的Object类的子类的匿名对象,接着直接在后面加入{},编写此匿名子类的语句写入了test方法,最后直接在编写好后的匿名子类的匿名对象后面直接调用test方法。根据内部类中的show方法可知,要调用外部类的属性(或方法),要使用 外部类名.this.外部类的属性(或方法) 的格式。比如:要编写一个匿名内部类,它继承于Object类,并在匿名内部类中,声明一个方法test打印出“我要玩原神!>匿名的局部内部类。原创 2023-11-04 16:51:29 · 127 阅读 · 0 评论 -
jdk8和jdk9中接口的新特性
③如果类实现了两个接口,而两个方法中定义了同名同参数列表的默认方法。则实现类在没有重写此两个接口默认方法的情况下,会接口冲突。(其中,接口中的方法是默认方法).System.out.println("这是接口中定义的私有方法");默认情况下,子类(实现类)在没有重写此方法的情况下,调用的是父类中的方法。②接口中声明的默认方法可以被实现类继承,实现类在没有实现此方法的情况下,如果重写了此方法,则调用的是重写后的方法。//调用自己类中的方法,省略了this.接口中私有方法的用途,供接口中其他的默认方法调用。原创 2023-11-03 21:29:51 · 143 阅读 · 0 评论 -
Java,面向对象,抽象类和抽象方法(abstract的使用)
关于抽象类和抽象方法的使用,以Person和student和Teacher为例,若Student类和Teacher继承于Person类,老师和学生都有Person的特征。关于Person的方法,学生和老师都有各自的重写,那么Person类中的方法的内容就无意义了。当然,间接的父类中的抽象方法也要实现。②静态的方法,abstract修饰的方法是不应该被调用的,如果方法被static修饰,就可以通过类来进行调用。如果没有实现所有的方法,就会认为继承了父类中的抽象方法,而子类又不是抽象方法,就会报错。原创 2023-11-02 16:03:53 · 253 阅读 · 0 评论 -
Java,面向对象,多态性
如此,便可以用instanceof来判断传入的参数animal是哪个类的实例,再将animal的引用数据类型向下转型为相应的Animal的子类的引用数据类型之后,就可以调用相应的子类的特有的方法了。实际运行时,执行的是子类中的重写方法。一个adopt的方法,可以同时供Cat类和Dog类的对象使用,因为参数的引用数据类型声明为Animal,而Cat和Dog是Animal的子类。能发现,虽然编译器指明a1调用的方法是Animal类的jump方法,但是实际运行却是运行的Dog类中的重写后的jump。原创 2023-10-31 19:16:51 · 124 阅读 · 0 评论 -
Java,快速排序
写了好久的注释,将就着看吧,>_原创 2023-10-26 21:46:34 · 95 阅读 · 1 评论 -
Java,回形数
3.每次赋值到终点时,以第一次为例,最后还有一个j++,j会变为5,而接下来的向下应该时要保持j为4才行,j为5时会数组访问越界。所以要在后面的换方向的if里面加上一个j--,中和掉多余加出来的1.1.count是用来计算赋值的次数的,左右方向上,当赋值次数等于剩余列数时,就换方向。用不同的四个分支分别表示向右向下向左向上,假如i表示数组的行数,j表示数组的列数,向右向左就是控制j的加减,向上向下就是控制i的加减。2.换方向时,要把赋值的起点换一下,每次换起点都是让赋值对象变为下一个方向的下一个元素。原创 2023-10-23 22:02:38 · 308 阅读 · 0 评论 -
Java,给数组元素赋不同的随机值
2.while循环用来赋随机值,条件为flag的原因是,内层的for循环判断有元素相等时,就给flag赋值为true后马上跳出内层for判断,又进入while重新赋值,只有一直不相等,不被赋值为true,才能跳出while循环,不再继续赋随机值。1. 若要用随机数表示[a,b)的范围,公式为(int) (Math.random() * (a - b + 1) ) + a,所以赋值范围为一到三十的表示为(int)(Math.random() * 30) + 1。若要求数组长度为六,给数组元素赋不同的随机值。原创 2023-10-21 22:00:41 · 320 阅读 · 1 评论 -
Java,输出一个10行的杨辉三角
/每个元素等于它的上一个元素加上左上角的元素。首先,先完成二数组的创建和初始化,第一行的长度为一,第二行的长度为二……据图可以发现,杨辉三角是每行的首元素和末元素都为1,中间的元素都是等于它上面的元素加上左上角的元素。i是从0开始的,所以要加一,对应相应的外层元素的长度。然后,给杨辉三角的首末元素赋值为1.//2.使用循环,初始化外层数组元素。//3.给数组首末元素赋值。原创 2023-10-21 20:20:47 · 679 阅读 · 1 评论 -
Java,利用switch的穿透
如果用单纯的case后跟break的方法,month为1的时候,直接输出day。month为3的时候,结果为31+28+day。在switch语句中,case就是一个入口,表达式与case后面的表达式匹配上后,就进入后面的语句,其他case后面的语句也会进入执行,直到遇到break才停止执行跳出switch语句。通常情况下,会在每一个case后的语句中,以break结尾,防止发生穿透,执行其他case后面的语句。比如输入的month为7,就会从case 7:进入,进行前六个月的天数的相加。原创 2023-10-19 18:33:36 · 198 阅读 · 0 评论