![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java Core
一颗向上的草莓
后台开发者,前端爱好者,个人博客:http://catchu.github.io
展开
-
Java之泛型<T> T与T的用法
<T> T表示返回值是一个泛型,传递什么类型,就返回什么类型的数据,而单独的T就是表示当前对象创建时,就限制你传递的参数类型,下面案例中,通过一个泛型的返回方式,获取每一个集合中的第一个数据, 通过返回值<T> T 和T的两种方法实现。1、<T>T 用法这个<T> T 表示的是返回值T是泛型,T是一个占位符,用来告诉编译器,这个东西先给我留着,等我编译的时候,告诉你。package xxxx;import java.util.ArrayLi.转载 2022-02-20 17:23:14 · 5413 阅读 · 0 评论 -
DFA敏感词过滤算法
运用DFA算法加密。首先我先对敏感词库初始化,若我的敏感词库为冰毒白粉大麻大坏蛋初始化之后得到的是下面这样。:{冰={毒={isEnd=1}, isEnd=0}, 白={粉={isEnd=1}, isEnd=0}, 大={麻={isEnd=1}, isEnd=0, 坏={蛋={isEnd=1}, isEnd=0}}}。ok,我把初始化之后的数据用A来表示。假设待检测的文字为:张三是个大坏蛋,他竟然吸食白粉和冰毒。后面检测文字中是否有敏感词的时候,先把要检测的文字迭代循环,并转换转载 2020-06-30 11:48:13 · 663 阅读 · 0 评论 -
Java内存模型与Volatile,Happen-Before原则等
Java的内存模型Java内存模型(JMM)是一个抽象的模型。决定了线程主要定义了线程和内存间的抽象关系:主内存存放的是线程共享变量,每个线程有自己的工作内存,存放变量的副本,只能对副本进行读写,副本的变量再刷新到主内存中。具体体现为多核CPU,每核有一个高速缓存,每个核的线程对高速缓存读写,并且有共同的主存。主内存与工作线程交互的操作有以下八种:lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态unlock(解锁):作用于主内存的变量,释放锁定状态的变量read(读转载 2020-06-29 11:15:33 · 214 阅读 · 0 评论 -
理解StackOverflowError与OutOfMemoryError
之前对于StackOverflowError和OutOfMemoryError这2个错误一直理解得不太清楚。就专门去看了下源代码,找出了这2个异常引发的原因。就对应与了相应的例子:1、StackOverflowError源代码解释说:抛出这个错误是因为递归太深.其实真正的原因是因为Java线程操作是基于栈的,当调用方法内部方法也就是进行一次递归的时候就会把当前方法压入栈直到方法内部的方法执行完全之后,就会返回上一个方法,也就是出栈操作执行上一个方法。e.g.:public class转载 2020-06-19 09:39:16 · 187 阅读 · 0 评论 -
关于栈上分配和TLAB的理解
引言我们知道,一般在java程序中,new的对象是分配在堆空间中的,但是实际的情况是,大部分的new对象会进入堆空间中,而并非是全部的对象,还有另外两个地方可以存储new的对象,我们称之为栈上分配以及TLAB栈上分配为什么需要栈上分配在我们的应用程序中,其实有很多的对象的作用域都不会逃逸出方法外,也就是说该对象的生命周期会随着方法的调用开始而开始,方法的调用结束而结束,对于这种对象,是不是该考虑将对象不在分配在堆空间中呢?因为一旦分配在堆空间中,当方法调用结束,没有了引用指向该对象,该对转载 2020-06-19 09:32:06 · 178 阅读 · 0 评论 -
Java集合框架常见面试题
剖析面试最常见问题之Java集合框架1.1 集合概述1.1.1 说说List,Set,Map三者的区别?List(对付顺序的好帮手):List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set(注重独一无二的性质):不允许重复的集合。不会有多个元素引用相同的对象。 Map(用Key来搜索的专家):使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。1.1.2 集合框架底...转载 2020-06-12 10:19:24 · 136 阅读 · 0 评论 -
订单缓存查询实践
订单缓存实践 最近在做订单缓存查询相关需求,记录下该过程中缓存查询考虑的几个问题以及处理方案。缓存穿透 实际场景中使用缓存都是先去缓存中查询,如果缓存没有命中,在去查询数据库并将结果缓存。如果查询一个在系统中根本就不存在的数据,就会造成每次请求都会穿透缓存去查询数据库。如果出现大量的缓存穿透(或者恶意攻击),就会对数据库造成比较大的压力。处理方案 对于数据库中不存在的数据,存储特定的值表示数据不存在。在发生insert之后将缓存中对应数据移除,避免在数据生成之后缓存中查询还是NUL原创 2020-06-11 15:56:37 · 426 阅读 · 0 评论 -
Java 并发进阶常见面试题总结
Java 并发进阶常见面试题总结1. synchronized 关键字1.1. 说一说自己对于 synchronized 关键字的了解synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。另外,在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Java 的线程是映射到操作系统的转载 2020-06-11 14:50:53 · 229 阅读 · 0 评论 -
HashMap 为什么线程不安全
前言:我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线程不安全主要体现在什么地方呢,本文将对该问题进行解密。1.jdk1.7中的HashMap在jdk1.8中对HashMap做了很多优化,这里先分析在jdk1.7中的问题,相信大家都知道在jdk1.7多线程环境下HashMap容易出现死循环,这里我们先用代码来模拟出现死循环的情况:1publicclass HashMapTest { 2 3public static void main(String[] args)转载 2020-06-11 14:49:42 · 114 阅读 · 0 评论 -
List集合在遍历的同时删除元素
使用增强for循环会报ConcurrentModificationException异常,可以采用iterator遍历,或者普通for循环遍历1. 使用Iterator的remove()方法使用Iterator的remove()方法的实现方式如下所示:publicstaticvoidmain(String[]args){List<String>platformList=newArrayList<>();platformList.ad...原创 2020-06-01 22:10:40 · 274 阅读 · 0 评论 -
Java中对象并不是都在堆上分配内存的
JIT编译除了具有缓存的功能外,还会对代码做各种优化,比如:逃逸分析、 锁消除、 锁膨胀、 方法内联、 空值检查消除、 类型检测消除、 公共子表达式消除等。JVM内存分配策略关于JVM的内存结构及内存分配方式,不是本文的重点,这里只做简单回顾。以下是我们知道的一些常识:1、根据Java虚拟机规范,Java虚拟机所管理的内存包括方法区、虚拟机栈、本地方法栈、堆、程序计数器等。2、我们...原创 2019-09-20 17:52:13 · 129 阅读 · 0 评论 -
说说你对threadlocal的理解?以及它的应用和如何解决hash冲突的
什么是散列散列表(hash table)我们平时也叫它哈希表或者Hash表,它用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,没有数组就没有散列表。比如我们有100件商品,编号没有规律的4位数字,现在我们想要通过编号快速获取商品信息,如何做呢?我们可以将这100件商品信息放到数组里,通过 商品编号%100这样的方式得到一个值,值为1的商品...原创 2019-09-16 22:25:42 · 3954 阅读 · 2 评论 -
Java语法糖 : try-with-resources
先了解几个背景知识什么是语法糖 语法糖是在语言中增加的某种语法,在不影响功能的情况下为程序员提供更方便的使用方式。 什么是资源 使用之后需要释放或者回收的都可以称为资源,比如JDBC的connection连接,文件IO的各种类。 在这里我们可以简单理解为实现了 java.lang.AutoCloseable/java.io.Closeable接口的类对象。 回到正题,tr...原创 2019-08-26 16:10:24 · 223 阅读 · 0 评论 -
hashmap源码的理解
ThreadLocalMap是使用开放地址法来解决冲突问题的,而我们今天的主角HashMap是采用了链表法来处理冲突的,什么是链表法呢?数据结构在散列表中,每个 “ 桶(bucket)” 或者 “ 槽(slot)” 会对应一条链表,所有散列值相同的元素我们都放到相同槽位对应的链表中。jdk8和jdk7不一样,jdk7中没有红黑树,数组中只挂载链表。而jdk8中在桶容量大于等于64且...原创 2019-09-16 21:49:24 · 154 阅读 · 0 评论 -
ip用int类型存储
今天再看sql优化的时候,突然看到一点说建议ip在数据库里用int类型存储,试了一下,在这里记录一下/** * * (Ip转Integer) * 方法名:ipToInteger * @exception * @since 1.0.0 */ public static int ipToInteger(String ip){ String[] ips = ip...原创 2019-09-12 22:50:21 · 218 阅读 · 0 评论 -
使用 Java 8 Optional 的正确姿势
我们知道 Java 8 增加了一些很有用的 API, 其中一个就是 Optional. 如果对它不稍假探索, 只是轻描淡写的认为它可以优雅的解决 NullPointException 的问题, 于是代码就开始这么写了Optional<User> user = ...... if (user.isPresent()) { return user.getOrders();...转载 2019-08-05 12:26:52 · 114 阅读 · 0 评论 -
史上最清晰的红黑树讲解(上)
本文github地址本文以Java TreeMap为例,从源代码层面,结合详细的图解,剥茧抽丝地讲解红黑树(Red-Black tree)的插入,删除以及由此产生的调整过程。总体介绍JavaTreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的自然顺序(natural ordering),也可以通过构造时传...转载 2019-08-04 21:46:29 · 100 阅读 · 0 评论 -
使用多线程查询百万条用户数据将汉字转化成拼音
现在有一个需求:用户表里面有将近200万条数据,查询时需要按用户名字的汉语拼音按从a-z排序。有两种解决方案:1.查询时使用数据库自带的CONVERT()函数进行转化,按拼音首字母排序;2.新加一个拼音字段(spell_name),用户注册时,将用户名字的汉语拼音也一并插入数据库。权衡之后我采用了第二种,因为用户量还会持续增长,使用数据库自带的函数会拖慢查询速度,索引也会失效,如果采用第二种加一个...原创 2018-08-27 14:38:33 · 319 阅读 · 0 评论 -
当多个线程同时参与某项任务时,如何知道他们都已经执行完毕
在面试过程中聊到并发相关的内容时,不少面试官都喜欢问这类问题:当 N 个线程同时完成某项任务时,如何知道他们都已经执行完毕了。这也是本次讨论的话题之一,所以本篇为『并发包入坑指北』的第二篇;来聊聊常见的并发工具。自己实现其实这类问题的核心论点都是:如何在一个线程中得知其他线程是否执行完毕。假设现在有 3 个线程在运行,需要在主线程中得知他们的运行结果;可以分为以下几步:定义一个计...转载 2019-04-29 13:14:03 · 1504 阅读 · 0 评论 -
Java中的并发工具CountDownLatch、CyclicBarrier、Semapphore使用详解
在JDK的并发包里面提供了几个非常有用的并发工具,CountDownLatch、CyclicBarrier、Semaphore工具类提供了一种并发控制流程的手段。一、CountDownLatchCountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它运行一个或者多个线程一直处于等待状态。CountDownLatch中有两个关键的方法public void c...转载 2019-04-29 22:58:51 · 208 阅读 · 0 评论 -
查看项目端口和启动情况
linux启动java进程之后,有时需要查询启动是否成功,下面几个命令很有用:1.jpsjps可以查看程序当前运行的进程,使用方式:jps控制台列举出的就是当前运行的java进程2.查看某个端口是否被占用:netstat -anp|grep 端口号示例:⚡ root@kl-demo0 /var/java-app/course netstat -a...原创 2019-05-15 19:59:43 · 3143 阅读 · 0 评论 -
{@link}与@see的简单使用以及区别--如何写好Java代码注释
写代码的时候,有时候,你需要写一些注释,把内容相互关联起来,方便自己或别人看的时候,可以直接找到你关联的代码类或者啥的。这个时候,{@link}与@see,这2个javadoc注解就派上用场了,不管他具体有什么功能,咱就只管一个,他可以链接代码,让注释看的更清楚易懂。方便你我他。@see 标签允许用户引用其他类的文档。具体使用方式如下:@see classname@see fully-...转载 2019-06-29 17:29:36 · 2838 阅读 · 0 评论 -
Java ArrayList自动扩容机制
ArrayList介绍ArrayList底层是基于数组实现的,是一个动态数组,自动扩容。ArrayList不是线程安全的,只能用在单线程环境下。实现了Serializable接口,因此它支持序列化,能够通过序列化传输;实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问;实现了Cloneabl...原创 2019-07-14 21:04:35 · 215 阅读 · 0 评论 -
java打印代码执行耗时
在代码开发中,常常需要看代码的执行效率,必须直观的看到某个循环消耗的多少时间,进而针对性的优化,有两种方式。1.使用System.currentTimeMillis()方法打印代码开始的执行时间和结束的时间,中间的时间差就是执行耗时。示例如下: long begin = System.currentTimeMillis(); System.out.p...原创 2019-07-16 19:31:36 · 7347 阅读 · 0 评论 -
web开发中参数传递时的编码和解码
1.在web开发中,前端向后台传递参数,特别是GET请求传递汉字或者特殊字符时,需要对参传递的参数进行编码解码,以防乱码,java中可以使用URLEncoder.encode方法和URLDecoder.decode方法。比如我们通过http调用其它服务和接口时就可以这样编码和解码示例如下: String a = URLEncoder.encode("测试", "UTF-8"...原创 2019-07-16 19:43:15 · 1141 阅读 · 0 评论 -
java格式化字符串的MessageFormat.format方法
1.java中格式化字符串常用的方式有MessageFormat.format和String.format示例如下:如下: String format1 = MessageFormat.format("我是{0},我{1}", "中国人", 18); System.out.println(format1); Object[] testA...原创 2019-07-16 20:00:18 · 985 阅读 · 0 评论 -
java中将List切割执行
现在有一个比较大的list,比如请求过来了一个list,它里面有1000个数据需要入库,如果我一下把1000条数据全部插入,可能数据库会扛不住,或者我调其它公司的推送,比如调华为推送,它只允许我一次最多推100条数据,那么需要对传入的大list进行切分,分段执行。需要引入google的guava jar包,用到的api是Lists.partition示例如下:/** * 描述:Gu...原创 2019-07-16 20:29:02 · 3935 阅读 · 0 评论 -
Guava-EventBus使用详解
在使用ApplicationEvent和Listener快速实现业务解耦中提到了用Spring提供的观察者设计模式完成系统内部逻辑解耦。本文将介绍Google-Guava中的一种消息发布-订阅类库——EventBus。EventBus 是Google.Guava提供的消息发布-订阅类库,它实现了观察者设计模式,消息通知负责人通过EventBus去注册/注销观察者,最后由消息通知负责人给观察者发...转载 2019-07-23 18:43:15 · 314 阅读 · 0 评论 -
Android客户端如何使用cookie
一. 关于Cookie一句话概括就是:cookie就是一系列的键值对组成的字符串二. Cookie的最常用场景登录状态的判定等前言以前看过不少关于cookie的文章,至于写的好坏不做评价,反正我是没看多明白如何操作cookie,也有可能是个人水平不行,无法理解别人的讲解。最近一直在学习后台开发,加上个人一直在做移动端开发,之前一直不明白的地方现在都豁然开朗了,于是打算写这篇文章...原创 2019-07-29 14:07:55 · 2017 阅读 · 0 评论 -
Arrays.asList()的正确使用姿势
简介Arrays.asList()在平时开发中还是比较常见的,我们可以使用它将一个数组转换为一个List集合。String[]myArray={"Apple","Banana","Orange"};List<String>myList=Arrays.asList(myArray);//上面两个语句等价于下面一条语句List<String>...转载 2019-07-26 10:44:50 · 237 阅读 · 0 评论 -
Java线程池详解
Java线程池详解构造一个线程池为什么需要几个参数?如果避免线程池出现OOM?Runnable和Callable的区别是什么?本文将对这些问题一一解答,同时还将给出使用线程池的常见场景和代码片段。基础知识Executors创建线程池Java中创建线程池很简单,只需要调用Executors中相应的便捷方法即可,比如Executors.newFixedThreadPool(int nT...转载 2019-08-04 11:19:48 · 115 阅读 · 0 评论 -
死磕java底层(一)—多线程
1.线程和进程1.1线程和进程的区别进程 它是内存中的一段独立的空间,可以负责当前应用程序的运行。当前这个进程负责调度当前程序中的所有运行细节(操作系统为进程分配一块独立的运行空间);线程 它是位于进程中,负责当前进程中的某个具备独立运行资格的空间(进程为线程分配一块独立运行的空间); 进程是负责某个程序的执行,线程是负责进程中某个独立功能的运行,一个进程至少要包含一个线程。多线程 在原创 2017-12-20 16:49:52 · 5062 阅读 · 0 评论