Java
文章平均质量分 61
橙生北国
这个作者很懒,什么都没留下…
展开
-
String、StringBuffer、StringBuilder的区别
String被声明为final class,所有属性为final的,因为是被final修饰保证了基础线程安全,因为你没办法对里面的数据结构进行改变,在并发情况下一个对象被多次访问,可以省略同步时间和锁的等待时间可以大幅度的提高性能。也是因为不变,所以每次裁剪、拼接字符串等操作都会产生新的String对象。StringBuffer是为了减少拼接或裁减中产生的太多中间对象而提供了一个类,可以用ap...原创 2018-07-21 00:32:39 · 311 阅读 · 0 评论 -
HashTable与ConcurrentHashMap的区别
HashTable比ConcurrentHashMap低效,它的实现基本就是给put、get、size等方法加了synchronized,所以并发操作的时候就需要去竞争一把锁,一个线程进行同步操作时,其它线程只能等待。一般不适用于高并发情况下。ConcurrentHashMap分为JDK1.8之前与JDK1.8之后,早期的ConcurrentHashMap 实现基于分离锁与volatile...原创 2018-11-20 00:55:50 · 348 阅读 · 0 评论 -
JVM的类加载机制
从class文件变成内存中的类按先后顺序需要经过加载、链接以及初始化这三大步骤。目录加载链接初始化加载查找字节流,并且根据字节流创建类的过程。JVM是借助类加载器来完成查找字节流的过程,用定制木质家具来比较的话,你首先需要给木匠说一下房型,这里的家具就是类,木匠就是类加载器。每一个木匠都有同一个祖宗“鲁班”,也就是说每一个类加载器都有同一个类加载器叫做启动类加载器,它是用C...原创 2018-11-23 01:16:45 · 439 阅读 · 0 评论 -
synchronized与ReentrantLock的区别
synchronized是Java原语,提供了互斥的语义和可见性,当一个线程已经获取了当前的锁时,其他试图获取锁的线程就只能等待或者阻塞。ReentrantLock是实现了Lock接口,是一个互斥的同步器。当一个线程试图获取一个它已经获取的锁时,这个获取动作自动成功。在基本用法上,synchronized与ReentrantLock很是类似,都是可重入锁,不过ReentrantLock是A...原创 2018-11-20 14:31:06 · 492 阅读 · 1 评论 -
Java中线程有几种状态
在线程的生命周期里,线程总共有6种状态,这是Java5之后在公共内部枚举类Thread.State里面声明的。他们分别是NEW:新建,表示的是线程被创建出来但还未被投入使用。RUNNABLE:就绪,这个线程已经在JVM里被执行,有可能是正在运行也有可能是等待CPU分配资源进入了就绪队列BLOCKED:阻塞,线程在等待Monitor。当这个线程想要调用一个已经被另一个线程获取了synch...原创 2018-12-01 13:18:15 · 373 阅读 · 0 评论 -
锁优化
目录自旋锁自适应自旋锁锁消除锁粗化锁升级自旋锁 因为线程的阻塞到唤醒需要CPU从用户态转为内核态,这样所需要的资源是比较大的,如果频繁的去阻塞和唤醒这对CPU是一件压力很大的事情,并且有时候会发现对象锁的状态只会持续一段时间,为了这段比较短的时间去让CPU从用户态转化为内核态是一件得不偿失的事情。所以基于这个就出现了自旋锁。 那么,什么是自旋锁呢?...原创 2018-12-06 13:59:42 · 573 阅读 · 0 评论 -
PageHelper不生效的原因
PageHelper是一个比较简单的分页插件,但是好些人在用的时候却无法生效了。遇到这种情况不要方,首先先看看自己的配置,我这里用的是注解配置import com.github.pagehelper.PageHelper;import org.springframework.context.annotation.Bean;import org.springframework.cont...原创 2019-01-14 17:11:54 · 9425 阅读 · 3 评论 -
Java new一个对象的具体过程
我们在Java中,new一个对象看似很简单。只需要new一下就可以了,但是你知道在JVM中,它是如何实现的吗?Object obj=new Object();当JVM遇到了一个new的指令的时候,它会执行两步操作,第一步是先进行类加载机制,第二步是去给对象分配内存。类加载机制包括 加载、验证、准备、解析、初始化等操作,但是它并不是严格按照这个程序来开始的。具体的介绍请看我以前写的...原创 2019-02-25 15:45:53 · 1916 阅读 · 0 评论 -
Java 读取大文件CSV,然后将数据存入redis中
前些天,项目需要用到从csv文件中读取数据,然后将数据存入redis中。我看了一下csv文件的大小,1G多。这个虽然算不上大文件,但是考虑到以后如果数据量增加可能到2G、3G、甚至更大,所以就不打算用普通读取文件的方式去读取这个文件。因为普通读取文件是将文件全部加载进内存,然后再内存中读取。这种情况下,文件比较小那还好说,如果文件大了,就会占用大量的内存。出于这样的考虑,我决定用读取大文件的方...原创 2019-06-15 12:45:29 · 5275 阅读 · 0 评论 -
什么是面向对象
我们经常说Java是一门面向对象语言,那么什么是对象?我jio得吧,对象就是现实中各种事物在计算机语言中的映射,相比以往的面向过程语言来说,面向对象它关注的是事物,然后基于这些事物的问题去产生一个新类型的对象。也就是说面向对象它关注的是问题本身,而不是问题的具体解决步骤。它就是将一个事务抽象成计算机中的一种特殊的变量,具有自己的属性,而这些属性就分为动态和静态,动态的就是方法。例如:跑、跳。而...原创 2019-06-28 15:35:08 · 473 阅读 · 0 评论 -
多model的情况下Consider defining a bean of type错误排查
今天遇到一个问题,就是在多Model的SpringBoot项目里,明明已经加了@Service注解,但是在启动的时候还是无法启动,报出下面的错误Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.2019-07-13 ...原创 2019-07-13 18:51:10 · 1710 阅读 · 1 评论 -
用Java去执行Linux命令,或者在Linux中运行脚本
背景前一段时间项目需要在程序里面使用shell命令,就比较纠结,问我导师,导师给我说你可以去百度一下,Java是可以执行shell命令的。听到这个消息我就有点懵了,Java还可以执行Shell命令,有点强大啊!后来在网上搜了一些博文,看了看,还真的是可以的。代码public static String execShell(String shell) { StringBuild...原创 2019-07-14 16:20:45 · 797 阅读 · 0 评论 -
多态的底层原因
目录静态分派动态分派动态分配的实现多态的底层就是分派,分派分为静态分派(重载)与动态分派(重写)。静态分派发生在编译时期,因此静态分派的动作实际上不是由虚拟机来执行的,只能通过语言上的规则去理解和推断哪个是更加合适的版本,自动转型: char->int->long->float->double的顺序转型时进行匹配,但不会匹配到byte和short类型...原创 2018-10-15 23:23:25 · 391 阅读 · 0 评论 -
阻塞与非阻塞,同步与异步
Java的IO有三种:IO、NIO、AIO第一种是Java刚开始就出现的IO即BIO(同步阻塞IO),我们一般常说的IO就是这种IO,这种IO相对来说比较简单,基于流模型,提供一种IO操作。交互方式是同步、阻塞,调用的顺序是线性顺序,这种IO有一个好处就是,代码简单,但是缺点就是IO的效率较低、扩展性不好。在Java1.4后,出现了NIO(同步非阻塞IO),提供了Channel、Buffe...原创 2018-11-20 00:49:34 · 236 阅读 · 0 评论 -
JVM的分代年龄为什么是15
在一次面试中,被问到JVM的分代年龄问题,最后面试官问了一句,为什么它的分代年龄是15,而不是17或者16?当时有些太想当然,觉得这个和HashMap的负载因子是0.75类似,就答得是多次试验后得出来的一个平衡的数字。后来面试就凉凉了,接着回去查了一下资料,原来原因是在MarkWord里。这就是一个MarkWord,其中对象的分代年龄占4位,也就是0000,最大值为1111也就是最大为15...原创 2018-09-23 15:09:34 · 3801 阅读 · 8 评论 -
final、finally、finalize的区别
final可以用来修饰类、方法、变量,分别有不同的意义。修饰类:这个类不能被继承,所有的方法不能被重写,但是里面的成员变量并不是不可变得,如果需要让它们不可变则需要用final去修饰变量。修饰方法:不可以被重写,但是子类可以去使用这个方法。修饰变量:不可修改,可以用于保护只读数据,尤其是在并发中,有利于减少额外的同步开销,也可以省去一些防御性的拷贝。final指的是引用不可变性,也...原创 2018-09-26 00:26:35 · 262 阅读 · 0 评论 -
int与Integer的区别
int是Java的八个基本类型之一,基本类型都有:byte,char,short,int,float,double,boolean,long.Integer是int的包装类,它有一个int类型的字段存储数据,并且提供了基本操作。而且Integer里有缓存区间[-128-127];自动拆装箱其实是一种语法糖,语法糖是JVM的一个小手段,它可以提高效率。它发生在编译器,在编译为字节码的时候,如...原创 2018-09-29 01:00:51 · 305 阅读 · 0 评论 -
HashTable、HashMap、TreeMap的区别
Map是集合框架的一部分(另一部分是Collection),以键值对的形式存储和操作数据的数据容器。HashTable是Java早期基于Hash表的实现的类,本身就是同步,不论是key还是value都不支持null值,而且因为同步开销太大,现在基本不用这个容器了。 HashMap是也是基于Hash表实现的类,与HashTable的主要区别在于HashTable是线程安全的,而Has...原创 2018-10-16 01:43:28 · 311 阅读 · 0 评论 -
浅解volatile
volatile是Java的关键字,可以被理解为轻量级的synchronized,在多线程并发中可以保证共享变量的可见性,每当有线程修改这个共享变量的时候,对其他的线程就是可见的。一般被volatile修饰的共享变量会认为这个变量是易变得。它有三个特性:可见性、有序性、原子性。可见性:对一个volatile的读,总能看到任意线程对这个volatile写的最后的写入原子性:对任意单个vo...原创 2018-11-01 11:18:58 · 231 阅读 · 0 评论 -
双重校验锁 为啥要用volatile修饰
public class Single { private static volatile Single single; public static Single getSingle(){ if (single==null){ synchronized (Single.class){ if (single==...原创 2018-11-06 15:41:39 · 1018 阅读 · 0 评论 -
浅析final关键字
final可以用来修饰类、方法、变量,分别有不同的意义。修饰类:这个类不能被继承,所有的方法不能被重写,但是里面的成员变量并不是不可变得,如果需要让它们不可变则需要用final去修饰变量。修饰方法:不可以被重写,但是子类可以去使用这个方法。修饰变量:不可修改,可以用于保护只读数据,尤其是在并发中,有利于减少额外的同步开销,也可以省去一些防御性的拷贝。final指的是引用不可变性,也...原创 2018-11-06 15:44:11 · 331 阅读 · 0 评论 -
浅析Java线程池
在Java里,线程池的运用场景很多,几乎所有需要异步或者并发执行任务的程序都可以使用线程池。目录线程池的好处线程池的工作流程线程池的组成元素向线程池提交任务关闭线程池Java自带的四种线程池线程池的好处 降低资源消耗。通过重复利用已创建的线程降低了创建线程和销毁线程的资源消耗 提高了响应速度。当有任务时,任务可以不用等线程的创建就可以执行 提高...原创 2018-11-20 00:44:30 · 246 阅读 · 0 评论 -
初始class文件
class文件class文件的构成一个class文件主要分为十个部分。MagicNumber 魔数,它是用来标志一个class文件的,是class文件的第一部分,共4个字节,固定为0xCAFEBABE,虚拟机加载的时候就会先去加载这4个字节,当发现class文件的前面4个字节不是0xCAFEBABE的时候就会拒绝加载这个class文件。Version 版本号,它由两部分组成。Ma...原创 2019-09-16 14:51:34 · 259 阅读 · 0 评论