java基础
文章平均质量分 63
nuaazhaofeng
爱生活,爱coding
展开
-
抽象类和接口联系与区别
关键字: 抽象类与接口的区别abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。 abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于 abstract class和interface的选择转载 2015-11-25 09:30:04 · 465 阅读 · 0 评论 -
深入JVM-有关String的内存泄漏
什么是内存泄漏?所谓内存泄漏,就是由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,他并不是说物理内存消失了,而是指由于不再使用的对象占据了内存不被释放,而导致可用内存不断减小,最终有可能导致内存溢出。由于垃圾回收器的出现,与传统的C/C++相比,Java已经把内存泄漏的概率大大降低了,所以不再使用的对象会由系统自动收集,但这并不意味着已经没有内存泄漏的可能。内存泄漏实际上更是一个应用问题,这转载 2016-12-14 22:52:25 · 1339 阅读 · 0 评论 -
JAVA源码分析-HashMap源码分析(一)
一直以来,HashMap就是Java面试过程中的常客,不管是刚毕业的,还是工作了好多年的同学,在Java面试过程中,经常会被问到HashMap相关的一些问题,而且每次面试都被问到一些自己平时没有注意的问题。因为HashMap不管对于毕业生,还是对于老司机来说,都非常熟悉,熟悉到你经常忽略它。本着知其然,更要知其所以然的精神,本人对JDK 1.8版本的HashMap源码进行了仔细的学习。大家知道,JD原创 2017-01-06 17:27:02 · 508 阅读 · 2 评论 -
JAVA源码分析-HashMap源码分析(二)
本文继续分析HashMap的源码。本文的重点是resize()方法和HashMap中其他的一些方法,希望各位提出宝贵的意见。话不多说,咱们上源码。final Node<K,V>[] resize() { Node<K,V>[] oldTab = table; //如果老的数组为空,老的数组容量设为0 int oldCap = (oldTab == nul原创 2017-01-06 21:33:43 · 459 阅读 · 0 评论 -
JAVA源码分析-深度剖析ConcurrentHashMap
还记得大学快毕业的时候要准备找工作了,然后就看各种面试相关的书籍,还记得很多面试书中都说到: HashMap是非线程安全的,HashTable是线程安全的。那个时候没怎么写Java代码,所以根本就没有听说过ConcurrentHashMap,只知道面试的时候就记住这句话就行了…至于为什么是线程安全的,内部怎么实现的,通通不了解。今天我们将深入剖析一个比HashTable性能更优的线程安全的Ma转载 2017-01-15 20:02:17 · 620 阅读 · 0 评论 -
java中String、StringBuffer、StringBuilder的区别
java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题。现在总结一下,看看他们的不同与相同。1.可变与不可变 String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。private final char value[]; StringBuild原创 2017-02-18 17:13:30 · 606 阅读 · 0 评论 -
【Maven学习】maven中依赖的配置详解
根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或多个项目依赖。每个依赖可以包含的元素有:groupId,artifactId和version:依赖的基本坐标,对于一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。type:依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,默认值为jar原创 2017-05-15 23:03:39 · 379 阅读 · 0 评论 -
【Maven学习】maven基本命令
maven最主要的命令如下:mvn clean compile:告诉Maven编译项目主代码mvn clean test:执行src/test/main下面的test方法,在执行测试之前,会自动执行项目主资源处理、主代码编译、测试资源处理、测试代码编译等工作mvn clean package:打包,使用默认打包类型jar,在打包前会执行编译、测试等操作。生产的jar文件位于target下面m原创 2017-05-15 22:28:53 · 409 阅读 · 0 评论 -
【Maven学习】远程仓库的配置
很多情况下,默认的中央仓库无法满足项目的需求,我们可能需要配置新的远程仓库,此时我们可以这样配置:<repository> <id>java-net</id> <url>https://oss.sonatype.org/content/repositories/snapshots/</url> <snapshots> <enabled>false</enabl原创 2017-05-16 21:22:36 · 403 阅读 · 0 评论 -
elastic-job动态添加定时任务
在elastic-job的使用过程中,我们会遇到动态添加定时任务的时候,但是官网上面并没有对这块内容进行说明。按照我的理解以及官网上面elastic-job的框架图,ej的定时任务其实是存储在zookeeper的一个个节点上面,所以通过给zookeeper添加对应的节点即可完成定时任务的添加动作。下面上代码:import java.text.SimpleDateFormat;import java原创 2017-04-26 15:34:09 · 2700 阅读 · 0 评论 -
【Maven学习】maven-enforcer-plugin的使用
我们会经常碰到这样的问题,在pom中引入了一个jar,里面默认依赖了其他的jar包。jar包一多的时候,我们很难确认哪些jar是我们需要的,哪些jar是冲突的。此时会出现很多莫名其妙的问题,什么类找不到啦,方法找不到啦,这种可能的原因就是jar的版本不是我们所设想的版本,但是我们也不知道低版本的jar是从哪个maven里面引用的。此时我们的maven-enforcer-plugin就可以登场了。<p原创 2017-06-08 09:04:24 · 541 阅读 · 0 评论 -
【Guava】Optional接口来避免空指针错误
null会带来很多问题,从开始有null开始有无数程序栽在null的手里,null的含义是不清晰的,检查null在大多数情况下是不得不做的,而我们又在很多时候忘记了对null做检查,在我们的产品真正投入使用的时候,空指针异常出现了,这是一种讨厌的情况。鉴于此google的guava库中提供了Optional接口来使null快速失败,即在可能为null的对象上做了一层封装,在使用Optional静态方转载 2017-08-22 09:10:19 · 588 阅读 · 0 评论 -
【Guava】PreConditions来校验参数
前置条件:让方法调用的前置条件判断更简单。在我们的日常开发中,经常要对入参进行一定的参数校验,比如是否为空,参数的取值范围是否符合要求等等。这种参数校验如果我们单独进行校验的话,代码的重复率比较高,也不是很优雅。Guava提供了一个类PreConditions来统一校验我们的参数,同时可以抛出对应的异常信息,将参数校验的工作进行了统一。下面是它提供的几种校验方法: 方法声明(不包含额外参数)转载 2017-08-22 09:13:21 · 568 阅读 · 0 评论 -
Java 8学习之Lambda表达式
一、lambda表达式一个lambda表达式包含三个部分: - 一段代码 - 参数 - 自由变量的值,这里的自由指的是哪些不是参数并且没有在代码中定义的变量。示例:public static void repeat(String text, int count) { Runnable r = () -> { for (int i = 0; i < count; i++)转载 2017-08-15 16:19:58 · 215 阅读 · 0 评论 -
Java 8学习之Stream API
一个Stream表面上看与一个集合很类似,允许你改变和获取数据。但是实际上他与集合是有很大区别的:Stream自己不会存储元素。元素可能被存储在底层的集合中,或者根据需要产生出来。Stream操作符不会改变源对象。相反,他们会返回一个持有结果的新Stream。Stream操作符可能是延迟执行的。意味着他们会等到需要结果的时候才执行。下面是一段如何并行统计长单词的代码:long count =转载 2017-08-15 20:52:39 · 177 阅读 · 0 评论 -
【源码分析】HashMap源码再读-基于Java8
最近工作不是太忙,准备再读读一些源码,想来想去,还是先从JDK的源码读起吧,毕竟很久不去读了,很多东西都生疏了。当然,还是先从炙手可热的HashMap,每次读都会有一些收获。当然,JDK8对HashMap有一次优化一、一些参数我们首先看到的,应该是它的一些基本参数,这对于我们了解HashMap有一定的作用。他们分别是:参数说明capacity容量,默认为16,最大为2^...原创 2019-01-30 13:53:06 · 236 阅读 · 0 评论 -
深入JVM-性能监控工具
一、Linux下的性能监控工具1.1 显式系统整体资源使用情况-top命令top命令的输出可以分为两个部分:前半部分是系统统计信息,后半部分是进程信息。在统计信息中,第一行是任务队列信息,他的结果等同于uptime命令。从左到右以此表示:系统当前时间、系统运行时间、当前登录用户数。最后的load average表示系统的平均负载,即任务队列的平均长度,这三个值分别表示1分钟、5分钟、15分钟到现在的原创 2016-12-11 22:46:55 · 464 阅读 · 0 评论 -
深入JVM-垃圾收集器常用的GC参数
1.与串行回收器相关的参数-XX:+UseSerialGC:在新生代和老年代使用串行收集器-XX:SurvivorRatio:设置eden区大小和survivor区大小的比例-XX:PretenureSizeThreshold:设置大对象直接进入老年代的阈值。当对象的大小超过这个值时,将直接在老年代分配。-XX:MaxTenuringThreshold:设置对象进入老年代的年龄的最大值。每一原创 2016-12-11 21:33:38 · 664 阅读 · 0 评论 -
JAVA中int与string互转的效率对比
今天突然心血来潮,想看看int与string互转的效率,所以试一下。1.int转string对比众所周知,int转string有三种方法:* (1) String.valueOf(i)* (2) Integer.toString(i)* (3) i + "" 下面是对比:public class TestInt2String { public static v原创 2015-09-07 14:08:05 · 1259 阅读 · 1 评论 -
Communications Link failure
这个错误是因为数据库设置的wait_timeout和interactive_timeout两个参数时间比较短引起的,解决方案一个是延长这两个参数,另一个方法就是修改数据库连接池testOnBorrow参数,改为true即可解决问题。Mark一下原创 2015-07-15 16:35:24 · 665 阅读 · 0 评论 -
Java编程思想-复用类总结
今天继续读《java 编程思想》,读到了复用类一章,看到总结写的很好,现贴上来,给大家分享。继承和组合都能从现有类型生成新类型。组合一般是将现有类型作为新类型底层实现的一部分来加以复用,而继承复用的是接口。在使用继承时,由于导出类具有基类接口,因此它可以向上转型至基类,这对多态来讲至关重要。尽管面向对象编程对继承极力强调,但在开始一个设计时,一般应优先考虑使用组合(或者可能是代理),只在确实必要时才原创 2016-12-10 22:02:11 · 368 阅读 · 0 评论 -
Java编程思想-接口总结
“确定接口是理想选择,因而应该总是选择接口而不是具体的类。”这其实是一种诱饵。当然,对于创建类,几乎在任何时刻,都可以替代为创建一个接口和一个工厂。许多人都掉进了这种诱惑的陷阱,只要有可能就去创建接口和工厂。这种逻辑看起来是因为需要使用不同的具体实现,因此总是应该添加这种抽象性。这实际上已经变成了一种草率的设计优化。任何抽象性都应该是应真正的需求而产生的。当必须时,你应该重构接口而不是到处添加额外级原创 2016-12-10 22:03:53 · 427 阅读 · 0 评论 -
Java编程思想-异常使用指南
应该在以下情况下使用异常:在恰当的级别处理问题(在知道该如何处理的情况下才捕获异常)。解决问题并且重新调用产生异常的方法。进行少许修补,然后绕过异常发生的地方继续执行。用别的数据进行计算,以代替方法预计会返回的值。把当前运行环境下能做的事情尽量做完,然后把相同的异常重抛到更高层。把当前运行环境下能做的事情尽量做完,然后把不同的异常抛到更高层。终止程序。进行简化(如果你的异常模式使问题原创 2016-12-10 22:05:33 · 252 阅读 · 0 评论 -
Java编程思想-IO系统
一、输入和输出编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。“流”屏蔽了实际的I/O设备中处理数据的细节。Java类库中的I/O类分成输入和输出两部分。通过继承,任何自Inputstream或Reader派生而来的类都含有名为read()的基本方法,用于读取单个字节或者字节数组。同样,任何自OutputStream或Writer派生原创 2016-12-10 22:06:29 · 1135 阅读 · 0 评论 -
Java编程思想-注解
注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。一、定义注解注解的定义看起来很像接口的定义。事实上,与其他任何Java接口一样,注解也将会编译成class文件。import java.lang.annotation.*;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RU原创 2016-12-10 22:08:29 · 620 阅读 · 0 评论 -
Java编程思想-java中的并发(一)
一、基本的线程机制并发编程使我们可以将程序划分为多个分离的、独立运行的任务。通过使用多线程机制,这些独立任务中的每一个都将由执行线程来驱动。线程模型为编程带来了便利,它简化了在单一程序中同时jiao’zhi’zai’yi’qi交织在一起的多个操作的处理。在使用线程时,CPU将轮流给每个任务分配其占用时间。每个人物都觉得自己在一直占用CPU,但事实上CPU时间是划分成片段分配给所有的任务。线程的一大好原创 2016-12-10 22:09:06 · 553 阅读 · 0 评论 -
Java编程思想-java中的并发(二)
二、共享受限资源有了并发就可以同时做多件事情了。但是,两个或多个线程彼此互相干涉的问题也就出现了。如果不防范这种冲突,就可能发生两个线程同时试图访问同一个银行账户,或向同一个打印机打印,改变同一个值等诸如此类的问题。1. 不正确地访问资源考虑下面的例子,其中一个任务产生偶数,而其他任务消费这些数字。这里,消费者任务的唯一工作就是检查偶数的有效性。首先,我们定义EvenChecker,即消费者任务,因原创 2016-12-10 22:09:38 · 873 阅读 · 0 评论 -
Java编程思想-java中的并发(四)
五、 新类库中的构件Java SE5的java.util.concurrent引入了大量设计用来解决并发问题的新类。学习使用它们将有助于编写出更加简单而强壮的并发程序。1. CountDownLatch他被用来同步一个或多个任务,强制他们等待由其他任务执行的一组操作完成。你可以向CountDownLatch对象设置一个初始计数值,任何在这个对象上调用wait()方法都将阻塞,直至这个计数值到达0。其原创 2016-12-10 22:10:41 · 328 阅读 · 0 评论 -
深入JVM-java虚拟机的基本结构
本文将介绍Java虚拟机的基本结构,各组成部分的作用,以及相互之间是如何协调的。而要了解这些,首先必须了解Java堆、Java栈、永久区和元数据区的基本概念。一、Java虚拟机的架构1.1 类加载子系统类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息放在一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池的信息,包括字符串字面量和数字常量(这部分常量信息是cla原创 2016-12-11 12:26:05 · 363 阅读 · 0 评论 -
深入JVM-常用Java虚拟机参数
一、跟踪调试参数1.1 跟踪垃圾回收-读懂虚拟机日志Java的一大特色就是支持自动的垃圾回收(GC),但是有时候,如果垃圾回收频繁出现,或者占用了太长的CPU时间,就不得不引起重视。此时,就需要一些跟踪参数来进一步甄别垃圾回收器的效率和效果。最简单的一个GC参数是-XX:+PrintGC,使用这个参数启动Java虚拟机后,只要遇到GC,就会打印日志。如果需要更加详细的信息,则可以使用-XX:+Pri原创 2016-12-11 15:34:55 · 289 阅读 · 0 评论 -
深入JVM-垃圾回收概念与算法
一、认识垃圾回收谈到垃圾回收(Garbage Collection,简称GC),GC中的垃圾,特指存在于内存中的、不会再被使用的对象。对于内存空间的管理来说,识别和清理垃圾对象是至关重要的。二、常用的垃圾回收算法2.1 引用计数法(Reference Counting)引用计数法是最经典也最古老的一种垃圾收集算法。引用计数器的实现很简单,对于一个对象A,只有有任何一个对象引用了A,则A的引用计数器就原创 2016-12-11 20:13:16 · 305 阅读 · 0 评论 -
NIO基础之同步、异步、阻塞、非阻塞
这里区分几个概念,也是常见但是容易混淆的概念,就是标题中的同步、异步、阻塞、非阻塞。一、同步与异步同步与异步,关心的是消息通信的机制。也就是调用者和被调用者之间,消息是如何进行通知的。如果是调用者主动等待调用的结果,那么就是同步。如果是被调用者主动去通知调用者,就是异步。从上面的描述中,我们可以看到。同步还是异步,主要是看的消息通知的方式,一个是调用者主动等待,一个是调用者被通知。二、阻塞与...原创 2019-02-11 14:10:21 · 292 阅读 · 0 评论