- 博客(38)
- 收藏
- 关注
原创 Git 常用命令
git revert name/bb92e0e:对于已经与团队共享的,想要撤销只能用此命令,原理是新建一个提交与要撤销到的位置内容相同。git reset name:将当前分支移动到指定name位置(一般用于撤销不再需要的提交)git branch -d name:删除名为name的分支(不能是当前选中的分支)git checkout bb92e0e:切换到编号为bb92e0e的分支。git checkout name:切换到名为name的分支。git branch name:建立名为name的分支。..
2022-08-31 12:18:38
277
原创 JVM 7-垃圾回收(重点)
1、垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。2、如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致。......
2022-08-11 11:34:09
399
原创 JVM 6-对象实例化
new:最常见的方式、单例类中调用getInstance的静态类方法,XXXFactory的静态方法2、r的newInstance(Xxxx):反射的方式,可以调用空参的,或者带参的构造器3、使用clone():不调用任何的构造器,要求当前的类需要实现Cloneable接口中的clone方法4、使用序列化:序列化一般用于Socket的网络传输5、第三方库2、为对象,就有了内存地址3、(堆空间绝大部分空间是共享的,多个线程访问会有线程安全的问题)......
2022-08-10 23:32:27
203
原创 JVM 5-方法区
1、线程私有结构:程序计数器、虚拟机栈、本地方法栈2、每个虚拟机栈由由具体的栈帧组成3、方法区在 JDK7 之前,使用永久代实现,在 JDK8 之后,使用元空间实现4、Minor GC 针对于新生区,Major GC 针对于老年区,Full GC 针对于整个堆空间和方法区。...
2022-08-10 23:23:24
232
原创 JVM 3-线程 程序计数器&虚拟机栈
6、如果当前方法调用了其他方法,方法返回之际,当前栈帧会传回此方法的执行结果给前一个栈帧,接着,虚拟机会丢弃当前栈帧,使得前一个栈帧重新成为当前栈帧(主管Java程序的运行,它保存方法的局部变量(8 种基本数据类型、对象的引用地址)、部分结果,并参与方法的调用和返回。对一个函数而言,它的参数和局部变量越多,使得局部变量表膨胀,它的栈帧就越大,以满足方法调用所需传递的信息增大的需求。不是,一定程度减少了内存溢出的概率,但是会挤占其它的空间,因为整个虚拟机的内存空间是有限的,会出现OOM。.........
2022-08-09 21:59:14
182
原创 JVM 2-类加载器
类加载器子系统作用:1.从文件系统或者网络中加载Class文件2.ClassLoader只负责class文件的加载,至于它是否可以运行,由Exception Engine决定3.加载的类信息存放在JVM方法区 当我们执行下面一段代码,它的加载过程是怎样的呢:1.要执行main方法就要先加载承载它的类HelloLoader2.加载成功则进行链接、初始化,完成后即可调用main3.加载失败抛出异常 完成流程为:加载,链接(验证、准备、解析),初始化流程:1.获取类的字节流,通过类的全类名2.
2022-08-08 23:37:03
145
原创 Java 集合框架
我们知道HashSet保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序?在HashSet下面有一个子类LinkedHashSet,它是链表和哈希表组合的一个数据存储结构。
2022-08-08 22:49:52
181
原创 Java 锁的分类 JUC和CAS
悲观锁,认为数据很容易被其他线程修改,为保证数据正确性,每次获取并修改数据时,对数据加锁。例如synchronized和Lock相关类。乐观锁,认为自己在操作时不会有其他线程干扰,所以不对被操作对象加锁。在更新时会判断修改期间是否有其他线程修改过,可以使用版本号机制和CAS算法实现。。如果没被修改过,则表示只有当前线程在操作,正常修改数据。如果数据被其他线程修改过,则会停止刚才的更新,选择执行策略,例如抛弃、报错、重试等。从上面对两种锁的介绍,我们知道两种锁各有优缺点,不可认为一种好于另一种乐观锁适用于写比
2022-08-06 23:01:58
333
原创 Java 线程池
比如: newSingleThreadExecutor() 创建一个只有一个线程的线程池,newFixedThreadPool(int numOfThreads)来创建固定线程数的线程池,newCachedThreadPool()可以根据需要创建新的线程,但如果已有线程是空闲的会重用已有线程。创建是一个单线程池,也就是该线程池只有一个线程在工作,所有的任务是串行执行的,如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它,1、线程池中的线程处于一定的量,可以很好的控制线程的并发量。......
2022-08-06 21:13:24
165
原创 Java wait、notify、notifyAll&线程的基本状态
换句话说,把wait、notify、notifyAll三者均解释为对实例对象的wait set的操作,会比说他们是对线程的操作更贴切,由于所有实例都会有wait set,所以wait、notify、notifyAll才会是Object类的方法。(这个obj也是对象,不是线程)则从wait set里的线程中挑出一个,唤醒这个线程。被唤醒的线程便退wait set。都有一个wait set,wait set是一个在执行该实例的wait方法时、操作停止的线程的集合它有点类似线程的休息室,而且每个实例都会有。...
2022-08-06 20:24:02
658
原创 Java 多线程 sychronized三种应用方式 与 Lock的区别
在 Java 中,关键字 synchronized可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),同时我们还应该注意到synchronized另外一个重要的作用,synchronized可保证一个线程的变化(主要是共享数据的变化)被其他线程所看到(注意代码中的increase4Obj方法是实例方法,其对象锁是当前实例对象,与increase的锁对象不同,所以不是同一把锁,不会互斥。),这点确实也是很重要的。.........
2022-08-06 16:47:16
412
原创 Java 线程之简单生产者消费者问题&Thread常用方法
在某些情况下,如果子线程里要进行大量的耗时的运算,主线程可能会在子线程执行完之前结束,但是如果主线程又需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()。a.join,在API中的解释是,在B线程中调用a.join(),堵塞当前线程B,直到A执行完毕并死掉,再执行B。Thread.yield(),表示暂停当前线程,执行其他线程(包括执行yield这个线程), 执行谁由cpu决定。1)使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。......
2022-08-04 21:55:33
265
原创 Java 进程,线程 线程的创建方法
进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)1、一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程(通常说的主线程)。的最小单位,重点在系统调度和单独的单位,也就是说进程是可以独立运行的一段程序。2、资源分配给进程,同一进程的所有线程共享该进程的所有资源。,他是比进程更小的能独立运行的基本单位,线程自己基本上。4、CPU是分给线程,即真正在CPU上运行的是线程。.....
2022-08-04 20:56:24
409
原创 Java 反射 简单介绍 易懂
众多的类 -----> Class类:任何一个类里面都包含这些东西:Field[]、Constructor[]、Method[]并且对于任意一个对象,都能够调用它的任意一个方法;不看不知道,一看,可不就是吗,基本上普通的类都是这么构成的,这样,我们把这些类,类的属性,构造方法,普通方法分别抽象出来又组成了新的类。...............
2022-08-02 21:31:28
276
1
原创 Java IO流
即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。- 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。什么情况下使用字符流:如果读写的都是字符数据,这时候我们就使用字符流。上边看了这么多都是字符流,字符流确实适合对文本的输入输出,下面我们看一下字节流。通过上边的学习,基本上明白了输入流输出流是什么,以及基本语法了吧。....
2022-08-02 20:38:08
641
原创 Java实现 快速排序(递归)及两种优化
每轮递归时,仅对较短的子数组执行哨兵划分partition(),就可将最差的递归深度控制在O(logN)(每轮递归的子数组长度都≤当前数组长度1/2),即实现最差空间复杂度O(logN)。由于普通快速排序每轮选取「子数组最左元素」作为「基准数」,因此在输入数组完全倒序时,partition()的递归深度会达到N,即最差空间复杂度为O(N)。对于某些特殊输入数组,每轮哨兵划分操作都将长度为N的数组划分为长度为1和N-1的两个子数组,此时递归轮数达到N。...
2022-07-26 21:36:26
1127
原创 JDBC开发基本步骤和简单封装&PreparedStatement和Statement的区别&sql注入
例如MySql公司实现了MySql驱动程序里面实现了这套接口,Java程序员只要调用实现了这些方法就可以实现对MySql数据库的增删改查。PreparedStatement可以使用预编译的sql,只需要发送一次sql语句,后面只要发送参数即可,公用一个sql语句。通过将恶意的Sql查询或添加语句插入到应用的输入参数中,再在后台Sql服务器上解析执行进行的攻击.可以看到--后的都被注释掉,这样可以直接查出所有的user表的信息,即为不安全.Statement只能使用静态的sql。...
2022-07-26 20:00:37
335
原创 Java 异常Exception
这意味着程序存在bug,如数组越界,0被除,空指针....这类异常需要更改程序来避免,Java编译器强制要求处理这类异常。如果抛出运行时异常,是要根据抛出的异常的信息去分析程序的错误,在写代码时候绝大部分情况下不去try-catch运行时异常。比如读取一个硬盘上图片,读取的代码逻辑是正确的,但是这个图片所在的硬盘可能出现坏道,就没法读取这个文件,需要检查的代码(可能会抛出异常,也可能不会抛出异常)需要检测的代码(可能会抛出异常,也可能不会抛出异常)}catch(异常的类型2异常类型的变量2){.......
2022-07-18 21:58:59
299
原创 数据库设计三范式
如果确定一个表中的某个数据(A),则就可以确定该表中的其他另一个数据(B),则我们说B依赖于A。每个范式,都是用来规定某种结构或数据要求——后一范式都是在前一范式已经满足的情况用来“部分依赖是指某个非主键字段,依赖于联合主键字段的其中部分字段。实际上,一个表只要有主键,则其他非主键一定是依赖于主键的。范式,就是规范,就是指设计数据库需要(应该)遵循的原则。C依赖B,B依赖A——这就是传递依赖。设计数据库,其实就是设计表(多个表)消除非主键依赖联合主键中的部分字段。非主键值不依赖于另一个非主键值。...
2022-07-18 21:19:20
318
原创 Java错题笔记
两个数组用equals方法比较时,会逐个便利其中的元素,对每个元素进行比较(对)可以二维数组,且可以有多维数组,都是在Java中合法的(对)4.数组是一个对象,不同类型的数组具有不同的类(对)JAVA程序中可以有多个名字为main方法(对)JAVA程序中类名必须与文件名一样(错).........
2022-07-15 19:22:30
972
原创 Java中代码执行顺序
1)父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。(2)子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。(3)父类实例成员和实例初始化块,按在代码中出现的顺序依次执行。(5)子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。(4)执行父类构造方法。(6)执行子类构造方法。...
2022-07-14 22:01:21
523
原创 java String常量池与常用API
如果常量池里面没有这个字符串对象,java就帮你在常量池里面new一个"如果常量池里面有这个字符串,就把这个字符串的地址赋给这个变量。jdk1.8之后常量池放到堆,在常量池里面找有没有这个""双引号括起来的字符串常量字符串,...
2022-07-14 21:44:14
85
原创 java 设计模式-单例模式
1.Windows的TaskManager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windowstaskmanager吗?4.应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。保证类仅有一个实例最好的办法就是,让类自身负责保存他的唯一实例。单例模式保证只有一个实例,就要保证外不能随便的new这个对象,所以要。所以又叫“懒汉式”(也就是在用到的时候才去实例化)..............
2022-07-14 21:27:29
153
原创 Java中的static静态变量和静态方法 简单介绍
一般来说我们要修改一个属性或者调用一个方法,必须要new一个对象实例,通过对象来调用。2、静态的方法中不能写this、super关键字(因为当前的对象实例可能还没有创建,1、静态的方法只能访问静态的方法和静态的属性(因为当前对象的实例可以没有创建,非静态的属性和方法(实例属性和方法)必须通过new对象访问,而静态的属性和方法。是属于类的,在类加载到内存中就可以访问(类名.方法名),被所有对象所共享。所以静态的方法是没办法调用非静态的方法和属性的)这种属性/方法,可以称作实例属性/方法。...
2022-07-14 21:11:47
932
原创 java 抽象类 接口 final 简单介绍
对于一些父类中准备重写的方法,如上一篇多态中提到的Cal类中的getResult(),并没有具体实现,只是为了不报错写了一个return0;1、接口是一个纯粹的抽象类,接口里面的方法都是抽象方法publicabstract。子类必须实现这个抽象方法,如果子类不想实现这个方法,那么这个子类也必须要变成抽象类。1、抽象方法是没有方法体,如果这个类里面有抽象方法,这个类必须变成抽象类。4、如果一个类是抽象类,那么这个类就不能被new实例化,只能被其他类继承。final方法这个方法就不能被重写。...
2022-07-14 21:05:34
584
原创 Java 多态简单介绍
父类定义两个num和一个geResult()方法,此方法并没有具体实现。如果子类重写了getResult()方法,调用的就是子类中的方法。如果子类重写了getResult()方法,调用的就是子类中的方法。加减乘除四个子类继承父类Cal并重写geResult()方法。多态声明成父类类型,指向不同的子类对象,能实现不同的重写方法。声明成父类类型,指向不同的子类对象,能实现不同的重写方法。如果没有重写,调用的就是父类中的方法。如果没有重写,调用的就是父类中的方法。3.父类引用指向子类对象。.........
2022-07-14 20:57:06
112
原创 java 继承 重载 重写
2、intshow(inta,doublec,charb){}是重载,参数顺序不一样,和返回值无关。1、voidshow(intx,chary,doublez){}不是重载,是同一个方法。3、voidshow(inta,doublec,charb){}是重载,参数顺序不一样。2、如果父类是private的方法,子类是默认方法,那么子类是不知道这个方法的,不是覆盖。重载(Overload)同一个类中看同名方法的参数列表。...
2022-07-14 20:50:46
248
原创 java 构造方法
super与this类似,在子类构造方法中调用,代表父类中的构造方法,也是必须放在第一行。1、构造方法是在new对象的时候运行,而一般的方法是在对象调用的时候才执行。如果不写任何构造方法,系统默认提供一个无参数构造方法,只是我们看不到而已。2、一个对象的建立,构造方法只执行一次,而一般方法可以被改对象调用多次。所以说如果自己写了一个带参数的构造方法,就要把无参数构造方法也要写上。如果自己写了任何一个构造方法,系统就不会提供这个默认无参构造方法。(后面使用或者学习的一些框架要new这个无参数的构造方法)...
2022-07-14 20:45:24
476
原创 java 随机数random
返回一个伪随机数,它是取自此随机数生成器序列的、在0(包括)和指定值(不包括)之间均匀分布的int值。返回[0.0,1.0)的随机数,double类型,经过变换得到想要的随机数。
2022-07-14 20:41:28
765
原创 java零基础——while循环语句
while循环语句不断重复某件工作,有明确的结束条件while循环大多数用在不明确循环次数的情况下语法:while(继续循环的条件) { 循环体 }int num=0;//计数器 while(num<10) { System.out.println("---------"+num); num++; }输出:---------0---------1---------2---------3---------4---------5--------
2021-12-14 20:50:11
421
原创 java零基础——break和continue
break和continue都是逻辑控制语句。break:跳出循环体。也就是结束循环体,执行之后直接结束所在的一层循环执行循环下边的语句。continue:结束本次循环直接进行下次循环。它并不会结束整个循环体而是直接执行下一次循环。举个例子:...
2021-12-14 19:35:32
350
原创 Java零基础——switch语句
作用:多分支选择语句,判断表达式的值跳到符合语句开始执行。switch语句跟if——else语句都是多分支选择语句,不同的是switch只能匹配值不能范围判断,也不能做不等于的判断。一般用法:int num=2; switch(num) { case 1: System.out.println("num变量的值是1"); break; case 2: System.out.println("num变量的值是2"); break;
2021-12-11 15:04:54
477
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人