<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Jhon1994的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Jhon1994</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Jhon1994]]></copyright><item><title><![CDATA[线程状态]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/106129605</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/106129605</guid><author>Jhon1994</author><pubDate>Thu, 14 May 2020 21:50:59 +0800</pubDate><description><![CDATA[**Java线程的生命周期有如下六种**
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200514214849965.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0pob24xOTk0,size_16,color_FFFFFF,t_70#pic_center)

**Java线程的生命周期一直在不同的状态间]]></description><category></category></item><item><title><![CDATA[线程上下文切换]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/106129519</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/106129519</guid><author>Jhon1994</author><pubDate>Thu, 14 May 2020 21:47:09 +0800</pubDate><description><![CDATA[多线程编程中，一般线程的个数都大于CPU的个数，而一个CPU核心在任意时刻只能被一个线程使用，为了让这些线程都能得到有效执行，CPU才去的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间用完时就会重新处于就绪状态，CPU的使用交给其他线程，完成一次上下文切换。
概括来说就是：当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态，以便下次再切换回这个任务时，可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。
上下文切换通常是计算密集型的。也就是说，它需要相当可观的]]></description><category></category></item><item><title><![CDATA[关于死锁]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/106129457</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/106129457</guid><author>Jhon1994</author><pubDate>Thu, 14 May 2020 21:44:19 +0800</pubDate><description><![CDATA[1.什么是死锁
线程死锁描述的是这样一种情况：多个线程同时被阻塞，它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞，因此程序不可能正常终止。
如下图所示，线程 A 持有资源 2，线程 B 持有资源 1，他们同时都想申请对方的资源，所以这两个线程就会互相等待而进入死锁状态。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RF3veVpN-1589463851327)(/img/java/2019-4死锁1.png)]
2.死锁产生的条件

互斥条件：该资源任意]]></description><category></category></item><item><title><![CDATA[sleep&wait]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/106129432</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/106129432</guid><author>Jhon1994</author><pubDate>Thu, 14 May 2020 21:43:13 +0800</pubDate><description><![CDATA[1.关于sleep（）和wait（）

两者最主要的区别在于：sleep 方法没有释放锁，而 wait 方法释放了锁 。
两者都可以暂停线程的执行。
Wait 通常被用于线程间交互/通信，sleep 通常被用于暂停执行。
wait() 方法被调用后，线程不会自动苏醒，需要别的线程调用同一个对象上的 notify() 或者 notifyAll() 方法。sleep() 方法执行完成后，
线程会自动苏醒。或者可以使用 wait(long timeout)超时后线程会自动苏醒。

2.关于start（）与run（]]></description><category></category></item><item><title><![CDATA[JVM]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105956862</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105956862</guid><author>Jhon1994</author><pubDate>Wed, 06 May 2020 23:30:51 +0800</pubDate><description><![CDATA[一、Java的内存区域
先放一张图

1.运行时数据区域按照线程的公私有进行划分

线程私有的
程序计数器、虚拟机栈、本地方法栈
线程共享的
堆、方法区、直接内存

1.1程序计数器
程序计数器是一块较小的内存区域，可以看作是当前线程所执行字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来获取下一条需要执行的字节码指令，分支，循环，跳转，异常处理，线程恢复等功能都需要依赖计数器完成。为...]]></description><category></category></item><item><title><![CDATA[HashMap的长度为什么是2的次幂]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105940811</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105940811</guid><author>Jhon1994</author><pubDate>Tue, 05 May 2020 22:54:01 +0800</pubDate><description><![CDATA[我们知道Hash 值的范围值-2147483648到2147483647，只要hash值映射的比较松散是很难出现hash冲突的，这样数组的长度加起来会超过40亿，内存中无法存放，所以使用hash值之前与数组长度进行取余操作，结果作为数组的下标，数组下标的计算方法是（n-1）&amp; hash ，n为数组长度，大家可能会疑惑，为什么不是 hash%n ，其是是这样的，hash%n==hash&am...]]></description><category></category></item><item><title><![CDATA[HashMap的底层实现]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105919516</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105919516</guid><author>Jhon1994</author><pubDate>Mon, 04 May 2020 16:55:57 +0800</pubDate><description><![CDATA[HashMap在1.8和1.8之前的变化
1. JDK1.8之前
HashMap底层是使用数组和链表结合在一起使用，即链表散列。HashMap通过key的HashCode经过扰动函数hash(int h)处理后得到hash值，然后通过（（n-1）&amp; hash）确定该元素存放的位置，if 当前位置已存在元素，就判断当前位置的元素hash值以及key 是否相同，如果相同则直接覆盖，不相同就通过...]]></description><category></category></item><item><title><![CDATA[HashMap与HashSet的区别]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105919002</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105919002</guid><author>Jhon1994</author><pubDate>Mon, 04 May 2020 16:31:45 +0800</pubDate><description><![CDATA[HashSet检查重复
HashSet的底层是基于HashMap实现的。
当把对象加入HashSet时，调用add（E e）方法，发现调用的是map的put方法
public class HashSet&lt;E&gt;
    extends AbstractSet&lt;E&gt;
    implements Set&lt;E&gt;, Cloneable, java.io.Serializ...]]></description><category></category></item><item><title><![CDATA[HashMap与HashTable的区别]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105902680</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105902680</guid><author>Jhon1994</author><pubDate>Mon, 04 May 2020 12:13:56 +0800</pubDate><description><![CDATA[1.HashMap与HashTable的对比




对比点
HashMap
HashTable




线程安全
否
是


效率
高
低


null key, null value的支持
是
否


2.HashMap与HashTable扩容的不同点

创建时如果不指定初始容量HashTable的初始容量为11，负载因子为0.75
扩容的时机，当entry的数量大于阈值（(int)(capa...]]></description><category></category></item><item><title><![CDATA[ArrayList的扩容机制]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105890498</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105890498</guid><author>Jhon1994</author><pubDate>Sat, 02 May 2020 14:55:00 +0800</pubDate><description><![CDATA[一 先从 ArrayList 的构造函数说起
ArrayList有三种方式来初始化，构造方法源码如下：
   /**
     * 默认初始容量大小
     */
    private static final int DEFAULT_CAPACITY = 10;
    

    private static final Object[] DEFAULTCAPACITY_EMPTY_ELE...]]></description><category></category></item><item><title><![CDATA[java 集合框架之List,Set,Map]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105889966</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105889966</guid><author>Jhon1994</author><pubDate>Sat, 02 May 2020 14:52:41 +0800</pubDate><description><![CDATA[List,Set,Map的区别

List （顺序）：List接口存储一组不唯一，有序的对象
Set（无序）：不允许重复的集合。不会有多个元素引用相同的对象。
Map（key-value键值对）：Map会维护与Key有关联的值，两个key可以引用相同的对象，key不能重复，key可以是String也可以是任何对象。

ArrayList与LinkedList的区别

ArrayList与Linke...]]></description><category></category></item><item><title><![CDATA[java queue]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105889846</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105889846</guid><author>Jhon1994</author><pubDate>Sat, 02 May 2020 13:57:41 +0800</pubDate><description><![CDATA[Java queue
Queue
设计用于在处理之前保留元素的集合。 除了基本的Collection操作之外，队列还提供额外的插入，提取和检查操作。 这些方法中的每一种都有两种形式：如果操作失败，则抛出一个异常，另一种返回一个特殊值（ null或false ，具体取决于操作）。 插入操作的后一种形式专门设计用于容量限制的Queue实现; 在大多数实现中，插入操作不能失败
Queue的实现


Ab...]]></description><category></category></item><item><title><![CDATA[Arrays.asList使用]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105595836</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105595836</guid><author>Jhon1994</author><pubDate>Sat, 18 Apr 2020 13:56:07 +0800</pubDate><description><![CDATA[1.看到这这个Arrays就会想到这是操作数组的工具类，但是这个工具类有你想不到的坑。

假如你这么使用


    public static void main(String[] args) {
        String[] array = {"1", "2", "3"};
        List&lt;String&gt; list = Arrays.asList(array);
  ...]]></description><category></category></item><item><title><![CDATA[BigDecimal的用处]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105545370</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105545370</guid><author>Jhon1994</author><pubDate>Wed, 15 Apr 2020 22:05:44 +0800</pubDate><description><![CDATA[1.浮点数比较存在的问题


    public static void main(String[] args) {
        float a = 1.0f - 0.9f;
        float b = 0.9f - 0.8f;
        System.out.println(a);// 0.100000024
        System.out.println(b);// ...]]></description><category></category></item><item><title><![CDATA[Java中的IO流]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105544477</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105544477</guid><author>Jhon1994</author><pubDate>Wed, 15 Apr 2020 21:13:05 +0800</pubDate><description><![CDATA[1.流的分类

按照流的方向：输入流和输出流

按照操作单元划分：字节流和字符流

按照流的角色：节点流和处理流

Inputstream/Reader 输入流，前者为字节输入流，后者为字符输入流

Outputsteam/Writer 输出流，前者为字节输出流，后者为字符输出流

流的分类结构图





摘自《https://snailclimb.gitee.io/javaguide》
...]]></description><category></category></item><item><title><![CDATA[String，StringBuilder，StringBuffer的区别]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105519186</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105519186</guid><author>Jhon1994</author><pubDate>Tue, 14 Apr 2020 20:00:30 +0800</pubDate><description><![CDATA[1.String

String中使用final char value[]来存储字符串，所以String字符串是不可变的


public final class String
    implements java.io.Serializable, Comparable&lt;String&gt;, CharSequence {
    /** The value is used for cha...]]></description><category></category></item><item><title><![CDATA[重载与重写的区别]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105500147</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105500147</guid><author>Jhon1994</author><pubDate>Mon, 13 Apr 2020 23:07:36 +0800</pubDate><description><![CDATA[区别点
			重载overload
			重写override
		发生位置
			同一个类中
			子类
		参数列表
			必须修改
			一定不能修改
		返回类型
			可修改
			不可修改
		异常类型
			可修改
			异常范围小于等于父类
		访问修饰符
			可修改
			大于等于父类
		发生阶段
			编译器
			运行期
		1.重写

重写发生在运行期，是子类对父类的允...]]></description><category></category></item><item><title><![CDATA[Java基本数据类型比较]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105498702</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105498702</guid><author>Jhon1994</author><pubDate>Mon, 13 Apr 2020 22:49:01 +0800</pubDate><description><![CDATA[基本类型
			位数（bit）
			最小值
			最大值
			包装器
		boolean
			--
			--
			--
			Boolean
		byte
			8bit
			-128
			+127
			Byte
		char
			16bit
			unicode
			
			Character
		short
			16bit
			-2^15
			+2^15-1
			...]]></description><category></category></item><item><title><![CDATA[JVM，JDK，JRE你区分过吗？]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105497259</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105497259</guid><author>Jhon1994</author><pubDate>Mon, 13 Apr 2020 21:22:00 +0800</pubDate><description><![CDATA[JVM
			运行Java字节码的虚拟机，JVM针对于不同的操作系统具有不同的实现，.class文件不面向任何特定的处理器，只面向jvm，从而保证了java的平台无关性。
		JDK
			功能齐全的Java SDK拥有jre的一切，包含编译器和其他工具，能够创建和编译程序。
		JRE
			Java运行时环境，运行已编译的Java程序的内容集合，包括JVM，Java类库等，不能用于创建新程序。...]]></description><category></category></item><item><title><![CDATA[面向对象与面向过程的区别]]></title><link>https://blog.youkuaiyun.com/Jhon1994/article/details/105496702</link><guid>https://blog.youkuaiyun.com/Jhon1994/article/details/105496702</guid><author>Jhon1994</author><pubDate>Mon, 13 Apr 2020 20:44:20 +0800</pubDate><description><![CDATA[特点
			面向对象
			面向过程
		维护
			Y
			N
		扩展
			Y
			N
		复用
			Y
			N
		性能
			N？？
			Y？？
		关于性能问题：

1.面向对象（表象）：类调用时需要实例化，开销比较大，比较耗费资源。

2.根本原因：Java是半编译语言最终执行的代码不是cpu能够执行的二进制机械码

3.面向过程语言大多数编译成机械码直接运行，并不是所有的...]]></description><category></category></item></channel></rss>