自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 全局视角观看Python备忘录-英文版

全局视角观看Python备忘录-英文版

2024-04-15 10:33:29 155 2

原创 从HashMap了解二叉树、平衡二叉树、红黑树

面试过程中,多多少少会问一点数据结构(二叉树)的问题,今天我们来复习一下二叉树的相关问题,文末总结。1、为什么有了数组和链表还要引入二叉树?针对数组和链表的优缺点,无法说链表一定优于数组,或者是数组一定优于链表,因为某些长期的需要,所以就推出一个相对折中的二叉树。2、为什么有了二叉树还要引入平衡二叉树?有了二叉树还不算完,二叉树有一种极端的情况,就是所有的子结点偏向一端,二叉树退化成链表,这就相当于我选择了这种的二叉树,你现在罢工不干了,找了个链表来糊弄我...

2024-04-15 09:53:59 860 1

原创 python判断字符串是否包含子串的五种方法

rfind()方法同上面介绍的find()方法的用法基本一致,如果没有出现,也是返回-1。不同的是,rfind()返回的是子串最后一次出现的索引位置。in是python内置的保留字符,也是身份运算符,可以用于判断某个子串是否包含于某个字符串,如果包含于,则返回True,否则返回False。

2024-04-15 09:36:45 246 1

原创 Java虚拟机——HotSpot 垃圾收集器

追求高吞吐量,可以通过减少 GC 执行实际工作的时间,然而,仅仅偶尔运行 GC 意味着每当 GC 运行时将有许多工作要做,因为在此期间积累在堆中的对象数量很高。Serial Old 收集器是 Serial 的老年代版本,都是单线程收集器,只启用一条 GC 线程,都适合客户端应用。CMS(Concurrent Mark Sweep,并发标记清除)收集器是以获取最短回收停顿时间为目标的收集器(追求低停顿),它在垃圾收集时使得用户线程和 GC 线程并发执行,因此在垃圾收集过程中用户也不会感到明显的卡顿。

2024-04-14 10:17:58 814

原创 Java虚拟机——内存的分配详解

另外,不少人的博客中,将 Java GC 的分代收集机制分为 3 个代:青年代,老年代,永久代,这些作者将方法区定义为“永久代”,这是因为,对于之前的 HotSpot Java 虚拟机的实现方式中,将分代收集的思想扩展到了方法区,并将方法区设计成了永久代。局部变量表中存储着方法的相关局部变量,包括各种基本数据类型,对象的引用,返回地址等。一般的,根据 Java 虚拟机规范规定,堆内存需要在逻辑上是连续的(在物理上不需要),在实现时,可以是固定大小的,也可以是可扩展的,目前主流的虚拟机都是可扩展的。

2024-04-11 19:07:40 666

原创 python维护代理ip的实现

代理IP的作用是可以为爬虫提供多个IP地址,从而加快其爬取数据的速度,同时也可以避免因为访问频率过高而被网站封禁的问题。代理ip 是介于浏览器和Web服务器之间的一台服务器,如果使用代理IP,Request信号就会先送到代理服务器,并由代理服务器得到浏览器所需要的信息并传送到你的浏览器。使用代理ip的优点有很多,但是还有一个重要的地方就是使用代理ip的必要性,尤其是对于某些爬虫程序来说是非常重要的一环。这个时候的代理ip发挥的作用可谓是举足轻重,所以这也是使用代理ip的重要原因之一。

2024-04-11 18:47:32 273

原创 Java原子操作类的应用场景-AtomicInteger

这里的问题就在于 m++,如果我们在 m++的时候加上关键字synchronized也能解决该并发问题。于是我们可以考虑使用原子操作类AtomicInteger来实现。它相当于一个int变量,我们执行Int的 i++ 的时候并不是一个原子操作。而使用AtomicInteger的incrementAndGet却能保证原子操作。现在有2个线程,分别将全局整型变量 i 进行加1。每个线程执行10000次。最后我们执行上面的代码,结果有可能是20000,但是大多数时候不是20000,而是随机的一些数字。

2024-04-11 08:57:41 243

原创 JAVA线程池的四种拒绝策略总结

总结起来,也就是一句话,当提交的任务数大于(workQueue.size() + maximumPoolSize ),就会触发线程池的拒绝策略。executor.execute()提交任务,由于会抛出 RuntimeException,如果没有try.catch处理异常信息的话,会中断调用者的处理流程,后续任务得不到执行(跑不完100个)。运行后,在控制台console中能够看到的是,会有一部分的数据打印,显示的是 “main is running”,也即体现调用线程处理。

2024-04-10 20:04:53 426 1

原创 Python并发编程利器——ThreadPoolExecutor

模块是 Python3.2 中引入的新模块,用于支持异步执行,以及在多核CPU和网络I/O中进行高效的并发编程。这个模块提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,简化了跨平台异步编程的实现。1、多进程当通过多进程来实现并发编程时,程序会将任务分配给多个进程,这些进程可以在不同的CPU上同时运行。进程之间是独立的,各自有自己的内存空间等,可以实现真正的并行执行。

2024-04-08 09:03:35 811

原创 Netty——基础知识点整理

收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样做虽然提高了效率,但是接收端就难于分辨出完整的数据包了,由于TCP无消息保护边界,需要在接收端处理消息边界问题。这就是拆包和粘包问题。比如:正常的理想情况,两个包恰好满足TCP缓冲区的大小或达到TCP等待时长,分别发送两个包;粘包:两个包较小,间隔时间短,发生粘包,合并成一个包发送。

2024-04-07 23:07:52 860

原创 JAVA中创建线程池的五种方法及比较

因为核心线程数为2,队列大小为5,存活时间1分钟,所以流程是第0-1号任务来时,陆续创建2个线程,然后第2-6号任务来时,因为无线程可用,均进入了队列等待,第7-9号任务来时,没有空闲线程,队列也满了,所以陆续又创建了3个线程。所以你会发现7-9号任务反而是先执行的。因为SynchronousQueue队列不保持它们,直接提交给线程,相当于队列大小为0,而最大线程数为Integer.MAX_VALUE,所以线程不足时,会一直创建新线程,等到线程空闲时,又有60秒存活时间,从而实现了一个可缓存的线程池。

2024-04-04 21:49:01 732 1

原创 Anacoda应用-环境的使用

我们在实际的开发过程中可能需要切换到不同的环境,使用不同的版本,现在来看看conda是如何操作管理我们的环境的。macOS和Linux用户请打开“Terminal”(“终端”)进行操作。如:conda create --name study python3.7。Windows用户请打开“Anaconda Prompt”;(创建名称为study的环境,python包的版本为3.7)执行yes:y ,开始创建上述命令环境。

2024-04-04 07:39:25 311 1

原创 Anaconda介绍及安装使用教程

6. 安装过程中,提示“Press Enter to accept the default install location, CTRL-C to cancel the installation or specify an alternate installation directory.”(“按回车键确认安装路径,按'CTRL-C'取消安装或者指定安装目录。4. “Installation Type”部分,可以点击“Change Install Location”来改变安装位置。

2024-04-04 07:08:01 836 1

原创 Java虚拟机——垃圾的回收策略与算法

程序计数器、虚拟机栈、本地方法栈随线程而生,也随线程而灭;栈帧随着方法的开始而入栈,随着方法的结束而出栈。这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而对于 Java 堆和方法区,我们只有在程序运行期间才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器所关注的正是这部分内存。

2024-04-01 06:51:24 1073

原创 Java虚拟机——JVM的内存结构详解

程序计数器是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址。若当前线程正在执行的是一个本地方法,那么此时程序计数器为Undefined。Java 虚拟机栈是描述 Java 方法运行过程的内存模型。局部变量表操作数栈动态链接方法出口信息......本地方法栈是为 JVM 运行 Native 方法准备的空间,由于很多 Native 方法都是用 C 语言实现的,所以它通常又叫 C 栈。它与 Java 虚拟机栈实现的功能类似,只不过本地方法栈是描述本地方法运行过程的内存模型。

2024-03-31 15:26:23 1029 1

原创 网络协议:网络分层的七层、四层和五层

所以为了能进行通信,就要规定每个终端都要将各自字符集中的字符先变换为一种统一标准字符集的字符后,才进入网络传送,到达目的终端之后,再变换为该终端字符集的字符。总结下来,数据链路层就是通过物理手段把电脑连接起来并对比特流的数据进行分组,网络层来建立主机到主机的通信,传输层建立端口到端口的通信,应用层最终负责建立连接,数据格式转换,最终呈现给用户。网络协议,即是指计算机网络中进行数据交换而建立的规则、标准或约定的集合。应用层、运输层、网络层、数据链路层和物理层。应用层、传输层、网络层、数据链路层。

2024-03-31 08:29:08 616

原创 Hutool-超级好用的Java工具类库

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。

2024-03-28 11:39:38 1088 1

空空如也

空空如也

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

TA关注的人

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