- 博客(48)
- 资源 (1)
- 收藏
- 关注
原创 Android 使用Retrofit,OKHTTP进行网络请求的时候携带Cookie,Token
Android Retrofit ,OKHTTP 请求携带Token,Cookie
2022-07-17 17:19:56
2413
原创 Java中内存泄漏的原因
什么是内存泄漏?内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费。可能造成内存泄漏的原因:静态集合类引起的内存泄漏:如HashMap和Vector,如果这些容器是静态的,由于他们的生命周期与程序一致,那么容器中的对象在程序结束释放之前不能被释放掉,从而造成内存泄漏。它们引用着的对象也不可以被释放,可以通过remove或者将集合对象设为 null来释放。监听器我们在使用监听器之后没有对监听器进行删除,那么就可能会造成内存泄漏。各
2020-09-14 16:19:52
292
原创 怎么实现保持数据库和缓存数据的一致性
在开发中缓存的使用是特别普遍的,使用缓存可以提高请求的响应速度,还可以减少请求到达DB的次数。但是当你使用缓存的时候就可能面临着缓存里面的数据和你数据库里面存储的数据是不一样的,这样就会导致你请求到的数据都是旧数据。解决方案:更新数据库,然后再删除缓存读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。更新的时候,先更新数据库,然后再删除缓存。但是这样还是会有问题的,就是当你更新数据库的时候更新成功了,但是在你删除缓存的时候删除失败,这个时候你就会发现缓存里面
2020-08-16 15:45:30
674
原创 JAVA中NIO,BIO,AIO理解分析
在理解这三种IO模型之前需要知道同步异步,阻塞和非阻塞这几种概念,还要知道什么是同步阻塞,异步阻塞,同步非阻塞,异步非阻塞。上面的内容在另一篇博客里有讲;通过这个连接可以查看:https://blog.csdn.net/weixin_43404016/article/details/106881672BIOBIO其实就是一种同步阻塞IO,在对数据的读写都是需要在一个线程内完成的。BIO就是一个请求对应一个处理,而每一个处理对应的就是一个线程,因此在使用BIO意味着需要很多的线程开销。下面这是
2020-06-21 15:24:17
452
原创 搞懂什么是同步,异步,阻塞和非阻塞
前面我一直弄不清楚同步异步和阻塞和非阻塞之间的差别是什么,以为他们就是同一个东西,后来去看了一些博客和相关的书籍之后才直到了他们之间的差别。要搞懂他们之间的差别首先要知道调用者和被调用者两个概念。只有知道他们两个概念才好区分同步异步和阻塞非阻塞。其实看他们的名字也很好区分,调用者就可以是用户,然后被调用者就是一些资源。同步和异步,阻塞和非阻塞针对的对象也是不一样的,对于调用者的就是阻塞和非阻塞,被调用者就是同步和异步。同步:A调用B,这个时候A只有等待B有结果才会返回。异步:A调用B,B立即返回,
2020-06-21 10:05:48
904
1
原创 hash冲突以及hash冲突的解决方法
首先说一下hash冲突吧,hash冲突在hash表中一般情况下是会遇到的;hash冲突指的是你在向hash表中存数据时,首先要通过key值进行指定的hash算法进行计算,然后得到一个值,这个值就是你要将这个key对应的value存入的地址。但是在这个地址中已经有值存在,所以这个时候就发生了hash冲突,不同的key通过hash算法得到了对应的同一个值。hash冲突解决的方法:再hash法:这种方法就是有多个hash算法,当使用一个hash算法计算得到值发生hash冲突时那就使用另外一个hash算法
2020-06-20 11:15:48
1222
原创 Linux云服务器(Centos)中启动nginx时候错误解决,以及nginx的启动
错误启动时报这个错误解决:mkdir /var/run/nginx启动nginx/usr/local/nginx/sbin/nginx
2020-05-10 13:20:58
197
原创 Linux云服务器(centos)中启动elasticsearch遇到的错误解决
问题:max virtual memory areas vm.max_map_count [65530] is too low, increaseto at least [262144]解决方法:解决方法elasticsearch启动时遇到的错误问题翻译过来就是:elasticsearch用户拥有的内存权限太小,至少需要262144;解决:切换到root用户执行命令:sysctl -w vm.max_map_count=262144查看结果:sysctl -a|grep vm.
2020-05-10 13:17:55
341
原创 Linux云服务器(Centos)中Redis使用外网连接时出现各种问题的解决办法
问题一 :-DENIED Redis is running in protected modebecause protected mode is enabled, no bind address was specified, noauthentication password isrequested to clients. In this mode connections areonly accepted fromthe loopback interface. If you want to con
2020-05-10 13:13:36
801
原创 Linux云服务器(centos)中Redis不可以使用外网访问解决
1 确认防火墙是否开启了6379端口添加端口:firewall-cmd --zone=public --add-port=6379/tcp --permanent刷新防火墙:firewall-cmd --reload2 找到 redis.conf 文件1 bind 127.0.0.1改为绑定 bind 0.0.0.02 protected-mode yes改为protected-mode no3 如果你是阿里云的服务器,那么可能还需要在安全组中开启端口4 在重启redis,即可。cd /op
2020-05-10 12:53:09
483
原创 Java 中递归的讲解,以及实例应用。经典案例:迷宫问题以及八皇后问题解决
递归调用规则:1.当程序执行到一个方法时,就会开辟一个独立的空间(栈)2.每个空间的局部变量是独立的,不会相互影响3.如果方法中使用的是引用类型变量(例如数组),这个变量就是共享4.递归必须向退出条件逼近,否则就可能无限递归,会出现栈溢出5.当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也执行完毕递归的概念递归就是自己调用自己,每次传入不同的参数,递归有助于解决复杂的问题,同时可以让代码变得简洁。经典案例:迷宫问题,八皇后
2020-05-10 12:38:59
433
原创 Java中栈的实现,分别用数组和用链表来模拟
栈(stack)栈是一个先进后出的有序列表栈的插入和删除只可以在同一段操作,允许删除和插入的一端是栈顶(top),另一端为固定的一端,称为栈底(bottom)实现栈思路1.使用数组来模拟栈2.定义一个top来表示栈顶,初始化为-1.3.入栈的操作,当有数据入栈的时候,top++,stack[top]=data4.出栈操作,当有数据出栈时候,int value = stack[top],top–;使用数组来模拟实现package com.gsy.stack;import java.uti
2020-05-10 12:32:15
206
原创 Java单向环形链表,解决约瑟夫问题
单向环形问题的实际引用;约瑟夫问题解决构建一个单向环形链表思路:1.先创建第一个节点,让first指向该节点,并形成环2.当我们每创建一个新的节点,就将其加入到已有的环形链表中即可。遍历环形链表:1.先让一个辅助指针curBoy指向first2.然后通过一个whil循环遍历该环形链表,curBoy.next = first时候就遍历结束小孩出圈思路:根据用户输入,生成一个小孩出圈序列n=5,即有5个人k=1,从第一个数开始报数,m=2,数2下1.需要创建一个辅助指针helper
2020-05-10 11:42:36
198
原创 Java实现双向链表
单链表只可以有一个方向进行查找,而双向链表可以向前或者向后查找单向链表不可以自我删除,需要一个辅助节点,而双向链表可以实现自我删除遍历:双向链表的遍历思路和单链表的思路是一样的,只是可以向前,也可以向后添加:(默认添加到双向链表的最后)先找到双向链表最后的这个节点;temp.next = 新节点;新节点.pre = temp;修改:修改思路和双向链表是一样的删除:因为是双链表,所以可以自我删除某个节点。找到要删除的那个节点,temp;temp.pre.next = temp.nex
2020-05-10 10:41:39
607
原创 Spring IOC的实现原理理解
由于对象之间存在了复杂的依赖关系,导致耦合度较高,为了解决这个问题,所以提出了ioc原理ioc(控制反转)是什么其实简单来说就是你在创建对象的时候不用自己去new 一个对象,而是有别的给你提供,在spring 中就有ioc容器给你提供对象。ioc在spring中怎么实现我个人觉得spring中的ioc实现其实就是加强版的工厂模式,然后它通过加载配置文件来初始化对象。在这里配置文件可以用xml , properties等都可以,但是不同的配置文件类型需要用不同的解析器去解读。然后 Spring B.
2020-05-10 10:32:15
1412
1
原创 jdk1.7下的ConcurrentHashMap
我们在使用hashmap的时候,它不是线程安全的,而且还会出现死循环和数据丢失这些问题;使用hashtable可以保证线程安全,但是呢hashtable的效率是比较低的,hashtable中的方法是直接被synchronized关键字修饰的,一次就只可以一个线程执行,所以说效率是低的,这个时候就有了ConcurrentHashMap,它可以保证线程安全,同时也保证了效率。ConcurrentHa...
2020-04-18 11:00:42
1290
原创 Jdk1.7下的HashMap
一. 概述首先我们都知道java1.7中hashmap使用的数据结构是数组加链表;hashmap也不是线程安全的;它支持key和value都是null,但是这样的值只允许有一个。hashMap的底层是用了一个Entry的数组,然后数组中的一个每一个节点对应着一个链表。二. 源码解析源码中重要变量//默认初始化容量,1向左移4位,就是16static final int DEFAUL...
2020-04-17 11:11:58
203
原创 Java中ThreadLocal的使用以及其源码详解
ThreadLocal其实就是为共享变量在每个线程种创建一个副本,然后可以每一个线程可以访问自己的副本变量。ThreadLocal使用没有使用threadlocal前:package threadlocal;import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;/** * @program: JavaBasic * @descri...
2020-04-13 11:19:44
203
原创 Mysql中事务的介绍以及事务的特性介绍,事务的隔离级别以及事务并发带来的问题解决
一. 事务的概念在百度上事务的概念是指数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作构成。我觉得事务就是当你要完成一个对数据库数据的操作时候,可能一条sql语句完成不了,想要使用多条sql语句一起完成,而且这几条sql语句一定要都执行成功对数据库的修改或者对数据库数据修改都执行失败的一个事件。就例如你要在一个平台上注销你的账号,那么关于你账号的所有数据都需要删除,同时涉及好多张...
2020-04-11 11:19:08
139
原创 Mysql索引的介绍,以及索引的使用方法
一. 什么是索引索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B树, B+树和Hash。索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大查询数据所花费的时间就越多。如果表中查询的列有索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。例如:有一个Stude...
2020-04-08 12:04:07
392
1
原创 Java中成员变量和局部变量的概述,以及区分
1. 成员变量和局部变量概述在Java中,可以将变量分为成员变量和局部变量两大类;成员变量存放在堆或者方法区中,局部变量存放在栈中。成员变量和局部变量的区别:1). 声明的位置:局部变量:在方法体{ }中,形参,代码块中成员变量:类中方法外类变量:有static修饰实例变量:没有static修饰2).修饰符局部变量:final成员变量:public private protec...
2020-04-07 11:07:22
414
原创 Java参数传递机制
方法参数传递机制:形参的基本数据类型它传递的是数据值,将数据重新复制了一份,所以不会改变实参是引用数据类型传递的是地址值特殊的类型:String ,包装类等对象不可变性当传入之后如果发生改变,那将会创建一个新的数据,所以也是没有变化。...
2020-04-06 11:44:23
118
原创 Java类的初始化过程和实例的初始化过程
一个类要创建实例首先就要初始化类类的初始化过程一个类要创建实例需要先加载并初始化该类,main()方法所在的类需要先加载和初始化一个子类初始化需要先初始化父类一个类的初始化就是执行< clinit>()方法(这个方法是自动生成的)< clinit>()方法有静态类变量显示赋值代码和静态代码块组成静态类变量显示赋值代码和静态代码块按从上到下的顺序执行< ...
2020-04-05 11:03:26
160
原创 Java单例模式的实现方法
1. 阐述单例模式单例模式是一种设计模式,就是说单例对象的类只可以有一个实例对象存在。由自己来创建自己的对象,同时确保只可以有一个对象,而且当你访问的时候只可以直接访问,不需要实例化这个对象。它实现方式主要是有懒汉式和饿汉式两种2. 饿汉式实现直接创建实例化对象,不管你是否需要这个对象饿汉式没是线程安全的饿汉式最简单的实现方法是枚举类1). 第一种实现规则构造器私有化自行创建,并...
2020-04-03 12:19:49
125
原创 java中hashCode()和equals()比较和详解
首先我们要知道equals()的作用是什么?equals()的作用是用来判断两个对象是否相同。equals() 定义在JDK的Object.java中。通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否相等。既然Object.java中定义了equals()方法,这就意味着所有的Java类都实现了equals()方法,所有的类都可以通过equals()去比较两个对象是否相...
2020-03-31 12:03:16
655
原创 Java类加载机制,类加载过程,类加载器以及双亲委派详解
1. 加载机制的概念类加载机制Java编译生成后的.class文件中的二进制数据读取到内存中,将其放到jvm运行时的数据区的方法区中,然后在堆区创建一个Class对象,用来封装方法区内的数据结构。2. 类的加载过程 类的加载过程主要是加载,验证,准备,解析,初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化...
2020-03-30 11:40:47
179
原创 JAVA数据结构之单链表实现创建,增加,删除,插入,修改,打印操作
链表是以节点的方式来存储,是链式存储每个节点包含data域,next域,指向下一个节点如图,发现链表的各个节点不一定是连续存储链表分带头节点和不带头节点链表,根据实际的需求来确定链表主要的操作就是增删查改,还有逆序输出。添加(创建)1.先创建一个head头节点,作用就是表示单链表的头2.后面我们每添加一个节点,就直接加到链表最后遍历:通过一个辅助变量,帮助遍历整个链表 publ...
2020-03-29 13:41:00
1047
原创 JAVA数据结构之使用数组进行循环队列的实现
前面的博客实现了普通的队列,但是不可以重用,然后现在就要用循环队列来解决它的问题。普通队列的地址:普通队列数组模拟环形队列1.front变量的含义做一个调整:front指向队列的第一个元素,也就是front初始值为02.rear变量的含义做一个调整,rear指向队列的最后一个元素的后一个位置,可以空出一个空间作为约定,rear初始值为03.当队列满时,条件是(rear+1)%maxsiz...
2020-03-29 13:26:45
274
1
原创 JAVA数据结构之使用数组实现队列
队列是一个有序列表,它可以用数组或者是链表来实现遵循先进先出的原则。先存入的数据要先取出,后存入的要后取出数组模拟队列队列本身是有序队列,所以使用数组来实现队列的输入和输出是有前后端来处理,因此需要两个变量front及rear分别记录队列前后端的下标,front会根据队列的输出而改变,rear会根据队列的输入而改变。往队列中插入数据将尾指针rear后移,但是前提是rear小于队列的最大...
2020-03-29 13:20:21
337
原创 Java数据结构实现稀疏数组
首先什么是稀疏数组呢?当一个数据大部分为0或者大部分都为1时,可以用另外一个数组来保存它,节约空间。先用图片表示将二维数组转化为稀疏数组的思路:1.遍历原始的二维数组,得到有效数据的个数sum2.根据sum就可以创建稀疏数组 sparseArr int[sum+1][3]3.将二维数组的有效数据存入到稀疏数组中稀疏数组转化为二维数组的思路:1.先读取稀疏数组的第一行,根据第一行的...
2020-03-29 13:12:36
186
1
原创 JAVA内存分配以及常量存储位置解析
Java内存分配与管理是Java的核心技术之一,前面我介绍过Java垃圾回收的一些知识,今天我们看Java的内存分配。一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中(new 出来的对象) ◆堆:存放用new产生的数据 ◆静态域:存放在对象中用static定义的静态成员 ◆常...
2020-03-18 14:37:25
490
原创 RabbitMQ简介
要了解RabbitMQ首先要知道什么是消息队列?为什么会产生消息队列?首先,什么是消息队列呢?消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。其主要用途:不同进程Process/线程Thread之间通信。为什么会产生消息队列?不同进程(process)之间传递消息时,两个进程之间耦合程度过高,...
2020-03-18 09:42:46
188
原创 Java多线程详解
要想了解多线程,首先要知道线程是什么,它和程序,进程之间的差别。程序:就是一个静态的代码块,静态的对象。进程:就是一个程序执行的过程或者是一个正在运行的程序,比如电脑里面运行的qq,或者运行的浏览器。每个独立执行的程序都可以叫做一个进程线程:就是在进程里同时做不同的事情,比如在QQ里面既要发送消息,还要接收消息,这就是不同的线程。多线程在java中实现的两种方法(1). 继承Threa...
2020-03-17 15:34:05
137
原创 Java 垃圾回收机制
垃圾收集GC(Garbage Collection)是Java语言的核心技术之一, 在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理。在平时开发中需要创建大量的对象,如果这些对象没有回收那么会占用大量的内存空间,最后会导致溢出。Java内存回收那么首先要知道jvm的内存结构java运行时内存主要是分为三个部分其中PC寄存器、java虚拟机栈、本地方法...
2020-03-15 11:30:21
141
原创 Java基础之接口和抽象类
在java中提供了两种方法来实现OOP的抽象,抽象类和接口。很多时候我们需要在接口和抽象类中做出选择。一. 接口接口的理解:我觉得接口就是一个特殊的类,它主要是为了解决java不可以实现多继承的特性,在开发过程中接口更多的是用在标准的定义。而且接口中的方法都是没有方法体的,都是一些抽象方法。接口的要求:1、接口中的属性默认为public static final类型的。2、接口中的方...
2020-03-14 10:16:56
134
原创 JAVA中方法重载和重写详解
Java中有三大特性,分别是继承,多态,封装;重载和重写是多态的重要体现的两种方式。一. 重载概念:重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。我们使用重载方法时需要注意以下几点:(1).在使用重载时只能通过不同的参数列表,必须具有不同的参数列表(2).不能通过访问权限、返回类型、抛出的异常进行重载(3).方法的...
2020-03-13 15:42:19
412
原创 Java集合详解
先通过一张图来展示java集合类之间的继承关系先总的来说一下list,set,map的特点list里存放数据是有序的,它的顺序是按照存放顺序,元素以线性方式存储,集合中可以存放重复对象。set中存放数据是无序的,它里面的数据也不可以重复,集合中的数据不按特定的顺序排序,只是简单的把数据放入集合中。map是Java.util包中的另一个接口,它和Collection接口没有关系,是相互独立...
2020-03-12 11:43:05
152
原创 怎么查看端口号被哪个程序占用从而解决端口冲突
在java后台开发过程中我们可能都会遇到端口被占用的问题,但是此时又不知道端口被哪个端口占用,用下面方法可以查看端口是被哪个程序占用,然后结束这个程序就可以解决端口被占用的问题1.按windows+R键,输入cmd命令,回车2.输入netstat -ano命令回车,查找你要找的端口号3.Ctrl+Alt+Del打开任务管理器,然后在详细信息下面可以看到PID和对应的占用端口的程序4.找...
2020-03-03 15:23:41
3679
原创 C/C++实现链表的操作,可以从文件中存取数据
链表的操作很容易理解,直接上代码#include #include <stdio.h>#include <stdlib.h>#include #define NULL 0using namespace std;struct Book {int id;char name[20];char author[20];char publish[20];floa...
2019-07-01 16:19:50
3566
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人