- 博客(47)
- 收藏
- 关注
原创 Java 数据结构:栈和队列
栈是一种遵循后进先出(LIFO, Last In First Out)原则的数据结构。想象一个叠放的盘子堆,你只能从顶部添加或移除盘子。栈的操作也类似,元素从栈顶添加(压栈)和移除(弹栈)。队列是一种遵循先进先出(FIFO, First In First Out)原则的数据结构。队列就像排队买票,先到的人先买票。队列的操作分别在两端进行:一端用于添加元素(入队),另一端用于移除元素(出队)。在Java中,我们可以利用Stack类、Queue接口及其各种实现类(如LinkedListArrayDeque。
2024-06-15 16:54:23 984 1
原创 深入理解Java中的链表:实现与应用
链表是一种线性数据结构,其中的元素通过指针(引用)连接在一起。数据域:存储数据。指针域:存储指向下一个节点的引用。链表是一种灵活且高效的数据结构,适用于需要频繁插入和删除操作的场景。在Java中,LinkedList类提供了对双向链表的支持,并且实现了List和Deque接口,使其成为一个功能强大的工具。内存分配:链表和节点对象在堆内存中分配。垃圾回收:未使用的节点由垃圾回收器自动回收。时间复杂度:插入和删除操作高效,但查找操作的时间复杂度较高。JVM优化。
2024-06-11 15:48:03 1036
原创 深入理解Java中的LinkedList:特性、用法及其优势
LinkedList是一个基于双向链表(Doubly Linked List)实现的集合类。它允许存储重复的元素,并且可以动态地调整大小。每个节点包含一个数据元素以及指向前后节点的引用。E data;// 节点数据// 指向下一节点的引用// 指向前一节点的引用LinkedList是Java集合框架中的一个重要类,基于双向链表实现,提供了灵活且高效的插入和删除操作。尽管其随机访问效率较低,但在需要频繁插入和删除、双向遍历以及实现栈和队列等场景下,LinkedList具有显著的优势。动态大小。
2024-06-10 17:29:18 1281
原创 如何解决ArrayList缺陷
在Java编程中,ArrayList是最常用的集合类之一。它提供了动态数组的实现,允许我们方便地存储和访问元素。然而,ArrayList也存在一些缺陷和局限性,这些问题在某些应用场景中可能会影响性能和灵活性。本文将探讨ArrayList的常见缺陷及其解决方案。
2024-06-10 16:40:57 819 2
原创 web开发之jQuery
jQuery由John Resig于2006年发布,旨在简化HTML文档遍历和操作、事件处理、动画以及Ajax交互。得益于其简单易用的API和强大的功能,jQuery迅速成为开发者的首选工具。jQuery第三方包。
2024-06-10 12:37:02 1028
原创 Java的封装
封装(Encapsulation)是面向对象编程(OOP)的四大基本特性之一,它旨在将对象的状态(成员变量)和行为(成员方法)绑定在一起,并对外隐藏内部实现细节,仅通过公开的接口与外界交互。本文将深入探讨Java中的封装,解释其原理、优势以及如何在实际开发中应用封装。
2024-06-09 14:05:41 666
原创 在Java中类中的成员变量和成员方法在jvm中如何协调调用及优化
优化JVM中类的成员变量和方法的性能是一个综合过程,需要考虑代码的设计、数据结构的选择、并发处理和内存管理等多个方面。通过合理的优化策略,可以显著提高Java应用程序的性能和可维护性。
2024-06-09 00:41:23 963
原创 对Java中二维数组的深层认识
上面已经说了数组是对象,并且它是一个特殊的一维数组,那么arr在一维数组中就是数组对象的引用,又因为二维数组是一个特殊的一维数组,那么拆分一下,是不是每一行arr[i]都是一维数组。则arr[0]就是第一行对象的引用,arr[1]就是第二行对象的引用。在Java中,数组是对象,二维数组是包含数组引用的数组。每个子数组都是有独立的对象,存储在堆内存中。这意味着各子数组可以有不同的长度,并且改变一个子数组不会影响到其他子数组。从上述运行结果我们不难看出,arr[i]就是一个对象的引用(即一个一维数组)
2024-06-09 00:04:16 399
原创 在Java中为什么对a赋值为10,在进行a++时还是等于10呢
不是在第二步有a++操作吗?保存当前a的值(即10);首先我们看这样一组代码。递增a,让a变成11;将a++返回的值赋给a。返回保存的值(10)
2024-06-08 15:12:19 178
原创 快速了解JVM机制
由于JVM的多线程是通过线程轮流切换并分配处理器执⾏时间的⽅式来实现,因此在任何⼀个确定的 时刻,⼀个处理器(多核处理器则指的是⼀个内核)都只会执⾏⼀条线程中的指令。因此为了切换线程后能恢复到正确的执⾏位置,每条线程都需要独⽴的程序计数器,各条线程之间计数器互不影响,独⽴ 存储。我们就把类似这类区域称之为"线程私有"的内存。
2024-06-03 18:42:08 1132
原创 IP协议1.0
基本概念:• 主机: 配有IP地址, 但是不进⾏路由控制的设备;• 路由器: 即配有IP地址, ⼜能进⾏路由控制;• 节点: 主机和路由器的统称;IP协议的报头•: 指定IP协议的版本, 对于IPv4来说, 就是4.•IP头部的⻓度是多少个32bit, 也就是 length * 4 的字节数. 4bit表⽰最 ⼤的数字是15, 因此IP头部最⼤⻓度是60字节.•。
2024-06-02 19:09:43 762
原创 对HTTP和HTTPS的介绍
为什么 HTTP 报文中要存在 “空行”?因为 HTTP 协议并没有规定报头部分的键值对有多少个. 空⾏就相当于是 “报头的结束标记”, 或者是"报头和正⽂之间的分隔符".HTTP 在传输层依赖 TCP 协议, TCP 是⾯向字节流的. 如果没有这个空⾏, 就会出现 “粘包问题”
2024-06-02 19:09:18 1438
原创 UDP协议与TCP协议1.2
UDP数据报=UDP报头+UDP载荷UDP的报文格式:这里的UDP长度,描述了整个UDP数据报,占多少个字节,这里整个UDP长度最多是64kb在UDP中校验和就是使用CRC的方式来完成的数据在网络传输中是可能会出现错误的,例如比特翻转(0变成1,1变成0),基于数据内容生成校验和主机A对数据内容进行校验和后发送给主机B,主机B再对传输来的数据继续进行一遍校验和,如果不相等就舍弃。CRC算法是一个简单粗暴的计算校验和方式,循环冗余校验。
2024-05-24 16:11:01 959
原创 线程池1.0
线程池是什么?想象这么⼀个场景:在学校附近新开了⼀家快递店,⽼板很精明,想到⼀个与众不同的办法来经营。店⾥没有雇⼈,⽽是每次有业务来了,就现场找⼀名同学过来把快递送了,然后解雇同学。这个类⽐我们平时来⼀个任务,起⼀个线程进⾏处理的模式。很快⽼板发现问题来了,每次招聘解雇同学的成本还是⾮常⾼的。⽼板还是很善于变通的,知道了为什么⼤家都要雇⼈了,所以指定了⼀个指标,公司业务⼈员会扩张到 3 个⼈,但还是随着业务逐步雇⼈。
2024-04-28 23:44:05 342
原创 网络原理(qq消息发送原理)
IP地址主要⽤于标识⽹络主机、其他⽹络设备(如路由器)的⽹络地址。简单说,IP地址⽤于定位主机的⽹络地址。就像我们发送快递⼀样,需要知道对⽅的收货地址,快递员才能将包裹送到⽬的地。IP地址是⼀个32位的⼆进制数,通常被分割为4个“8位⼆进制数”(也就是4个字节),如:通常⽤“点分⼗进制”的⽅式来表⽰,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的⼗进制整数)。如:100.4.5.6。
2024-04-28 14:03:00 1197
原创 搜索文件1.0
案例1: 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件。案例3:扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)案例2:进行普通文件的复制。
2024-04-21 21:14:55 253
原创 文件操作和IO
我们先来认识狭义上的⽂件(file)。针对硬盘这种持久化存储的I/O设备,当我们想要进⾏数据保存时,往往不是保存成⼀个整体,⽽是独⽴成⼀个个的单位进⾏保存,这个独⽴的单位就被抽象成⽂件的概念,就类似办公桌上的⼀份份真实的⽂件⼀般。什么是输入输出?靠近cpu就是输入,远离cpu就是输出。例如下载一个文件,把文件从网卡下载到硬盘上就是输入,把文件上传到网卡上就是输出文件夹也是一种文件,我们称为“目录文件”(diectory),这种文件之间的嵌套关系是一种树型结构,n叉树。
2024-04-20 13:59:42 462
原创 单列模式1.0
单例模式能保证某个类在程序中只存在唯⼀⼀份实例, ⽽不会创建出多个实例1.饿汉模式只要程序一启动就会立即创建出一个对象注意虽然构造方法是private,但是我们仍然可以在类外面用反射拿到私有构造方法,创建实例如果在代码中存在多个单例类,饿汉模式在程序启动的时候就会发生扎堆创建,延缓了程序启动时间。2.懒汉模式只有在调用的时候才会创建对象懒汉模式进阶。
2024-04-13 23:05:43 409
原创 线程等待通知机制
在上述代码中,由于t2线程需要打开输入资源流,所以t1大概率比t2先拿到锁,当t1拿到锁后t1执行wait,t1线程释放锁,然后执行t2线程。等到t2线程来唤醒t1线程的时候,线程t1进入就绪状态,当t2释放锁后,拿到锁继续执行。通过条件判定当前逻辑是否能执行,如果不能执行就主动wait,把执行机会留给其他线程。等到时机成熟后,再由其他线程进行唤醒,进行线程的抢占执行。“线程饿死问题”,一个线程频繁的获取锁和释放锁,由于获取锁的速度太快,其他的线程抢不到,那么就会影响到代码的执行速度。
2024-04-06 15:59:48 261
原创 线程安全1.2(内存可见性问题)
在执行循环体的时候会将成员变量加载到cpu中,而从内存读取数据到cpu相对于cpu中的cmp来说执行速度是非常慢的,所以在cmp执行很多次后感受到cmp的内容并没有变化,于是就发生了编译器优化,只是在第一次进行了真正的load,后续代码执行到t2时就不再去load,用的就是第一次load的值。首相这两者是没有任何关系的,对于sychronized是将代码中的非原子性指令打包成一个整体,防止由于线程之间相互竞争特性而导致指令的执行顺序发生错误,导致代码bug。1.只可以对变量进行修饰,不可以对方法进行修饰。
2024-04-06 14:19:28 155
原创 线程安全问题1.0
线程安全的概念:如果多线程环境下代码运⾏的结果是符合我们预期的,即在单线程环境应该的结果,则说这个程序是线程安全的。线程不安全的原因:1.线程调度是随机的这是线程安全问题的 罪魁祸⾸随机调度使⼀个程序在多线程环境下, 执⾏顺序存在很多的变数.程序猿必须保证 在任意执⾏顺序下 , 代码都能正常⼯作。2.多个线程同时修改同一个变量3.线程针对变量的修改操作,不是原子的4.内存可见性问题,引起的线程不安全5.指令重排序,引起的线程不安全首先上述代码必须有join,否则会脏读数据。
2024-03-31 23:07:23 301
原创 线程认识与创建
1.1线程是什么⼀个线程就是⼀个 “执⾏流”. 每个线程之间都可以按照顺序执⾏⾃⼰的代码. 多个线程之间 “同时” 执⾏ 着多份代码1.2 为啥要有线程⾸先, “并发编程” 成为 “刚需”.• 单核 CPU 的发展遇到了瓶颈. 要想提⾼算⼒, 就需要多核 CPU. ⽽并发编程能更充分利⽤多核 CPU 资源. • 有些任务场景需要"等待 IO", 为了让等待 IO 的时间能够去做⼀些其他的⼯作, 也需要⽤到并发编程. 其次, 虽然多进程也能实现 并发编程,但是线程⽐进程更轻量.
2024-03-30 23:02:21 419
原创 操作系统——进程
进程的概念:进程是操作系统对⼀个正在运⾏的程序的⼀种抽象,换⾔之,可以把进程看做程序的⼀次运⾏过程;同时,在操作系统内部,进程⼜是操作系统进⾏资源分配的基本单位。要想让一个程序运行,就必须得给这个进程分配资源(包括不限于:cpu,内存,硬盘,网络宽带,显卡…)操作系统只认识二进制文件所谓程序就是一个二进制文件,操作系统要运行程序,该则么操作呢?这就需要进程:程序被触发后,执行者的权限与属性,程序的代码与所需的数据都会被加载到内存中,这个过程就叫做进程。
2024-03-30 18:47:57 713
原创 Clonable 接口和深拷贝
Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 “拷贝”. 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常.如上代码,我们可以看到,通过clone,我们只是拷贝了Person对象。通过person2这个引用修改了m的值后,person1这个引用访问m的时候,值也发生了改变。所有类都默认继承的是Object,那么想要访问Object的方法,就要通过子类来访问来调用,
2024-03-24 15:00:28 186
原创 静态内部类与实例内部类
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,二之人格内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类,在Java中,可以将一个类定义在另一个类或者一个方法内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现。对于静态内部类,可以在静态内部类中调用外部类中的静态成员变量和静态成员方法,如果是非静态则通过外部类对象的引用来调用。内部类有:静态内部类 实例内部类 匿名内部类 局部内部类。2.实例内部类(非静态内部类)
2024-03-24 14:17:34 130
原创 多态的基本概念
1.多态的概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状态。当类的调用者在编写 eat 这个方法的时候, 参数类型为 Animal (父类), 此时在该方法内部并不知道, 也不关注当前的a 引用指向的是哪个类型(哪个子类)的实例. 此时 a这个引用调用 eat方法可能会有多种不同的表现(和 a 引用的实例相关), 这种行为就称为 多态.
2024-03-21 14:27:32 921 1
原创 细说static成员
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。【静态成员变量特性】
2024-03-19 22:51:02 552 1
原创 类和对象及构造方法的简述
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。WashMachine 类名 采用大驼峰(类名的每一个首字母大写)的形式。(也可以直接就地初始化),并不负责给对象开辟空间。一般情况下一个类写在一个Java文件中。
2024-03-19 20:35:08 286
原创 在Java中,实例化对象如何分配内存
在Java中,对象的内存分配是由Java虚拟机(JVM)自动完成的,而不需要程序员显示的管理内存。当你使用关键字new创建一个对象时,JVM会在堆(Heap)内存中为该对象分配空间。当对象不在被引用时,java的垃圾回收机制(JVM)会自动回收对象所占的内存空间。
2024-03-19 20:20:52 370
原创 认识泛型1.0
实现一个类,类中包含一个数组成员,使得数组中可以存放任何数据的类型,也可以根据成员方法返回数组中某个下标标的值。泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多类型,从代码上将,就是对类型实现了参数化。
2023-11-28 22:58:24 45
原创 接口速成宝典
2.在动物中有跑的,有飞的,有可以游泳的,如果直接在父类中定义,继承的时候比如狗它不能是飞天狗,所以要用接口(接口解决了Java不能多继承的问题)抽象类中可以包含普通方法和普通字段,这样的普通方法和字段可以被子类直接使用(不必重写)而接口中不能包含普通方法,子类必须重写所有的抽象方法。2.接口当中的方法如果没有被实现 ,那么他默认就是一个抽象方法。10.如果类没有实现接口中所有的抽象方法,则类必须设置为抽象类。6.类和接口的实现可以用implements来实现。3.接口当中的方法不能有具体的实现。
2023-11-27 23:17:17 53 1
原创 抽象类速成详解
抽象类当中可以包含构造方法,这个构造方法并不是在实例化这个抽象类的时候使用,因为他就不能被实例化。总结:抽象类本身不能被实例化,想要使用,只能创建该抽象类的子类。2.如果一个类包含了抽象方法这个类也要被abstract修饰,此时这个类被叫做抽象类。问题一:普通类也可以被继承,普通方法也可以被重写,为什么要用抽象类和抽象方法?7.抽象类必须被继承,继承后子类要重写父类的方法,否则子类也是抽象类。1.被abstract修饰的方法叫做抽象方法,没有具体的实现。8.抽象类中不一定包含抽象方法,但有抽象方法的类。
2023-11-26 22:23:38 40 1
原创 java中的static
假设三个同学是同一个班的,那么他们上课肯定是在同一个教室,那既然在同一个教室,那能否给类中再加一个成员变量,来保存同学上课时的教室呢?答案是不行的。之前在Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量),因为需要使用这些信息来描述具体的学生。而现在要表示学生上课的教室,这个教室的属性并不需要每个学生对象中都存储一份,而是需要让所有的学生来共享。在Java中,被static修饰的成员,称之为,也可以称为,其,是所共享的。
2023-11-22 18:48:31 31 1
原创 自定义类型详解
在c语言中结构体是一种自定义的数据类型,用于储存不同类型的数据项,他的每个数据项称为成员,而每个成员都有自己的数据类型,我们可以理解为结构体允许将多个相关的数据项组合在一起,形成逻辑上的整体。联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。很明显他的运行结果不是6,是8,为啥呢,这就得了解一下结构体的内存对齐了。对于结构体的地址的访问。
2023-10-15 14:03:41 40 1
原创 内存函数的应用
/num是拷贝多少个字节。结果:‘DWgaOtP12df0’ is greater than ‘DWGAOTP12DF0’.结果:person_copy: Pierre de Fermat, 46。返回值:destination is returned.(实现不重叠内存拷贝)返回值:des的返回值。
2023-10-10 16:58:01 29 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人