- 博客(41)
- 收藏
- 关注
原创 2.线上论坛项目
本项目是一个功能丰富的线上论坛,用户可编辑、发布、删除帖子,并评论、点赞。帖子按版块分类,方便查找。同时,用户可以修改和展示个人信息,还能发送私信与其他用户交流。
2024-06-16 18:31:11
1001
原创 3.UI自动化测试中的PO模式
PO模式是一种将某个页面的所有元素对象定位和对元素对象的操作封装成一个Page类的设计模式。它强调以页面为单位来编写测试用例,实现页面对象和测试用例的分离。
2024-06-12 22:00:18
484
原创 27.Java中单例模式的实现方式
枚举是实现单例模式的最佳方式,将单例对象定义为一个枚举类型,这种实现方式可以保证线程安全,同时也可以防止反射、反序列化破坏单例模式。
2024-05-23 01:42:32
538
原创 26.synchronized和ReentrantLock的区别
ReentrantLock可以实现选择性通知(借助Condition接口和NewCondition()方法实现,在一个Lock对象中创建多个Condition实例(对象监视器),线程可以注册在指定的Condition中,signal()方法会唤醒一个等待在该Condition上的线程,而signalAll()方法会唤醒所有等待在该Condition上的线程,从而实现有选择性的线程通知。),而synchronized不行,只能随机唤醒一个线程notify(),或者全部唤醒notifyAll()。
2024-05-19 23:35:55
287
原创 1.对IOC和DI的理解
在传统的应用程序中,对象的生命周期和对象间的依赖关系通常是由程序自身来负责。而在 IOC 中,对象的生命周期和对象间的依赖关系是由容器来负责,通过这种方式,对象之间的依赖关系变得更加灵活和可配置。DI(Dependency Injection,依赖注入),它是IOC的一种实现方式。(就是容器在实例化对象的时候,把这个对象所依赖的类注入给它。使用IOC最大的好处是降低耦合度,硬编码会造成对象间的过度耦合,而使用IOC后,可以降低使用资源双方之间的依赖程度。
2024-05-19 21:32:31
216
原创 22.HashMap的底层数据结构
其中,桶数组是用来存储数据元素,链表是用来解决冲突(哈希冲突:多个键通过哈希函数处理后得到相同的哈希值),红黑树是为了提高查询的效率。
2024-05-15 17:55:47
258
原创 3.TCP的三次握手和四次挥手
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。在传输数据前通信双方必须建立连接(所谓连接,是指客户端和服务端各自保存一份关于对方的信息,比如ip地址,端口号等)。2.序列号(Sequence number):占32位,用来标识从TCP源端向目的端发送的字节流。1.源端口和目的端口(Source port,Destination port):这两个字段用来标识发送端和接收端的端口号,占16位。4.标志位:占6位,包含URG、ACK、PSH、RST、SYN、FIN等标志。
2024-05-15 02:22:38
1509
原创 21.JVM的垃圾回收算法
标记-整理算法是在标记-清除算法的基础上进行改进,它的标记阶段与标记-清除算法一样,但后续不是直接清除可回收对象。而是将所有存活的对象移动到内存空间的一端,然后直接清理掉边界以外的内存空间。当这块区域用完了,就将还存活的对象复制到另一块区域,然后把使用过的这一块内存区域一次性清理掉。进行垃圾回收过程中会涉及对象的移动,那么为了保证对象引用更新的正确性,必须暂停所有的用户线程。b.清除阶段:会再次遍历所有的对象,回收被标记了的对象。a.标记阶段:会遍历所有的对象,标记出需要回收的对象。
2024-05-13 00:25:09
369
原创 20.并发,并行,串行之间的区别
并发就是在同一时刻,只有一个线程在执行,但是在一个时间段内,从整体上看是多个线程同时执行了。(并发的实现依赖于CPU切换线程,因为切换的时间特别短,所以用户基本上是感知不到的)并行就是在同一时刻多个线程都在同时执行。(要求有多个CPU分别执行一个线程)串行就是一个线程执行完,再执行另一个。
2024-05-12 23:30:29
120
原创 18.异常的处理方式
是指遇到异常并不进行具体的处理,而是向上抛给上层调用者。b.throws,用在方法上,来声明可能会抛出的异常类,可以声明多个。a.throw, 用在方法里面显式地抛出异常对象。c.系统自动抛异常。
2024-05-10 00:09:37
360
原创 17.Java中的异常体系
b.RuntimeException运行时异常,程序运行时出现的异常,比如空指针异常(NullPointerException),数组下标越界异常(ArrayIndexOutOfBoundsException)等。Error是系统内部错误,这些错误通常是由Java虚拟机抛出的,程序无法捕获和处理。比如有栈溢出(StackOverflowError),内存溢出(OutOfMemoryError)。a.CheckedException受检异常,编译器会强制检查并要求处理的异常。
2024-05-09 23:34:18
154
原创 14.List和Set的区别
List的实现类有 ArrayList,LinkedList,Vector。Set的实现类主要有HashSet,TreeSet。
2024-05-06 00:34:17
203
原创 13.ArrayList和LinkedList的区别
因为ArrayList基于数组实现,get(index)直接通过数组下标获取,时间复杂度为O(1);LinkedList基于双向链表实现,get(index)需要遍历链表,时间复杂度为O(n)。ArrayList的增删,如果是在数组末尾,直接插入或删除即可,但是如果在数组中间位置,则需要移动元素,而且还有可能触发扩容操作。LinkedList基于双向链表,无法根据序号直接获取元素,不支持随机访问。ArrayList基于数组实现,LinkedList基于双向链表实现。
2024-05-05 23:55:36
255
原创 12.重载和重写的区别
a.被 final(final关键字用于防止被修改),static(静态方法属于类本身),private(私有方法,只能在自己类中访问,子类访问不到)修饰的方法不能被重写。b.子类返回值范围小于等于父类,抛出异常范围小于等于父类,访问修饰符范围大于等于父类。重写发生在子类与父类之间,子类重写父类的方法,方法名和参数列表相同。重载在同一类中,方法名相同,参数列表不同。a.返回类型和访问权限没有限制。
2024-05-05 23:12:43
212
原创 11.==与equals的区别,hashCode与equals之间的关系
而在hashMap的源码中,是先通过hashCode方法获取对象的哈希值,比较两个对象的hash值是否相等,再通过equals方法来进行比较。一旦重写了equals方法,即不再用对象内存地址比较,有自定义的比较规则,那么为了保持这两个方法比较对象是否相等结果的一致性,所以也必须重写hashCode方法,让它不再通过对象的内存地址来获取哈希值,而是自定义其获取哈希值的方式,来实现两个对象使用equals方法比较为true 那么通过hashCode方法获取它们的hash值也必须相等。
2024-04-28 22:48:38
807
原创 10.String,StringBuffer,StringBuider之间的区别
String是引用类型,被final修饰,无法被继承。String的值创建后就不能被修改,任何对String值的修改都会引发新的String对象的生成。StringBuffer与String类似,但它的值可以被修改,使用Synchronized来保证线程安全。StringBuider是StringBuffer的线程不安全版本,但它的性能更高。
2024-04-28 21:43:55
174
原创 9.JDK,JRE,JVM之间的区别
JRE(Java Runtime Environment)Java运行时环境,是运行已编译Java程序所需所有资源的集合,包括JVM,Java类库,Java命令和其他的一些基础构件。JVM(Java Virtual Machine)Java虚拟机,Java程序运行在Java虚拟机上。针对不同的系统有不同的JVM,所以Java语言可以实现平台无关性。JDK(Java Development Kit)Java开发工具包,拥有JRE拥有的一切,还有编译器和工具,能够创建和编译程序。
2024-04-28 21:23:42
303
原创 8.Java中创建线程执行任务的方式
3.实现Callable接口,重写call方法,可以通过FutureTask来获取任务执行的返回值。1.继承Thread类,重写run方法,调用start()启动线程。以上两种方式没有返回值,要获取线程的执行结果,可以。2.实现Runnable接口,重写run方法。
2024-04-23 22:36:04
137
原创 7.对象的创建过程
5.然后设置对象头,对象头里包含了对象是哪个类的实例、如何找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。2.检查这个符号引用代表的类是否已被加载、解析和初始化过,如果还没有,就执行相应的类加载过程。4.内存分配完成之后,JVM将分配到的内存空间(其中不包括对象头)都初始化为零值。1.首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用。3.类加载检查通过后,JVM就会为这个新生的对象分配内存。
2024-04-23 21:43:03
268
原创 6.类加载器,类加载过程,类的生命周期
用户自定义类加载器(user ClassLoader),用户通过继承 java.lang.ClassLoader类的方式自定义实现的类加载器。
2024-04-22 17:50:26
347
原创 2.TCP保证传输可靠性
TCP主要提供了连接管理,校验和,序列号/确认应答,流量控制,最大消息长度,超时重传,拥塞控制等方式实现可靠性传输。
2024-04-20 12:18:37
256
1
原创 1.OSI七层模型,TCP/IP四层模型
在物理层提供比特流(二进制位组成的数据流,是计算机处理和传输数据的最基本形式)服务的基础上,建立相邻节点之间的数据链路。为源端与目的端之间提供可靠的透明数据传输,传输层协议为不同主机上运行的进程提供逻辑通信。确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。将网络地址翻译成对应的物理地址,实现不同网络之间的路径选择。OSI七层模型是国际标准化组织制定的一个用于计算机或通信系统间互联的标准体系。应用层协议定义的是应用进程间通信和交互的规则。建立、管理、终止会话,是用户应用程序和网络之间的接口。
2024-04-20 10:21:21
192
原创 4.常见典型锁策略
乐观锁认为锁竞争是不激烈的,即是多个线程同时访问同一个共享变量冲突的概率是较小的,所以并不会真正地去加锁,而是直接尝试去访问数据。(其中写锁是只能被独占的,读锁是可以被共享的)实现的方式是:在锁中记录持有该锁的线程身份以及一个计数器来记录该线程的加锁次数,如果发现当前尝试加锁的线程就是此时持有锁的线程,则计数器+1即可。自旋锁的优点是:没有放弃CPU资源,一旦锁被其它线程释放就能第一时间获取到锁,更高效,在锁持有时间比较短的场景下非常有用。悲观锁的实现:先加锁,获取到锁再去操作数据,获取不到锁就等待。
2024-04-18 10:43:22
406
原创 3.CAS机制
CAS叫做CompareAndSwap,比较并交换,主要是通过处理器的指令来保证操作的原子性。CAS指令包含3个参数:共享变量的内存地址、预期的值、该共享变量要设置成的新值。只有当共享变量内存地址处的值等于预期的值时,才能将该共享变量设置成新值。作为一条CPU指令,CAS指令本身是能够保证原子性的。
2024-04-16 19:28:48
266
原创 2.常见的Java集合
集合相关的类和接口都在Java.util中,主要分为三种: List(列表)、Set (集)、Map (映射)。Map是另外的接口,是键值对映射结构的集合。List:存储的元素是有序的,可重复的。Set:存储的元素是无序的,不可重复的。
2024-04-08 23:09:08
113
原创 1.理解Java面向对象
多态是指程序中定义的引用变量所指向的具体类型和通过这个引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。子类拥有父类所有的属性和方法(包括私有属性和私有方法),但是对于父类中的私有属性和私有方法,子类只是拥有,无法访问。Java中有两种形式实现多态:继承(多个子类对父类同一方法的重写)和接口(实现接口并重写接口中的同一方法)。继承是使用已经存在的类作为基础创建新的类,子类继承父类的属性和方法,也可以增加新的属性和方法。可以把一个对象的属性私有化,同时可以对外界提供一些访问属性的方法。
2024-04-08 22:45:33
271
原创 进程(计算机基本组成,操作系统,进程,线程)
记录自己学习,哪里有问题,请和我说一下.简单介绍现代计算机的组成,操作系统的概念及其工作,还有进程与线程相关概念。CPU 中央处理器: 进行算术运算和逻辑判断.存储器: 分为外存(硬盘)和内存, 用于存储数据(使用二进制方式存储)输入设备: 用户给计算机发号施令的设备.输出设备: 计算机个用户汇报结果的设备.
2023-04-07 12:26:15
118
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人