java基础
文章平均质量分 92
咖啡不加冰和糖
有志者,事竟成
展开
-
jdk7HashMap扩容和扩容死锁分析
1. 前言jdk7的HashMap扩容过程在多线程下容易形成环,线程不安全,那么怎么产生的环?要解决这个问题,就要先弄懂jdk7下的HashMap是怎么扩容的,这里先介绍扩容过程,然后分析环的形成过程。2. 扩容过程jdk7中,扩容代码如下:void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.length;//新数组的长度 for (Entry<K,V>原创 2020-06-16 12:37:15 · 1229 阅读 · 0 评论 -
LeetCode链表之 K 个一组翻转链表
题目:给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。思路:3步:找到第k个结点--------翻转-------连接到链表中。从前往后遍历链表,当遇到第k个结点,进行翻转;然后再往后遍历k个结点,进行翻转,重复进行,由此可以用递归来实现。public ListNode reverseKGroup(ListNode head, int k) { if(hea原创 2020-05-15 13:19:27 · 356 阅读 · 0 评论 -
数据结构中的各种树总结
虽然学习了数据结构,但是在平时学习中,发现自己对一些树的基本概念经常混淆,这里进行记录总结。这里只是总结一些基本的概念。大顶堆和小顶堆无论是大顶堆还是小顶堆,它的前提条件是:首先是一个完全二叉树大顶堆:任意非叶子结点的值都大于等于子结点的值。 java中创建大顶堆小顶堆:任意非叶子结点的值都小于等于子结点的值。java中默认创建的是小顶堆。大顶堆创建如下://创建一个包含k个元素的大顶堆Queue<Integer> heap = new PriorityQueue<原创 2020-05-12 14:25:47 · 263 阅读 · 0 评论 -
java并发编程之按顺序打印字母问题
问题:按顺序打印字母。如abcabcabcabcabc,即将字母abc按顺序打印5次。思路:设置3个线程,分别打印a,b,c,设置1个标志位flag,表示当前该打印哪个字母,如果线程要打印的字母和该标志相等,打印字母、更新flag、唤醒等待线程;否则线程等待被唤醒。参考代码/** * 按顺序打印字母a,b,c,打印结果为abcabcabcabcabc * **//** *...原创 2020-05-06 20:23:06 · 442 阅读 · 0 评论 -
Java多线程笔记
关于方法执行过程:关于join():等待某线程运行完成再执行某一操作例如:有2个线程,main和t1,在main中调用t1.join(),意思是 main线程等待t1执行完成后再执行。join(time):设置等待时间,过时不候;但是如果 t1线程的等待时间 大于要等待线程t2的运行时间,那么t2执行完成就开始继续执行线程t1,不会傻傻的等到t1自己设置的时间结束后再运行t1。int...原创 2020-04-23 13:33:38 · 236 阅读 · 0 评论 -
LeetCode之移除重复节点
题目:示例1:输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3]示例2:输入:[1, 1, 1, 1, 2]输出:[1, 2]提示:链表长度在[0, 20000]范围内。链表元素在[0, 20000]范围内。进阶:如果不得使用临时缓冲区,该怎么解决?思路:从头到尾遍历链表:如果当前节点的值存在在hash表中,则删除当前结点;如果当前节点的值不在...原创 2020-04-15 00:35:48 · 209 阅读 · 0 评论 -
链表操作总结
整理一些关于链表的操作,供自己来进行复习。反转链表public ListNode resverse(ListNode head){ if(head == null || head.next == null)return head; ListNode pre = null; ListNode curr = head; ListNode nextNode = head....原创 2020-04-13 23:12:46 · 145 阅读 · 0 评论 -
LeetCode之相交链表
题目:编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:在节点 c1 开始相交。思路:设置2个指针p,q,p指向A链表的headA结点,q指向B链表的headB结点,开始遍历,p移动1步,q移动1步,p为空时,令p= headB;q为空时,令q=headA,这样,当p==q时,返回true,否则返回false。参考代码:public ListNode getIn...原创 2020-04-12 20:32:33 · 86 阅读 · 0 评论 -
LeetCode之环形链表
题目:参考代码:原创 2020-04-12 12:30:29 · 112 阅读 · 0 评论 -
LeetCode之删除排序链表中的重复元素
题目:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例 1:输入: 1->1->2输出: 1->2示例 2:输入: 1->1->2->3->3输出: 1->2->3参考代码1:public static ListNode deleteDuplicates(ListNode head) { ...原创 2020-04-12 11:04:24 · 110 阅读 · 0 评论 -
ArrayBlockingQueue源码浅析
概述ArrayBlockingQueue由数组实现,元素插入队列尾部,从队列头部出队,是一个有界队。属性public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable {...原创 2020-04-08 19:24:08 · 196 阅读 · 0 评论 -
java之CountDownLatch浅析
概述CountDownLatch是一个工具类,位于java.util.concurrent包下面,用它可以控制对多个线程执行的顺序:一个或者多个线程要等到其他线程执行完成后才能执行。例子举个例子,有三个工人在为老板干活,这个老板有一个习惯,就是当三个工人把一天的活都干完了的时候,他就来检查所有工人所干的活。记住这个条件:三个工人先全部干完活,老板才检查。所以在这里用Java代码设计两个类,W...原创 2020-04-07 16:02:02 · 184 阅读 · 0 评论 -
java集合之HashSet源码浅析
本文基于JDK1.8来进行分析。HashSet简介HashSet实现了Set接口,实际上是一个HashMap的实例(源码中可以看到),它不保证集合的迭代顺序,允许元素为null;HashSet不是线程安全的,要保证线程安全,可以用Collections.synchronizedSet(Set s)或者CopyOnWriteArraySet类;HashSet不允许元素重复。源码分析p...原创 2020-04-07 13:18:29 · 137 阅读 · 0 评论 -
java中的Unsafe类浅析
unsafe类java是无法直接访问操作系统底层的,可以通过Unsafe类来访问操作系统底层。Unsafe类可以提升Java运行效率。Unsafe的大部分API都是native的方法,主要包括以下几类:1)Class相关。主要提供Class和它的静态字段的操作方法。2)Object相关。主要提供Object和它的字段的操作方法。3)Arrray相关。主要提供数组及其中元素的操作方法。4...转载 2020-04-07 11:25:55 · 168 阅读 · 0 评论 -
剑指offer之二进制中1的个数求解
题目请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。方法一:一个二进制表示的数n和1做与运算,如果为0,表示n的最后一位为0,如果为1,表示n的最后一位为1,计数器加1,将n无符号右移一位,再进行上述操作。参考代码:public int numberOfOne(int n){ int count ...原创 2020-04-06 23:50:57 · 111 阅读 · 0 评论 -
剑指offer之斐波那契数列求解
题目写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列的定义如下: 参考代码方法一:递归public int fibonacci(int n){ if(n <= 0 || n == 1)return n; //边界条件 return fibonacci(n - 1) + fibonacci(n - 2);}方法二:备忘录public i...原创 2020-04-06 15:36:48 · 97 阅读 · 0 评论 -
旋转数组的最小数字
题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。思路观察循环数组,发现可以分成2个部分,两个部分元素都是递增的,且前部分的最后一个元素大于后部分的第一个元素。例如:【3,4,5,1,2】可分成【3,4,5】和【1...原创 2020-04-06 11:03:27 · 85 阅读 · 0 评论 -
用两个栈来实现一个队列,完成队列的Push和Pop操作
思路:栈的特点是先进后出,而队列的特点是先进先出。元素进队列,然后出队列,元素顺序不变;而元素进栈,然后又出栈的顺序和原来恰好相反,那么将出栈的元素再执行一次进栈、出栈操作,元素顺序就和元素出队的顺序一致了。具体实现:要用2个栈实现1个队列,则可以这样实现:元素进队列实际上是进栈1,元素出队列实际上是将栈1的元素出栈,然后进入栈2,最后出栈2。参考代码:...原创 2020-04-05 23:37:51 · 371 阅读 · 0 评论 -
剑指Offer之重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如:前序遍历序列{ 1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8,6},重建出下图所示的二叉树并输出它的头结点。思路:前序序列:【1 2 4 7 3 5 6 8】 中序序列:【4 7 2 1 5 3 8 6...原创 2020-04-05 20:37:33 · 100 阅读 · 0 评论 -
java基础之动态代理
静态代理一般来说:1个接口,2个实现类,在代理实现类的实现方法中调用真实类的方法。定义接口。interface Animal{ public void show(); }定义真正的实现类。class Cat implements Animal{ @Override public void show() { // TODO Auto-generated...原创 2020-04-03 20:58:19 · 142 阅读 · 0 评论 -
剑指offer之从尾到头打印链表
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思路:看到题目的倒序输出,就想到让元素进栈再出栈后放到ArrayList中。//定义Node节点class Node{ private Integer value; private Node next; public Node(Integer value){ this.value = value;...原创 2020-04-02 11:09:25 · 79 阅读 · 0 评论 -
Stack源码分析
publicclass Stack<E> extends Vector<E> { /** * Creates an empty Stack. */ public Stack() { }转载 2020-04-02 10:05:37 · 101 阅读 · 0 评论 -
二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。public boolean find(int[][] a,int target){ if(a == null || a.length <= 0) return false; int m = a.length...原创 2020-04-01 20:57:32 · 77 阅读 · 0 评论 -
单例模式
饿汉式public class Singleton{ private static Singleton instance = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return instance; }}恶汉式:不用等...原创 2020-04-01 13:28:54 · 80 阅读 · 0 评论 -
内部类
内部类分为局部内部类和成员内部类。成员内部类class A { class B{}}内部类可以访问外部类的所有成员。外部类访问内部类要借助内部类对象。局部内部类class A{ public void test(){ class B{} }}...转载 2020-04-01 12:09:56 · 118 阅读 · 0 评论 -
红黑树详细分析
1.红黑树简介红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1978年发明,在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的红黑树。红黑树具有良好的效率,它可在 O(logN) 时间内完成查找、增加、删除等操作。因此,红黑...转载 2020-03-22 18:17:20 · 166 阅读 · 0 评论 -
LinkedHashMap源码浅析
本文基于JDK8进行解析。public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{ static class Entry<K,V> extends HashMap.Node<K,V> { Entr...原创 2020-03-22 12:39:31 · 115 阅读 · 0 评论 -
ConcurrentHashMap解析
public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>, Serializable { private static final long serialVersionUID = 7249069246763182397L;...原创 2020-03-22 11:29:27 · 426 阅读 · 0 评论 -
HashMap源码解析
HashMap在工作中比较常用,而且面试中经常被问到,所以我特意把它列出来进行分析。 本文基于JDK8的源码进行分析。HashMap位于Java.util 包中,键和值都可以为null,并发情况下不安全,数据结构为 数组 + 链表 + 红黑树。本文将从HashMap的 成员变量,get()put(), hash(),等进行分析。基础知识java 中的 << ...原创 2020-03-21 15:56:06 · 168 阅读 · 0 评论 -
Java的序列化和反序列化
本节,我们来分析对象的序列化和反序列化。从以下几个方面来进行分析:为什么要进行序列化?什么是序列化与反序列化?如何实现序列化和反序列化?序列化和反序列化要注意什么问题?如何进行解决?为什么要进行序列化?将Java对象状态信息存储在硬盘或数据库中;通过网络传输Java对象,所以序列化Java类。通过RMI传输对象的时候;什么是序列化和反序列化?序列化: 将 ...原创 2020-03-20 10:40:44 · 156 阅读 · 0 评论 -
String源码解析
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { private final char value[]; private int hash; // Default to 0 /** use serialVersionU...原创 2020-03-14 16:08:32 · 103 阅读 · 0 评论 -
list.size() > 0 && list != null 和 list != null && list.size() > 0 的区别
list.size() > 0 && list != null 和 list != null && list.size()>0 的区别使用场合:list==null; 此时list还没有实例化(new);list.size()==0; 此时表明list已经实例化了,但list集合里面没有元素,长度为0区别:...原创 2018-12-17 10:59:36 · 1254 阅读 · 0 评论