自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java--volatile关键字

为什么引入缓存程序在执行时是通过CPU指令来执行的,当数据读取和写入时,涉及到访问主存即物理内存,但由于CPU执行速度很快,而从内存中读取数据和写入数据速度很慢,为了解决这种速度上的差异,提高指令运行速度,就引入了缓存。缓存一致性缓存不一致问题初始时,两个线程分别读取i的值存入各自所在的CPU的高速缓存当中,然后线程1进行加1操作,然后把i的最新值1写入到内存。此时线程2的高速缓存当中i的值还是0,进行加1操作之后,i的值为1,然后线程2把i的值写入内存。  最终结果i的值是1,而不是2缓存一致

2021-07-15 19:01:33 78

原创 http和https区别

Http和Https区别http是超文本传输协议,明文传输;https是具有安全性的SSL加密协议https协议需要到申请CA(证书颁发机构)证书连接的方式不一样,使用的端口也不一样。http使用80端口,https使用443端口。http是无状态连接,https是基于http+SSL协议构建的加密传输,身份认证的网络协议,比http安全。对称加密和非对称加密对称加密:服务端和客户端使用一个密钥进行加密和解密非对称加密:一组公钥和私钥,用公钥加密后的数据只能用自己的私钥进行解密。用私钥加密后的

2021-07-01 20:50:04 247

原创 剑指 Offer 45. 把数组排成最小的数(java)

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: “102”示例 2:输入: [3,30,34,5,9]输出: “3033459”来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof可以看成基于字符串的字典序的排序,使用快排解决。java提供了compareTo方法来比较判断规则

2021-06-16 20:28:24 93

原创 剑指 Offer 53 - II. 0~n-1中缺失的数字

题目描述:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例1:输入: [0,1,3]输出: 2示例2输入: [0,1,2,3,4,5,6,7,9]输出: 8思路1:双重暴力for循环class Solution { public int missingNumber(int[] nums) { if(nums[0]!=0)

2021-06-15 22:01:55 69

原创 剑指 Offer 03. 数组中重复的数字

题目描述:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字示例1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3思路1:暴力双重for循环依次遍历。思路2:使用HashSet去重class Solution { public int findRepeatNumber(int[] nums) {

2021-06-15 21:35:35 48

原创 基于lock实现生产者消费者模型

实现需求:面包店:10个消费者,不停的消费,每个每次消费1个5个生产者,不停的生产,每个每次生产3个库存上限100import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 面包店: * 10个消费者,不停的消费,每个每次消费1个 * 5个生产者,不停的生产,每个每次生产

2021-06-08 23:28:07 367

原创 线程同步和互斥

线程同步和线程互斥线程互斥:指在某一时刻只允许一个线程运行代码块,具有排他性和唯一性。对于线程A和线程B来讲,在同一时刻,只允许一个线程对临界资源进行操作,即当A进入临界区对资源操作时,B就必须等待;当A执行完,退出临界区后,B才能对临界资源进行操作。线程同步:指的是在互斥的基础上,实现进程之间的有序访问。假设现有线程A和线程B,线程A需要往缓冲区写数据,线程B需要从缓冲区读数据,但他们之间存在一种制约关系,即当线程A写的时候,B不能来拿数据;B在拿数据的时候A不能往缓冲区写,也就是说,只有当A写完数

2021-06-06 21:36:01 309

原创 CAS基本认识

CAS(Compare and swap)乐观锁和悲观锁乐观锁和悲观锁只是两种设计思想,和语言无关,并不是java独有的东西。乐观锁:同一个时间点,经常只有一个线程来操作共享变量。(总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。)悲观锁:同一个时间点,经常有多个线程在操作共享变量。(总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想

2021-06-06 21:27:27 219 1

原创 进程和线程的区别

进程和线程的区别根本区别:进程是操作系统资源分配的最小单位,而线程是处理任务调度和执 行的最小单位。 一个进程可以含有多个线程。资源开销:每个进程都有单独的代码和数据空间,进程之间的切换会有较大的 开销;线程可以看做是轻量级的进程,同一类线程共享代码和数据空间,每个 线程有自己独立的运行栈和程序计数器,线程之间的切换开销比较小。内存分配:同一个进程中的所有线程共享本进程的地址空间和资源,而进程之 间的地址空间和资源都是相互独立的。影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响;而一个

2021-06-06 21:20:56 328 1

原创 jvm对synchronized的优化

jvm对synchronized的优化基于对象头的锁状态来实现,从低到高(锁只能升级,不能降级)(1)无锁(2)偏向锁:同一个对象多次加锁(重入)(3)轻量级锁(自旋锁):基于CAS实现,同一个时间点,经常只有一个线程竞争(4)重量级锁:基于系统mutex锁,同一个时间点,经常有多个线程竞争特点:mutex是系统级别加锁,线程会由用户态切换到内核态,切换成本比较高(成本高的解释:一个线程总是竞争失败,就会不停的在用户态和内核态切换,比较耗费资源,进一步,如果有很多竞争失败的线程,性能就会有很大

2021-06-06 20:45:43 236 1

原创 输入一个url发生了哪些事

输入URL:[http://www.xxx.com]1.根据域名,进行DNS解析,拿到IP地址2.封装数据,三次握手建立TCP连接(传输层)应用层:,构造http报文,发送http请求传输层:TCP传输报文3.往目的ip地址处发送请求网络层:IP协议查Mac地址​ 判断目标地址是否与当前地址处于同一网络中(子网掩码运算),是的话直接根据 Mac 地址发送,不是的话通过arp协议在缓存表通过ip找mac,找不到的话会发送询问mac的广播数据报。有了mac之后交换机会通过这个mac找对应端

2021-05-27 19:45:02 147

原创 JVM之垃圾回收

文章目录JVM垃圾回收1.内存泄漏与内存溢出1.1什么是内存泄漏?1.2什么是内存溢出?1.3常见的OOM1.4两者的区别?2.内存回收机制2.1概述2.2垃圾回收的时机2.3判断一个对象是否"死亡"/是否可以回收2.4java中的引用类型?(了解)2.5需要垃圾回收的内存方法区(jdk1.7)/元空间(jdk1.8)堆2.6垃圾回收算法1.标记清除算法(Mark-Sweep算法)2.标记整理算法(Mark-Compact)3.复制算法(Copying)4.分代收集算法( Generation Collec

2021-05-23 16:33:34 206

原创 JVM 双亲委派机制

文章目录类加载器双亲委派机制1.工作原理:2.源码3.双亲委派机制的好处和缺陷类加载器实现通过类的权限名获取该类的二进制流字节代码叫做类加载器(类加载器本身也是个类)类加载器可以分为:启动类加载器,扩展类加载器,应用程序类加载器,自定义类加载器​ 启动类加载器(Bootstrap):用于加载java的核心类–位于 <JAVA_HOME>\lib目录中的下的rt.jar、charsets.jar和class等扩展类加载器: 主要负责加载jre/lib/ext目录下的一些扩展的jar应用程序类加载

2021-05-21 12:26:56 172

原创 jvm类加载

文章目录类加载机制1.类的生命周期2.类加载的过程概述:2.1加载2.2验证:2.3准备2.4解析2.5初始化2.6类加载的时机类加载机制1.类的生命周期​ 7个阶段:加载,验证,准备,解析,初始化,使用,卸载。其中验证,准备,解析3个部分统称为连接2.类加载的过程概述:​ java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这个过程被称作虚拟机的类加载机制。2.1加载加载是将类的class文件读入到内存,

2021-05-20 23:26:17 123

原创 JVM内存模型

文章目录1.内存模型/JMM1.1区域划分1.2区域作用/保存内容程序计数器/PC寄存器:虚拟机栈本地方法栈方法区/元数据区(线程共享)堆运行时常量池(方法区的一部分)JDK1.6内存模型JDK1.7内存模型JDK1.8内存模型1.3java程序运行流程1.内存模型/JMM1.1区域划分线程私有:程序计数器,虚拟机栈,本地方法栈线程共享:方法区,堆1.2区域作用/保存内容程序计数器/PC寄存器:保存程序当前执行指令的地址,可以看作是当前线程所执行字节码的行号指示器。为了能够使得每个线程都

2021-05-20 16:43:40 116

原创 二叉树常见题

二叉树的前序遍历-递归方式思路:创建一个List ,把打印操作改为add操作即可。class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> result=new ArrayList<>(); if(root==null){ return result; } r

2021-03-25 18:14:47 255 1

原创 栈和队列-简单实现

1.栈栈:是一种特殊的线性表,只允许在固定的一端插入和删除,一端称为栈底,一端称为栈顶。栈遵循先进后出的原则。栈的相关操作:压栈,向栈顶插入一个元素出栈,在栈顶处删除一个元素取栈顶元素,获取到在最后一个在栈顶元素的结果。栈的实现:1.基于顺序表:使用尾插,尾删来分别表示入栈和出栈。根据下标获取元素表示取栈顶元素实现代码:public class MyStack { private int[] arr=new int[100]; private int size=0;

2021-03-10 17:02:32 146

原创 Java 面向对象中的多态

多态,是面向对象三大特性之一。在理解多态前先要明白向上转型和动态绑定1.向上转型是多态实现的前提之一:父类引用指向了子类实例。看起来像是把子类引用转成了父类引用,所有称做向上转型。。第一种:直接赋值public class Test { public static void main(String[] args) { Cat cat=new Cat(); //Animal animal=null; //向上转型 //anima

2021-01-29 23:20:32 148 1

原创 java中的继承

继承是面向对象编程的三大特性之一。主要功能是在原有的基础上进行扩展。若果没有继承,那么代码将会出现大量重复。继承的实现:通过extends关键字class Animal {public String name;public Animal(String name) {this.name = name;}public void eat(String food) {System.out.println(this.name + "正在吃" + food);}}class Cat extends

2021-01-29 19:28:18 149 2

原创 java 四种权限修饰符

权限修饰符就是控制属性,方法以及类的范围的符号1.public公共类型:public 可以修饰类,成员属性,成员方法,构造方法。被public 修饰的成员,可以在任何一个类中被调用,无论是否同包,是权限最大的一个修饰符。2.private私有类型 private可以修饰属性,方法,不能修饰类(外部类)。被private修饰的成员,只能在本类中使用,在其他类要想使用,必须通过本类提供的public方法来使用。3.default默认类型 default;可用于修饰类,成员变量,构造方法,方法,都能

2021-01-29 17:19:17 999 4

原创 面向对象编程特性 -封装

封装是面向对象的三大特性之一,其含义简单来说就是把类的成员属性方法等包装起来,当类的调用者调用时不需要知道其细节,只要知道如何使用就好。封装需要用到private这个关键字。 关于private和public的区别:被public修饰的成员,可以在任何一个类中被调用,不管同包或不同包,权限最大 而private修饰的成员只能在定义它的本类中调用。不使用封装:类的调用者需要知道类的细节,比如类里有哪些成员。public class Person { public int age=19;

2021-01-29 17:00:07 200 3

原创 java this关键字和super关键字有什么区别

this和super的区别thisthis是当前对象的引用,指向了这个类类的对象。作用:1.可以调用类中成员的属性。方式:class student{ private int age; private String name;} //含参的构造方法 public student (int age ,String name){ this.age=age; this.name=name; }//当传入参数的名字与成员属性的名字相同时,this有效的防止参数

2021-01-29 16:21:53 149 1

原创 java 关键字static

static修饰类中的某个成员 ,则这个成员是一个类属性/类方法,与类相关。如果不加static,则这个成员是一个实例属性/实例方法,与对象/实例相关1.修饰属性static修饰的成员变量叫静态变量,属于类,不属于对象,在内存中的方法区所存储。2.修饰方法静态方法,属于类,不属于对象,调用静态方法,可以直接通过方法名来调用,也可以 类名.方法名来调用在静态方法中不能访问非静态方法和非静态成员变量,this和super也不能再静态方法中使用,因为this和super都与实例相关。class Pe

2021-01-24 18:15:08 118

原创 java 实现indexof contains 方法

contains方法: public static boolean mycontains(String a,String b){ char[] s1=a.toCharArray(); char[] s2=b.toCharArray(); int index=0; int i=0; //int x=0; for( i=0;i<s1.length;i++){ if(s1[i]==

2021-01-22 19:28:15 240

原创 java实现 replace方法

思路:先将字符串转换为 char[]数组 方便操作下标然后先找到要替换的字符串开始的下标 再创建一个新数组,分别对分割成的三部分进行赋值,最后转化为String 类型 打印且作为方法返回值返回public class Solution { public static String myreplace(String str, String a, String b) { //将要操作的字符串转化为字符数组; char[] val = str.toCharArray()

2021-01-22 16:49:48 926 1

原创 动态内存管理

1.为什么存在动态内存开辟普通的开辟方式:int a=0;int arr[5]={0};上述内存开辟方式是在栈上开辟的,大小固定,声明数组时且必须给定数组长度,它所需要的内存在编译时分配,但很多时候我们所需要的空间大小在程序运行时才能知道,这时上述的开辟方式就不行了,所以需要通过动态内存开辟的方法。2.动态内存函数malloc void* malloc(size_t size);作用申请一块连续的空间并返回指向这段空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失

2020-11-10 12:44:41 161

原创 C 语言基础位段 枚举 联合体

一.结构体实现位段概念:位段和结构体的声明,不过位段的成员和结构体有两处不同1.位段的成员必须是int ,unsigned int ,signed int或者char2.位段后面需要加上冒号和数字例如:struct A { int _a:2; int _b:5; int _c:10; int _d:30; }位段的内存大小计算:先开辟第一个成员所占至少需要的字节,第二个成员所占比特位如果能放进去剩下的比特位中,则不开辟,如果放不进去,则再开辟第二个成员所需要的字节,以此类推。

2020-11-05 11:39:21 240

原创 C语言 什么是结构体内存对齐

结构体结构体是一些值的集合,这些值被称为成员变量,每个成员类型也可以不同。1.结构体的声明例如创一个学生的结构体struct student{char name[20];int age;char sex[5];};//分号不能忘记特殊声明:匿名结构体类型:不完全声明struct{ char name[20]; int age;}stu;结构体的自引用struct Node{ int data; struct Node* next;}typedef作用:将结

2020-11-03 19:08:25 204

原创 字符串函数和字符函数 c语言

字符函数和字符串函数函数介绍1. 求字符串长度strlensize_t(const char * str)字符串以’\0’为结束的标志 strlen返回的是遇到’\0’前字符的个数函数的返回值是size_t(无符号)模拟实现1.递归 不创建临时变量#include<stdio.h>#include<assert.h>size_t my_strlen(char * str){ if (*str == '\0') { return 0; } ret

2020-10-29 21:59:59 351

原创 C语言 --strlen库函数的三种实现方式

1.递归 不创建临时变量#include<stdio.h>#include<assert.h>size_t my_strlen(char * str){ if (*str == '\0') { return 0; } return 1 + my_strlen(str + 1);2.指针相减size_t my_strlen(const char *str){ assert(str != NULL); const char *start = str; w

2020-10-20 10:50:21 320

原创 c语言-指针基本知识

指针是一个存放地址的变量,存放的地址指向了另一个变量。int main(){ int a = 4; int * p = &a; printf("%d\n",* p);//打印p指向的(整形变量a的内容) printf("%p\n", p);//打印p所存储的(a的地址) printf("%p\n", &a);// 打印p所存储的(a的地址) return 0;}*说明p是一个指针 .int 说明p指向了一个整型变量a.&a即是取a的地址.通过指针改变变量

2020-08-13 21:46:18 191

原创 c语言 static

#include<stdio.h>void test(){ int a = 1; a++; printf("%d\n", a);}int main(){ int i = 0; while (i < 10) { test(); i++; } return 0;}如上代码,程序运行结果为10个2,但当给test里的int a 加上 static修饰时,程序的巡行结果会发生变化,变为2,3,4,5,6,7,8,9,10,11原因:static 可以修饰

2020-08-13 15:47:12 143

原创 c语言 字符串 转义字符

关于字符串,例如用char创建一个字符串数组int main(){ char arr1[] = { "abcde" }; char arr2[] = { 'a', 'b', 'c', 'd', 'e' }; printf("%s\n", arr1);//%s打印字符串 printf("%s\n", arr2); return 0;}对于arr1,打印结果是abcde对于arr2,打印结果是abcde加乱码。这种由双引号引起来的一串字符称为字符串字面值,或者简称字 符串。注:字符串的

2020-08-10 13:07:35 1040

空空如也

空空如也

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

TA关注的人

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