jdk版本的区别
简述jre与jdk的区别
简述jre与jdk的区别少同学初次安装JDK后,会发现电脑里会有两套JRE:一套位于\jre;另外一套位于 C:\Program Files\Java\j2re1.4.1_01 目录下后面这套比前面那套少了Server端的Java虚拟机。
那么JDK和JRE各有什么作用,区别在哪呢?下面是店铺为你整理的简述jre与jdk的区别,供大家阅览!简述jre和jdk的区别什么是JREJRE(Java Runtime Environment,Java运行时环境),包含了java虚拟机、java基础类库。
是使用java语言编写的程序运行所需要的软件环境。
它相当于操作系统部分,提供了Java程序运行时所需要的基本条件和许多Java基础类,例如,IO类、GUI控件类、网络类等。
JRE是提供给普通用户使用的,如果你只想运行别人开发好的Java程序,那么,你的计算机上必须且只需安装JRE。
什么是JDKJDK(Java Development Kit,Java开发工具包),它包含编译工具、解释工具、文档制作工具、打包工具多种与开发相关的工具,是提供给Java开发人员使用的。
JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。
总结初学者学习和使用Java语言时,首先必须下载和安装JDK。
JDK中已经包含了JRE部分,初学者安装JDK后不必再去下载和安装JRE了。
如果你需要运行java程序,只需安装JRE就可以了。
如果你需要编写java程序,需要安装JDK。
JDK,JRE,JVM之间的区别JDK, JRE和JVM是java编程语言的核心概念。
他们看起来有点相似。
作为一个编程者我们似乎也并不是很关心这个概念。
但是她们确实是有区别的,并且他们分别基于不同的目的的。
本文将会分别解释这三个概念,并且说明他们之间的不同点。
JDK(Java Development Kit,Java开发包,Java开发工具)是一个写Java的
JDK(Java Development Kit,Java开发包,Java开发工具)是一个写Java的applet 和应用程序的程序开发环境。
它由一个处于操作系统层之上的运行环境还有开发者编译,调试和运行用Java语言写的applet和应用程序所需的工具组成。
JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。
自从Java 推出以来,JDK已经成为使用最广泛的Java SDK(Software development kit)。
JDK包含的基本组件包括:·javac –编译器,将源程序转成字节码·jar –打包工具,将相关的类文件打包成一个文件·javadoc –文档生成器,从源码注释中提取文档·jdb – debugger,查错工具JDK中还包括完整的JRE(Java Runtime Environment,Java运行环境),也被称为private runtime。
包括了用于产品环境的各种库类,以及给开发员使用的补充库,如国际化的库、IDL库。
JDK中还包括各种例子程序,用以展示Java API中的各部分。
从初学者角度来看,采用JDK开发Java程序能够很快理解程序中各部分代码之间的关系,有利于理解Java面向对象的设计思想。
JDK的另一个显著特点是随着Java (J2EE、J2SE 以及J2ME)版本的升级而升级。
但它的缺点也是非常明显的就是从事大规模企业级Java应用开发非常困难,不能进行复杂的Java软件开发,也不利于团体协同开发。
JDK一般有三种版本:SE(J2SE),standard edition,标准版,是我们通常用的一个版本EE(J2EE),enterpsise edtion,企业版,使用这种JDK开发J2EE应用程序,ME(J2ME),micro edtion,主要用于移动设备、嵌入式设备上的java应用程序Java开发工具(JDK)是许多Java专家最初使用的开发环境。
JDK版本JavaSE、JavaEE、JavaME的区别
JDK版本JavaSE、JavaEE、JavaME的区别
想在win7 X64上搭建JAVA开发环境来着(只是尝试下),打开JAVA 官⽹下载JDK,发现好多版本懵了,百度了下找到这些版本的区别,故有了下⽂
1.JAVA SE
Java2平台标准版(Java2 Platform Standard Edition),主要⾯向个⼈PC桌⾯应⽤程序开发,其中包括:
a、Java运⾏环境(Java Runtime Environment, JRE),包含基本类库,Java虚拟机,Applet组件等;
b、Java开发⼯具包(Java Development Kit, JDK),是JRE的扩展集,包含Java编译器和调试器等。
2.JAVA EE
Java2平台企业版(Java2 Platform Enterprise Edition),主要⾯向复杂的企业级应⽤,基于J2SE。
3.JAVA ME
Java2平台微型版(Java2 Platform Micro Edition),主要是⾯向移动设备、嵌⼊式设备等的开发,基于J2SE。
看了这些JDK的详解知道⾃⼰需要什么版本了吧!。
JDK16正式发布,一次性发布17个新特性…不服不行!
JDK16正式发布,⼀次性发布17个新特性…不服不⾏!上⼀篇:JDK 16 正式发布⽜逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 ⼜如期⽽⾄(2021/03/16),⽼铁们,跟上。
来看下 Oracle Java ⽀持路线图:Oracle 继续保持版本半年⼀发的节奏。
试问:你还能追上 JDK 的发布速度吗??可以看到,JDK 16 也不是⼀个长期⽀持的版本,只⽀持 6 个⽉到 2021 年 9 ⽉,上⼀个长期⽀持版本还是 JDK 11,下⼀个长期⽀持版本是JDK 17,还有半年也要发布了。
所以千万不要把 JDK 16(⾮长期⽀持版本)⽤于⽣产,⼤家了解⼀下就好。
JDK 16 新特性⼀览ID JEP Feature1394Pattern Matching for instanceof2395Records3392Packaging Tool4387Elastic Metaspace5376ZGC: Concurrent Thread-Stack Processing6380UNIX-Domain Socket Channels7396Strongly Encapsulate JDK Internals by Default8390Warnings for Value-Based Classes9338Vector API (Incubator)10389Foreign Linker API (Incubator)11393Foreign-Memory Access API (Third Incubator)12397Sealed Classes (Second Preview)13347Enable C++14 Language Features (in the JDK source code)14357Migrate from Mercurial to Git15369Migrate to GitHub16386Alpine Linux Port17388Windows/Aarch64 PortJDK 16 这个版本提供了 17 个增强功能,包括全新的 Java 语⾔改进,⼯具和内存管理,以及还有⼀些孵化和预览特性,有了这些新功能,Java 会进⼀步提⾼开发⼈员的⽣产⼒。
教你辨别JDK各版本新特性
教你辨别JDK各版本新特性2019-11-22在1995年的3月23日诞生了!Java的诞生标志着互联网时代的开始,它能够被应用在全球信息网络的平台上编写互动性及强的apxxxxplet程序,而1995年的apxxxxplet无疑能给人们无穷的视觉和脑力震荡。
JDK 1.0Sun公司在1996年的1月23日发布了JDK1.0来帮助开发人员的开发∙JDK包括两大部分:运行环境和开发工具。
而运行环境包括五大部分:核心API,集成API,用户界面API,发布技术,Java虚拟机(JVM)。
∙一组完整的 frxxxxamework——AWT∙JDK 1.1Sun公司在1997年2月18日发布了JDK 1.1∙推出了JIT(Just-In-Time)编译器∙Java平台分为PersonalJava与emxxxxbeddedJava,前者比较适用于运算资源和内存丰富的设备,而资源有限者适用于后者。
JDK 1.2JDK1.2在1998年12月4日的隆重发布,标志着Java2平台的诞生。
∙将 Java改名为Java 2。
∙在99年Sun公司还将Java2平台分为三大块:J2SE,J2EE,J2ME。
∙JCP的API制定过程的革命∙新增Swing库∙Java2 还废弃了一些API,最重要的莫过于Thread类中对suspend()resume()和stop()等方法的废弃。
的集合类库中的Vector类和HashTable类都考虑了同步,在平常的使用中影响效率,所以Java2专门添加了对应的非同步类,并完善了集合类库。
∙这个时期出现了一些优秀书籍,比如著名的《Core Java2》JDK 1.32000年5月8日推出的J2SE 1.3,API的加强和对新API的拓展。
∙数字运算:加入了ng.StrictMath方便我们的一般的数字运算。
∙新的Timer API:相信大家对其中的java.util.Timer和java.util.TimerTask一定不陌生。
JDK1.7与JDK1.8的区别,你知道了吗
JDK1.7与JDK1.8的区别,你知道了吗Java 8于2014年3⽉18⽇发布,在阅读相关⽂章后,在本教程中,我们将通过⽰例研究 Java 8功能。
⼀、Java 8 的新特性1. Iterable 接⼝中的 forEach()⽅法2. 接⼝中允许有默认⽅法和静态⽅法3. 函数式接⼝与 Lambda 表达式4. ⽤于集合上批量数据操作的 Java Stream API5. 新的时间 API6. 集合 API 的改进7. 并发 API 的改进8. Java IO 的改进9. 其他核⼼ API 的改进以上是 Java 8 的新特性的列举,接下来展⽰⼀些代码⽚段,来更好理解这些新特性⼆、新特性应⽤2.1、Iterable 接⼝中的 forEach()⽅法package com.taotao.springboot;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.function.Consumer;public class IterableForEachExample {public static void main(String[] args) {List<Integer> ints = new ArrayList<>();for (int i = 0; i < 10; i++) ints.add(i);//迭代器遍历Iterator<Integer> iterator = ints.iterator();while (iterator.hasNext()) {Integer i = iterator.next();System.out.println("Iterator Value::" + i);}//使⽤forEach⽅法遍历,这⾥使⽤了匿名内部类ints.forEach(new Consumer<Integer>() {public void accept(Integer t) {System.out.println("forEach anonymous class Value::" + t);}});//通过实现Consumer接⼝的⼦类遍历,业务处理从遍历逻辑中抽取出来MyConsumer action = new MyConsumer();ints.forEach(action);}}//实现Conumer接⼝class MyConsumer implements Consumer<Integer> {public void accept(Integer t) {System.out.println("Consumer impl Value::" + t);}}通过上⾯这个例⼦,看出使⽤ forEach()⽅法代码⾏数会增加,但是它将遍历逻辑与业务处理逻辑分离,有助于我们将关注点放在业务逻辑的处理上。
JAVA版本号的问题——Java版本号与Jdk版本
JAVA版本号的问题——Java版本号与Jdk版本初学Java时便⼀直疑惑Java版本号到底是如何命名的?时常在⽹上看到Java5、Java6、Java7、Java8 (到今天已经到了Java12了,2019.4.5) 这⼀类 “Java X” 的Java版本名称,同时⼜会看到诸如JDK1.5、JDK1.6这中 “JDK1.X” 的JDk叫法。
⼀直以来都在纠结Java以及JDK的规范版本名称到底是如何,知道最近在⼏本书上看到了相关的解释才有点明⽩,现总结在这⾥:⾸先1996年发布了最初版本Java1.0(此前原型为1995年的Oak,因Oak商标已被占⽤后改名为Java),此后为Java1.1、J2SE1.2、J2SE1.3、J2SE1.4、采⽤ 1.X的命名⽅式,直到2004年的JavaOne会议后版本数提升为5.0,这⼀新版本为Java SE5.0(或J2SE5.0,此处存在疑问,⽹上使⽤较多为Java SE5),在2006年Sun公司终结了已经有8年历史的J2SE、J2EE、J2ME的命名⽅式启⽤了今天的 Java SE、Java EE、Java ME 命名⽅式,⽽此后的版本为Java SE6、Java SE7、Java SE8、Java SE9、Java SE10、Java SE11、JavaSE12。
⽽JDK则在 Java1.0 到 Java9 对应每⼀个版本号:JDK1.0、JDK1.2 ... JDK1.8、JDK1.9,Java10以后JDK对应名称为:JDK10、JDK11、JDK12。
时间线如下:下图来⾃《Java核⼼技术》卷1 第2章 2.1.1你已经看到, JDK 是 Java Development Kit 的缩写。
有点混乱的是:这个⼯具包的版本1.2 ~ 版本 1.4 被称为 Java SDK (软件开发包,Software Development Kit )。
在某些场合下,还可以看到这个过时的术语。
JDK1.8、JDK1.7、JDK1.6区别看这里
JDK1.8、JDK1.7、JDK1.6区别看这⾥这⼀篇开始说ArrayList参考代码为jdk1.6_45 jdk1.7_80 jdk1.8_111中的源码,对⽐阅读,发现修改的问题以及改进点。
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable⼀、基本性质1、底层使⽤原⽣数组实现,实现RandomAccess接⼝,可以随机访问,随机访问指的是下标索引操作index(i)的时间复杂度是O(1)。
size、isEmpty、get、set、iterator和listIterator操作在O(1)内完成,add(e)操作平均在O(1)内完成,即添加n个元素需要O(n)时间(这个是Collection.add,是在尾部添加注意区分下List.add(index, e))。
其他操作基本都是O(n)内完成。
ArrayList与LinkedList实现相⽐,O(n)的各个⽅法的时间复杂度的常数因⼦更⼩。
2、因为底层数组 elementData 的容量是不能改变的,所以容量不够时,需要把 elementData 换成⼀个更⼤的数组,这个过程叫作扩容。
实际的元素的数量size,总是不会超过底层数组的容量 elementData.length,因为扩容需要申请更⼤的内存,并且需要原来数组的进⾏⼀次复制,所以扩容是个耗时的操作。
在添加⼤量元素之前,使⽤者最好是预估⼀个⼤致的数量,⼿动调⽤ensureCapacity进⾏⼀次扩容操作,避免⼀个个添加导致频繁扩容影响性能。
3、ArrayList是未同步的,多线程并发读写时需要外部同步,如果不外部同步,那么可以使⽤Collections.synchronizedList⽅法对ArrayList的实例进⾏⼀次封装,或者使⽤Vector。
jdk17和18的区别面试题
jdk17和18的区别面试题
一、JDK1.7和1.8的Hashmap有哪些区别?1、JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法JDK1.7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。
但是在JDK1.8之后使用尾插法,能够避免出现逆序且链表死循环的问题。
二、扩容后数据存储位置的计算方式不一样在JDK1.7的时候是直接用hash值和需要扩容的二进制数进行&运算,见下图:JDK1.8
是扩容前的原始位置+扩容的大小值=JDK1.8的计算方式,而不再是JDK1.7中异或的方法。
扩容后长度为原hash表的2倍,于是把hash 表分为两半,分为低位和高位,如果能把原链表的键值对,一半放在低位,一半放在高位。
jdk各版本区别
jdk各版本区别⽬录⼀.命名从下⽅的JDK各个版本发布时间和版本名称表可以看到,Java⼤体有3⼤类命名⽅式:JDK、J2SE、JAVA SE。
简⽽⾔之:我们⼝中说的Java8、JDK8、JDK1.8都是⼀个东西,JDK(Java Development Kit)版本名称发⾏⽇期JDK 1.0Oak(橡树)1996-01-23JDK 1.1none(⽆)1997-02-19JDK 1.1.4Sparkler(宝⽯)1997-09-12JDK 1.1.5Pumpkin(南⽠)1997-12-13JDK 1.1.6Abigail(阿⽐盖尔–⼥⼦名)1998-04-24JDK 1.1.7Brutus(布鲁图–古罗马政治家和将军)1998-09-28JDK 1.1.8Chelsea(切尔西–城市名)1999-04-08J2SE 1.2Playground(运动场)1998-12-04J2SE 1.2.1none(⽆)1999-03-30J2SE 1.2.2Cricket(蟋蟀)1999-07-08J2SE 1.3Kestrel(美洲红隼)2000-05-08J2SE 1.3.1Ladybird(瓢⾍)2001-05-17J2SE 1.4.0Merlin(灰背隼)2002-02-13J2SE 1.4.1grasshopper(蚱蜢)2002-09-16J2SE 1.4.2Mantis(螳螂)2003-06-26Java SE 5.0 (1.5.0)Tiger(⽼虎)2004-09-30Java SE 6.0 (1.6.0)Mustang(野马)2006-04Java SE 7.0 (1.7.0)Dolphin(海豚)2011-07-28Java SE 8.0 (1.8.0)Spider(蜘蛛)2014-03-18Java SE 9.0none(⽆)2017-09-21Java SE 10.0none(⽆)2018-03-21Java SE 11.0none(⽆)2018-09-25⼆.缘由Java命名⽅式更改的事件原因:1998年12⽉8⽇,Sun公司发布了第⼆代Java平台(简称为Java2)的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版),应⽤于移动、⽆线及有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的标准版),应⽤于桌⾯环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应⽤于基于Java的应⽤服务器。
JDK发展历史以及版本特性
JDK发展历史以及版本特性JDK(Java Development Kit)是Java语言的开发工具包,包含了Java编译器、调试器、自动构建工具和其他一些实用工具。
JDK的发展历史可以追溯到上世纪90年代,从最早的JDK 1.0到最新的JDK 17,每个版本都带来了许多新的功能和改进。
下面将详细介绍JDK的发展历史以及每个版本的主要特性。
1. JDK 1.0(1996年):JDK 1.0是Java开发工具包的首个正式发布版本。
它包含了Java编译器、调试器、类库和开发工具。
JDK 1.0的特性包括基本的Java语言特性、图形界面和网络编程支持。
2. JDK 1.1(1997年):JDK 1.1引入了许多重要的新功能,包括内部类、JavaBeans、RMI(远程方法调用)和反射。
此外,JDK 1.1还带来了对AWT(图形用户界面工具包)和JDBC(Java数据库连接)等的改进。
3. JDK 1.2(1998年):JDK 1.2是一个重要的里程碑,它引入了许多基本的Java特性,包括协同多线程、集合框架、Java虚拟机内存管理和Java 2D API。
此外,JDK 1.2还提供了对Java Servlet和JavaServer Pages(JSP)的支持。
4. JDK 1.3(2000年):JDK 1.3主要集中在性能改进和稳定性方面。
它引入了HotSpot虚拟机,其中包含了即时编译器,可以显著提高Java程序的执行速度。
此外,JDK 1.3还带来了对JNDI(Java命名和目录接口)和Java Sound API的支持。
5. JDK 1.4(2002年):JDK 1.4引入了许多新功能,包括正则表达式库、XML处理工具、Java Web Start和JMX(Java管理扩展)。
此外,JDK 1.4还改进了性能、内存管理和安全性能。
6. JDK 5(2004年):JDK 5(也称为J2SE 5.0)是一个重要的版本,引入了许多新的语言特性,如泛型、枚举、自动装箱和拆箱以及注解。
JDK的安装和使用方法详细说明
JDK的安装及使用方法详细说明一、JDK基本开发工具简介JDK(Java Developer's Kit,Java开发者工具包),也称J2SDK(Java 2 Software Development Kit),是SUN公司提供的一个开源、免费的Java开发工具。
JDK 包含了Java程序的编译、解释执行工具以及Java运行环境(即JRE)。
作为基本开发工具,JDK也是其它Java开发工具的基础,也就是说,在安装其它开发工具和集成开发环境以前,必须首先安装JDK。
初学者使用JDK,可以在学习的初期把精力集中在Java语言语法的学习上,能够体会到更底层、更基础的知识,对于以后的程序开发很有帮助。
但是JDK没有提供Java源代码的编辑环境,这个是SUN提供的很多基础开发工具的通病,所以还需要在某种文本编辑器(比如:记事本、EditPlus、UltraEdit等)中编写Java源代码。
其实大部分程序设计语言的源代码都是一个文本文件,只是存储成了不同的后缀名而已。
Java源代码程序文件的后缀是.java 的文本文件。
对于初学者来讲,仅使用“记事本+JDK”就可以完成Java程序的编辑、编译、解释及执行等功能。
Java发展到现在,按应用来进行分类,可分为三大块:J2SE、J2ME和J2EE。
这三块相互补充,应用范围不同。
●J2SE就是Java 2的标准版,主要用于桌面应用软件的编程,从JDK1.1.8版本以后改成J2SE。
初学者应从J2SE开始学习。
本文关于软件的下载、安装和配置,以及教学授课内容的介绍也都是基于J2SE平台的。
●J2ME就是Java 2微型嵌入式版,主要应用于嵌入式系统的开发,如:手机、PDA、家电的编程等。
可以说,这是一个很有前途的研究和工作方向。
●J2EE是Java 2的企业版,全称为Java 2 Platform Enterprise Edition。
J2EE 主要用于分布式的网络程序的开发,如:电子商务网站和ERP系统等。
浅谈JDK7和JDK8的区别在哪
浅谈JDK7和JDK8的区别在哪⽬录⼀、接⼝中的default⽅法⼆、lambda表达式三、函数式接⼝四、StreamAPI五、移出永久代,元空间替换六、HashMap中的优化七、currentHashMap的优化⼀、接⼝中的default⽅法⼀般来说接⼝中的⽅法都是不实现的,基本通过实现类来实现⽅法。
但是jdk8中提供了⼀种被default修饰的⽅法,可以直接在接⼝中进⾏实现。
⼆、lambda表达式jdk8引⼊了lambda表达式,也可称为closure(闭包),通常是在需要⼀个函数,但⼜不想费神去命名⼀个函数的场合下使⽤,也就是指匿名函数。
lambda允许把函数作为⼀个⽅法的参数(函数作为参数传递进⽅法中)。
由于其⼏乎被所有主流开发语⾔⽀持。
是java8新引⼊的⼀种语法,是⼀种紧凑的传递代码的⽅式。
使⽤lambda表达式可以使代码变的更加简洁紧凑。
三、函数式接⼝函数式接⼝的引⼊是为了函数式编程的,函数式编程往往依赖于lambda表达式。
定义函数式接⼝有两个步骤:1)确保接⼝中有且仅有⼀个抽象⽅法:2)使⽤注解@FunctionalInterface修饰接⼝四、StreamAPIJDK8中引⼊了StreamAPI,对于学过Flink或Spark的学者应该对此⽐较熟悉,其实就是类似于⼀种流式的数据处理,从dataSource到中间的operator操作,再到最后的dataSink。
Stream的中间操作有map,filter等操作。
⽽流式的数据处理往往就是通过函数式编程实现的。
五、移出永久代,元空间替换JDK7使⽤永久代存储类的元数据,JDK8使⽤元空间存储类的元数据。
元空间和永久代都是⽤来存储class相关信息,包括class对象的Method,Field等,元空间和永久代其实都是⽅法区的实现,只是实现有所不同,所以说⽅法区其实只是⼀种JVM 的规范。
区别:两者最⼤的区别是元空间使⽤本地内存,⽽永久代使⽤的是JVM的内存。
OpenJDK和SunOracleJDK区别与联系
OpenJDK :
[root@localhost ~]# java -version java version "1.6.0_39" OpenJDK Runtime Environment (IcedTea6 1.13.11) (rhel-1.13.11.0.el5_11-x86_64) OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)
jdk 1.9 等价JDK9 J2SE9 JAVA9 jdk 1.8 等价JDK8 J2SE8 JAVA8 jdk 1.7 等价JDK7 J2SE7 JAVA7 jdk 1.6 等价JDK6 J2SE6 JAVA6 jdk 1.5 等价JDK5 J2SE5 JAVA5 jdk 1.4 等价J2SE1.4 jdk 1.3 等价J2SE1.3 jdk 1.2 等价J2SE1.2 jdk 1.1
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
OpenJDK和 SunOracleJDK区别与联系
首先要先明确之间,以及Open 6、OpenJDK 7、OpenJDK 7u和OpenJDK 8等项目之间是什么关系,这有助于确定接下来编译要使用的 JDK版本和源码分支。 从前面介绍的Java发展史中我们了解到OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形 式,即源码是可被复用的,例如IcedTea、UltraViolet都是从OpenJDK源码衍生出的发行版。但如果仅从“开源”字面意义(开放可阅读的源 码)上看,其实Sun自JDK 之后就开始以Java Research License(JRL)的形式公布过Java源码,主要用于研究人员阅读(JRL许可证的开 放源码至JDK 1.6 Update 23为止)。把这些JRL许可证形式的Sun/OracleJDK源码和对应版本的OpenJDK源码进行比较,发现除了文件头 的版权注释之外,其余代码基本上都是相同的,只有字体渲染部分存在一点差异,Oracle JDK采用了商业实现,而OpenJDK使用的是开源 的FreeType。当然,“相同”是建立在两者共有的组件基础上的,Oracle JDK中还会存在一些Open JDK没有的、商用闭源的功能,例如从 JRockit移植改造而来的Java Flight Recorder。预计以后JRockit的MissionControl移植到HotSpot之后,也会以Oracle JDK专有、闭源的形 式提供。 Oracle的项目发布经理Joe Darcy在OSCON 2011上对两者关系的介绍也证实了OpenJDK 7和Oracle JDK 7在程序上是非常接近的,两者共 用了大量相同的代码(如下图,注意图中提示了两者共同代码的占比要远高于图形上看到的比例),所以我们编译的OpenJDK,基本上可 以认为性能、功能和执行逻辑上都和官方的Oracle JDK是一致的。
Java和JDK版本的关系
Java和 JDK版本的关系
JAVA的版本最开始是1995年的JDK Alpha and Beta版本,第二年发布JDK1.0版本之后就是JDK1.1,JDK1.2。到1998年,不再叫JDK了, 而是叫J2SE,但是版本号还是继续延续下去。到了2004年,Sun公司又各种不爽了,按理J2SE1.5的版本,改名叫J2SE5.0了。之后又把 J2SE改成Java SE 6.然后一直延续到现在,因此人们常说的Java X=Java SE X=JDK1.X,都是一回事。 Java SE 8就是Java8,或者jdk1.8。 Java各个版本发行日期: 1 JDK Alpha and Beta (1995) 2 JDK 1.0 (January 23, 1996) 3 JDK 1.1 (February 19, 1997) 4 J2SE 1.2 (December 8, 1998) 5 J2SE 1.3 (May 8, 2000) 6 J2SE 1.4 (February 6, 2002) 7 J2SE 5.0 (September 30, 2004) 8 Java SE 6 (December 11, 2006) 8.1 Java 6 updates 9 Java SE 7 (July 28, 2011) 9.1 Java 7 updates 10 Java SE 8 (March 18, 2014) 10.1
JDk以及各个版本的区别
JDK的含义:java development kit是程序员编写java程序需要的软件,JDK是整个java 的核心,包括了java运行环境、java工具和java基础的类库。
JDK包含的基本组件包括:.javac—编译器,将源程序转成字节码.jar—打包工具,将相关的类文件打包成一个文件.javadoc—文档生成器,从源码注释中提取文档.jdb—debugger,查错工具.java—运行编译后的java程序appletviewer:小程序浏览器,一种执行HTML文件上的java小程序的java浏览器。
javah:产生可以调用java过程的C过程,或建立能被java程序调用的C过程的头文件。
javap:java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。
jconsole:java进行系统调试和监控的工具。
ng:这个是系统的基础类,比如String等都是这里面的,这个package是唯一一个可以不用import就可以使用的package;java.io:这里面有所有输入输出有关的类,比如文件操作等;:这是与网络有关的类,比如URL,URLConnection等;java.util:这个是系统辅助类,特别是集合类Collection,List,Map等;java.sql:这个是数据库操作的类,Connection,Statement,ResultSet等;javax.servlet这个是JSP,Servlet等使用到的类;JDK各个版本的新特性:jdk1.5的新特性(代号:猛虎):1.静态导入(import static)import语句可以导入一个类或是某个包中的所有类。
import static 语句可以导入一个类中的某个静态方法或是所有静态方法。
例如:Math类提供了很多于数学运算的静态方法,通常情况下我们是以Math.abs();这样的方式来进行调用函数的。
但是我们可不可以只写出adb();在JDK1.5之后,可以使用import static 语句导入一个类中的某个静态方法或是所有静态方法。
jdk版本的区别
jdk版本的区别jdk1.4与jdk1.5及jdk1.6的区别jdk1.5的新特性:1. 泛型2 自动装箱/拆箱3 for-each4 static import5 变长参数1. 泛型(避免类型强制转换可能引起的运行错误)例如:ArrayList list=new ArrayList();list.add(new Integer(3));list.add(new Integer(4));int i=((Integer)(list.get(0))).parseInt();很麻烦ArrayListlist=new ArrayList();list.add(new Integer(3));list.add(new Integer(4));int i=list.get(0).parseInt();2 自动装箱/拆箱上面例子的最后一句可改为:int i=list.get(0);因为原始类型与对应的包装类不用显式转换3 for-each循环的增强int a[]={........};//初始化for(int i:a){......}不用以前的i=0;i4 static import以前调Java.mathMath.sqrt();现在static import /doc/27332a0ef12d2af90242e6cb.html ng.Math.sqrt;再 sqrt();相当于你自己类里有这个方法5 变长参数int sum(int ...intlist){int sum;sum=0;for(int i=0;i{sum+=intlist[i];}return sum;}有任意个参数,把他看作数组jdk6.0新特性增强的for循环语句为了迭代集合和数组,增强的for循环提供了一个简单、兼容的语法。
有两点值得一提:一、在循环中,初始化表达式只计算一次。
int表达式未增强的For:int sum = 0;Integer[] numbers = computeNumbers();for (int i=0; i < numbers.length ; i++)sum += numbers[i];增强后的For:int sum = 0;for ( int number: computeNumbers() )sum += number;局限性增强的for循环迭代期间不能访问迭代器或下标请看下面的例子:for (int i=0; i < numbers.length ; i++) {if (i != 0) System.out.print(",");System.out.print(numbers[i]);}这是另一个例子:for (Iterator it = n.iterator() ; it.hasNext() ; )if (it.next() < 0)it.remove();注释注释处理是一个很大的话题。
Java中JDK和JRE的区别是什么?它们的作用分别是什么?
Java中JDK和JRE的区别是什么?它们的作⽤分别是什么?JDK和JRE是Java开发和运⾏⼯具,其中JDK包含了JRE,但是JRE是可以独⽴安装的,它们在Java开发和运⾏的时候起到不同的作⽤~1.JDKJDK是Java Development Kit的缩写,是Java的开发⼯具包,主要包含了各种类库和⼯具,当然也包含了另外⼀个JRE.。
那么为什么要包含另外⼀个JRE呢?⽽且<JDK安装⽬录>/JRE/bin⽬录下,包含有server⼀个⽂件夹~包含⼀个jvm.dll,这说明JDK提供了⼀个虚拟机。
另外,JDK的bin⽬录下有各种Java程序需要⽤到的命令,与JRE的bin⽬录最明显的区别就是JDK⽂件下才有javac,这⼀点很好理解,因为JRE 只是⼀个运⾏环境⽽已,与开发⽆关。
正因为如此,具备开发功能的JDK所包含的JRE下才会同时有server的JVM,⽽仅仅作为运⾏环境的JRE下,只需要server的jvm.dll就够了。
注意:JDK所提供的运⾏环境和⼯具度需要进⾏环境变量的配置以后,才能使⽤,最主要的配置就是把<JDK安装⽬录>/bin⽬录设置为Path环境变量值的⼀部分。
2.JREJRE是Java Runtime Environment的缩写,是Java程序的运⾏环境。
既然是运⾏,当然要包含JVM,也就是所谓的Java虚拟机,还有所以的Java类库的class⽂件,都在lib⽬录下,并且都打包成了jar。
⾄于在Windows上的虚拟机是哪个⽂件呢?就是<JRE安装⽬录>/bin/server中的jvm.dll。
另外,安装JRE的时候安装程序会⾃动把JRE的java.exe添加到了系统变量中。
系统变量Path的最前⾯有%SystemRoot%system32;%SystemRoot%;这样的配置,那样到Windows/system32⽬录下main去看看,会发现⼀个java.exe⽂件。
JDK8到JDK17各个版本的重要特性整理
JDK8到JDK17各个版本的重要特性整理JDK8新特性(2014年初)(LTS版本)1、Lambda表达式2、函数式编程3、接⼝可以添加默认⽅法和静态⽅法,也就是定义不需要实现类实现的⽅法4、⽅法引⽤5、重复注解,同⼀个注解可以使⽤多次6、引⼊Optional来避免空指针7、引⼊Streams相关的API8、引⼊新的Date/Time相关的API9、新增jdeps命令⾏,来分析类、⽬录、jar包的类依赖层级关系10、JVM使⽤MetaSpace代替了永久代(PermGen Space)重要特性:Lambda表达式、函数式接⼝、⽅法引⽤、Stream流式API、采⽤MetaSpace代替了永久代(PermGen Space)JDK9新特性(2017年9⽉)1、接⼝⽅法可以使⽤private来修饰2、设置G1为JVM默认垃圾收集器3、⽀持http2.0和websocket的API重要特性:主要是API的优化,如⽀持HTTP2的Client API、JVM采⽤G1为默认垃圾收集器JDK10新特性(2018年3⽉)1、局部变量类型推断,类似JS可以通过var来修饰局部变量,编译之后会推断出值的真实类型2、并⾏Full GC,来优化G1的延迟3、允许在不执⾏全局VM安全点的情况下执⾏线程回调,可以停⽌单个线程,⽽不需要停⽌所有线程或不停⽌线程重要特性:通过var关键字实现局部变量类型推断,使Java语⾔变成弱类型语⾔、JVM的G1垃圾回收由单线程改成多线程并⾏处理,降低G1的停顿时间JDK11新特性(2018年9⽉)(LTS版本)1、ZGC,ZGC可以看做是G1之上更细粒度的内存管理策略。
由于内存的不断分配回收会产⽣⼤量的内存碎⽚空间,因此需要整理策略防⽌内存空间碎⽚化,在整理期间需要将对于内存引⽤的线程逻辑暂停,这个过程被称为"Stop the world"。
只有当整理完成后,线程逻辑才可以继续运⾏。
JDK与JavaSEEEME的区别
JDK与JavaSEEEME的区别1. Java SE(Java Platform,Standard Edition)。
Java SE 以前称为 J2SE。
它允许开发和部署在桌⾯、服务器、嵌⼊式环境和实时环境中使⽤的 Java 应⽤程序。
Java SE 包含了⽀持 Java Web 服务开发的类,并为 Java Platform,Enterprise Edition(Java EE)提供基础。
Java SE 是做电脑上运⾏的软件。
2. Java EE(Java Platform,Enterprise Edition)。
这个版本以前称为 J2EE。
企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应⽤程序。
Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以⽤来实现企业级的⾯向服务体系结构(service-oriented architecture,SOA)和 Web 2.0 应⽤程序。
Java EE 是⽤来做⽹站的(我们常见的JSP技术)。
3. Java ME(Java Platform,Micro Edition)。
这个版本以前称为 J2ME。
Java ME 为在移动设备和嵌⼊式设备(⽐如⼿机、PDA、电视机顶盒和打印机)上运⾏的应⽤程序提供⼀个健壮且灵活的环境。
Java ME 包括灵活的⽤户界⾯、健壮的安全模型、许多内置的⽹络协议以及对可以动态下载的连⽹和离线应⽤程序的丰富⽀持。
基于 Java ME 规范的应⽤程序只需编写⼀次,就可以⽤于许多设备,⽽且可以利⽤每个设备的本机功能。
Java ME 是做⼿机软件的。
在⼀台电脑上可以同时安装Java SE、Java EE、Java ME,不影响,对应开发需求不⼀样,⽤对应的版本。
JDK与Java SE/EE/ME的区别jdk是不区分se、ee、me的,所以你在oracle的官⽹上只要下载java se对应的版本jdk即可:实际上我们开发web时,就应该选择ee的,⽽J2EE你只需要两个包 jsp-api.jar 和 servlet-api.jar,⽽这两个包是没有官⽅版本的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
@Override
public int hashCode() {
...
}
看上面的例子,如果没有在hashCode中将“C”大写,在编译时不会出现错误,但是在运行时将无法像期望的那样调用该方法。通过添加Override标签,编译器会提示它是否真正地执行了重写。
“隐藏的”静态方法
两个静态方法出现在所有枚举类型声明中。因为它们是枚举子类上的静态方法,而不是Enum本身的方法,所以它们在ng.Enum的javadoc中没有出现。
第一个是values(),返回一个枚举类型所有可能值的数组。
第二个是valueOf(),为提供的字符串返回一个枚举类型,该枚举类型必须精确地匹配源代码声明。
再 sqrt();
相当于你自己类里有这个方法
5 变长参数
int sum(int ...intlist)
{
int sum;
sum=0;
for(int i=0;i<intlist.length;i++)
{
sum+=intlist[i];
}
return sum;
协变返回
协变返回的基本用法是用于在已知一个实现的返回类型比API更具体的时候避免进行类型强制转换。在下面这个例子中,有一个返回Animal对象的Zoo接口。我们的实现返回一个AnimalImpl对象,但是在JDK 1.5之前,要返回一个Animal对象就必须声明。:
public interface Zoo {
Thread.currentThread().stop();
}
这可能是内置注释最有用的地方。遗憾的是,1.5.0_04的javac不支持它。但是1.6支持它,并且Sun正在努力将其向后移植到1.5中。
Eclipse 3.1中支持该注释,其他IDE也可能支持它。这允许您把代码彻底地从警告中解脱出来。如果在编译时出现警告,可以确定是您刚刚把它添加进来——以帮助查看那些可能不安全的代码。随着泛型的添加,它使用起来将更趁手。
if (objects.length > 1) {
Exception e = (Exception)objects[1];
// Do something with the exception
}
}
方法签名应该如下所示,相应的可变参数分别使用String和Exception声明:
public enum DatabaseType {
ORACLE {
public String getJdbcUrl() {...}
},
MYSQL {
public String getJdbcUrl() {...}
};
public abstract String getJdbcUrl();
}
现在枚举类型可以直接提供它的实用方法。例如:
DatabaseType dbType = ...;
String jdbcURL = dbType.getJdbcUrl();
要获取URL,必须预先知道该实用方法在哪里。
可变参数(Vararg)
正确地使用可变参数确实可以清理一些垃圾代码。典型的例子是一个带有可变的String参数个数的log方法:
public Animal getAnimal();
}
public class ZooImpl implements Zoo {
public Animal getAnimal(){
Log.log(String message, Exception e, Object... objects) {...}
不要使用可变参数破坏类型系统。需要强类型化时才可以使用它。对于这个规则,PrintStream.printf()是一个有趣的例外:它提供类型信息作为自己的第一个参数,以便稍后可以接受那些类型。
@Property
private int bar;
}
其思想是为私有字段bar自动创建getter和setter方法。遗憾的是,这个想法有两个失败之处:1)它不能运行,2)它使代码难以阅读和处理。 它是无法实现的,因为前面已经提到了,Sun特别阻止了对出现注释的类进行修改。
jdk1.4与jdk1.5及jdk1.6的区别
jdk1.5的新特性:
1. 泛型
2 自动装箱/拆箱
3 for-each
4 static import
5 变长参数
1. 泛型 (避免类型强制转换可能引起的运行错误)
例如:
ArrayList list=new ArrayList();
注释不能用做预处理器。Sun的设计特别预防了完全因为注释而修改类的字节码。这样可以正确地理解该语言的成果,而且IDE之类的工具也可以执行深入的代码分析和重构之类的功能。
注释不是银弹。第一次遇到的时候,人们试图尝试各种技巧。请看下面这个从别人那里获得的建议:
public class Foo {
list.add(new Integer(3));
list.add(new Integer(4));
int i=list.get(0).parseInt();
2 自动装箱i=list.get(0);
因为原始类型与对应的包装类不用显式转换
Log.log(String code, String... args)
所有的可变参数都是源兼容的——那就是说,如果重新编译log()方法的所有调用程序,可以直接替换全部的四个方法。然而,如果需要向后的二进制兼容性,那么就需要舍去前三个方法。只有最后那个带一个字符串数组参数的方法等效于可变参数版本,因此可以被可变参数版本替换。
类型强制转换
如果希望调用程序了解应该使用哪种类型的参数,那么应该避免用可变参数进行类型强制转换。看下面这个例子,第一项希望是String,第二项希望是Exception:
Log.log(Object... objects) {
String message = (String)objects[0];
Deprecated
遗憾的是,Deprecated没那么有用。它本来旨在替换@deprecated javadoc标签,但是由于它不包含任何字段,所以也就没有方法来建议deprecated类或方法的用户应该使用什么做为替代品。大多数用法都同时需要javadoc标签和这个注释。
Override
}
有任意个参数,把他看作数组
jdk6.0新特性
增强的for循环语句
为了迭代集合和数组,增强的for循环提供了一个简单、兼容的语法。有两点值得一提:
一、在循环中,初始化表达式只计算一次。int表达式
未增强的For:
int sum = 0;
Integer[] numbers = computeNumbers();
即使是可能的,它也不是一个好主意,因为它使代码可读性差。第一次看到这段代码的人会不知道该注释创建了方法。此外,如果将来您需要在这些方法内部执行一些操作,注释也是没用的。 总之,不要试图用注释去做那些常规代码可以完成的事情。
枚举
enum非常像public static final int声明,后者作为枚举值已经使用了很多年。对int所做的最大也是最明显的改进是类型安全——您不能错误地用枚举的一种类型代替另一种类型,这一点和int不同,所有的int对编译器来说都是一样的。除去极少数例外的情况,通常都应该用enum实例替换全部的枚举风格的int结构。
在超类发生改变的情况中,这也很有帮助。如果向该方法中添加一个新参数,而且方法本身也被重命名了,那么子类将突然不能编译,因为它不再重写超类的任何东西。
其它注释
注释在其他场景中非常有用。当不是直接修改行为而是增强行为时,特别是在添加样板代码的情况下,注释在诸如EJB和Web services这样的框架中运行得非常好。
Suppress Warnings
该注释关闭了类或方法级别的编译器警告。有时候您比编译器更清楚地知道,代码必须使用一个被否决的方法或执行一些无法静态确定是否类型安全的动作,而使用:
@SuppressWarnings("deprecation")
public static void selfDestruct() {
Log.log(String code)
Log.log(String code, String arg)
Log.log(String code, String arg1, String arg2)
Log.log(String code, String[] args)
当讨论可变参数时,比较有趣的是,如果用新的可变参数替换前四个例子,将是兼容的:
for (int i=0; i < numbers.length ; i++)
sum += numbers[i];
增强后的For:
int sum = 0;
for ( int number: computeNumbers() )
sum += number;
局限性
增强的for循环迭代期间不能访问迭代器或下标
方法
关于枚举类型,我们最喜欢的一个方面是它可以有方法。过去您可能需要编写一些代码,对public static final int进行转换,把它从数据库类型转换为JDBC URL。而现在则可以让枚举类型本身带一个整理代码的方法。下面就是一个例子,包括DatabaseType枚举类型的抽象方法以及每个枚举实例中提供的实现: