java基础
文章平均质量分 90
帅性而为1号
就读于东南大学,现阿里巴巴Java工程师
展开
-
ThreadLocal弱引用与内存泄漏分析
本文对ThreadLocal弱引用进行一些解析,以及ThreadLocal使用注意事项。ThreadLocal首先,简单回顾一下,ThreadLocal是一个线程本地变量,每个线程维护自己的变量副本,多个线程互相不可见,因此多线程操作该变量不必加锁,适合不同线程使用不同变量值的场景。其实现原理这里就不做详细阐述,其数据结构是每个线程Thread类都有个属性ThreadLocalMap,...原创 2020-04-10 19:40:52 · 993 阅读 · 0 评论 -
依赖倒置原则
依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。面向过程的开发,上层调用下层,上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降低而且大大提高了开发的成本。面向对象的开发很好的解决了这个问题,一般情况下...转载 2020-03-22 11:40:22 · 324 阅读 · 0 评论 -
软件设计七大原则实战(二)-开闭原则
1 开闭原则的定义开闭原则是Java世界里最基础的设计原则,它指导我们如何建立一个稳定的、灵活的系统,先来看开闭原则的定义:Software entities like classes,modules and functions should be open for extension but closed for modifications定义初看到这个定义,可能会很迷惑...转载 2020-03-22 11:27:53 · 550 阅读 · 0 评论 -
Java NIO(一)入门篇
概念java.nio(java new IO),是jdk1.4 里提供的新api ,为所有的原始类型提供缓存支持。Sun 官方标榜的特性如下: 为所有的原始类型提供(Buffer)缓存支持。字符集编码解码解决方案。 Channel :一个新的原始I/O 抽象。 支持锁和内存映射文件的文件访问接口。 提供多路(non-bloking) 非阻塞式的高伸缩性网络I/O。NIO和IO的主要原创 2016-03-31 13:52:47 · 1611 阅读 · 0 评论 -
Java8特性之Lambda表达式
简介Lambda表达式(也称为闭包)是整个Java 8发行版中最受期待的在Java语言层面上的改变,Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中),或者把代码看成数据:函数式程序员对这一概念非常熟悉。在JVM平台上的很多语言从一开始就有Lambda,但是Java程序员不得不使用毫无新意的匿名类来代替lambda。“Lambda 表达式”(lambda expres原创 2016-03-24 14:13:36 · 1225 阅读 · 0 评论 -
Java String类的秘密
String的本质 打开String的源码,类注释中有这么一段话“Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings.Because String objects are immutable they can原创 2016-04-13 14:18:05 · 707 阅读 · 0 评论 -
java集合框架之hashmap
定义 hashmap基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 根据需要该容器可能会对元素重新哈希,元素的顺序也会被重新打散,因此不同时间迭代同一个HashMap的顺序可能会不同。原创 2016-04-28 13:43:28 · 720 阅读 · 0 评论 -
Java8特性之接口的默认方法与静态方法
简介 Java 8用默认方法与静态方法这两个新概念来扩展接口的声明。它允许添加新方法到已有接口中,但是不会破坏那些基于老版接口实现的代码的二进制兼容性。默认方法和抽象方法的区别在于:抽象方法是必须要实现的,而默认方法不是。相反,每个接口必须提供一个所谓的默认方法实现,所有的实现类都会默认继承得到这个方法(如果需要也可以重写这个默认实现)。意义众所周知,我们应该使用接口编原创 2016-03-24 14:43:40 · 1996 阅读 · 0 评论 -
Java虚拟机详解
概念 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。运行过程一个运行时的Java虚拟机实例的天职是:负责原创 2016-05-11 22:14:55 · 1576 阅读 · 1 评论 -
Java Thread.join()方法
一、使用方式。join是Thread类的一个方法,启动线程后直接调用,例如:Thread t = new AThread(); t.start(); t.join();二、为什么要用join()方法在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结原创 2016-05-12 15:08:45 · 311 阅读 · 0 评论 -
多线程之指令重排序
理解重排序 重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境。 在并发程序中,程序员会特别关注不同进程或线程之间的数据同步,特别是多个线程同时修改同一变量时,必须采取可靠的同步或其它措施保障数据被正确地修改,这里的一条重要原则是:不要假设指令执行的顺序,你无法预原创 2016-05-24 16:51:49 · 3717 阅读 · 1 评论 -
java的System.exit(0)和System.exit(n)
终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。 该方法调用 Runtime 类中的 exit 方法。该方法永远不会正常返回。调用 System.exit(n) 实际上等效于调用: Runtime.getRuntime().exit(n)在一个if-else判断中,如果我们程序是按照我们预想的执行,到最后我们需要停止程序,那么我原创 2016-04-18 20:29:56 · 1115 阅读 · 0 评论 -
Java静态内部类的作用
在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。由于静态的内部类在定义、使用的时候会有种种的限制。所以在实际工作中用到的并不多。 在开发过程中,内部类中使用的最多的还是非静态地成员内部类。不过在特定的情况下,静态内部类也能够发挥其独特的作用。 一、静态内部类的使用目的。 在定义内部类的时候,可以在其前面原创 2016-05-26 13:54:22 · 3899 阅读 · 0 评论 -
危险!在HashMap中将可变对象用作Key
本文由 ImportNew - 刁 文阳 翻译自 java-fries。欢迎加入翻译小组。转载请见文末要求。本文中我们将会讨论在Java HashMap中将可变对象用作Key。所有的Java程序员可能都在自己的编程经历中多次用过HashMap。那什么是HashMap呢?HashMap是一种用哈希值来存储和查找键值对(key-value pair,也称作entry)的一种数据结构转载 2016-05-19 09:59:46 · 597 阅读 · 0 评论 -
Java回调机制
定义一句话,回调是一种双向调用模式,什么意思呢,就是说,被调用方在被调用时也会调用对方,这就叫回调。“If you call me, i will call back”。 在网上看到了一个比喻,觉得很形象,这里借用一下: 你有一个复杂的问题解决不了,打电话给你的同学,你的同学说可以解决这个问题,但是需要一些时间,那么你不可能一直拿着电话在那里等,你会把你的电话号码告诉他,让他解转载 2016-04-19 09:44:40 · 665 阅读 · 1 评论 -
Java 内存区域和GC机制
Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。概括地说,该机制对 JVM(Java Virtual Mach转载 2016-05-13 17:09:51 · 440 阅读 · 0 评论 -
java中类方法和实例方法区别
我们已经知道类体中的方法分为实例方法和类方法两种,用static修饰的是类方法。二者有什么区别呢?当一个类创建了一个对象后,这个对象就可以调用该类的方法。 当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,当该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。需要注意的是,当我们创建第一个对象时,类中的实例方法就分配了入口地址,当再创建原创 2016-04-19 15:58:52 · 1114 阅读 · 0 评论 -
Object类和String类equals方法的区别
String类的equals方法和“==”相信很多学习过Java的同学都知道,在比较两个String对象的内容是否相同时是使用equals方法的如:String str1=new String(“A”); String str2=new String(“B”); String str3=new String(“B”); boolean result1= str原创 2016-05-15 15:20:45 · 3498 阅读 · 1 评论 -
HashMap和HashSet的区别和分析
HashSet定义HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。public boolean add(Objec原创 2016-05-15 17:22:27 · 7534 阅读 · 1 评论 -
Java虚拟机详解----JVM常见问题总结
本文转自:http://www.cnblogs.com/smyhvae/p/4810168.html面试必问关键词:JVM垃圾回收、类加载机制。 先把本文的目录画一个思维导图:一、Java引用的四种状态:强引用: 用的最广。我们平时写代码时,new一个Object存放在堆内存,然后用一个引用指向它,这就是强引用。 如果一个对象具有强引转载 2016-05-15 22:48:41 · 767 阅读 · 0 评论 -
Java虚拟机详解----GC算法和种类【重要】
转载自:http://www.cnblogs.com/smyhvae/p/4744233.html本文主要内容:GC的概念GC算法 引用计数法(无法解决循环引用的问题,不被java采纳) 根搜索算法 现代虚拟机中的垃圾搜集算法: 标记-清除 复制算法(新生代) 标记-压缩(老年代) 分代收转载 2016-05-15 23:01:22 · 1949 阅读 · 0 评论 -
Java源码分析之ArrayList
ArrayList是以数组为基准的容器类,和LinkedList(链表)正好相反。因而ArrayList拥有更好的查找性能,增删操作则差一些。ArrayList封装了对于常规数组的操作,同时可以自动扩展容量。下面对ArrayList的API进行归类:1、构造函数:①ArrayList() 以空数组进行构造 ②ArrayList(int) 以指定大小的容量初始化数转载 2016-05-16 10:52:17 · 356 阅读 · 0 评论 -
Java源码分析之LinkedList
LinkedList与ArrayList正好相对,同样是List的实现类,都有增删改查等方法,但是实现方法跟后者有很大的区别。先归纳一下LinkedList包含的API1、构造函数:①LinkedList() 起始没有元素②LinkedList(Collection collection) 用另一个集合构造LinkedList2、增加元素:①vo转载 2016-05-16 10:53:30 · 487 阅读 · 0 评论 -
java Jvm工作原理学习笔记
一、 JVM的生命周期1. JVM实例对应了一个独立运行的java程序它是进程级别a) 启动。启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点b) 运行。main()作为该程序初始线程的起点,任原创 2016-05-16 16:57:28 · 514 阅读 · 0 评论 -
java反射技术详解
反射:其实就是动态的从内存加载一个指定的类,并获取该类中的所有的内容。反射的好处:大大的增强了程序的扩展性。 反射的基本步骤: 1. 获得Class对象,就是获取到指定的名称的字节码文件对象。 2. 实例化对象,获得类的属性、方法或构造函数。 3. 访问属性、调用方法、调用构造函数创建对象。一: 获取Class对象,有三种方式 :原创 2016-05-16 17:38:33 · 281 阅读 · 0 评论 -
java 反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。注意:反射是在运行的时候进行的,不是在编译的时候运行的。反射的功能Java反射机制主要提供了以下功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的转载 2016-05-16 17:42:58 · 261 阅读 · 0 评论 -
Java常见内存溢出异常分析
http://www.importnew.com/14604.html简介Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆内存分为了三部分,新生代,老年代,持久带,其中持久带实现了规范中规定的方法区,而内存模型中不同的部分都会出现相应的OutOfMemoryError错误,接下来我们就分开来讨论一下。java.lang转载 2016-05-11 16:56:06 · 646 阅读 · 0 评论 -
Java多线程面试问题
原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题。Java多线程面试问题1原创 2016-04-21 22:36:19 · 1523 阅读 · 0 评论 -
Java并发编程之this逃逸问题
简介this逃逸是指在构造函数返回之前其他线程就持有该对象的引用. 调用尚未构造完全的对象的方法可能引发令人疑惑的错误, 因此应该避免this逃逸的发生.this逃逸经常发生在构造函数中启动线程或注册监听器时, 如:public class ThisEscape { public ThisEscape() { new Thread(new EscapeRunnab原创 2016-04-22 16:57:12 · 2950 阅读 · 0 评论 -
浅谈Java中的equals和==
原文出处: 海 子在初学Java时,可能会经常碰到下面的代码:1String str1 = newString("hello");2String str2 = newString("hello");3 4System.out.println(str1==str2);转载 2016-05-18 14:36:43 · 320 阅读 · 0 评论 -
谁在关心toString的性能?
本文由 ImportNew - 无名侠女谭 翻译自 Antoniogoncalves.org。欢迎加入翻译小组。转载请见文末要求。谁在关心toString的性能?没有人!除非当你有大量的数据在批量处理,使用toString产生了许多日志。然后,你去调查为何如此之慢,才意识到大部分的toString方法使用的是introspection,它其实是可以被优化的。不过,首先让我们一起看看转载 2016-05-18 14:52:40 · 363 阅读 · 0 评论 -
不同的垃圾回收器的比较以及使用调查
4款Java垃圾回收器——错误的选择导致糟糕的性能现在已经是2014年了,但是对大多数开发人员而言有两件事情仍然是个谜——垃圾回收以及异性(码农又被嘲笑了)。由于我对后者也不是特别了解,我想我还是试着说说前者吧,尤其是随着Java 8的到来,这个领域也发生了许多重大的变化及提升,其中最重要的莫过于持久代(PermGen)的删除以及一些令人振奋的新的优化(后面会陆续提及这些)。说起垃原创 2016-05-18 15:35:17 · 1295 阅读 · 0 评论 -
Minor GC、Major GC和Full GC之间的区别
本文由 ImportNew - 光光头去打酱油 翻译自 javacodegeeks。欢迎加入翻译小组。转载请见文末要求。在 Plumbr 从事 GC 暂停检测相关功能的工作时,我被迫用自己的方式,通过大量文章、书籍和演讲来介绍我所做的工作。在整个过程中,经常对 Minor、Major、和 Full GC 事件的使用感到困惑。这也是我写这篇博客的原因,我希望能清楚地解释这其中的一些疑惑。转载 2016-05-18 16:01:40 · 407 阅读 · 0 评论 -
详解java类的生命周期
原文出处: 卡奴达摩的专栏引言最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上转载 2016-05-18 16:05:09 · 297 阅读 · 0 评论 -
Java异常处理和设计
Java异常处理和设计 在程序设计中,进行异常处理是非常关键和重要的一部分。一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度。试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻找出错的根源?但是如果一个项目异常处理设计地过多,又会严重影响到代码质量以及程序的性能。因此,如何高效简洁地设计异常处理是一门艺术,本文下面先讲述Java异常机制最基转载 2016-05-16 10:30:30 · 539 阅读 · 0 评论 -
Java编程中“为了性能”需做的26件事
最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了。 本文参考网络资源总结的一些在Java编程中尽可能要做到的一些地方。最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压转载 2016-04-24 10:20:15 · 335 阅读 · 0 评论 -
细说JAVA反射
Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。JavaBean 是 reflection 的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。转载 2016-05-19 13:04:02 · 579 阅读 · 0 评论 -
Java泛型
什么是泛型?泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。可以在集合框架(Collection framework)中看到泛型的动机。例如,Map 类允许您向一个 Map 添加任意类的对象,即转载 2016-05-19 14:36:54 · 426 阅读 · 0 评论 -
java通配符
Java泛型中的标记符含义: E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型)? - 表示不确定的java类型关键字说明● ? 通配符类型● 表示类型的上界,表示参数原创 2016-05-19 15:41:42 · 1486 阅读 · 0 评论 -
Java return和finally执行顺序
在Java语法中,return表示当前执行的结束,finally则是在当前代码块一定会执行的代码块。如果return在finally在之前执行,也就是return放在try或者catch的语句块里,,finally里的代码也会执行吗?我们来试试看!源码: public static String test(){ int a = 2; int b = 0; int c;原创 2016-04-24 14:24:09 · 625 阅读 · 0 评论