Java
文章平均质量分 78
保护眼睛
这个作者很懒,什么都没留下…
展开
-
Java实现阻塞队列、简易线程池、计时器
Java实现阻塞队列、线程池、计时器Java实现阻塞队列、简易线程池、计时器Java实现阻塞队列、简易线程池、计时器package demo0821;import java.util.ArrayList;import java.util.List;import java.util.concurrent.*;/** * user:ypc; * date:2021-08-21; * time: 9:12; */public class Main { static class B原创 2021-08-21 19:43:55 · 199 阅读 · 0 评论 -
源码之ConcurrentHashMap
源码之ConcurrentHashMap初始化put方法相关源码(JDK1.8)总结初始化核心成员变量和HashMap是类似的(可以看我的这篇)、ConcurrentHashMap是HashMap的线程安全版本(Collections.synchronizedMap、Hashtable也是HashMap线程安全的版本)。初始的容量要是2的次幂:1.如果数组的长度是2的次幂的话、那么在进行取模的运算的时候、就可以使用位运算来代替%:2.如果数组的长度是2 的次幂的话、那么在扩容的时候(扩容也原创 2021-08-03 23:51:59 · 375 阅读 · 4 评论 -
Java内存模型对并发处理的三个特性
JVM(四)原子性可见性有序性从上文的有关JMM的介绍、可以知道Java内存模型对并发的处理都围绕在三个特性—>原子性、可见性、有序性。原子性Java内存模型直接保证的原子性变量的操作包括read、load、assign、use、store、write.我们可以认为基本数据类型的访问、读写都是具有原子性的(除了long 和 double 的非原子的协定)。如果一个场景需要的是更大范围的原子性的保证、JMM还提供了lock和unlock操作来满足这种需求、但是JVM并未将这种操作直接开放给用户,原创 2021-07-30 22:58:58 · 106 阅读 · 2 评论 -
Java内存模型
JVM(三)Java内存模型指的是JMM(Java Memory Model)、是Java虚拟机规范中定义的一种模型、试图屏蔽硬件和操作系统的内存的访问差异的,为了让Java程序在各种的平台达到一致的内存访问效果。Java内存模型的主要的目的就是定义程序中的各种变量的访问的规则的、也就关注的是在虚拟机中将变量存储在内存中、和从内存中取值的细节。这里的变量指的是实列字段、静态的字段、构成数组对象的元素。不包括局部的变量和方法参数、因为这些都是线程私有的。JMM规定了所有的变量存储在主内存中、每个线程都有原创 2021-07-29 22:56:39 · 112 阅读 · 14 评论 -
基于UDP协议实现的‘智能’问答机器人
‘智能’问答机器人效果客户端代码服务端代码思想效果客户端输入消息后:服务端就会自动应答:????客户端代码/** * user:ypc; * date:2021-06-29; * time: 21:03; * 使用UDP创建一个客户端 */public class UDPDemo1 { //创建服务端的ip地址 private static final String ip = "127.0.0.1"; //创建服务器端的端口号 private s原创 2021-07-28 22:53:53 · 453 阅读 · 14 评论 -
锁销除、锁粗化
锁销除、锁粗化锁销除锁粗化锁销除java中的锁销除是指JVM即时编译器在运行的时候,对一些代码要求同步、但是对被检测到不可能存在共享数据的竞争的锁进行消除。锁销除的主要的依据来源于逃逸机制分析的数据支持、如果判断到一段代码中、在堆上的所有的数据都不会逃逸出去被其它的线程访问到的时候,那么就可以把他们当作栈上的数据对待。栈是线程私有的,也就不会发生线程不安全的问题了。来看:????这是看起来一段没有锁的代码但是在JDK5之前字符串的加法操作会转换为StringBuilder对象连续的append(原创 2021-07-26 22:40:02 · 317 阅读 · 14 评论 -
源码之HashMap
源码之HashMap概述哈希冲突和解决方案JDK1.8部分源码解读概述HashMap 基于hashing的原理,通过put(Key,value)和 get(key)方法存储和获取对象当存储对象的时候,将健值队传递给put(key,value)方法时,它调用键对象key的hashCode()方法来计算hashcode,然后找到bucket位置、来存储对象value当获取对象的时候、也是先计算key的hashCode、找到数组中对应位置的bucket位置、然后通过key的equals()方法找到正确的键原创 2021-07-22 01:11:02 · 110 阅读 · 0 评论 -
源码之ArrayList
源码之ArrayListArrayList:底层是一个被transient修饰的object类型的数组,为什么要用transient来修饰呢?被transient关键字修饰的变量不会被序列化、因为因为ArrayList数组elementData中有未使用的空间 ,如果没有使用的空间也序列化,势必会影响性能.ArrayList的动态数组elementData被transient 修饰的 那么反序列化后的ArrayList会丢失了原先的元素吗? ArrayList在序列化的时候会调用writeObj原创 2021-07-09 16:28:01 · 106 阅读 · 0 评论 -
快速排序优化
快速排序优化原始的写法随机数法优化三向切分法优化快速排序又叫快排、思路是找一个元素作为pivot、我们选取最后的元素作为pivot、从数组首位开始遍历、将小于pivot的放在数组前面的位置、最后将pivot放在两个分区的中间、pivot的右边的元素都大于pivot、左边的元素都小于pivot、这就分好了两个区域、然后继续对两个区域分区–>指定pivot、交换元素、分区…直到分区只有一个元素的时候也就都有序了。时间复杂度为log2n、但是最坏的情况下也会变为O(n²):假设数组是有序的、那么每次找的原创 2021-07-09 12:15:27 · 78 阅读 · 1 评论 -
源码之LinkedList
源码之LinkedListLinked List:首先LinkedList底层是一个双向的链表、链表的结点是带有前驱节点和后继节点、以及值item 的结点。常见的方法:getFirst 和 getLast方法将链表的第一个结点或者尾结点保存、如果首或尾结点为空的话、抛出异常、否则返回结点的值。RemoveFirst 和 remove Last方法将first 或者 last结点的值赋给l,判断l是否为空、为空就抛出异常、否则调用unlinkFirst和unlinkLast方法来删除头或者尾结原创 2021-07-06 14:03:48 · 92 阅读 · 2 评论 -
常见排序算法的优化
常见排序算法的优化冒泡排序原始的写法优化一优化二选择排序方法一方法二堆排序建大堆来实现堆排建小堆来实现堆排插入排序实现优化一优化二归并排序递归实现归并排序优化来看O(n)的排序冒泡排序冒泡排序的思想:每次让当前的元素和它的下一个元素比较大小、如果前一个的元素大于后一个元素的话,交换两个元素。这样的话经历一次扫描之后能确保数组的最后一个元素一定是数组中最大的元素。那么下次扫描的长度比上次少一个、因为数组的最后一个元素已经是最大的了、即最后一个元素已经有序了。优化一: 优化的思路就是每一次扫描遍历一原创 2021-06-28 12:19:48 · 411 阅读 · 18 评论 -
Java之枚举、注解、反射
Java之枚举、注解、反射枚举什么是枚举?枚举类的实现自定义实现枚举类使用关键字enum定义枚举类Enum的常用方法实现接口的枚举类注解注解概述常见的注解反射什么是反射?反射的用途反射的具体作用反射的主要APIClass类获取Class实例的四种方式通过反射创建运行时类的对象通过反射获取运行类的属性及权限修饰符、变量名 、数据的类型通过反射获取运行时类的方法结构及其内部结构通过反射获取运行时类的构造结构通过反射获取运行时类的父类和父类的泛型、注解、接口、所在包通过反射调用运行时类的指定属性、方法、构造方法原创 2021-06-22 21:01:18 · 1124 阅读 · 22 评论 -
JVM类加载机制、垃圾回收
JVM运行时数据区域原创 2021-06-19 12:09:01 · 292 阅读 · 4 评论 -
Java多线程
Java多线程Java多线程线程的创建线程常见方法线程的状态线程的优先级守护线程线程组Java线程池线程池的创建线程池的参数线程池的使用线程不安全问题Java中的锁synchronized同步方法synchronized同步语句块synchronized锁的优化问题volatile关键字Lock类的使用线程间通信wait/notify生产者/消费者模式的实现join方法的使用ThreadLocal的使用InheritableThreadLocal的使用定时器Timer单例模式与多线程立即加载/饿汉模式延时加原创 2021-06-14 20:18:30 · 17892 阅读 · 26 评论 -
leetcode 记录
leetcode 记录559.求N叉树的深度559.求N叉树的深度class Solution559 { //递归实现 public int maxDepth(Node root) { if (root == null) return 0; int res = 1; for (Node child : root.children) { res = Math.max(res, maxDepth(child) + 1)原创 2021-06-07 16:17:30 · 57 阅读 · 1 评论 -
leetcode 记录
leetcode 记录896.判断一个数列是否是单调数列896.判断一个数列是否是单调数列/** * user:ypc; * date:2021-06-02; * time: 15:05; */class Solution896 { public boolean isMonotonic(int[] nums) { boolean increase = false; boolean decrease = false; int len = n原创 2021-06-02 17:25:57 · 86 阅读 · 2 评论 -
JVM运行时数据区域
JVM基本概述JVM一、JVM的内存布局堆区JVM栈程序计数器本地方法栈方法区二、 JVM类的加载过程三、双亲委派模型四、 JVM的垃圾回收判断死亡对象垃圾回收算法垃圾回收器JVM一、JVM的内存布局堆区堆区是线程共享的,所有创建对象的信息都在这个区域,堆也是JVM最大的一块内存。JVM栈JVM栈是线程私有的,JVM栈中存放了局部变量表、操作栈、动态链接、方法返回地址。局部变量表:有八大基本数据类型和引用。操作栈:它是每个方法都会生成的栈动态链接:指向字符串常量池的方法的返回地址:pc寄原创 2021-05-31 17:54:30 · 102 阅读 · 7 评论 -
leetcode记录
leetcode记录448找到所有数组中消失的数字448找到所有数组中消失的数字class Solution { public static List<Integer> findDisappearedNumbers(int[] nums) { int len = nums.length; int index =0; while (index<len) { if (nums[index] == index +原创 2021-05-26 21:50:19 · 96 阅读 · 4 评论 -
哈希表基本功能实现
哈希表基本功能实现哈希表头插法放入元素哈希表尾插法放入元素哈希表头插、尾插扩容找到key对应的value运行结果哈希表的泛型实现为什么JDK1.7及之前使用头插法而JDK1.8使用尾插法欢迎指正,相互关注啊????上篇????二叉搜索树的基本操作哈希表头插法放入元素/** * user:ypc; * date:2021-05-20; * time: 11:05; */public class HashBuck { class Node { public int k原创 2021-05-20 15:59:29 · 2492 阅读 · 33 评论 -
二叉搜索树的基本操作
二叉搜索树的基本操作二叉搜索树插入元素搜索指定节点删除节点方式一删除节点方式二运行结果欢迎指正,相互关注啊????上篇????二叉树二叉搜索树插入元素/** * user:ypc; * date:2021-05-18; * time: 15:09; */ class Node { int val; Node left; Node right; Node(int val) { this.val原创 2021-05-19 12:39:53 · 270 阅读 · 18 评论 -
常见的排序算法
常见的排序算法冒泡排序选择排序插入排序shell排序堆排序快速排序快速排序非递归实现归并排序非递归实现归并排序欢迎指正,相互关注啊????上篇????栈和队列-上冒泡排序选择排序插入排序shell排序堆排序快速排序快速排序非递归实现归并排序非递归实现归并排序欢迎指正,相互关注啊????...原创 2021-05-17 12:13:20 · 179 阅读 · 0 评论 -
二叉树
二叉树二叉树基本概念二叉树的基本性质二叉树的基本操作由字符串创建一颗二叉树二叉树生成字符串层序遍历二叉树检查两棵二叉树是否相同二叉树的最大深度二叉树的最大宽度一棵树是否是完全二叉树判断一棵二叉树是否是平衡二叉树一棵二叉树是否是对称二叉树一棵树是不是另一颗树的子树分层遍历二叉树找出一颗二叉树的最近公共祖先二叉树搜索树转换成排序双向链表根据一棵树的前序遍历与中序遍历构造二叉树根据一棵树的中序遍历与后序遍历构造二叉树二叉树创建字符串二叉树的前后中遍历的非递归实现欢迎指正,相互关注啊????上篇????java原创 2021-05-14 19:46:28 · 195 阅读 · 1 评论 -
栈和队列-上
栈和队列-上栈和队列基本概念顺序表实现栈及其基本操作分析源码运行结果链表实现栈及其基本操作分析源码运行结果链表实现队列及其基本操作分析源码运行结果顺序表实现队列及其基本操作分析源码运行结果用队列实现栈分析源码运行结果用栈实现队列分析源码运行结果集合集合中的栈和队列及其使用欢迎指正,相互关注啊????上篇????java之String、StringBuffer 、 StringBuilder有什么区别?String不可变?栈和队列基本概念栈和队列都属于线性表,因为它们也都用于存储逻辑关系为 “一对一”原创 2021-05-03 20:57:03 · 249 阅读 · 1 评论 -
Java比较器之Comparable和Comparator
Java比较器之Comparable和Comparator比较器ComparableComparator总结欢迎指正,相互关注啊????上篇????java之String、StringBuffer 、 StringBuilder有什么区别?String不可变?比较器如果需要比较对象之间的某一个属性之间的大小,就可以使用到Java中的比较器。ComparableComparable是个接口,通过对象实现Comparable接口,重写compareTo()方法。实现:class 要比较的类的类名原创 2021-04-27 21:05:43 · 379 阅读 · 11 评论 -
java之String、StringBuffer 、 StringBuilder有什么区别?String不可变?
java之String、StringBuffer 、 StringBuilder有什么区别?String不可变?String类String的定义==和equals()方法?字符串常量池String字符串不可变如何修改字符串?字符串不可变的优点字符与字符串字节与字符串(有坑)String常用函数StringBuffer类、StringBuilder类总结String、StringBuffer 、StringBuilder欢迎指正,相互关注啊????上篇????面向对象编程之继承、多态、封装、抽象类、接口、原创 2021-04-25 13:52:59 · 4454 阅读 · 31 评论 -
面向对象编程之继承、多态、封装、抽象类、接口、包-下(实战图书管理系统)
面向对象编程之继承、多态、封装、抽象类、接口、包-下(图书管理系统)概述需求分析核心需求抽象实现所需要创建的包和类、接口????书类????BookList类????IOperation接口????AddOperation类(增加图书操作)????BorrowOperation类(借阅图书操作)????DisplayOperation类(显示图书操作)????ExitOperation类(退出系统操作)FindOperation类(按名字查询图书操作)ReturnOperation类(归还图书操作)????原创 2021-04-23 12:45:55 · 3824 阅读 · 18 评论 -
面向对象编程之继承、多态、封装、抽象类、接口、包-上
面向对象编程之继承、多态、封装、抽象类、接口、包继承类的继承格式为什么要继承继承的特点继承的种类及关键字访问权限多态向上转型动态绑定方法重写重写和重载的区别比较多态的优点封装实现Java的封装封装的优点抽象类抽象类及其实现抽象方法抽象类使用的注意事项接口接口的声明接口的特性抽象类和接口的区别接口与类的区别包包的语法格式和导入包的作用欢迎指正????继承继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。类的继承格式在 Jav原创 2021-04-20 21:14:38 · 5039 阅读 · 26 评论 -
顺序表与链表
数据结构数据结构常用数据结构常用算法顺序表及操作源码运行截图链表及其基本操作源码运行截图链表习题练习链表开始入环的第一个节点图解分析源码运行结果给定一个链表,判断链表中是否有环图解分析源码运行结果链表的回文结构图解分析源码运行截图删除链表重复节点图解分析源码运行结果链表分割图解分析源码运行截图输入一个链表,输出该链表中倒数第k个结点图解分析源码运行截图欢迎指正!????数据结构数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相原创 2021-04-18 17:20:45 · 946 阅读 · 2 评论 -
类和对象
类和对象类和对象面向对象语言的特性类的实列化类的成员字段/属性/成员变量字段就地初始化方法 (method)访问权限static 关键字修饰属性修饰方法例子getter和setter方法构造方法基本语法this关键字代码块普通代码块构造代码块静态块匿名对象欢迎指正!????类和对象C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。JAVA是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。面向过程注重的是过程,在整个过程中所涉及的行为,就原创 2021-04-10 19:57:31 · 623 阅读 · 6 评论 -
Java练习三
Java练习三水仙花数源码计算分数的值 。源码最大公约数源码二进制1的个数源码二进制序列源码模拟登陆源码输出一个整数的每一位源码输出乘法口诀表源码欢迎指正!????水仙花数求出0~999之间的所有“水仙花数”并输出。(“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本 身,如;153=1+5+3?,则153是一个“水仙花数“。)源码public static void GetDaffodil(){ int j=0; int k=0; int l=0; fo原创 2021-04-06 21:04:33 · 392 阅读 · 1 评论 -
Java练习二
Java练习二数字9 出现的次数源码输出闰年源码打印素数源码判定素数源码年龄打印源码打印 X 图形源码猜数字游戏源码欢迎指正!????数字9 出现的次数编写程序数一下 1到 100 的所有整数中出现多少个数字9源码public static int Getnum(){ int count=0; for(int i=1;i<=100;i++){ if (i % 10 == 9) { count++;原创 2021-04-06 20:55:50 · 214 阅读 · 0 评论 -
Java练习一
Java练习找出出现一次的数字源码斐波那契数源码找出出现一次的数字有一组数据,只有一个数字是出现一次,其他是两次,请找出这个数字。源码public static int findNum(int arr []){ int n=0; for(int i =0;i<arr.length;i++){ n^=arr[i]; } return n;}运行结果:斐波那契数求斐波那契数列的第n项。(迭代实现。源码public static in原创 2021-04-06 20:35:47 · 246 阅读 · 0 评论 -
初始Java二
初始Java二算数运算符例子关系运算符例子逻辑运算符例子赋值运算符Java运算符优先级算数运算符算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。下表列出了所有的算术运算符。表格中的实例假设整数变量A的值为10,变量B的值为20:操作符描述+加法 - 相加运算符两侧的值-减法 - 左操作数减去右操作数*乘法 - 相乘操作符两侧的值/除法 - 左操作数除以右操作数%取余 - 左操作数除以右操作数的余数++自增: 操作数的值增加1原创 2021-04-02 16:05:08 · 539 阅读 · 1 评论 -
初始Java一
初始Java一java基础Java历史Java特点Java基本数据类型例子基本数据类型的包装类强制类型转换隐含强制类型转换自动类型转换java基础Java历史Java:由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。Java语言是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由当时任职太阳微系统的詹姆斯·高斯林(James Gosling)等人于1990年代初开发,它最初被命名为Oak。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络原创 2021-04-01 13:10:23 · 407 阅读 · 2 评论