java
小白写程序
这个作者很懒,什么都没留下…
展开
-
初始G1垃圾收集器
掘金这篇G1很好理解。转载 2020-03-08 11:44:50 · 144 阅读 · 0 评论 -
二维码登录原理
问题:如果我们使用其他软件来扫码登录有什么问题?因为二维码的转码规则是统一的,所有任何扫码软件都可以得到二维码里面的信息,比如上图二维码包含的是随机字符串uuid和登录验证接口信息。但只有同一软件的手机端才能对这些信息做处理。比如手机端服务器验证该接口信息和用户信息,并将用户uid存入redis中。重要的不是扫描二维码中的信息,而是谁扫描了这个信息。问题:这种登录方式安全吗?由于整个验证过...原创 2020-02-23 15:49:52 · 422 阅读 · 0 评论 -
Java8 -- stream的详细用法
一、概述Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。特点:1 . 不是数据结构,不会保存数据...转载 2020-02-19 14:05:52 · 281 阅读 · 0 评论 -
零拷贝的实现原理
场景:从一个文件中读出数据并将数据传送到另一台服务器上?File.read(file, buf, len);Socket.send(socket, buf, len);一共涉及了4次数据拷贝:应用程序中调用read() 方法,这里会涉及到一次上下文切换(用户态->内核态),底层采用DMA(direct memory access)读取磁盘的文件,并把内容存储到内核地址空间的读...转载 2020-01-12 10:23:17 · 169 阅读 · 0 评论 -
Guava异步编程之ListenableFuture
前提:Java的Future虽然已经提供异步操作,但是不能直接回调。Guava对Future进行了增强,核心接口就是ListenableFuture。一、ListenableFuture源码解析guava对JDK的异步增强可以通过看MoreExecutor和Futures两个类的源码入手。ListenableFuture继承了Future,额外新增了一个方法,listener是任务结束后...原创 2020-01-11 17:24:45 · 2371 阅读 · 1 评论 -
Java异步编程之Future机制原理
一、回顾Runnable和Callable区别:Callable定义了call()方法,Runnale定义了run()方法。call()方法可以抛出异常,run()方法无法抛出异常。Callable有返回值,是泛型的,创建的时候传递进去,执行结束后返回。Callable执行任务的时候可以通过FutureTask得到任务执行的状态。联系:Callable的call方法实际执行在R...原创 2020-01-11 11:18:49 · 3240 阅读 · 0 评论 -
Java文件上传与删除
一、文件上传到服务器上: /** * 上传文件 * @param file 文件 * @param request HttpServletRequest * @return 返回文件基本信息 */ @RequestMapping(value = "/upload", method = RequestMethod.POST) ...转载 2019-11-27 20:18:07 · 877 阅读 · 0 评论 -
双亲委派机制的破坏
第一次被破坏其实发生在双亲委派模型出现之前–即JDK1.2发布之前。由于双亲委派模型是在JDK1.2之后才被引入的,而类加载器和抽象类java.lang.ClassLoader则是JDK1.0时候就已经存在,面对已经存在 的用户自定义类加载器的实现代码,Java设计者引入双亲委派模型时不得不做出一些妥协。为了向前兼容,JDK1.2之后的java.lang.ClassLoader添加了一个新的pr...原创 2019-10-18 23:22:28 · 759 阅读 · 0 评论 -
JVM常见的问题
方法区方法区与Java堆一样,是各个线程共享的区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译(JIT)后的代码等数据。对于JDK1.8之前的HotSpot虚拟机而言,很多人经常将方法区称为我们上图中所描述的永久代,实际上两者并不等价,因为这仅仅是HotSpot的设计团队选择利用永久代来实现方法区而言。同时对于其他虚拟机比如IBM J9中是不存在永久代的概念的。其实,移除永久...转载 2019-10-14 15:41:05 · 125 阅读 · 0 评论 -
什么是幂等性?
HTTP 幂等方法,是指无论调用多少次都不会有不同结果的 HTTP 方法。不管你调用一次,还是调用一百次,一千次,结果都是相同的。HTTP GET 方法HTTP GET 方法,用于获取资源,不管调用多少次接口,结果都不会改变,所以是幂等的。GET /tickets # 获取ticket列表GET /tickets/12 # 查看某个具体的ticket只...转载 2019-10-14 15:32:25 · 1142 阅读 · 1 评论 -
JDK8接口的新特性
在JDK8环境中,接口中的方法不再是只能有抽象方法,他可以有静态方法和default方法。package com.wangcc.MyJavaSE.jdk8interface;public interface NewInterface { static void staticMethod() { System.out.println("staticMethod"); ...转载 2019-10-13 14:14:43 · 106 阅读 · 0 评论 -
海量数据解决思路之BitMap
使用场景:给一台普通PC,2G内存,要求处理一个包含40亿个不重复并且没有排过序的无符号的int整数,给出一个整数,问如果快速地判断这个整数是否在文件40亿个数据当中?问题分析:40亿个int占(40亿*4)/1024/1024/1024 大概为14.9G左右,很明显内存只有2G,放不下,因此不可能将这40亿数据放到内存中计算。要快速的解决这个问题最好的方案就是将数据搁内存了,所以现在的问题...转载 2019-10-13 10:47:26 · 213 阅读 · 0 评论 -
String源码解析
string的底层还是char数组,用final修饰,只是引用的地址不可变,但地址存放的内容是可以改变。String不可变的本质原因是它不提供修改char数组的方法,是严格封装的。具体看这篇,很详细。...转载 2019-10-06 20:36:43 · 123 阅读 · 0 评论 -
泛型常见面试题
Java中的泛型是什么 ? 使用泛型的好处是什么?在集合中存储对象并在使用前进行类型转换是多么的不方便。泛型防止了那种情况的发生。它提供了编译期的类型安全 ,确保你只能把正确类型的对象放入 集合中,避免了在运行时出现ClassCastException。Java的泛型是如何工作的 ? 什么是类型擦除 ?泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不...转载 2019-10-06 10:07:41 · 449 阅读 · 0 评论 -
Java开发必会的Linux命令
https://juejin.im/post/5ac04f206fb9a028d1413bf2转载 2019-10-06 09:41:10 · 118 阅读 · 0 评论 -
Java多线程的各种锁
1、乐观锁:CAS乐观锁正好和悲观锁相反,它获取数据的时候,并不担心数据被修改,每次获取数据的时候也不会加锁,只是在更新数据的时候,通过判断现有的数 据是否和原数据一致来判断数据是否被其他线程操作,如果没被其他线程修改则进行数据更新,如果被其他线程修改则不进行数据更新。2、悲观锁:synchronized悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改。因此...原创 2019-10-04 16:25:07 · 158 阅读 · 0 评论 -
分布式锁之zookeeper
一、zookeeper节点的概念Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫做Znode。Znode分为四种类型:1、持久节点(presistent)默认的节点类型。创建节点的客户端和zookeeper断开连接后,该节点依旧存在。2、持久节点顺序节点(presistent_sequential)所谓顺序节点,就是在创建节点时,zookeeper根据创建的时...转载 2019-10-04 09:31:18 · 331 阅读 · 0 评论 -
静态代理和动态代理
一、代理Proxy代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。代理解决的问题当两个类需要通信时,引入第三方代理类,将两个类的关系解耦,让我们只了解代理类即可,而且代理的出现还可以让我们完成与另一个类之间的关系的统一管理,但是切记,代理类和委托类要实现相同的接口,因为代...原创 2019-10-02 16:30:58 · 94 阅读 · 0 评论 -
Scanner中next方法和nextLine方法的区别
next方法:next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。所以next()读取到的字符串是不能包含有空格的。nextLine方法:nextLine()方法的结束符只是Enter键,即ne...原创 2019-08-19 23:37:12 · 185 阅读 · 0 评论 -
Object类的常用方法
1.clone方法:实现对象的浅复制,只有object的子类实现了cloneable接口,覆写clone方法,才可以使用super.clone()调用object的该方法,否则抛出CloneNotSupportedException异常。子类中的基本类型和String类型可以实现浅拷贝,引用类型只能使用深拷贝。2.getClass方法:final方法,获得运行时的类型信息。3.toStri...原创 2019-08-16 13:39:49 · 123 阅读 · 0 评论 -
字符串匹配 -- BF算法
BF算法,即暴风(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。其实就是暴力算法。算法时间复杂度为O(nm)。而KMP算法是一种更优化的算法,时间复杂度为O(n+m)....原创 2019-08-16 19:50:34 · 410 阅读 · 0 评论 -
Java基础的巴拉巴拉
实现接口的类,如果是抽象类,就不用实现该接口的所有抽象方法;如果是具体类,就要实现所有抽象方法。System.out.println(a + b + “,” + i); a=2,b=3,i=4,输出结果是5,4 为什么?因为输出函数可以计算,从左到右先计算再进行字符串拼接。...原创 2019-08-22 14:26:34 · 128 阅读 · 0 评论 -
BlockingQueue阻塞队列的解读
源码解读分析转载 2019-08-29 15:28:23 · 154 阅读 · 0 评论 -
定时器Timer的使用
1、介绍:设置定时器,Java中最方便,最高效的实现方式是用java.util.Timer工具类,再通过调度java.util.TimerTask任务。Timer是一种工具,可安排任务执行一次,或者周期性重复执行,实际上是一个线程,定时调度所拥有的TimerTasks任务。TimerTask是一个抽象类,它的子类继承它并实现一个run方法,需要定时执行的代码都放到run方法内。由Timer安排...转载 2019-08-29 15:57:41 · 346 阅读 · 0 评论 -
Arrays.sort()和lambda表达式
1、对基本数据类型数组的排序:数字排序:int[] intArray = new int[]{1,34,5,-9};Arrays.sort(intArray);System.out.println(Arrays.toString(intArray));字符串排序(先大写后小写):String[] strArray = new String[]{"Z", "a", "D"}; ...原创 2019-08-31 20:14:40 · 24872 阅读 · 9 评论 -
Java中创建对象的四种方式
1、使用new关键字创建。2、调用对象的clone方法,对象都继承自object类,它的clone方法是protected类型的,如果想要扩大使用范围,必须重写clone方法为public。3、利用反射,调用class类或者是Constructor类的newInstance()方法,创建时默认使用对象的无参构造函数。4、用反序列化,调用ObjectInputStream类的readObjec...原创 2019-09-16 15:16:53 · 279 阅读 · 0 评论 -
线程间通信的方式
一、使用volatile关键字基于volatile关键字来实现线程间相互通信是使用共享内存的思想,就是让这个变量对所有线程都可见,一旦发生变化,都是立即可见的。public class TestSync { // 定义一个共享变量来实现通信,它需要是volatile修饰,否则线程不能及时感知 static volatile boolean notice = false; ...转载 2019-09-17 09:43:23 · 2599 阅读 · 0 评论 -
多线程之线程池详解
1、线程池家族线程池的最上层接口是Executor,这个接口定义了一个核心方法execute(Runnabel command),这个方法最后被ThreadPoolExecutor类实现,这个方法是用来传入任务的。而且ThreadPoolExecutor是线程池的核心类,此类的构造方法如下:public ThreadPoolExecutor(int corePoolSize,int maxim...转载 2019-09-17 10:37:16 · 117 阅读 · 1 评论 -
RestFul实践总结
参考该链接,写的很详细!转载 2019-09-18 10:11:39 · 152 阅读 · 0 评论 -
Java类加载器和加载机制详解
一、原理:JVM将class文件字节码文件加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆(并不一定在堆中,HotSpot在方法区中)中生成一个代表这个类的java.lang.class对象,作为方法区类数据的访问入口。二、类加载过程:JVM类加载机制分为五部分:加载,验证,准备,解析,初始化。其中,加载,检验,准备,初始化,和卸载这五个阶段的顺序是固定的,而解析则未必。为...原创 2019-09-29 17:16:33 · 207 阅读 · 0 评论 -
LinkedList源码解析(JDK1.8)
一、LinkedList简介LinkedList是通过双链表来实现的,本身实现了List接口和Deque接口,并且实现了所有可选的列表操作,并且允许包含所有元素(包括null)。继承了AbstractSequentialList抽象类: 遍历LinkedList的时候,官方推荐使用顺序访问,就是使用迭代器,相当于直接遍历一个链表。***(虽然LinkedList提供了get(index)...原创 2019-10-01 14:58:58 · 216 阅读 · 0 评论 -
ArrayList源码解读(基于JDK8)
一、ArrayList简介ArrayList的实现原理就是数组,是线程不安全的,允许其中元素为null。它实现了List<E>, RandomAccess, Cloneable, java.io.Serializable接口,其中RandomAccess代表了其拥有随机快速访问的能力,ArrayList可以以O(1)的时间复杂度去根据下标访问元素。因为底层是数组,所以会占用一块连...原创 2019-10-01 19:52:08 · 197 阅读 · 0 评论 -
Java自动装箱和拆箱的实现原理
一、装箱和拆箱原始类型转换为对象类型就是装箱,反之就是拆箱。原始类型byte,short,char,int,long,float,double,boolean对应的封装类为Byte,Shor,Character,Integer,Long,Float,Double,Boolean.二、源码解读自动装箱时编译器调用valueOf将原始类型值转换成对象,同时自动拆箱时,编译器通过调用类似intV...原创 2019-10-02 10:23:55 · 2720 阅读 · 0 评论