自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(69)
  • 收藏
  • 关注

原创 The path to the driver executable must be set by the webdriver.edge.driver system property

selenium设置驱动

2022-10-12 20:33:39 1939

原创 cookie 和session

首先明确HTTP是一个无状态的协议(这里的无状态指的是对处理事务没有记忆能力,每次客户端和服务端完成会话之后,服务端不会保存任何的会话信息):每一次的请求都是完全独立的,服务端无法确认当前访问者的身份信息(我只知道你让我干什么,但是我不知道你是谁),所以服务端为了进行会话跟踪(知道是谁在让我做事),就要进行一系列的操作来明确不同的请求是否来自于同一个浏览器,那这个操作就需要通过cookie和session来去实现。cookie :cookie是存储在客户端的,它是服务器发送给浏览器并且保存在客户..

2021-10-11 09:03:59 179

原创 Java对象类型转换:向上转型和向下转型

向上转型父类引用指向子类对象称为向上转型其实就是把子类对象直接赋给父类引用,不用进行强制转换。使用向上转型可以调用父类类型中的所有成员,在进行编译时会进行静态绑定,对象与指定的类型进行方法绑定调用某个方法,究竟执行哪一段方法,要看这个引用指向的是父类还是子类对象,这个过程是在运行时决定的,因此称为 动态绑定。向下转型与向上转型相反,子类对象指向父类引用就是向下转型向下转型可以是调用子类类型中的所有成员,不过需要注意的是如果父类引用对象指向的是子类对象,那么在向下转型的过程的过程中

2021-09-27 23:30:51 943 2

原创 JVM垃圾处理方法

目录标记-清除算法不足之处:复制算法优缺点:复制算法的空间分配担保标记整理算法标记-清除算法这个算法是最基础的垃圾处理算法,算法分为 标记 清除 两个阶段:首先标记处所有需要回收的对象,在标记完成后统一回收所有被标记的对象,后续的所有算法都是对这种算法的改进不足之处:①效率不高:标记和清除都没有很高的效率②空间问题:标记清除后会产生大量的不连续的内存碎片,空间碎片会导致在程序运行时如果需要较大内存的对象的时候没有足够的连续内存,所以又得再一次...

2021-08-22 18:15:22 341

原创 常见的锁策略

乐观锁和悲观锁乐观锁:乐观地认为数据一般不会产生并发冲突,所以再在正式提交更新的时候才会对是否发生冲突进行检测,如果发生冲突,则让返回用户错误的信息,让用户决定如何去做悲观锁:悲观地认为每次拿数据的时候都会被别人修改,所以每次拿数据的时候都会上锁,别人想要拿到这个这个数据就必须等到锁释放。乐观锁只能适用于冲突较少的场景悲观锁由于需要竞争锁,所以性能不高读写锁多线程之间,如果只是涉及到读操作的话不会引起线程安全的问题,但数据的写入和读之间都需要进行互斥。如果都加锁,会产生极大的性能损耗

2021-08-19 19:05:48 125

原创 关于线程的一些操作

获取当前线程的引用对象Thread.currentThread();返回当前对象的引用休眠当前线程①Thread.sleep(long mills)②Thread.sleep(long mills,int nanos)

2021-08-19 18:12:55 117

原创 线程的生命周期

新建和就绪状态当使用new关键字创建了一个线程之后,该线程就处于新建状态,此时Java虚拟机就会给他分配内存,并且初始化成员变量的值。当对象调用了start()方法之后,这个程序就会处于就绪状态,它就有了自己的方法调用栈和程序计数器,处于这个状态的线程并不是立即开始运行,至于什么时候运行取决于调度器。...

2021-08-19 16:22:03 101

原创 start 和 run

启动线程时我们使用的时start()方法,而不能使用run()方法;调用start()方法时,系统会将run()方法作为线程执行体系来进行处理调用run()方法时,run()方法会直接运行,而在run()方法执行结束之前其他的线程无法并发执行也就是说,如果直接调运run()方法,系统会把线程对象当作一个普通对象,而不是线程对象此时的run()方法就是一个普通方法,不是线程的执行体系。...

2021-08-19 15:53:11 131

原创 进程和线程

定义:几乎所有的操作系统都支持同一时间执行多个任务,这个任务通常就是一个程序,当一个程序运行时,可能会有多个执行流,那我们就可以认为,程序就是就是一个进程,每个执行流就是一个线程。进程和线程之间的关系:线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须拥有它的父亲进程。 线程可以拥有自己的堆栈、自己的程序计数器和自己的局部变量,可以与其他线程共享进程所拥有的资源。通过相互之间的配合来完成进程所要完成的任务。 线程是独立运行的,它并不直到是否有其他线程的存在,线程 的执行是抢占式..

2021-08-19 15:36:26 101

原创 接口interface

接口的概念:如果说抽象类是多个类抽象出来的模板,那么接口就是更加抽象的“抽象类”,即规范,在接口中,不能包含普通方法,只能包含抽象方法。定义接口的时候,我们使用的是interface关键字,基本语法如下:{修饰符}interface 接口名 extends 接口1,接口2{常量;抽象方法;内部类;默认方法,类方法;....}接口的修饰符可以是public或者省略,省略的话默认default,包访问限制,即只有在相同的包里面才能进行访问 一个接口可以继承多个接口,但是接口只

2021-08-19 09:50:53 182

原创 abstract抽象类

在我们定义某一个类的时候,往往会为这些类定义一些方法,这些方法用于描述该类的行为,都有具体的方法体。在发生继承时,父类只直到子类应该继承哪些方法,但是并不直到子类是如何实现这些方法的(重写)。既然不知道子类时如何实现这些方法的,那么干脆就可以不用管,使用只有方法名,而没有实现方法的抽象方法。抽象方法和抽象类:必须用abstract修饰符来进行修饰,有抽象方法的类只能被定义为抽象类,抽象类里面可以没有抽象方法。 抽象方法必须没有方法体 抽象类不能被实例化 抽象类可以包含成员变量,方法(这里的

2021-08-16 11:40:41 261

原创 Java的访问控制符

Java提供了三个访问控制符:private、protect、public,还有一个不加任何任何访问控制符的访问控制级别 default,一共就是4个访问控制级别。java的访问控制级别由小到大如下所示:注意:default并没有对应的访问控制符,当没有访问控制符来修饰类或者类成员时,系统默认使用default修饰。四个访问控制级别的具体介绍如下:private(当前类访问)如果类里的一个成员(包括成员变量、方法和构造器等)使用private访问修饰符来修饰,则这个成员变量只能在当.

2021-08-16 09:30:54 884

原创 可以重写static方法和private方法吗

当然是不能的static方法 可以被继承,但是不能被重写首先static方法是编译时静态绑定的,而方法重写时基于运行时动态绑定的。static方法跟类的实例无关,只跟类有关虽然不能被重写,但是可以被继承 ,可以在子类中通过 父类类名.方法名 的形式进行访问,如果父类和子类中拥有相同名称和参数的静态方法,那么该子类其实是隐藏了从父类继承过来的静态方法,这是属于子类自己的方法,而不是重写。通俗的讲就是,这两个方法是两个没有关系的方法,具体调用哪个就要看是哪个对象的引用,不存在多态的性质.

2021-08-14 21:23:07 1961

原创 重载和重写的区别

重载:定义:编译时多态,即同一个类中具有多个名字相同的方法。这些方法具有不同的参数列表,不能根据返回值类型进行区分;就是:针对同一个类,方法名相同方法参数不同(个数和类型不受限制)至于其他部分(返回值类型,修饰符等)跟重载没有关系示例:public class Main { public static void test(){ System.out.println("无参数的test方法"); } public

2021-08-14 20:58:00 105

原创 二叉树习题

一、判断两个二叉树是否相同100. 相同的树 - 力扣(LeetCode) (leetcode-cn.com)如果当前节点都为null,返回true;如果有一个为null,另外一个不为null,返回false;如果对应位置的val不同,返回fasle;递归遍历左子树和右子树。public boolean isSameTree(TreeNode p, TreeNode q) { if(p==null&&q==null)return true; .

2021-08-14 16:43:29 207 1

原创 二叉树的前序中序后序遍历

所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作 依赖于具体的应用问题(比如:打印节点内容、节点内容加1)。 遍历是二叉树上最重要的操作之一,是二叉树上进 行其它运算之基础。在遍历二叉树时,如果没有进行某种约定,每个人都按照自己的方式遍历,得出的结果就比较混乱,如果按照某种 规则进行约定,则每个人对于同一棵树的遍历结果肯定是相同的。如果N代表根节点,L代表根节点的左子树,R代 表根节点的右子树,则根据遍历根节点的先后次序有以下遍历方式:

2021-08-12 10:14:14 257

原创 微信红包测试用例

针对私发红包:1.功能①红包钱数精度为两位小数,直接输入小数点会不会自动补0,当输入钱数为0时,“塞钱进红包”置为灰色②红包输入的前述超过最大钱数时是否会有提示③红包描述可以输入正常字符,是否可以输入数字,汉字,英文,表情,检查他们是否可以任意搭配,各种字符最多的限制是多少,在输入后,是否可以进行修改④红包的金额数字,描述是否可以复制粘贴⑤点击塞钱进红包是否可以跳出支付界面⑥是否可以选择支付方式,余额不足的时候会不会自动匹配⑦是否支持密码和指纹支付密码输入错误是否会提示,指纹验证错误是否会提

2021-08-11 15:12:16 1146

原创 JDK、JRE、JVM

JDK(JavaDevelopmentKit):是Java开发工具包,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。JRE(Java Runtime Environment,Java运行环境),包含JVM标准实现及Java核心类库。 JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。通过它,J...

2021-08-10 23:08:05 115

原创 面向对象的三大特性 封装、继承、多态

封装:通常认为封装是把数据和操作数据的方法封装起来,它指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类提供的方法实现对内部信息的操作和访问。封装是面向对象编程语言对客观世界的模拟,在客观世界里,对象的状态信息都被隐藏在对象内部,外界无法直接做出修改。对一个类实现良好的封装,可以实现以下目的:①隐藏类的实现细节②让使用者只能使用预先提供的方法进行访问,从而可以在实现方法时加入一些逻辑,限制不合理访问③可以进行数据检查,有利于保证数据的完整性和可维护性

2021-08-10 22:53:27 220

原创 什么是面向对象?面向对象和面向过程的区别

面向对象的编程是以对象为中心,以消息为驱动。面向对象是一种基于面向过程的编程思想,是计算机向现实世界模型的自然延伸,说白了就是“万物皆对象”。在现实世界中任何一种物体都可以归为一类是事物,而每一个个体都是一类事物的实例,这就是类和实例。面向对象编程与面向过程编程的区别:①编程思路不同:面向过程以实现功能的函数开发为主,使用函数来实现功能面向过程要首先抽象出类,类的属性,类的方法,然后通过实例化对象来完成功能②封装性:二者都具有封装性,但是面向过程封装的是类,面向过程封

2021-08-10 21:20:08 1623 4

原创 使用数组实现循环队列

622. 设计循环队列 - 力扣(LeetCode) (leetcode-cn.com)思路:①根据给出的k值创建数组arr,大小为k创建指针head表示头,tail表示尾,注意tail所指的下标不在队列之内size用来表示当前队列中的有效元素的数量②要添加一个元素时先判断队列是否为空,如果size=arr的长度了,队列已满,添加失败如果小于,直接给tail所在的位置进行赋值,size++,同时tail移动到 下一个位置(tail+1)% arr.length..

2021-08-10 20:55:54 203

原创 实现最小栈

155. 最小栈 - 力扣(LeetCode) (leetcode-cn.com)思路:①用两个栈来实现最小栈的功能 stack用来存储元素,min用来存储当前stack中最小的元素②push当要存储一个元素时,stack直接存储,比较当前值和min中栈顶元素的值的大小,如果当前值较小,则将这个值也存入min中,否则再存一次min的栈顶元素注意,如果min为空的话直接存储,当前值就是最小值class MinStack { Stack<Integer>sta.

2021-08-10 20:09:26 93

原创 用栈实现队列

232. 用栈实现队列 - 力扣(LeetCode) (leetcode-cn.com)思路;①准备两个栈 a,b②push 操作首先将a的所有元素按照出栈的顺序入b栈将元素放入a栈,然后将所有b里面的元素按照出栈顺序放回a栈这样就可以起到每次新加的元素都在栈底(后进后出)③pop 操作返回a栈栈顶元素④每次push操作后所有元素都在a栈,所以判断是否为空就是判断a栈是否为空class MyQueue { Stack<Integer&.

2021-08-10 19:52:58 84

原创 用队列实现栈

225. 用队列实现栈 - 力扣(LeetCode) (leetcode-cn.com)思路:①坑定使用两个a,b 队列实现栈②当执行push操作的时候,可以先将要push的元素放入b,让后将a的所有元素依次出队,同时依次入队b,这样就使push 的元素都在队列的首位,执行完上述操作后,交换a b,保证所有的元素都在a队列里面③pop 就是a出队列,top就是a的首位元素class MyStack { public Queue<Integer>.

2021-08-10 17:28:54 70

原创 有效的括号

20. 有效的括号 - 力扣(LeetCode) (leetcode-cn.com)思路:当遇到右边的括号的时候,判断栈顶元素是不是对应的左括号,如果是的话就弹出栈顶元素其他情况都是将这个元素入栈注意,在判断栈顶元素的时候,需要先判断栈是否为空,如果为空的话,也是直接入栈,其实这种情况可以直接返回falseclass Solution { public boolean isValid(String s) { Stack<Character&g.

2021-08-10 16:54:36 76

原创 力扣杨辉三角

118. 杨辉三角 - 力扣(LeetCode) (leetcode-cn.com)思路:如果我们把杨辉三角放在一个二维数组里面不难发现它的规律假设这个数组为arr,用 i表示行,用 j 表示列,那么arr[ i ][ 0 ] =1,arr[ i ] [ i ]=1,其余的arr[i] [j]=arr[i-1][j-1]+arr[i-1][j]①新建数组,用来存储杨辉三角里面的数字②根据以上推出的规律,得出每一行的数字,并且放入List当中③将每一行的list 放入总的l...

2021-08-10 16:06:39 148

原创 移除链表元素

203. 移除链表元素 - 力扣(LeetCode) (leetcode-cn.com)思路:①新建傀儡节点 newhead ,用来存储删除后的链表②遍历链表,存储拿到每个节点 cur 的next,然后将每个节点的next设为null;这样就能保证在加入链表时只加入当前的节点③根据val值是否相等如果相等,直接处理下一个节点 cur=curNext;不相等,加入链表,pre指向当前节点,cur指向curNext;public ListNode removeElements.

2021-08-10 15:41:10 72

原创 判断链表是否有环

142. 环形链表 II - 力扣(LeetCode) (leetcode-cn.com)①判断链表是否有环②此时slow和fast已经相遇,设头节点到环入口的距离为x,设换入口到相遇节点的距离为y,相遇节点到环入口的距离为z那么可以得出slow 走了x+yfast走了 x+y+(n-1)(y+z)fast每次走两个节点,slow每次走一个所以 (x+y)* 2 = x+y+(n-1)(y+z)化简之后:x = (n - 1) (y + z) + ...

2021-08-08 23:37:38 78

原创 判断链表是否有环

141. 环形链表 - 力扣(LeetCode) (leetcode-cn.com)思路:快慢指针跑得快的和跑的慢的如果相遇,那就证明有环,如果期间出现null,说明没有环因为fast跑得快,因此直接用fast来判断是否为空public class Solution { public boolean hasCycle(ListNode head) { if(head==null))return false; ListNode fast=head.

2021-08-08 23:22:19 69

原创 求相交链表的第一个公共节点

160. 相交链表 - 力扣(LeetCode) (leetcode-cn.com)思路:因为保证了有环,定义两个指针, 第一轮让两个到达末尾的节点指向另一个链表的头部,最后如果相遇则为交点(在第一轮移动中恰好抹除了长度差)两个指针等于移动了相同的距离, 有交点就返回, 无交点就是各走了两条指针的长度public class Solution { public ListNode getIntersectionNode(ListNode headA, Lis...

2021-08-08 22:41:27 79

原创 判断链表是否为回文结构

思路:①找到中间节点②反转中间节点之后的所有节点③如果是回文结构的话,如下图,按位判断节点的值是否相等import java.util.*;/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class PalindromeList { publi...

2021-08-08 22:19:35 72

原创 删除链表中的重复节点

删除链表中重复的结点_牛客题霸_牛客网 (nowcoder.com)思路:①定义傀儡节点newhead,指针pre指向newhead②遍历链表,如果当前节点 cur 的值和cur.next的值,如果相等 cur=cur.next 继续判断,直到不相等,此时用pre.next 保存cur 的下一个节点如果不相等,pre=pre.next.相当于是删除了中间的节点public ListNode deleteDuplication(ListNode pHead) { ..

2021-08-08 00:49:10 83

原创 链表—分割

链表分割_牛客题霸_牛客网 (nowcoder.com)思路:设置两个头,一个用来存放比目标值小的,另外一个用力啊存放比目标值大的,最后链接两个的目标值,记住最后一定要最后一个节点的next设为nullpublic ListNode partition(ListNode pHead, int x) { if(pHead==null)return null; ListNode small=new ListNode(-1); ListNod...

2021-08-08 00:07:10 92

原创 合并两个有序链表

21. 合并两个有序链表 - 力扣(LeetCode) (leetcode-cn.com)思路:①新建傀儡节点newHead,用于添加后续节点②遍历两个链表,比较第一个链表当前节点的值和第二个链表当前节点的值,较小的放在新链表末尾③遍历完成后,其中一个链表已经走完,将没走完的加到新链表的末尾public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode newHead=new ListNode(-

2021-08-07 23:44:50 78

原创 链表中倒数第K个节点

链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com)思路:还是快慢指针①既然是倒数第K个节点,那我就定义一个快指针,先让他跑k个节点,②定义一个慢指针,让他和已经跑了k个节点的快指针一起跑③快指针跑完了,慢指针就是倒数第K个节点 public ListNode FindKthToTail(ListNode head,int k) { ListNode slow=head; ListNode fast=head; ..

2021-08-07 23:27:39 49

原创 返回链表的中间节点

876. 链表的中间结点 - 力扣(LeetCode) (leetcode-cn.com)这道题可以直接用快慢指针做:①定义slow表示跑得慢的节点,一次只跑一个节点定义fase表示跑的快的节点,一次跑两个②同时起跑,只要fast到了终点,slow就是中间节点public ListNode middleNode(ListNode head) { if(head==null){ return null; } .

2021-08-07 23:09:47 131

原创 反转链表-leetCode 206

题目来源:206. 反转链表 - 力扣(LeetCode) (leetcode-cn.com)直接上思路:①新建一个傀儡节点newhead,newhead.next=head 就是链表的头节点;②遍历链表假如当前节点为cur新建节点 tmp=cur.next;将当前节点插入傀儡节点和链表之间,要注意这里的顺序cur.next=newhead.next;newhead.next=cur;cur=tmp;完整代码:public ListNode r...

2021-08-07 22:57:08 76

原创 顺时针打印数组

对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。首先坑定是使用模拟法,直接模拟,但是自己Debug了好几遍都是越界,越整越迷糊,整的脑袋瓜子嗡嗡的,于是,我突然有了个大胆的想法只要我拿到了全部的数字,直接跳出循环就好了,还管什么越界,不存在啊ok,上代码:public static int[]draw1(int[][]arr,int n ,int m ){..

2021-08-07 17:43:08 304

原创 经典动态规划---(马戏团)叠罗汉

OK,首先看题目描述:再看输入和输出描述:那通过审题我们可以得出以下结论:①每个人肩上的人满足以下几个条件a.身高和体重都比自己低 b.身高相等 体重比自己低满足以上条件之一就可以!!!!注意,体重相等,身高比自己低的人是不满足条件的!②求的是最大的层数那我的思路就是先把所有人都按身高从低到高进行排序,如果身高相等那么就按照体重从低到高排序。之后就是上升子序列的求法了,我们设每个人的值为dp[i],设一个max值记录最大层数①每个人的初始值dp[i..

2021-08-06 09:22:28 219

原创 向浏览器输入一个URL后,发生的事情

一、浏览器获取URL对应的请求 用户在地址栏输入了URL,地址栏会对用户输入的URL进行解析①如果不是正确的URL结构的字符串,浏览器就会使用搜索引擎直接进行搜索②输入的是URL结构的字符串,就会构建完整的URL结构字符串,浏览器就会使用这个URL进行通信,即IPC二、查询DNS获取IP 在网络进程接收到URl后,并不是马上对指定的URL进行请求。首先是使用DNS解析域名得到对应的IP。三、通过IP获得mac地址通过ARP解析IP得到对应的mac地址,即找到终端...

2021-08-05 17:20:46 135

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除