- 博客(43)
- 收藏
- 关注
原创 多线程交替打印
多线程交替打印1.使用synchronized加锁方式public class test { public static void main(String[] args) { Count c = new Count(0); new Thread(()->{ c.even(); }).start(); try { Thread.sleep(1000); } catch (Int
2021-04-15 11:33:45 321
原创 HashMap的容量为什么是2的幂次
HashMap的容量为什么是2的幂次?hash取值范围非常大必要要经过取余操作才能作为下标使用,在HashMap中使用与运算代替取余运算,因为位运算的与操作比取模操作效率高很多,但是前提是数组长度是2的幂次,只有长度为2的幂次的时候取余操作从等价于除数减1的与操作而且2的幂次的二进制表示除了首位其他位都是0,减去1之后除了首位为0后面的n位都为1,在进行与运算的时候运算效率很高而且结果取决于hash值后面的n位充分利用了数组减少空间浪费,降低了hash冲突...
2021-04-04 16:06:22 359
原创 牛客编程题-压缩算法问题-递归解法
题目描述:Java语言递归解法:import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param str string字符串 * @return string字符串 */ public String compress (String str) { // write cod
2021-04-04 14:17:35 234
原创 有2n+1个数其中n个数是成对出现的只有一个数单个出现找出这个数
关键点!任何数与0异或值不变,与自己异或值为0因此一个数两次异或同一个数值不变代码实现:public class BitOperation { public static void main(String[] args) { int nums[] = {3,2,3,2,5,5,8,1,6,1,6}; int res = 0; //用0去异或数组中所有的数 for (int i = 0; i <nums.length ; i++) {.
2021-04-01 21:13:44 552
原创 LRU算法
LRU(Least Recently Used)算法一般用来作为缓存淘汰策略,该算法的作用就是每次操作会将被操作的数据放在最前面,然后当缓存满了之后就会删除最末尾的数据也就是最近最少使用的数据。LRU算法底层的数据结构是一个双向链表加一个哈希表,因为LRU中的查询数据和存放数据都要求时间复杂度为O(1)其中查询之后会将数据放置在最前面这里涉及到了删除操作先删除然后再添加进双向链表,因此必须借助哈希表和双向链表的优势才能实现。Java中有LinkedHashMap这个集合类,这个集合类就是双向链表加.
2021-03-24 21:09:49 214
原创 堆排序
堆排序堆排序是不稳定的排序算法在排序的过程中两个相等的元素的相对位置可能会发生改变,时间复杂度比较低为O(nlogn),空间复杂度为O(1)不需要额外的空间堆排序借助了二叉堆这个数据结构,需要升序排序的时候使用最大堆,降序使用最小堆升序排序步骤:需要排序的无序数组可以看作是一个完全二叉树首先将这个无序的完全二叉树,构建成一个最大堆然后删除堆顶元素,具体的操作就是和堆的删除操作一样,先将堆顶元素和堆底元素交换然后删除堆顶元素,最后再调整堆也就是将交换后的堆顶元素下沉到合适位置,重复操作直到堆.
2021-03-24 17:52:10 245
原创 构建最大/最小堆
堆平常所说的堆也就是二叉堆性质比二叉排序树(BST)更简单,堆顶的元素是最值,堆的主要操作有上浮下沉和删除堆顶元素插入元素。堆的性质:堆顶元素是整个堆中的最大值最小堆堆顶元素是最小值,这个性质在整个二叉堆中每个子节点都适用堆底层数据结构堆底层实际存储元素的数据结构是数组,利用数组的索引之间的关系来表示二叉堆的左右子节点由于数组中的第一个元素索引为0所以不能使用,0与任何数进行乘除操作都为0二叉堆的索引有如下关系:假设堆中某个节点的索引下标为index父节点下标为 index/2左子节
2021-03-23 20:13:58 290
原创 什么是协程?
什么是协程?协程一般也被叫做微线程,是比线程更小更轻量级的存在了解协程之前我们先来复习一下进程和线程进程就相当启动了一个程序,进程是程序的启动实例,一个运行着的程序就是一个进程我们的计算机中会同时运行着很多个程序也就是有很多个进程。同时一个进程中又有很多个线程,线程是程序的实际执行者在Java程序中的线程共享堆和方法区,每个线程独有的是虚拟机栈和本地方法栈以及程序计数器,进程是计算机资源的最小分配单位,线程是cpu调度的最小单位。进程和线程的协作方式最经典的例子就是生产者消费者模式,若干个消费.
2021-03-23 19:29:49 103
原创 归并排序
归并排序是一种算法的时间复杂度比较低,但是空间复杂度比较的高的排序算法,用空间换时间。而且归并排序是比较稳定的相等的元素在排序过程中的相对位置不会发生变化而且归并排序比较稳定最好平均最坏时间复杂度都是O(nlogn) public void mergeSort(int []arr,int []temp ,int left,int right) {// if(left<right)继续进行递归的判断条件满足就继续递归// 而if(left>=right)是递归的出口,结束继续.
2021-03-16 21:28:42 85
原创 快速排序
快排是一种时间复杂度很低的排序算法,快速排序算法也是不稳点的算法在划分比较好多情况下速度很快最好的情况下时间复杂度为O(nlogn)也就是每次划分都将区间分为了一半的情况下,最坏的时间复杂度为O(n^2)也就是数组已经有序的情况下 public void quicklySort(int indexLeft,int indexRight,int []array){ int l = indexLeft; int r = indexRight; int flag = array[indexLef.
2021-03-16 20:59:02 76
原创 ARP协议
ARP协议 即IP地址解析协议,通过IP地址得到IP地址所在主机的MAC地址ARP协议的应用背景当我们在传输IP数据报的时候,知道了源IP地址和目标IP地址,然后主机通过路由表找到下一跳的IP地址,但是此时只知道IP地址不知道MAC地址是肯定完成不了数据报的传输,此时就用到了ARP协议ARP协议的工作原理ARP协议包含ARP请求包和ARP响应包,首先主机使用广播向网段中所有的主机发送ARP请求包,该包中包含下一跳的IP地址,当网段中的主机收到ARP请求包之后会解析出其中的IP地址并且与自己的IP.
2021-03-12 14:30:28 132
DNS域名系统
DNS(域名系统)人们在访问各个网站的时候,地址栏输入的都是网站的域名而不是网站的IP地址,使用域名可以方便人们辨别和记忆使得访问更加方便。然而访问网站必须要知道网站的IP地址,这个时候就需要用到DNS服务器域名和IP地址的映射分布式系统。域名服务器分为几个层级:根域DNS服务器顶级域DNS服务器顶级域DNS服务器域名解析流程:首先浏览器客户端发出域名解析的请求然后浏览器在缓存中查看是否有域名对应的IP地址如果没有就在操作系统的缓存中查看如果没有就在主机的hosts文件域名解析文件中查看.
2021-03-12 14:11:41 92
原创 IP地址中主机位全为零和全为一
ip地址由网络位和主机位组成主机位全为0的时候,此IP地址表示网络号代表网络段本身,也就是本网段的代表,常用在路由器的路由表中主机位全为1的时候,此IP地址表示广播地址,代表的是整个网段中的所有主机可以向该网段中所有的主机发送数据包...
2021-03-11 17:13:51 16687
原创 redis中五种常见数据结构
redis的常见数据类型1. string2. list3. hash4. set5. sorted setstring:string是redis种最常用的数据结构,其中key-value也是string类型,尽管redis是由c编写的但是redis没有使用c语言中使用字符数组的字符串表示方式,而是自己开发了一种简单动态字符串SDS[Simple Dynamic String] redis中的SDS是二进制安全的因此不仅可以存储文本数据也可以存储任意格式的二进制数据,而且获取字符串长度时间
2021-03-03 17:07:41 665
原创 Java原子类中CAS详解
Java原子类中CAS详解在Java中使用volatile关键字不保证操作的原子性从而在多线程环境下会出现问题,解决方法可以使用琐机制使用synchronized和lock进行加锁但是效率极低一般不使用这种方式解决原子性问题,在Java中的java.util.concurrent.atomic 包下有各种数据类型的原子类,使用原子类型来解决原子性问题最为高效public class Atomicity { private static int count = 0; public st
2021-02-05 23:23:56 314
原创 Java中的线程辅助类(CountDownLatch,CyclicBarrier,Semaphore)
CountDownLatch,CyclicBarrier,Semaphore1. CountDownLatch减法计数器,指定的数量的线程先执行,其他线程阻塞 直到指定的线程执行完毕阻塞线程恢复执行代码如下: //减法计数器public class CDL { public static void main(String[] args) { CountDownLatch countDownLatch = new CountDownLatch(6); f
2021-02-03 18:04:21 144
原创 JAVA多线程中的常用方法
JAVA多线程中的常用方法方法名说明public void run()单纯的执行run方法public void start()启动线程并且调用run方法public static void sleep(long millis)静态方法使当前线程进入休眠public static Thread currentThread()获取当前的线程对象public static void yield()线程让位,线程回到就绪状态public void in
2021-01-29 18:43:05 570
原创 JAVA中实现多线程的常用方式
JAVA中多线程的实现方式和常用线程方法详解JAVA实现多线程的三种方式继承Thread类并且重写run方法实现Runnable接口,并且实现接口中的run方法,使用Thread类的有参构造将实现类作为参数传入实现Callable接口并且实现接口中的call方法1.继承Thread类并且重写run方法public class TestMyThread extends Thread{ public static void main(String[] args) { Th
2021-01-29 17:11:45 174 1
原创 转发forward和重定向redirect
转发forward:转发只是一次请求并且是Web服务器内部进行资源跳转,而且浏览器地址栏上的路径也不会改变@WebServlet(urlPatterns = "/aaa")public class Demo extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOEx
2020-12-30 17:47:40 234
原创 session详解
Session是什么???session表示会话,session是为每个访问服务器的浏览器对象保存会话的状态的数据容器在Java中对应的是javax.servlet.http.HttpSession 在会话进程中服务器一直为当前会话维护着一个session对象,一次会话对应一个HttpSession对象session的作用???为每个访问服务器的浏览器对象创建一个存储当前会话信息的数据容器,利用这个session对象可以在当前会话的各个请求之间传递数据什么是一次会话???一般情况下就是指当用户打
2020-12-29 20:57:03 301
原创 HTTP协议
什么的是 HTTP协议?HTTP协议是超文本传输协议,是浏览器和服务器之间的一种通信协议,http协议是由w3c(World Wide Web Consortium 万维网联盟)制定的其本质上就是将数据的传输方式传输格式提前进行规定协商浏览器和服务器必须按照这种方式即(http协议)进行接收和发送数据HTTP协议的特点:支持客户端/服务器模式或者浏览器/服务器模式:客户端向服务器发送请求服务器返回所需的资源简单快速:客户向服务器请求服务时,只需传送请求方法和路径,由于HTTP协议简单,使得HTTP
2020-12-28 21:17:21 204
原创 POST请求和GET请求的区别
GET请求和POST请求是什么?首先GET和POST都是HTTP协议中的两种请求服务器的方式本质上来说并无区别底层都是基于TCP/IP协议栈实现的GET请求和POST请求的区别:GET请求在请求行上提交数据,这种提交方式最终提交的数据会显示在浏览器的地址栏上POST请求在请求体上提交数据,不会在浏览器的地址栏上显示提交的数据GET请求在请求行上提交数据,所以数据的大小有限制而且数据的格式也只能是字符串形式POST请求在请求体中提交数据所以提交的数据大小没有限制而且数据的格式也没有限制可以
2020-12-28 19:48:47 241 1
原创 TCP的三次握手四次挥手
TCP连接的三次握手第一次握手客户端发送一个带有SYN=1,ACK=0,seq=x的报文此时和客户端进入SYN-SENT(SYN发送状态)第二次握手服务器接收到客户端带有SYN的数据包,服务器发出一个SYN=1,ACK=1,seq=y,ack=x+1的确认包然后服务器进入SYN-RCVD(SYN包接收状态)第三次握手客户端收到服务器发来的确认包之后再给服务器发一个确认带有ACK=1,seq=x+1,ack=y+1的确认包此时客户端状态变为ESTAB-LISHED状态,服务器收到确认包
2020-12-28 18:37:52 149
原创 反转链表部分反转和区间反转
链表的反转从头节点开始反转链表ListNode reverse(ListNode head) 该函数的作用就算反转从head开始链表class Solution { public ListNode reverseList(ListNode head) { return reverse(head); } // 反转链表函数 该函数的作用就是将头节点之后的节点反转并且返回反转之后的头节点 public ListNode reverse(ListNode
2020-12-21 19:20:35 168
原创 最长回文子串和字符串中回文子串的个数
最长回文子串思路:将字符串中的每个字符都作为回文串的中心(此处应该考虑到回文串长度为偶数的时候有两个中心)从中心向两边扩展求出一个回文串的长度遍历完字符串后取最长的回文串class Solution { public String longestPalindrome(String s) { String res = ""; for(int i = 0;i<s.length();i++){ // 回文串中心为一个字符时(回文串长度为奇数
2020-12-16 15:55:01 271
原创 最长递增子序列和最长公共子序列以及最长回文子序列详解
子序列问题求解这类子序列问题都可以使用动态规划的思想来解决其中最长递增子序列使用一维动态数组最长公共子序列和最长回文子序列使用二维动态数组最长递增子序列使用一维动态数组class Solution { public int lengthOfLIS(int[] nums) { // 定义dp 数组 dp[i]表示以nums[i]结尾最长上升子序列 int []dp = new int[nums.length]; // baseCase nums
2020-12-16 14:09:27 234 1
原创 二叉树的前中后序非递归(迭代)以及层序遍历
二叉树的前中后序非递归(迭代)遍历思想利用栈这种数据结构从根节点开始扫描树过程中将节点压进栈中从而来保证当前遍历到的节点就算我们要使用的节点非递归前序遍历前序遍历顺序:根节点 左子树 右子树class Solution { public List<Integer> preorderTraversal(TreeNode root) { //根节点为null 树为空 if(root==null){ return new Link
2020-12-15 21:04:02 87
原创 HashMap扩容机制底层源码分析
HashMap的扩容涉及到的方法源码分析put方法源码分析resize方法源码分析treeifyBin方法源码分析
2020-12-14 16:20:23 189 1
原创 判断回文链表,回文串
判断回文链表回文数的特点就是从左往右和从右往左是一样的顺序判断是不是回文链表就利用这一特点12321 这就是一组回文数解决回文链表的思想将原来的链表拷贝一份并且反转(这样做是为了不改变原有链表),如果原链表是回文链表则新拷贝的链表和原来的链表是一样的,此时只需要同时遍历两个链表然后逐个比较代码如下: // 拷贝链表并且反转 ListNode temp = head; ListNode newNode = null; ListNode
2020-12-08 21:03:44 206
原创 解决Hash冲突的四种方法
什么是hash冲突简单来说就是一些值通过hash函数计算之后得到的hash值一样一、链地址法在hash值为k的元素对应的地址上建立一个链表,然后将所有hash值为K的元素都放在此链表上。优点:因为是链表这种数据结构所有增删快缺点:查询慢在Java1.7以及之前都采用的是链地址法来解决HashMap中的hash冲突在java1.8之后当链表长度大于8,且总数据量大于64的时候,链表就会转化成红黑树二、开放定址法当通过hash函数H(key)产生一个地址p=H(key)产生了hash冲突时
2020-12-07 20:20:06 6826 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人