- 博客(20)
- 收藏
- 关注
原创 Java基础 | 多线程同步和通信
目录程序、进程、线程线程的创建和使用1、继承Thread来重写run方法2、使用Thread匿名子类重写run线程生命周期线程同步线程通信线程创建方式程序、进程、线程程序:程序本身是静态的,我们开发程序,就是为了完成特定任务、用某种语言编写的一组指令的集合。进程:对进程来说,其就是程序装载入内存,开始运行的状态,是一个动态的概念。而且,进程是资源分配的基本单位,系统在运行的时候,会给进程分配不同的内存区域线程:对于进程来说,其可以划分为好几个线程。线程是操作系统调度和执行的单位,每个线程都有自己的
2020-10-27 22:48:37
277
原创 Java基础 | 多线程四种创建方式
目录程序、进程、线程线程的创建和使用1、继承Thread来重写run方法3、实现Runable接口,重写run方法3、实现Callable接口4、使用线程池程序、进程、线程程序:程序本身是静态的,我们开发程序,就是为了完成特定任务、用某种语言编写的一组指令的集合。进程:对进程来说,其就是程序装载入内存,开始运行的状态,是一个动态的概念。而且,进程是资源分配的基本单位,系统在运行的时候,会给进程分配不同的内存区域线程:对于进程来说,其可以划分为好几个线程。线程是操作系统调度和执行的单位,每个线程都有
2020-10-27 22:47:08
291
原创 Java设计模式 | 浅析代理模式
目录目录什么是代理模式?静态代理动态代理代理适用场景目录什么是代理模式?其实代理模式我们很早就在生活中接触过。为了实现某个目的而让中间人去做,这其实就是代理模式。厂家为了销售产品,招省代理,省代理招市级代理,市代理又去招县区代理。这样一层层代理最后到了区域销售点来销售给顾客,厂家的产品,由销售点去销售,这就是代理。静态代理先上代码如下:public class MainTest{ public static void main(String[] args) { Ser
2020-10-25 13:45:54
281
原创 Java设计模式 | 浅析模板方法模式
目录什么是模板方法模式抽取公共部分做成抽象类什么是模板方法模式这个模式我认为和单例模式一样,都是比较简单好懂的模式。而且在学习Java多态的时候也会直接用到的。其主要内容就是将各个类公共的方法抽取出来,做成一个抽象类,将公共方法的具体实现延迟到子类中去。这样可以避免代码高度重复且难以维护。举例来说:假如我们需要一个计算一个方法时间开销的代码。如果写进一个具体方法里,那么在测试另一个方法时,就又需要编写一次。long start = System.currentTimeMillis();code(
2020-10-24 18:45:41
291
1
原创 Java设计模式 | 浅析单例模式
目录什么是单例设计模式?饿汉式单例懒汉式单例饿汉和懒汉的区别线程安全的懒汉式单例单例的适用场景什么是单例设计模式?对于单例设计模式来说,其实和生活密不可分。假如说你的生活中有些东西只能有一个,比如亲人。任何时间你想找父亲开视频聊天,找到的都是唯一的一个父亲。不可能说两次通话找到的不同的父亲。例子可能不是很恰当。就是说这样一个需求,每次获取一个对象时,所拿到的对象都是同一个对象。对单例来说其主要规则有如下三点:1. 其构造器必须是private的,不能通过new来创建对象。2. 只能通过唯一一个静态
2020-10-24 09:22:59
290
原创 Java基础 | 面向对象程序设计
目录类类Java中的类在我看来很像是C++的对象指针,比如Date这个类,C++中像是`Date*。Java中的对象本身只是new 返回值的引用,其存储在堆区。Date birthday; //JavaDate* birthday; //C++这样甚至于对象被赋值成null,其仍然可以调用api,只是会发生运行时错误。...
2020-10-23 17:39:47
158
原创 Java基础 | 深入理解反射
目录什么是反射具体用法什么是反射面向对象中有一个概念叫封装,我们在编写类的时候会给一些不需要外界调用的字段private修饰,就好比在黑暗里有人在走你看不见,但是用了反射,就像在阳光下拿镜子将阳光反射到了黑暗里的人身上,能够完全获取运行时类的信息,即使这个信息是private的。C++中的RTTI和Java反射完全不能比,C++反射需要自己去实现,比较复杂,Java提供了API供使用者调用什么时候使用反射呢?很多时候我们没法确定程序在编写的时候要用到哪些类,比如现在有这样的需求:从键盘输入一个字符
2020-10-23 17:33:28
129
原创 Java基础 | 基本程序设计
目录数据类型常量和静态变量字符串数组数据类型这里我只写出于C++不同的地方常量和静态变量Java中的常量有final修饰,其所修饰的变量在初始化完毕之后不可再更改。那么final也可以修饰变量,函数形参,函数返回值。 public static void main(String[] args) { final int y=3; y=5; //这里会报编译错误 System.out.println(y); }C++中的const
2020-10-22 21:34:42
196
原创 算法笔记之旅 | 日期之间天数计算
目录计算两个日期中间的天数计算逻辑处理闰年以及年月天数情况处理正常逻辑年月一致年一致,月不一致年月都不一致代码实现计算两个日期中间的天数日常刷题碰到的,有计算两个日期之间天数的,有计算两个日期工作日数目的。这一类题目逻辑上算不上太难。只是没碰到过的话,第一时间可能想不好怎么处理。这里贴出来一条计算方法。计算逻辑打个比方是2020.3.15-2020.5.5中间一共多少天?首先是处理闰年,这是死方法,处理天数也是。处理闰年以及年月天数情况以下数组第一维用来判断是否是闰年int monthday
2020-10-08 20:17:02
791
原创 Linux基础 | 系统调用
目录概念系统调用缺点系统调用原理特权级与中断基于int的linux系统调用实现触发中断切换堆栈中断处理程序概念现代操作系统中程序本身没有多少权利访问系统资源,为了保护系统资源,OS会组织程序直接访问系统资源,比如文件、网络、IO、各种设备等。但是有些场景不借助OS没法很好地办到,比如让程序等待一段时间,如果借助OS,我们可以用sleep(),但是要是自己写的话,可能就是如下这样:for(int i=0;i<1000000;i++);可以是可以,但是这样会浪费CPU时间。特别是这段程序在不同
2020-08-15 00:58:13
237
原创 Linux基础 | 进程间通信
目录概述信号信号本质进程对信号的响应信号处理流程信号注册信号发送管道无名管道popen和pclose命名管道(FIFO)异同总结XSI IPC标识符和键权限结构结构限制优点和缺点消息队列共享内存信号量整形信号量记录型信号量本地Socket(UNIX域套接字)概述很多时候我们在写程序的时候为了提高效率采用多进程的方式,但是进程之间的内存区域实际上是分隔开的。我们需要采用一种机制来让各个进程之间进行通讯。(比如想写一个程序计算1到1千亿加法,当然这只是举个例子,一个进程去写只用一个cpu太亏了,我们用4个c
2020-08-12 19:13:33
673
原创 前缀树 | 208. 实现 Trie (前缀树)(medium)
前言Trie树大名鼎鼎,不能不学,平常我们在百度搜索的时候自动弹出来的相关推荐字段就可以用Trie树来实现。题目题解class Trie {public: /** Initialize your data structure here. */ bool isEnd=false; Trie *next[26]={nullptr}; Trie() { } /** Inserts a word into the trie. */ vo
2020-08-04 20:57:02
151
原创 C++进阶 | 智能指针详解
目录智能指针自实现智能指针auto_ptr,scoped_ptr,unique_ptr1、auto_ptr(不推荐)2、scoped_ptr(不推荐)3、unique_ptr(推荐)智能指针的交叉引用问题多线程访问共享对象问题自定义删除器智能指针首先来看一个裸指针:int *p=new int(10); //在堆内存上申请一个int型数组,大小为10,用指针p指向数组的起始地址。*p=30; //这里可以通过指针解引用,来修改p指向地址的值。delete p;
2020-07-05 15:11:07
743
原创 C++基础 | 初识模板和空间配置器Allocater
目录前言函数模板模板特例化用模板来开发一个简易的Vector容器前言单纯地直接写一个普通函数适用性比较小,比如int compare(int a,int b),这个函数直接比较了整型变量a和b的大小。但是如果你有了新需求,想比较两个double型数字的大小,那么之前我们讲过重载,很容易想到重载来满足这个需求。但是我们写代码当然追求省,毕竟懒是人生学习的动力。这种情况使用重载会造成不必要的代码冗余,毕竟参数都一样。那么这次来学习一下模板是如何节省代码的。首先来看重载的情况:bool compare(i
2020-06-24 20:29:03
979
1
原创 C++基础 | 全面解析const用法
前言本文将全面分析const这一C++语法的所有相关用法,包括:const、const指针、const引用、在函数当中的引用const怎么理解?C和C++中const的区别?在C++中,const所修饰的量叫做常量,必须初始化,且初始化完毕之后是不能被修改的,即const修饰的量不能作为左值。const int a=20;这里的a将不能再被修改,也可以再这样描述:a=30;这里是非法的。在C中,const修饰的量叫常变量,不叫常量。const 仅仅在语法层级限制a不能被写成赋值,即仅仅不能写成a=
2020-06-22 16:32:08
398
原创 C++基础 | 深入理解函数重载
什么是函数重载?1、首先是定义:一组函数,其函数名相同,但是函数参数个数或者类型不同,那么这组函数就是重载函数。比如下面这组函数:int compare(int a,int b){ cout<<"this is compare int"<<endl; return a>b;}int compare(double a,double b){ cout<<"this is compare double"<<endl;
2020-06-21 16:02:30
214
原创 C++基础 | inline内联函数
前言对于C++程序,需要预编译、编译、汇编、链接四个步骤才能成为可执行文件进而运行。而inline函数在编译期间执行。本文将结合上一节所说函数调用堆栈的开销,说明inline函数和普通函数的区别以及优点。普通函数调用堆栈int sum(int a,int b){ return a+b;}int ret3=sum(a,b);对于普通函数sum(a,b)的调用,会执行标准的函数调用过程:1、参数压栈2、开辟函数栈帧3、执行完毕回退函数栈帧inline函数调用堆栈...
2020-06-21 14:53:25
235
原创 c++基础 | 形参带默认值的函数
前言对于此类函数,一般的问法是,它与普通函数调用有什么区别?或者说优点?基本用法首先在写带默认值函数的时候,形参的默认值必须从右往左写。这点条件来自于函数调用堆栈,形参在入栈的时候是从右往左入栈的。以下为错误用法:int sum(int a=10,int b){ return a+b;}这里会报b没有默认值的错误剖析函数调用堆栈时的三种情况:1、函数形参不带默认值int sum(int a,int b){ return a+b;}int main(){
2020-06-21 12:53:41
914
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人