
Java基础知识
文章平均质量分 94
Q蛋黄酱
这个作者很懒,什么都没留下…
展开
-
关于Java虚拟机二三事(四)---内存分配与回收策略
前言 上篇文章中,已经较为详细地介绍了虚拟机中垃圾收集器体系以及运行原理,本文将继续探讨给对象分配内存的具体策略。 对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的Eden区,如果启动了本底线程分配缓存(TLAB),则将按线程优先在TLAB上分配。少数情况下,也可能直接分配至老年代中,分配的规则并非固定,其细节取决于当前所使用的哪一种垃圾收集器组合,还原创 2018-01-05 17:01:39 · 369 阅读 · 0 评论 -
Java NIO系列教程(九) ServerSocketChannel
原文链接 作者:Jakob Jenkov 译者:郑玉婷 校对:丁一Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样。ServerSocketChannel类在 java.nio.channels包中。这里有个例子:ServerSocketChanne转载 2017-08-26 10:30:13 · 222 阅读 · 0 评论 -
Java NIO系列教程(八) SocketChannel
原文链接 作者:Jakob Jenkov 译者:郑玉婷 校对:丁一Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel:打开一个SocketChannel并连接到互联网上的某台服务器。一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。转载 2017-08-26 10:29:30 · 231 阅读 · 0 评论 -
Java NIO系列教程(七) FileChannel
原文链接 作者:Jakob Jenkov 译者:周泰 校对:丁一Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。打开FileChannel在使用FileChannel之前,必须先打开它。但是,我们无法直接打开一个FileC转载 2017-08-26 10:29:03 · 190 阅读 · 0 评论 -
Java NIO系列教程(一) Java NIO 概述
原文链接 作者:Jakob Jenkov 译者:airu 校对:丁一Java NIO 由以下几个核心部分组成:ChannelsBuffersSelectors虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组转载 2017-08-25 16:49:06 · 195 阅读 · 0 评论 -
Java NIO系列教程(六) Selector
原文链接 作者:Jakob Jenkov 译者:浪迹v 校对:丁一Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。下面是本文所涉及到的主题列表:为什么使用Selector?Selector的创建向Selector注册通道Select转载 2017-08-25 16:55:57 · 202 阅读 · 0 评论 -
Java NIO系列教程(五) 通道之间的数据传输
原文地址:http://tutorials.jenkov.com/java-nio/scatter-gather.html作者:Jakob Jenkov 译者:郭蕾 校对:周泰在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel。transf转载 2017-08-25 16:54:12 · 245 阅读 · 0 评论 -
Java NIO系列教程(四) Scatter/Gather
原文地址:http://tutorials.jenkov.com/java-nio/scatter-gather.html作者:Jakob Jenkov 译者:郭蕾 Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作。分散(sca转载 2017-08-25 16:53:37 · 188 阅读 · 0 评论 -
Java NIO系列教程(三) Buffer
原文链接 作者:Jakob Jenkov 译者:airu 校对:丁一Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。下面是NIO Buffe转载 2017-08-25 16:51:37 · 236 阅读 · 0 评论 -
Java NIO系列教程(二) Channel
原文链接 作者:Jakob Jenkov 译者:airu 校对:丁一Java NIO的通道类似流,但又有些不同:既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。通道可以异步地读写。通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:转载 2017-08-25 16:50:16 · 225 阅读 · 0 评论 -
Java集合框架源码解析-HashSet及LinkedHashSet
Java容器类的用途是“保存对象”,分为两类:Map——存储“键值对”组成的对象;Collection——存储独立元素。Collection又可以分为List和Set两大块。List保持元素的顺序,而Set不能有重复的元素。 本文分析Set中最常用的HashSet类,并简单介绍和对比LinkedHashSet。 首先对Set接口进行简要的说明。 存原创 2017-08-08 17:29:44 · 316 阅读 · 0 评论 -
Java NIO系列教程(十) Java NIO DatagramChannel
原文链接 作者:Jakob Jenkov 译者:郑玉婷 校对:丁一Java NIO中的DatagramChannel是一个能收发UDP包的通道。因为UDP是无连接的网络协议,所以不能像其它通道那样读取和写入。它发送和接收的是数据包。打开 DatagramChannel下面是 DatagramChannel 的打开方式:转载 2017-08-26 10:31:01 · 247 阅读 · 0 评论 -
Java NIO系列教程(十一) Pipe
原文链接 作者:Jakob Jenkov 译者:黄忠 校对:丁一Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。这里是Pipe原理的图示:创建管道通过Pipe.open()方法打开管道。例如:转载 2017-08-26 10:33:55 · 253 阅读 · 0 评论 -
关于Java虚拟机二三事(三)---垃圾回收算法及回收器
前言 在介绍了对象的创建、定位以后,具体的使用则需要根据不同的业务逻辑来确定,这部分是比较自由的。但正如前文所说,Java程序员将内存的管理交托给了JVM。因此此章节将进一步介绍Java垃圾收集器及内存分配策略的相关知识。 Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,原创 2017-12-26 10:00:39 · 400 阅读 · 0 评论 -
关于Java虚拟机二三事(二)---对象创建及定位
前言: 在了解了JVM内存的结构之后,我们可以更进一步了解,对象在创建到销毁时,内存分配及回收的具体过程和策略。此处先学习一下Java对象的创建过程。 Java虚拟机执行过程中,对象的生命周期可以大概分成三个阶段:对象的创建、对象的使用、对象的销毁三个阶段,具体可如下图所示。 上图给出的是较为概要的对象生命周期。并针对对象的创建进行了具体的步骤描述: 1、当Java源文原创 2017-12-24 11:36:03 · 579 阅读 · 0 评论 -
关于Java虚拟机二三事(一)---Java技术体系及JVM内存结构
前言作为一个爱好Java的程序猿,自然少不了对JVM的学习和研究,《深入理解Java虚拟机》一书,大概从头到尾完整地看了四五遍,有些地方感觉讲的粒度比较粗,但只是少数,总体而言,这本书讲解的非常棒,不少东西都是看了第二次,甚至第三次之后才有了进一步的理解。走进Java-Java技术体系从广义上讲,Clojure、JRuby、Groovy等运行于Java虚拟机上的语言及其相关程序都属于Java技术体系原创 2017-12-22 17:33:06 · 409 阅读 · 0 评论 -
Java 8 Lambda实现原理分析
为了支持函数式编程,Java 8引入了Lambda表达式,那么在Java 8中到底是如何实现Lambda表达式的呢? Lambda表达式经过编译之后,到底会生成什么东西呢? 在没有深入分析前,让我们先想一想,Java 8中每一个Lambda表达式必须有一个函数式接口与之对应,函数式接口与普通接口的区别,可以参考前面的内容,那么你或许在想Lambda表达式是不是转化成与之对应的函数式接口的一个实现类转载 2017-10-19 10:38:23 · 522 阅读 · 0 评论 -
Java8:Lambdas(二)学习怎样去使用lambda表达式
Java8:Lambdas(二)学习怎样去使用lambda表达式原文链接 作者:Ted Neward 译者:赵峰Java SE 8的发布很快就到了。伴随着它来的不仅仅是新的语言lambda表达式(同样被称为闭包或匿名方法)——伴随着一些语言特性支持——更重要的是API和library的增强将会使传统的Java核心libraries变的更易于使用。其中大多数的增强和补充是在转载 2017-10-17 22:36:17 · 297 阅读 · 0 评论 -
35 个 Java 代码性能优化总结
前言代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每转载 2017-10-08 17:50:03 · 200 阅读 · 0 评论 -
Java I/O 操作及优化建议
Java I/OI/O,即 Input/Output(输入/输出) 的简称。就 I/O 而言,概念上有 5 种模型:blocking I/O,nonblocking I/O,I/O multiplexing (select and poll),signal driven I/O (SIGIO),asynchronous I/O (the POSIX aio_functions)。不同的操作转载 2017-10-08 17:47:49 · 257 阅读 · 0 评论 -
写出优质Java代码的4个技巧
我们平时的编程任务不外乎就是将相同的技术套件应用到不同的项目中去,对于大多数情况来说,这些技术都是可以满足目标的。然而,有的项目可能需要用到一些特别的技术,因此工程师们得深入研究,去寻找那些最简单但最有效的方法。在前一篇文章中,我们讨论了必要时可以使用的四种特殊技术,这些特殊技术可以创建更好的Java软件;而本文我们将介绍一些有助于解决常见问题的通用设计策略和目标实现技术,即:只做有目的性转载 2017-09-28 11:49:22 · 212 阅读 · 0 评论 -
判断java中两个对象是否相等
java中的基本数据类型判断是否相等,直接使用"=="就行了,相等返回true,否则,返回false。但是java中的引用类型的对象比较变态,假设有两个引用对象obj1,obj2,obj1==obj2 判断是obj1,obj2这两个引用变量是否相等,即它们所指向的对象是否为同一个对象。言外之意就是要求两个变量所指内存地址相等的时候,才能返回true,每个对象都有自己的一块内存,因此必须指向转载 2017-09-16 21:01:57 · 3405 阅读 · 0 评论 -
Java NIO系列教程(十二) Java NIO与IO
原文地址:http://tutorials.jenkov.com/java-nio/nio-vs-io.html作者:Jakob Jenkov 译者:郭蕾 校对:方腾飞当学习了Java NIO和IO的API后,一个问题马上涌入脑海:我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异、它们的使用场景,以及它们如何影响您的代转载 2017-08-26 10:34:37 · 228 阅读 · 0 评论 -
Java集合框架源码解析-LinkedList
LinkedList也和ArrayList一样实现了List接口,但是它执行插入和删除操作时比ArrayList更加高效,因为它是基于链表的。基于链表也决定了它在随机访问方面要比ArrayList逊色一点。 除此之外,LinkedList还提供了一些可以使其作为栈、队列、双端队列的方法。这些方法中有些彼此之间只是名称的区别,以使得这些名字在特定的上下文中显得更加的合适。原创 2017-08-08 17:10:04 · 229 阅读 · 0 评论 -
Java集合框架源码解析-ArrayList
由上图可知,List接口继承自Collection接口,但此外,List接口还扩展了很多Collection接口中没有的方法,如下图所示 ArrayList就是传说中的动态数组,就是Array的复杂版本,它提供了如下一些好处:动态的增加和减少元素、灵活的设置数组的大小......而ArrayList则实现了List接口,具体实现代码如下,[java] view pl原创 2017-08-08 16:39:46 · 386 阅读 · 0 评论 -
JVM类加载机制
概述虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象转载 2017-04-21 11:09:37 · 286 阅读 · 0 评论 -
深入理解JVM--JVM垃圾回收机制
Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都在重复的allocated,然后不停的~析构。于是,有人就提出,能不能写一段程序在实现这块功能,每次创建,释放控件的时候复用这段代码,而无需重复的书写呢? 1960年 基于MIT的Lisp首先提出转载 2017-06-04 23:07:02 · 489 阅读 · 0 评论 -
Java内存模型
1、概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题,它代表着一秒内服务器平均能响应的请求数,而TPS值与程序的并发能力有着非常密切的关系。在讨论Java内存模型和线程之前,先简单介绍一下硬件的效率与一致性。 2、硬件的效率与一致性 由于计算机的存储转载 2017-05-28 16:14:28 · 232 阅读 · 0 评论 -
RTTI、反射、动态代理部分知识总结
RTTI与反射 背景:为什么会需要反射机制? 众所周知,RTTI(运行时类型识别),可以确切的告诉你某一个对象的确切类型,但有一个前提,这个确切类型必须在编译阶段是已知的。 即在编译时,编译器必须知道所有要通过RTTI处理的类,如果当前是处在一个分布式的环境中,某一台主机接收到了一段字节流信息,而这个字节流信息代表着的是一个确切类型的对象,此时本地没有对应该类型的.class文件,则RTTI无原创 2017-05-16 21:31:10 · 348 阅读 · 0 评论 -
理解Java中的引用传递和值传递
理解Java中的引用传递和值传递关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑。关于值传递和引用传递其实需要分情况看待,今天学习和分析一下,着急可以先看最后的结论。1.基本类型和引用类型在内存中的保存Java中数据类型分为两大类,基本类型和对象类型。相应的,变转载 2017-05-25 22:16:33 · 236 阅读 · 0 评论 -
Java 对象的生命周期
在Java中,对象的生命周期包括以下几个阶段: 1. 创建阶段(Created) 2. 应用阶段(In Use) 3. 不可见阶段(Invisible) 4. 不可达阶段(Unreachable) 5. 收集阶段(Collected) 6. 终结阶段(Finalized) 7. 对象空间重分配阶段(De-alloca转载 2017-05-23 22:15:13 · 242 阅读 · 0 评论 -
Java集合---ConcurrentHashMap原理分析
Java集合---ConcurrentHashMap原理分析 集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并发集合类型(concurrent,copyonright,queue)中的Concurr转载 2017-04-17 17:45:13 · 245 阅读 · 0 评论 -
Java基础知识—多态
前言 多态,是继数据抽象和继承之后,面向对象第三种基本类型特征。方法调用绑定 将方法调用同一个方法主体关联起来,称为绑定。 方法绑定分为两种:前期绑定和后期绑定(动态绑定)Java方法绑定机制 Java中除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是通过后期绑定。多态表现 假设有一个基类Shape,包含成员方法draw原创 2017-03-31 15:50:32 · 360 阅读 · 0 评论 -
Java基础知识——复用类
前言复用代码是Java众多引人注目的功能之一,Java中复用代码的形式主要分为两种:组合与继承。1 组合语法1.1 概念:只需要将对象引用置于新类中即可,例如你需要某个对象,该对象中必须有多个String对象、几个基本数据类型以及另一个类的对象,此时,对于非基本类型的对象,必须在新的类中对其进行声明和定义,以达到组合的效果,对于基本类型数据,可直接进行定义。1.2 注意原创 2017-03-30 23:32:01 · 343 阅读 · 0 评论 -
Java基础知识整理(初始化与清理)
面向对象过程中,初始化是Java中必不可少的一个环节,用来确保每个类的实体对象都能够分配到存储空间而不会造成不必要的空指针异常。Java 构造器Java中,初始化对象的函数称为构造器,每个类都会有一个不带任何参数的默认构造器。若类中没有声明其他带参数的构造器,则编译器会自动生成一个“隐藏”的默认构造器。 注意几点:构造器没有任何返回类型(与void不同)构造器本身是静态方法构造器可以通过方法重原创 2017-03-13 11:19:34 · 395 阅读 · 0 评论 -
java基本数据类型转换
类型转换Java 语言是一种强类型的语言。强类型的语言有以下几个要求:变量或常量必须有类型:要求声明变量或常量时必须声明类型,而且只能在声明以后才能使用。赋值时类型必须一致:值的类型必须和变量或常量的类型完全一致。运算时类型必须一致:参与运算的数据类型必须一致才能运算。但是在实际的使用中,经常需要在不同类型的值之间进行操作,这就需要一种新的语法来适应这种转载 2017-06-19 23:23:19 · 291 阅读 · 0 评论 -
java中四种引用类型(对象的强、软、弱和虚引用)
对象的强、软、弱和虚引用在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 ⑴强引用(StrongReference)强引转载 2017-06-08 15:38:40 · 288 阅读 · 0 评论 -
Java集合框架综述
集合框架(collections framework)首先要明确,集合代表了一组对象(和数组一样,但数组长度不能变,而集合能)。Java中的集合框架定义了一套规范,用来表示、操作集合,使具体操作与实现细节解耦。其实说白了,可以把一个集合看成一个微型数据库,操作不外乎“增删改查”四种操作,我们在学习使用一个具体的集合类时,需要把这四个操作的时空复杂度弄清楚了,基本上就可以说掌握这转载 2017-08-08 16:21:10 · 208 阅读 · 0 评论 -
将javabean对象转换成Map<String,Object>类型对象
思路是采用反射机制,直接获取对象所有字段,遍历的时候在map里put进每个字段的值public static void transformBeanToMap(Object object,Map<String, Object>map) throws IllegalArgumentException, IllegalAccessException { Field[] d转载 2017-07-24 12:27:34 · 3244 阅读 · 0 评论 -
JVM在JDK8取消了永久代(PermGen)代之元空间(Metaspace)的意义
最直接的后果,就是以后再也不会有outofmemoryerror permgen space这个错误了!最根本的好处就是在效率提升的同时增加了安全性。相对于C++来说,Java语言更加安全,jvm具有自动的垃圾回收机制,而C++的程序员需要手动去清除垃圾。JVM这种设计思路确实使java语言的安全性提高了,并且不需要程序员手动去清理垃圾,但是带来了时间上的开销,也就导致了java语言效率低,速...转载 2017-07-30 23:06:17 · 590 阅读 · 0 评论