文章编号:11545时间:2024-10-01人气:
JDK 1.5(Java Development Kit)是 Java 开发环境的重要组件,用于编译、调试和运行 Java 程序。以下是如何从可靠来源下载 JDK 1.5 并确保安全可靠:
从以下权威来源下载 JDK 1.5,确保您获取官方版本并降低安全风险:
完成以下步骤下载和验证 JDK 1.5:
验证 JDK 1.5 安装程序后,按照以下步骤进行安装:
安装完成后,需要配置环境变量以使 JDK 可供系统使用:
%JAVA_HOME%\bin
验证 JDK 1.5 是否已成功安装并配置:
java -version
下载和使用 JDK 时需要注意以下安全注意事项:
通过从可靠来源下载并验证 JDK 1.5,您可以确保获得来自官方发行渠道的安全可靠的版本。通过正确配置环境变量和采取适当的预防措施,您可以确保您的 Java 开发环境安全并随时可用。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。 Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程[1]。 Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点[2]。 Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等[3]。 外文名Java现公司Oracle推出时间1995年5月快速导航编程开发 语言特点 工作原理 语言基础 语言标准 语言规范 技术应用 学习指南 语言评价发展历程20世纪90年代,硬件领域出现了单片式计算机系统,这种价格低廉的系统一出现就立即引起了自动控制领域人员的注意,因为使用它可以大幅度提升消费类电子产品(如电视机顶盒、面包烤箱、移动电话等)的智能化程度。 Sun公司为了抢占市场先机,在1991年成立了一个称为Green的项目小组,帕特里克、詹姆斯·高斯林、麦克·舍林丹和其他几个工程师一起组成的工作小组在加利福尼亚州门洛帕克市沙丘路的一个小工作室里面研究开发新技术,专攻计算机在家电产品上的嵌入式应用。 JAVA由于C++所具有的优势,该项目组的研究人员首先考虑采用C++来编写程序。 但对于硬件资源极其匮乏的单片式系统来说,C++程序过于复杂和庞大。 另外由于消费电子产品所采用的嵌入式处理器芯片的种类繁杂,如何让编写的程序跨平台运行也是个难题。 为了解决困难,他们首先着眼于语言的开发,假设了一种结构简单、符合嵌入式应用需要的硬件平台体系结构并为其制定了相应的规范,其中就定义了这种硬件平台的二进制机器码指令系统(即后来成为“字节码”的指令系统),以待语言开发成功后,能有半导体芯片生产商开发和生产这种硬件平台。 对于新语言的设计,Sun公司研发人员并没有开发一种全新的语言,而是根据嵌入式软件的要求,对C++进行了改造,去除了留在C++的一些不太实用及影响安全的成分,并结合嵌入式系统的实时性要求,开发了一种称为Oak的面向对象语言。 由于在开发Oak语言时,尚且不存在运行字节码的硬件平台,所以为了在开发时可以对这种语言进行实验研究,他们就在已有的硬件和软件平台基础上,按照自己所指定的规范,用软件建设了一个运行平台,整个系统除了比C++更加简单之外,没有什么大的区别。 1992年的夏天,当Oak语言开发成功后,研究者们向硬件生产商进行演示了Green操作系统、Oak的程序设计语言、类库和其硬件,以说服他们使用Oak语言生产硬件芯片,但是,硬件生产商并未对此产生极大的热情。 因为他们认为,在所有人对Oak语言还一无所知的情况下,就生产硬件产品的风险实在太大了,所以Oak语言也就因为缺乏硬件的支持而无法进入市场,从而被搁置了下来。 1994年6、7月间,在经历了一场历时三天的讨论之后,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于万维网。 他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。 作为原型,帕特里克·诺顿写了一个小型万维网浏览器WebRunner。 [4]1995年,互联网的蓬勃发展给了Oak机会。 业界为了使死板、单调的静态网页能够“灵活”起来,急需一种软件技术来开发一种程序,这种程序可以通过网络传播并且能够跨平台运行。 于是,世界各大IT企业为此纷纷投入了大量的人力、物力和财力。 这个时候,Sun公司想起了那个被搁置起来很久的Oak,并且重新审视了那个用软件编写的试验平台,由于它是按照嵌入式系统硬件平台体系结构进行编写的,所以非常小,特别适用于网络上的传输系统,而Oak也是一种精简的语言,程序非常小,适合在网络上传输。 Sun公司首先推出了可以嵌入网页并且可以随同网页在网络上传输的Applet(Applet是一种将小程序嵌入到网页中进行执行的技术),并将Oak更名为Java(在申请注册商标时,发现Oak已经被人使用了,再想了一系列名字之后,最终,使用了提议者在喝一杯Java咖啡时无意提到的Java词语)。 5月23日,Sun公司在Sun world会议上正式发布Java和HotJava浏览器。 IBM、Apple、DEC、Adobe、HP、Oracle、Netscape和微软等各大公司都纷纷停止了自己的相关开发项目,竞相购买了Java使用许可证,并为自己的产品开发了相应的Java平台。 [5] [6]1996年1月,Sun公司发布了Java的第一个开发工具包(JDK 1.0),这是Java发展历程中的重要里程碑,标志着Java成为一种独立的开发工具。 9月,约8.3万个网页应用了Java技术来制作。 10月,Sun公司发布了Java平台的第一个即时(JIT)编译器。 1997年2月,JDK 1.1面世,在随后的3周时间里,达到了22万次的下载量。 4月2日,Java One会议召开,参会者逾一万人,创当时全球同类会议规模之纪录。 9月,Java Developer Connection社区成员超过10万。 1998年12月8日,第二代Java平台的企业版J2EE发布。 1999年6月,Sun公司发布了第二代Java平台(简称为Java2)的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应用于基于Java的应用服务器。 Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着Java的应用开始普及。 1999年4月27日,HotSpot虚拟机发布。 HotSpot虚拟机发布时是作为JDK 1.2的附加程序提供的,后来它成为了JDK 1.3及之后所有版本的Sun JDK的默认虚拟机[7] 。 2000年5月,JDK1.3、JDK1.4和J2SE1.3相继发布,几周后其获得了Apple公司Mac OS X的工业标准的支持。 2001年9月24日,J2EE1.3发布。 2002年2月26日,J2SE1.4发布。 自此Java的计算能力有了大幅提升,与J2SE1.3相比,其多了近62%的类和接口。 在这些新特性当中,还提供了广泛的XML支持、安全套接字(Socket)支持(通过ssl与TLS协议)、全新的I/OAPI、正则表达式、日志与断言。 2004年9月30日,J2SE1.5发布,成为Java语言发展史上的又一里程碑。 为了表示该版本的重要性,J2SE 1.5更名为Java SE 5.0(内部版本号1.5.0),代号为“Tiger”,Tiger包含了从1996年发布1.0版本以来的最重大的更新,其中包括泛型支持、基本类型的自动装箱、改进的循环、枚举类型、格式化I/O及可变参数。 Java创始人之一:詹姆斯·高斯林2005年6月,在Java One大会上,Sun公司发布了Java SE 6。 此时,Java的各种版本已经更名,已取消其中的数字2,如J2EE更名为JavaEE,J2SE更名为JavaSE,J2ME更名为JavaME。 [8]2006年11月13日,Java技术的发明者Sun公司宣布,将Java技术作为免费软件对外发布。 Sun公司正式发布的有关Java平台标准版的第一批源代码,以及Java迷你版的可执行源代码。 从2007年3月起,全世界所有的开发人员均可对Java源代码进行修改[9] 。 2009年,甲骨文公司宣布收购Sun[10] 。 2010年,Java编程语言的共同创始人之一詹姆斯·高斯林从Oracle公司辞职。 2011年,甲骨文公司举行了全球性的活动,以庆祝Java7的推出,随后Java7正式发布。 2014年,甲骨文公司发布了Java8正式版[11] 。 编程开发编程环境Java概念图JDK(Java Development Kit)称为Java开发包或Java开发工具,是一个编写Java的Applet小程序和应用程序的程序开发环境。 JDK是整个Java的核心,包括了Java运行环境(Java Runtime Environment),一些Java工具和Java的核心类库(Java API)。 不论什么Java应用服务器实质都是内置了某个版本的JDK。 主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如,IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK[13] 。 另外,可以把Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE(JAVA Runtime Environment),JRE是支持Java程序运行的标准环境[14] 。 JRE是个运行环境,JDK是个开发环境。 因此写Java程序的时候需要JDK,而运行Java程序的时候就需要JRE。 而JDK里面已经包含了JRE,因此只要安装了JDK,就可以编辑Java程序,也可以正常运行Java程序。 但由于JDK包含了许多与运行无关的内容,占用的空间较大,因此运行普通的Java程序无须安装JDK,而只需要安装JRE即可[15] 。 编程工具Eclipse:一个开放源代码的、基于Java的可扩展开发平台[16] 。 NetBeans:开放源码的Java集成开发环境,适用于各种客户机和Web应用。 IntelliJ IDEA:在代码自动提示、代码分析等方面的具有很好的功能。 [17]MyEclipse:由Genuitec公司开发的一款商业化软件,是应用比较广泛的Java应用程序集成开发环境[18] 。 EditPlus:如果正确配置Java的编译器“Javac”以及解释器“Java”后,可直接使用EditPlus编译执行Java程序[19] 。 语言特点1.简单性Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。 例如,Java不支持go to语句,代之以提供break和continue语句以及异常处理。 Java还剔除了C++的操作符过载(overload)和多继承特征,并且不使用主文件,免去了预处理程序。 因为Java没有结构,数组和串都是对象,所以不需要指针。 Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。 2.面向对象Java是一个面向对象的语言。 对程序员来说,这意味着要注意应中的数据和操纵数据的方法(method),而不是严格地用过程来思考。 在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。 数据和方法一起描述对象(object)的状态和行为。 每一对象是其状态和行为的封装。 类是按一定体系和层次安排的,使得子类可以从超类继承行为。 在这个类层次体系中有一个根类,它是具有一般行为的类。 Java程序是用类来组织的。 Java还包括一个类的扩展集合,分别组成各种程序包(Package),用户可以在自己的程序中使用。 例如,Java提供产生图形用户接口部件的类(包),这里awt是抽象窗口工具集(abstract windowing toolkit)的缩写,处理输入输出的类(包)和支持网络功能的类(包)。 3.分布性Java设计成支持在网络上应用,它是分布式语言。 Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。 网络变成软件应用的分布运载工具。 Java程序只要编写一次,就可到处运行。 4.编译和解释性Java编译程序生成字节码(byte-code),而不是通常的机器码。 Java字节码提供对体系结构中性的目标文件格式,代码设计成可有效地传送程序到多个平台。 Java程序可以在任何实现了Java解释程序和运行系统(run-time system)的系统上运行。 在一个解释性的环境中,程序开发的标准“链接”阶段大大消失了。 如果说Java还有一个链接阶段,它只是把新类装进环境的过程,它是增量式的、轻量级的过程。 因此,Java支持快速原型和容易试验,它将导致快速程序开发。 这是一个与传统的、耗时的“编译、链接和测试”形成鲜明对比的精巧的开发过程。 5.稳健性Java原来是用作编写消费类家用电子产品软件的语言,所以它是被设计成写高可靠和稳健软件的。 Java消除了某些编程错误,使得用它写可靠软件相当容易。 JavaJava是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。 Java要求显式的方法声明,它不支持C风格的隐式声明。 这些严格的要求保证编译程序能捕捉调用错误,这就导致更可靠的程序。 可靠性方面最重要的增强之一是Java的存储模型。 Java不支持指针,它消除重写存储和讹误数据的可能性。 类似地,Java自动的“无用单元收集”预防存储漏泄和其它有关动态存储分配和解除分配的有害错误。 Java解释程序也执行许多运行时的检查,诸如验证所有数组和串访问是否在界限之内。 异常处理是Java中使得程序更稳健的另一个特征。 异常是某种类似于错误的异常条件出现的信号。 使用try/catch/finally语句,程序员可以找到出错的处理代码,这就简化了出错处理和恢复的任务。 6.安全性Java的存储分配模型是它防御恶意代码的主要方法之一。 Java没有指针,所以程序员不能得到隐蔽起来的内幕和伪造指针去指向存储器。 更重要的是,Java编译程序不处理存储安排决策,所以程序员不能通过查看声明去猜测类的实际存储安排。 编译的Java代码中的存储引用在运行时由Java解释程序决定实际存储地址。 Java运行系统使用字节码验证过程来保证装载到网络上的代码不违背任何Java语言限制。 这个安全机制部分包括类如何从网上装载。 例如,装载的类是放在分开的名字空间而不是局部类,预防恶意的小应用程序用它自己的版本来代替标准Java类。 7.可移植性Java使得语言声明不依赖于实现的方面。 例如,Java显式说明每个基本数据类型的大小和它的运算行为(这些数据类型由Java语法描述)。 Java环境本身对新的硬件平台和操作系统是可移植的。 Java编译程序也用Java编写,而Java运行系统用ANSIC语言编写。 8.高性能Java是一种先编译后解释的语言,所以它不如全编译性语言快。 但是有些情况下性能是很要紧的,为了支持这些情况,Java设计者制作了“及时”编译程序,它能在运行时把Java字节码翻译成特定CPU(中央处理器)的机器代码,也就是实现全编译了。 Java字节码格式设计时考虑到这些“及时”编译程序的需要,所以生成机器代码的过程相当简单,它能产生相当好的代码。 9.多线程性Java是多线程语言,它提供支持多线程的执行(也称为轻便过程),能处理不同任务,使具有线索的程序设计很容易。 Java的lang包提供一个Thread类,它支持开始线索、运行线索、停止线索和检查线索状态的方法。 Java的线索支持也包括一组同步原语。 这些原语是基于监督程序和条件变量风范,由开发的广泛使用的同步化方案。 用关键词synchronized,程序员可以说明某些方法在一个类中不能并发地运行。 这些方法在监督程序控制之下,确保变量维持在一个一致的状态。 10.动态性Java语言设计成适应于变化的环境,它是一个动态的语言。 例如,Java中的类是根据需要载入的,甚至有些是通过网络获取的。 [20]工作原理由四方面组成:工作原理(1)Java编程语言(2)Java类文件格式(3)Java虚拟机(4)Java应用程序接口[21]当编辑并运行一个Java程序时,需要同时涉及到这四种方面。 使用文字编辑软件(例如记事本、写字板、UltraEdit等)或集成开发环境(Eclipse、MyEclipse等)在Java源文件中定义不同的类[22] ,通过调用类(这些类实现了Java API)中的方法来访问资源系统,把源文件编译生成一种二进制中间码,存储在class文件中,然后再通过运行与操作系统平台环境相对应的Java虚拟机来运行class文件,执行编译产生的字节码,调用class文件中实现的方法来满足程序的Java API调用[6] 。 语言基础基本数据结构在Java中有8种数据类型来存储数值、字符和布尔值。 整数类型整数型用来存储整数数值,即没有小数部分的数值。 可以是正数,也可以是负数。 整数数据在Java程序中有3种表示形式,分别为十进制、八进制和十六进制。 整型数据根据它所占内容大小的不同可分为4种类型。 数据类型内存byte8位short16位int32位展开全部浮点类型数据类型内存float32位double64位字符类型字符类型用于存储单个字符,占用16位(两个字节)的内存空间。 在定义字符型变量时,要以单引号表示。 使用char关键字可定义字符变量。 数据类型内存char16位布尔类型布尔类型又称逻辑类型,通过关键字boolean来定义布尔类型变量,只有只有true和False两个取值,分别代表布尔逻辑中的“真”和“假”。 布尔类型通常被用在流程控制中作为判断条件。 关键字关键字含义abstract抽象类或方法assert用来查找内部程序错误break跳出一个switch或循环展开全部关键字参考资料来源[23]运算符运算符是一些特殊的符号,主要用于数学函数、一些类型的赋值语句和逻辑比较方面。 赋值运算符赋值运算符以符号“=”表示,它是一个二元运算符(对两个操作数作处理),其功能是将右方操作数所含的值赋给左方的操作数。 例如:int a = 100;算术运算符运算符说明+加-减*乘展开全部自增和自减运算符自增和自减是单目运算符,可以放在操作元之前,也可以放在操作元之后。 操作元必须是一个整型或浮点型变量。 自增、自减运算符的作用是使变量的值增1或减1。 放在操作元前面的自增、自减运算符,会先将变量的值加1或减1,然后再使该变量参与表达式的运算。 放在操作元后面的自增、自减运算符,会先使变量参与表达式的运算,然后再将该变量的值加1或减1。 例如:假设a=5b=++a;//先将a的值加1,然后赋值给b,此时a的值为6,b的值为6b=a++;//先将a的值赋值给b,再将a的值变为6,此时a的值为6,b的值为5比较运算符比较运算符属于二元运算符,用于程序中的变量之间,变量和自变量之间以及其他类型的信息之间的比较。 比较运算符的运算结果是boolean型。 当运算符对应的关系成立时,运算的结果为true,否则为false。 比较运算符共有6个,通常作为判断的依据用于条件语句中。 运算符说明>比较左方是否大于右方<比较左方是否小于右方==比较左方是否等于右方展开全部逻辑运算符运算符作用&&逻辑与||逻辑或!逻辑非语言基础参考资料来源[24]程序举例/*一个简单的Java应用程序,显示内容:Hello World!文件名为Hello.java*/class Hello{//程序开始于main()public static void main(String args[]){(Hello World!);} }main方法,正如注释所说,这是程序开始执行的第一行。 对于一个Java应用程序来说,main方法是必需的,Java解释器在没有生成任何对象的情况下,以main作为入口来执行程序。 每个类中可以定义多个方法,但main方法只能有一个。 关键字public表示访问权限,指明所有的类都可以使用这一方法。 本例中,main必须被定义为public类型,因为当程序开始执行时它需要被它的类之外的代码调用。 关键字static指明该方法是一个类方法。 关键字void指明main()方法不返回任何值。 main方法圆括号中定义的String args[]是传送给main方法的参数,参数名为args,它是类String的一个对象。 方法的参数用“类名参数名”来指定,多个参数间用逗号分隔。 该行的最后一个字符是“{”,它表示了main程序体的开始,一个方法中包含的所有代码都将包括在这对花括号中间。 另外,main仅是解释器开始工作的地方,一个复杂的程序可能包含几十个类,但这些类仅需要一个main方法。 [25]语言标准1997年11月17日,国际标准化组织(ISO)同意采纳Sun公司的专利技术——Java作为ISO标准。 JAVA作为一个技术标准供公众无偿使用。 根据ISO的批准,Sun公司将可提交JAVA的标准化平台规范。 [26]发布时间名称2000年11月15日ISO/TS -27年5月15日ISO/IEC -2年7月15日ISO/IEC TR -6:2014展开全部语言标准参考资料[27] [28] [29] [30] [31]语言规范JCP(Java Community Process)是一个开放的国际组织,主要由Java开发者以及被授权者组成,职能是发展和更新Java技术规范、参考实现(RI)、技术兼容包(TCK)。 JCP维护的规范包括Java ME、Java SE、Java EE、XML、OSS、JAIN等。 组织成员可以提交JSR(Java Specification Requests),通过特定程序以后,进入到下一版本的规范里面。 JSR是早期提议和最终发布的Java平台规范的具体描述。 通常,一个新的JSR的提出是为了增加或者规范Java平台的功能。 某个具体的JSR由专家组共同来制定,工作由组长协调。 例如,CLDC1.0(Connected Limited Device Configuration,JSR30)由Sun公司的Antero Taivalsaari担任组长,同时专家组的成员还包括Siemens、Motorola、Nokia、Symbian等。 Java ME平台规范是在JSR68中定义的,规范组长是Sun公司的Jon Courtney。 JSR完成后,相关的规范及JavaAPI会在JCP的官方网站发布。 设备制造商可以在自己的产品中实现某个JSR,如MIDP2.0(JSRll8)。 但是这些都必须要通过TCK(Technology Compatibility Kit)测试以确保技术兼容性。 [32]按照技术类别可以分成以下几类:1、J2EE平台规范[33]2、J2SE平台规范[34]3、J2ME平台规范[35]4、运营支持系统规范(OSS)[36]5、综合网络的Java 应用(JAIN)[37]6、XML 操作规范[38]技术应用1、Android应用许多的 Android应用都是Java程序员开发者开发。 虽然 Android运用了不同的JVM以及不同的封装方式,但是代码还是用Java语言所编写。 相当一部分的手机中都支持JAVA游戏,这就使很多非编程人员都认识了JAVA。 2、在金融业应用的服务器程序Java在金融服务业的应用非常广泛,很多第三方交易系统、银行、金融机构都选择用Java开发,因为相对而言,Java较安全[39] 。 大型跨国投资银行用Java来编写前台和后台的电子交易系统,结算和确认系统,数据处理项目以及其他项目。 大多数情况下,Java被用在服务器端开发,但多数没有任何前端,它们通常是从一个服务器(上一级)接收数据,处理后发向另一个处理系统(下一级处理)。 3、网站Java 在电子商务领域以及网站开发领域占据了一定的席位。 开发人员可以运用许多不同的框架来创建web项目,SpringMVC,Struts2.0以及frameworks。 即使是简单的 servlet,jsp和以struts为基础的网站在政府项目中也经常被用到。 例如医疗救护、保险、教育、国防以及其他的不同部门网站都是以Java为基础来开发的。 4、嵌入式领域Java在嵌入式领域发展空间很大。 在这个平台上,只需130KB就能够使用Java技术(在智能卡或者传感器上)。 5、大数据技术Hadoop以及其他大数据处理技术很多都是用Java,例如Apache的基于Java的HBase和Accumulo以及 ElasticSearchas。 6、高频交易的空间Java平台提高了这个平台的特性和即使编译,他同时也能够像 C++ 一样传递数据。 正是由于这个原因,Java成为的程序员编写交易平台的语言,因为虽然性能不比C++,但开发人员可以避开安全性,可移植性和可维护性等问题。 7、科学应用Java在科学应用中是很好选择,包括自然语言处理。 最主要的原因是因为Java比C++或者其他语言相对其安全性、便携性、可维护性以及其他高级语言的并发性更好。 Java语言好学难精,配置东西比较复杂
Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言,应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。 由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。 随着1990年代互联网的发展,Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。 Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
Java编程语言的风格十分接近C++语言。 继承了C++语言面向对象技术的核心,Java舍弃了C++语言中容易引起错误的指针,改以引用取代,同时移除原C++与原来运算符重载,也移除多重继承特性,改用接口取代,增加垃圾回收器功能。 在JavaSE1.5版本中引入了泛型编程、类型安全的枚举、不定长参数和自动装/拆箱特性。 太阳微系统对Java语言的解释是:“Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言”
Java不同于一般的编译语言或直译语言。 它首先将源代码编译成字节码,然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编写,到处运行”的跨平台特性。 在早期JVM中,这在一定程度上降低了Java程序的运行效率。 但在J2SE1.4.2发布后,Java的运行速度有了大幅提升。
与传统类型不同,Sun公司在推出Java时就将其作为开放的技术。 全球数以万计的Java开发公司被要求所设计的Java软件必须相互兼容。 “Java语言靠群体的力量而非公司的力量”是Sun公司的口号之一,并获得了广大软件开发商的认同。 这与微软公司所倡导的注重精英和封闭式的模式完全不同,此外,微软公司后来推出了与之竞争的平台以及模仿Java的C#语言。 后来Sun公司被甲骨文公司并购,Java也随之成为甲骨文公司的产品。
现时,移动操作系统Android大部分的代码采用Java编程语言编程。
早期的Java
Java的发明人詹姆斯·高斯林
Duke,Java语言的吉祥物
语言最开始只是Sun计算机(SunMicroSystems)公司在1990年12月开始研究的一个内部项目。 Sun计算机公司的一个叫做帕特里克·诺顿的工程师被公司自己开发的C++和C语言编译器搞得焦头烂额,因为其中的API极其难用。 帕特里克决定改用NeXT,同时他也获得了研究公司的一个叫做“Stealth计划”的项目的机会。
“Stealth计划”后来改名为“Green计划”,詹姆斯·高斯林和麦克·舍林丹也加入了帕特里克的工作小组。 他们和其他几个工程师一起在加利福尼亚州门罗帕克市沙丘路的一个小工作室里面研究开发新技术,瞄准下一代智能家电(如微波炉)的程序设计,Sun公司预料未来科技将在家用电器领域大显身手。 团队最初考虑使用C++语言,但是很多成员包括Sun的首席科学家比尔·乔伊,发现C++和可用的API在某些方面存在很大问题。
工作小组使用的是嵌入式系统,可以用的资源极其有限。 很多成员发现C++太复杂以至很多开发者经常错误使用。 他们发现C++缺少垃圾回收系统,还有可移植的安全性、分布程序设计、和多线程功能。 最后,他们想要一种易于移植到各种设备上的平台。
根据可用的资金,乔伊决定开发一种集C语言和Mesa语言大成的新语言,在一份报告上,乔伊把它叫做“未来”,他提议Sun公司的工程师应该在C++的基础上,开发一种面向对象的环境。 最初,高斯林试图修改和扩展C++的功能,他自己称这种新语言为C++++--,但是后来他放弃了。 他将要创造出一种全新的语言,被他命名为“Oak”(橡树),以他的办公室外的橡树命名。
就像很多开发新技术的秘密工程一样,工作小组没日没夜地工作到了1993年的夏天,他们能够演示新平台的一部分了,包括Green操作系统,Oak的程序设计语言,类库及其硬件。 最初的尝试是面向一种类PDA设备,被命名为Star7,这种设备有鲜艳的图形界面和被称为“Duke”的智能代理来帮助用户。 1992年12月3日,这台设备进行了展示。
同年11月,Green计划被转化成了“FirstPerson有限公司”,一个Sun公司的全资子公司,团队也被重新安排到了帕洛阿尔托。 FirstPerson团队对建造一种高度交互的设备感兴趣,当时代华纳发布了一个关于电视机顶盒的征求提议书时(Requestforproposal),FirstPerson改变了他们的目标,作为对征求意见书的响应,提出了一个机顶盒平台的提议。 但是有线电视业界觉得FirstPerson的平台给予用户过多的控制权,因此FirstPerson的投标败给了SGI。 与3DO公司的另外一笔关于机顶盒的交易也没有成功,由于他们的平台不能在电视工业产生任何效益,公司被并回Sun公司。
Java和互联网
1994年6月,在经历了一场历时三天的脑力激荡的讨论后,约翰·盖吉、詹姆斯·高斯林、比尔·乔伊、帕特里克·诺顿、韦恩·罗斯因和埃里克·斯库米,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于万维网。 他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。 作为原型,帕特里克·诺顿写了一个小型万维网浏览器,WebRunner,后来改名为HotJava[12]。
1994年10月,HotJava和Java平台为公司高层进行演示。1994年,Java
1.0a版本已经可以提供下载,但是Java和HotJava浏览器的第一次公开发布却是在1995年3月23日SunWorld大会上进行的。 升阳公司的科学指导约翰·盖吉宣告Java技术。 这个发布是与网景公司的执行副总裁马克·安德森的惊人发布一起进行的,宣布网景将在其浏览器中包含对Java的支持。 1996年1月,升阳公司成立了Java业务集团,专门开发Java技术。
Java和“Java”
由于商标搜索显示,Oak已被一家显示卡制造商注册。 于是同年,Oak被改名为Java。 当使用十六进制编辑器打开由Java源代码编译出的二进制文件(文件)的话,最前面的32位将显示为CAFEBABE,即词组“CAFEBABE”(咖啡屋宝贝)。
Java近况
一套Java编辑器软件
J2SE环境与CDC的关连
JVM的所在角色
JSPX网页的概念
在流行几年之后,Java在浏览器中的地位被逐步侵蚀。 它在简单交互性动画方面的用途已经完全被Adobe公司的Flash排挤,2005年Java倾向只被用于雅虎游戏那样的更为复杂的应用程序。 Java同时遭受到来自微软的反对,他们决定在新版本的InternetExplorer和Windows中不再附带Java平台。
与此相反。 在万维网的服务器端和手持设备上,Java变得更加流行。 很多网站在后端使用JSP和其他的Java技术。
在桌面系统上,独立的Java程序还是相对少见,这是因为Java平台的运行开销较大,而许多人的电脑上没有安装Java,由于网络带宽在以前较小,下载Java曾经是个耗时的事情。但是随着计算机计算能力、网络带宽在10年中获取了很大的进步,同时虚拟机和编译器的质量得到了提高,许多应用程序得到了广泛的使用,包括:
开源软件:
NetBeans和Eclipse等软件开发工具
Android操作系统
AzureusBitTorrent客户端。
JNode操作系统
Apache软件基金会的Ant、Derby、Hadoop、Jakarta、POI和Tomcat
JBoss和GlassFish应用服务器
商业软件:
EIOffice(永中Office)
纯Java3D游戏合金战士Chrome
IBMWebsphere、ColdFusion和WebLogic
IntelliJIDEA
还有许多用Java写的软件,可以在找到。在以下网页可以看到非常多用Java写的程序:下面有大量用JavaSwing开发的桌面Java程序目前Java提供以下三个版本:
JavaPlatform,EnterpriseEdition(JavaEE:Java平台企业版)
JavaPlatform,StandardEdition(JavaSE:Java平台标准版)
JavaPlatform,MicroEdition(JavaME:Java平台微型版)
JavaPlatform,CardEdition
Java开放源代码项目
2006年SUN在JavaOne公布Java开放源代码项目,并推出OpenJDK项目。 [13]Java虚拟机、Java编译器和Java类库以GNU通用公共许可证公开。
版本历史
主条目:Java版本历史
1995年5月23日,Java语言诞生
1996年1月,第一个JDK-JDK1.0诞生
1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术
1996年9月,约8.3万个网页应用了JAVA技术来制作
1997年2月18日,JDK1.1发布
1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录
1997年9月,JavaDeveloperConnection社区成员超过十万
1998年2月,JDK1.1被下载超过2,000,000次
1998年12月8日,JAVA2企业平台J2EE发布
1999年6月,SUN公司发布Java的三个版本:标准版(J2SE)、企业版(J2EE)和微型版(J2ME)
2000年5月8日,JDK1.3发布
2000年5月29日,JDK1.4发布
2001年6月5日,NOKIA宣布,到2003年将出售1亿部支持Java的手机
2001年9月24日,J2EE1.3发布
2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升
2004年9月30日18:00PM,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为JavaSE5.0
2005年6月,JavaOne大会召开,SUN公司公开JavaSE6。此时,Java的各种版本已经更名,以取消其中的数字“2”:J2EE更名为JavaEE,J2SE更名为JavaSE,J2ME更名为JavaME
2006年12月,SUN公司发布JRE6.0
2009年12月,SUN公司发布JavaEE6
2010年11月,由于Oracle公司对于Java社区的不友善,因此Apache扬言将退出JCP[14]
2011年7月28日,Oracle公司发布JavaSE7
2014年3月18日,Oracle公司发表JavaSE8
语言特性
Java之所以被开发,是要达到以下五个目的:
应当使用面向对象程序设计方法学
应当允许同一程序在不同的计算机平台执行
应当包括内建的对计算机网络的支持
应当被设计成安全地执行远端代码
应当易于使用,并借鉴以前那些面向对象语言(如C++)的长处。
Java技术主要分成几个部分:Java语言、Java运行环境、类库。 一般情况下说Java时并不区分指的是哪个部分。
Java在1.5版本时,做了重大改变,Sun公司并1.5版本重命名为Java5.0。
面向对象
Java的特点之一就是面向对象,是程序设计方法的一种。 “面向对象程序设计语言”的核心之一就是开发者在设计软件的时候可以使用自定义的类型和关联操作。 代码和数据的实际集合体叫做“对象”。 一个对象可以想象成绑定了很多“行为(代码)”和“状态(数据)”的物体。 对于数据结构的改变需要和代码进行通信然后操作,反之亦然。 面向对象设计让大型软件工程的计划和设计变得更容易管理,能增强工程的健康度,减少失败工程的数量。
跨平台性
Java语言的第二个特性就是跨平台性,也就是说使用Java语言编写的程序可以在编译后不用经过任何更改,就能在任何硬件设备条件下运行。 这个特性经常被称为“一次编译,到处运行”。
执行Java应用程序必须安装爪哇运行环境(JavaRuntimeEnvironment,JRE),JRE内部有一个Java虚拟机(JavaVirtualMachine,JVM)以及一些标准的类库(ClassLibrary)。 通过JVM才能在电脑系统执行Java应用程序(JavaApplication),这与的情况一样,所以电脑上没有安装JVM,那么这些程序将不能够执行。
实现跨平台性的方法是大多数编译器在进行Java语言程序的编码时候会生成一个用字节码写成的“半成品”,这个“半成品”会在Java虚拟机(解释层)的帮助下运行,虚拟机会把它转换成当前所处硬件平台的原始代码。 之后,Java虚拟机会打开标准库,进行数据(图片、线程和网络)的访问工作。 主要注意的是,尽管已经存在一个进行代码翻译的解释层,有些时候Java的字节码代码还是会被JIT编译器进行二次编译。
有些编译器,比如GCJ,可以自动生成原始代码而不需要解释层。 但是这些编译器所生成的代码只能应用于特定平台。 并且GCJ目前只支持部分的JavaAPI。
甲骨文公司对于Java的许可是“全兼容的”,这也导致了微软和升阳关于微软的程序不支持RMI和JNI接口、并且增加特性为己所用的法律争端。 升阳最终赢得了官司,获得了大约两千万美元的赔偿,法院强制要求微软执行升阳公司关于Java的许可要求。 作为回应,微软不再在Windows系统中捆绑Java,最新的Windows版本,WindowsVista和InternetExplorer7.0版本也不再提供对于Java应用程序和控件的支持。 但是升阳公司和其他使用Java运行时系统的公司在Windows操作系统下对用户提供无偿的第三方插件和程序支持。
Java语言使用解释层最初是为了轻巧性。 所以这些程序的运行效率比C语言和C++要低很多,用户也对此颇有微词。 很多最近的调查显示Java的程序运行速度比几年前要高出许多,有些同样功能的程序的效率甚至超过了C++和C语言编写的程序[来源请求]。
Java语言在最开始应用的时候是没有解释层的,所有需要编译的代码都直接转换成机器的原始代码。 这样做的后果就是获得了最佳的性能,但是程序臃肿异常。 从JIT技术开始,Java的程序都经过一次转换之后才变成机器码。 很多老牌的第三方虚拟机都使用一种叫做“动态编译”的技术,也就是说虚拟机实时监测和分析程序的运行行为,同时选择性地对程序所需要的部分进行编译和优化。 所有这些技术都改善了代码的运行速度,但是又不会让程序的体积变得失常。
程序的轻便性事实上是软件编写很难达到的一个目标,Java虽然成功地实现了“一次编译,到处运行”,但是由于平台和平台之间的差异,所编写的程序在转换代码的时候难免会出现微小的、不可察觉的错误和意外。 有些程序员对此非常头疼,他们嘲笑Java的程序不是“一次编译,到处运行”,而是“一次编译,到处调试”。 以Java
AWT为例,早期Java
AWT内提供的按钮、文字区等均是以计算机系统所默认的样式而显示。这令Java程序在有些没有提供图案的计算机系统产生错误(在Microsoft
Windows设有窗口管理器,在一些Linuxdistribution则没有)。后来SUN公司针对JavaAWT一些问题而推出Java
平台无关性让Java在服务器端软件领域非常成功。 很多服务器端软件都使用Java或相关技术建立。
自动垃圾回收(GarbageCollection)
C++语言被用户诟病的原因之一是大多数C++编译器不支持垃圾收集机制。 通常使用C++编程的时候,程序员于程序中初始化对象时,会在主机内存堆栈上分配一块内存与地址,当不需要此对象时,进行析构或者删除的时候再释放分配的内存地址。 如果对象是在堆栈上分配的,而程序员又忘记进行删除,那么就会造成内存泄漏(Memory
Leak)。 长此以往,程序运行的时候可能会生成很多不清除的垃圾,浪费了不必要的内存空间。 而且如果同一内存地址被删除两次的话,程序会变得不稳定,甚至崩溃。 因此有经验的C++程序员都会在删除之后将指针重置为NULL,然后在删除之前先判断指针是否为NULL。
C++中也可以使用“智能指针”(SmartPointer)或者使用C++托管扩展编译器的方法来实现自动化内存释放,智能指针可以在标准类库中找到,而C++
托管扩展被微软的Visual
7.0及以上版本所支持。 智能指针的优点是不需引入缓慢的垃圾收集机制,而且可以不考虑线程安全的问题,但是缺点是如果不善使用智能指针的话,性能有可能不如垃圾收集机制,而且不断地分配和释放内存可能造成内存碎片,需要手动对堆进行压缩。 除此之外,由于智能指针是一个基于模板的功能,所以没有经验的程序员在需要使用多态特性进行自动清理时也可能束手无策。
Java语言则不同,上述的情况被自动垃圾收集功能自动处理。 对象的创建和放置都是在内存堆栈上面进行的。 当一个对象没有任何引用的时候,Java的自动垃圾收集机制就发挥作用,自动删除这个对象所占用的空间,释放内存以避免内存泄漏。
注意程序员不需要修改finalize方法,自动垃圾收集也会发生作用。 但是内存泄漏并不是就此避免了,当程序员疏忽大意地忘记解除一个对象不应该有的引用时,内存泄漏仍然不可避免。
IBM有一篇有关Java内存回收机制比不激活垃圾收集机制的C++内存处理快数倍的技术文章[15],而著名的Java技术书籍《Java编程思想》(ThinkinginJava)也有一段论述Java内存及性能达到甚至超过C++的章节[16]。
基本语法
编写Java程序前应注意以下几点:
大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。
类名:对于所有的类来说,类名的首字母应该大写。 如果类名由若干单词组成,那么每个单词的首字母应该大写,例如MyFirstJavaClass。
方法名:所有的方法名都应该以小写字母开头。 如果方法名含有若干单词,则后面的每个单词首字母大写,例如myFirstJavaMethod。
源文件名:源文件名必须和类名相同。 当保存文件的时候,你应该使用类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为。 (如果文件名和类名不相同则会导致编译错误)。
主方法入口:所有的Java程序由publicstaticvoidmain(String[]args)方法开始执行。
Java关键字
关键字下面列出了Java关键字。 这些关键字不能用于常量、变量、和任何标识符的名称。
关键字
描述
抽象方法,抽象类的修饰符
断言条件是否满足
不执行循环体剩余部分
switch语句中的默认分支
循环语句,循环体至少会执行一次
64-bit双精度浮点数
if条件不成立时执行的分支
枚举类型
表示一个类是另一个类的子类
表示定义常量
无论有没有异常发生都执行代码
32-bit单精度浮点数
for循环语句
用于流程跳转(不可用,意即不可随意跳转)
条件语句
implements
表示一个类实现了接口
导入类
instanceof
测试一个对象是否是某个类的实例
32位整型数
接口,一种抽象的类型,仅有方法和常量的定义
64位整型数
表示方法用非java代码实现
分配新的类实例
一系列相关类组成一个包
表示私有字段,或者方法等,只能从类内部访问
表示保护类型字段
表示共有属性或者方法
方法返回值
16位数字
表示在类级别定义,所有实例共享的
浮点数比较使用严格的规则
表示基类
选择语句
synchronized
表示同一时间只能由一个线程访问的代码块
调用当前实例或者调用另一个构造函数
抛出异常
定义方法可能抛出的异常
修饰不要序列化的字段
表示代码块要做异常处理
标记方法不返回任何值
标记字段可能会被多个线程同时访问,而不做同步
while循环
注释
注释作用:标识程序是干什么的,以及它是如何构建的。 注释帮助程序员进行相互沟通以及理解程序。 注释不是程序设计语言,所以编译器编译程序时忽略它们。
接口和类别
Java自带了创建接口的类别,可以这样使用:
publicinterfaceDeleteable{
voiddelete();
这段代码的意思是任何实现(implement)Deleteable接口的类别都必须实现delete()方法。 每个类别对这个方法的实现可以自行定制。 由此概念可以引出很多种使用方法,下面是一个类别的例子:
通常提到线程安全问题等就有可能听到关线程安全和并发工具的一些片面的观点和结论。 比如“把 HashMap 改为 ConcurrentHashMap,就可以解决并发问题了呀”“要不我们试试无锁的 CopyOnWriteArrayList 吧,性能更好”。 的确,为了方便开发者进行多线程编程,现代编程语言会提供各种并发工具类。 但如果我们没有充分了解它们的使用场景、解决的问题,以及最佳实践的话,盲目使用就可能会导致一些坑,小则损失性能,大则无法确保多线程情况下业务逻辑正确性。
一、线程重用导致用户信息错乱的Bug之前有业务同学和我反馈,在生产上遇到一个诡异的问题,有时获取到的用户信息是别人的。 查看代码后,我发现他使用了ThreadLocal 来缓存获取到的用户信息。 我们知道,ThreadLocal 适用于变量在线程间隔离,而在方法或类间共享的场景。 如果用户信息的获取比较昂贵(比如从数据库查询用户信息),那么在 ThreadLocal 中缓存数据是比较合适的做法。 但,这么做为什么会出现用户信息错乱的 Bug 呢?
使用 Spring Boot 创建一个 Web 应用程序,使用 ThreadLocal 存放一个 Integer 的值,来暂且代表需要在线程中保存的用户信息,这个值初始是 null。 在业务逻辑中,我先从 ThreadLocal 获取一次值,然后把外部传入的参数设置到 ThreadLocal 中,来模拟从当前上下文获取到用户信息的逻辑,随后再获取一次值,最后输出两次获得的值和线程名称。
private static final ThreadLocal按理说,在设置用户信息之前第一次获取的值始终应该是 null,但我们要意识到,程序运行在 Tomcat 中,执行程序的线程是 Tomcat 的工作线程,而 Tomcat 的工作线程是基于线程池的。 顾名思义,线程池会重用固定的几个线程,一旦线程重用,那么很可能首次从 ThreadLocal 获取的值是之前其他用户的请求遗留的值。 这时,ThreadLocal 中的用户信息就是其他用户的信息。
为了更快地重现这个问题,我在配置文件中设置一下 Tomcat 的参数,把工作线程池最大线程数设置为 1,这样始终是同一个线程在处理请求:
随后用户 2 来请求接口,这次就出现了 Bug,第一和第二次获取到用户 ID 分别是 1 和 2,如果是按照正常的来说数的应该是的null和2。 显然第一次获取到了用户 1 的信息,原因就是Tomcat 的线程池重用了线程。 从图中可以看到,两次请求的线程都是同一个线程:http-nio-8080-exec-1。
这个例子告诉我们,在写业务代码时,首先要理解代码会跑在什么线程上:
我们可能会抱怨学多线程没用,因为代码里没有开启使用多线程。 但其实,可能只是我们没有意识到,在 Tomcat 这种 Web 服务器下跑的业务代码,本来就运行在一个多线程环境(否则接口也不可能支持这么高的并发),并不能认为没有显式开启多线程就不会有线程安全问题。
因为线程的创建比较昂贵,所以 Web 服务器往往会使用线程池来处理请求,这就意味着线程会被重用。 这时,使用类似 ThreadLocal 工具来存放一些数据时,需要特别注意在代码运行完后,显式地去清空设置的数据。 如果在代码中使用了自定义的线程池,也同样会遇到这个问题。
理解了这个知识点后,我们修正这段代码的方案是,在代码的 finally 代码块中,显式清除 ThreadLocal 中的数据。 这样一来,新的请求过来即使使用了之前的线程也不会获取到错误的用户信息了。 修正后的代码如下:
@GetMapping(right)public Map right(@RequestParam(userId) Integer userId) {String before= ()() + : + ();(userId);try {String after = ()() + : + ();Map result = new HashMap();(before, before);(after, after);return result;} finally {//在finally代码块中删除ThreadLocal中的数据,确保数据不串();}}重新运行程序可以验证,再也不会出现第一次查询用户信息查询到之前用户请求的 Bug:
ThreadLocal 是利用独占资源的方式,来解决线程安全问题,那如果我们确实需要有资源在线程之间共享,应该怎么办呢?这时,我们可能就需要用到线程安全的容器了。
二、并发工具导致的线程安全问题JDK 1.5 后推出的 ConcurrentHashMap,是一个高性能的线程安全的哈希表容器。 “线程安全”这四个字特别容易让人误解,因为 ConcurrentHashMap 只能保证提供的原子性读写操作是线程安全的。 我在相当多的业务代码中看到过这个误区,比如下面这个场景。 有一个含 900 个元素的 Map,现在再补充 100 个元素进去,这个补充操作由 10 个线程并发进行。 开发人员误以为使用了 ConcurrentHashMap 就不会有线程安全问题,于是不加思索地写出了下面的代码:在每一个线程的代码逻辑中先通过 size 方法拿到当前元素数量,计算 ConcurrentHashMap 目前还需要补充多少元素,并在日志中输出了这个值,然后通过 putAll 方法把缺少的元素添加进去。
//线程个数private static int THREAD_COUNT = 10;//总元素数量private static int ITEM_COUNT = 1000;//帮助方法,用来获得一个指定元素数量模拟数据的ConcurrentHashMapprivate ConcurrentHashMap从日志中可以看到:
初始大小 900 符合预期,还需要填充 100 个元素。
worker1 线程查询到当前需要填充的元素为 36,竟然还不是 100 的倍数。 worker13 线程查询到需要填充的元素数是负的,显然已经过度填充了。 最后 HashMap 的总项目数是 1536,显然不符合填充满 1000 的预期。
针对这个场景,我们可以举一个形象的例子。 ConcurrentHashMap 就像是一个大篮子,现在这个篮子里有 900 个桔子,我们期望把这个篮子装满 1000 个桔子,也就是再装 100 个桔子。 有 10 个工人来干这件事儿,大家先后到岗后会计算还需要补多少个桔子进去,最后把桔子装入篮子。
ConcurrentHashMap 这个篮子本身,可以确保多个工人在装东西进去时,不会相互影响干扰,但无法确保工人 A 看到还需要装 100 个桔子但是还未装的时候,工人 B 就看不到篮子中的桔子数量。 更值得注意的是,你往这个篮子装 100 个桔子的操作不是原子性的,在别人看来可能会有一个瞬间篮子里有 964 个桔子,还需要补 36 个桔子。
回到 ConcurrentHashMap,我们需要注意 ConcurrentHashMap 对外提供的方法或能力的限制:
使用了 ConcurrentHashMap,不代表对它的多个操作之间的状态是一致的,是没有其他线程在操作它的,如果需要确保需要手动加锁。
诸如 size、isEmpty 和 containsValue 等聚合方法,在并发情况下可能会反映 ConcurrentHashMap 的中间状态。 因此在并发情况下,这些方法的返回值只能用作参考,而不能用于流程控制。 显然,利用 size 方法计算差异值,是一个流程控制。 诸如 putAll 这样的聚合方法也不能确保原子性,在 putAll 的过程中去获取数据可能会获取到部分数据。
@GetMapping(right)public String right() throws InterruptedException {ConcurrentHashMap可以看到,只有一个线程查询到了需要补 100 个元素,其他 9 个线程查询到不需要补元素,最后 Map 大小为 1000。 到了这里,你可能又要问了,使用 ConcurrentHashMap 全程加锁,还不如使用普通的 HashMap 呢。
其实不完全是这样。 ConcurrentHashMap 提供了一些原子性的简单复合逻辑方法,用好这些方法就可以发挥其威力。 这就引申出代码中常见的另一个问题:在使用一些类库提供的高级工具类时,开发人员可能还是按照旧的方式去使用这些新类,因为没有使用其特性,所以无法发挥其威力。
三、并发工具的特性,导致性能降低问题我们来看一个使用 Map 来统计 Key 出现次数的场景吧,这个逻辑在业务代码中非常常见。
使用 ConcurrentHashMap 来统计,Key 的范围是 10。
使用最多 10 个并发,循环操作 1000 万次,每次操作累加随机的 Key。
如果 Key 不存在的话,首次设置值为 1。
//循环次数private static int LOOP_COUNT = ;//线程数量private static int THREAD_COUNT = 10;//元素数量private static int ITEM_COUNT = 10;private Map我们吸取之前的教训,直接通过锁的方式锁住 Map,然后做判断、读取现在的累计值、加 1、保存累加后值的逻辑。这段代码在功能上没有问题,但无法充分发挥 ConcurrentHashMap 的威力,改进后的代码如下:
private Map使用 ConcurrentHashMap 的原子性方法 computeIfAbsent 来做复合逻辑操作,判断 Key 是否存在 Value,如果不存在则把 Lambda 表达式运行后的结果放入 Map 作为 Value,也就是新创建一个 LongAdder 对象,最后返回 Value。
由于 computeIfAbsent 方法返回的 Value 是 LongAdder,是一个线程安全的累加器,因此可以直接调用其 increment 方法进行累加。
这样在确保线程安全的情况下达到极致性能,把之前 7 行代码替换为了 1 行。
@GetMapping(good)public String good() throws InterruptedException {StopWatch stopWatch = new StopWatch();(normaluse);Map这段测试代码并无特殊之处,使用 StopWatch 来测试两段代码的性能,最后跟了一个断言判断 Map 中元素的个数以及所有 Value 的和,是否符合预期来校验代码的正确性。测试结果如下:
可以看到,优化后的代码,相比使用锁来操作 ConcurrentHashMap 的方式,性能提升了 10 倍。 你可能会问,computeIfAbsent 为什么如此高效呢?答案就在源码最核心的部分,也就是 Java 自带的 Unsafe 实现的 CAS。 它在虚拟机层面确保了写入数据的原子性,比加锁的效率高得多:
static final像 ConcurrentHashMap 这样的高级并发工具的确提供了一些高级 API,只有充分了解其特性才能最大化其威力,而不能因为其足够高级、酷炫盲目使用。
四、不熟悉并发工具的使用场景,因而导致性能问题除了 ConcurrentHashMap 这样通用的并发工具类之外,我们的工具包中还有些针对特殊场景实现的生面孔。 一般来说,针对通用场景的通用解决方案,在所有场景下性能都还可以,属于“万金油”;而针对特殊场景的特殊实现,会有比通用解决方案更高的性能,但一定要在它针对的场景下使用,否则可能会产生性能问题甚至是 Bug。
之前在排查一个生产性能问题时,我们发现一段简单的非数据库操作的业务逻辑,消耗了超出预期的时间,在修改数据时操作本地缓存比回写数据库慢许多。 查看代码发现,开发同学使用了 CopyOnWriteArrayList 来缓存大量的数据,而数据变化又比较频繁。
CopyOnWrite 是一个时髦的技术,不管是 Linux 还是 Redis 都会用到。 在 Java 中,CopyOnWriteArrayList 虽然是一个线程安全的 ArrayList,但因为其实现方式是,每次修改数据时都会复制一份数据出来,所以有明显的适用场景,即读多写少或者说希望无锁读的场景。
如果我们要使用 CopyOnWriteArrayList,那一定是因为场景需要而不是因为足够酷炫。 如果读写比例均衡或者有大量写操作的话,使用 CopyOnWriteArrayList 的性能会非常糟糕。
我们写一段测试代码,来比较下使用 CopyOnWriteArrayList 和
Java语言跨平台
可以在各大主流操作系统运行:
windows、linux、mac
Java主要特性
简单
面向对象、多线程、可移植
分布式、健壮、安全、高性能
Java程序执行
Java代码编译成字节码文件编译成文件。
具芦袭族体过程为:
Java源代码-语法分析器-语义分析器-字节码生成器-字节码。
把文件放置到JVM(通常指oracle官方自带的HotspotJVM)陪弊。
JVM使用类加载器(ClassLoader)装载文件。
JVM解释禅扒器翻译成机器码-操作系统执行机器码。
windows系统安装java运行环境
下载完成后,点击安装
安装完成后右键点击我的电脑属性
新建环境Java环境变量
CLASSPATH:.;%JAVA_HOME%;%JAVA_HOME%;
找个系统变量中的Path点击编辑,新增
%JAVA_HOME%bin;%JAVA_HOME%jrebin;
点击确定
然后打开cmd键入java-verion查看环境是否ok
如图,恭喜你配置完成。
怎么安装java怎么安装java环境
第一种方法:(自动配置)你可以直接下载MyEclipse6.0或者以上版本(6.0以下的据说不行)来用,这个不用安装环境(自动设置了环境变量)。
直接安装就可以使用了,希望对你有用。 第二种方法(手动配置):windowsxp下配置JDK环境变量:1.安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为D:\java\jdk1.5.0_08;2.安装完成后,右击“我的电脑”,点击“属性”;3.选择“高级”选项卡,点击“环境变量”;4.在“系统变量敏悉”中,设置3项属性,JAVA_HOME,PATH,CLASSPATH(大小写无所谓),若已存在则点击“编辑”,不存在则点击“新建”渣拿神;_HOME指明JDK安装路径,就是刚才安装时所选择的路径D:\java\jdk1.5.0_08,此路径下包括lib,bin,jre等文件夹(此变量最好设置,因为以后运行tomcat,eclipse等都需要依*此变量);Path使得系统可以在任何路径下识别java命令,设为:%JAVA_HOME%\bin;%JAVA_HOME%\jre\binCLASSPATH为java加载类(classorlib)路径,只有类在classpath中,java命令才能识别,设为:.;%JAVA_HOME%\lib\;%JAVA_HOME%\lib\(要加.表示当前路径)%JAVA_HOME%就是引用前面指定的JAVA_HOME;6.“开始”-;“运行”,键入“cmd”;7.键入命令“java-version”,“java”,“javac”几个命令,出现画面,说明环境变量配置成功;8.好了,打完收工。
下面开始你的第一个java程序吧。
怎么下载和安装java
1.安装Java虚拟机1.1.下载JDK用户可以同过如下地址获取JavaJDK开发包/javase/downloads/index_将下载好的JDK解压后,安装在如本机的D:\java\jdk1.5.0_12。
安装路径一定不能为中文文件夹,文件夹名里不能出现空格。 1.2.配置Java环境变量打开我的电脑属性窗口切换到高级标签,点击“环境变量”按钮在系统变量中选择“Path”变量,点击“编辑”按钮,把刚才用户安装的JDK下的bin文件夹路径填入其中。
例如用户把JDK安装在D盘,那么JDK的路径因改为D:\java\jdk1.5.0_12。 那么在变量值里面就应该传入“D:\java\jdk1.5.0_12\bin;D:\java\jre1.5.0_12\bin;”。
接下来配置JAVA_HOME环境变量,点击“系统变量”下的“新建”按钮,如亏输入变量名为“JAVA_HOME”,变量值为“D:\java\jdk1.5.0_12”。 点击“确定”按钮。
最后配置CLASSPATH环境变量,同样点击“系统变量”下的“新建”按钮,输入变量名为“CLASSPATH”,变量值为“.;%JAVA_HOME%\lib\;%JAVA_HOME%\lib\”。
java安装步骤
安装到计算机上。 下来进行一些设置。
首先右键点我的电脑。 打开属性。
然后选择“高级”里面的“环境变量”,在新的打开界面中的系统变量需要设置三个属性“java_home”、“path”、“classpath”,其中在没安装过jdk的环境下。 path属性是本来存在的。
而java_home和classpath是不存在的。 首先点“新建”,然后在变量名写上java_home,顾名其意该变量的含义就是java的安装路径,呵呵,然后在变量值写入刚才安装的路径“C:\jdk1.6”.其次在系统变量里面找到path,然后点编辑,path变量的含义就是系统在任何路径下都可以识别java命令,则变量值为“%java_home%\bin;%java_home%\jre\bin”,(其中“%java_home%”的意思为刚才设置java_home的值),也可以直接写上“C:\jdk1.6\bin”最后再点“新建”,然后在变量名上写classpath,该变量的含义是为java加载类(classorlib)路径,只有类在classpath中,java命令才能识别。
其值为“.;%java_home%\lib;%java_home%\lib\(要加.表示当前路径)”,与相同“%java_home%有相同意思”以上三个变量设置完毕,则按“确定”直至属性窗口消失,下来是验证看看安装是否成功。 先打开“开始”-“运行”,打入“cmd”,进入dos系统界面。
然后打“java-version”,如果安装成功。 系统会显示javaversionjdk1.6.0。
确保安装在C盘文件名为jdk1.6,环境变量直接复制就可以了还有在c盘下保存下面的代码,文件名为的文件。 publicclassMyjava{publicstaticvoidmain(Stringargs[]){(试试看,装好了吗?.);}}进入cmd打c:cd\如果出现试试看,装好了吗?就说明安装好了,可以用了。
java怎么安装
下载后直接安装就好!一直下一步啦!
然后配置环境变量:
在windows桌面上右击“我的电脑”—“属性”—“高级”—“环境变量”,在“系统变量”里我们可以看到系统的各个环境变量的值。 双击某个变量名可以修改变量值,变量值之间用“;”隔开。 我们还可以“新建”原先没有的变量。 与jdk有关的有3个环境变量;“java_home”,“path”,“classpath”。 我的系统中“path”变量已经存在,可以直接添加新值(其它变量值不要动,防止其它程序运行异常),其它两个变量需要新建。
“java_home”,设置jdk的安装路径,比如“e:\java\jdk1.5”,以下简称“%java_home%”。
“path”,设置jdk中各个程序的路径,“%java_home%\bin;%java_home%\jre\bin;”
“classpath”,设置java各个类的路径,“.;%java_home%\lib;%java_home%\lib\”。 前面的“.”不可少,它代表了我们为自己的java类建立的工作路径,其它的是jdk自带的标准类库路径。
设置好环境变量后按“确定”退出。 按“win”+“r”键进入“运行”窗口,运行“cmd”进入DOS窗口,在输入“javac”后回车,如果有显示java的帮助信息,就说明环境变量设置成功。
怎么安装JAVA啊!
您好,亲爱的楼主,很高兴为您回答
java的运行需要虚拟机的支持,但是对于初学者来说,与其说是虚拟机倒不如说是java运行时环境(其中就包括了虚拟机),所谓java运行时环境,也是一个软件及其配置,配置好了java就可以在其中运行了。
这其中相当复杂,我们简化一下问题吧。 简单来说,java的运行安装jdk,这其中包括了两个版本的运行时环境,初学者不需要区分这个。
你要到sun公司的网站去下载并安装这个软件,然后配置环境变量。
重复一下,你弄好这个编程基本环境需要三步:下载jdk;安装jdk;配置环境变量。
我从第一步开始介绍一下。
第一步,下载:到sun的官方网站去下载jdk,网址是/,在右边有populardownload,其下有javaSE的链接,点开,一步一步操作,直到下载成功。
第二步,安装:新手建议按照默认设置安装,什么也不改变,直到安装结束。
第三步:配置环境变量,一共有三个,JAVA_HOME,PATH和CLASSPATH,网上都有详尽的配置方法介绍,可以参照一下。
接下来就可以编写并编译、运行你的java程序了。 这也是三步,编写、编译、运行。 你用记事本进行的那一步是编写,用javac命令进行的这一步是编译,用java命令进行的这一步是运行。
好了,先说这么多吧,这每一步都充满会挑战的,祝你好运。
java安装步骤
链接:
JDK安装方法
选择好安装路径。 安装到计算机上。 下来进行一些设置。 首先右键点我的电脑。 打开属性。 然后选择“高级”里面的“环境变量”,在新的打开界面中的系统变量需要设置三个属性“java_home”、“path”、“classpath”,其中在没安装过jdk的环境下。 path属性是本来存在的。 而java_home和classpath是不存在的。
首先点“新建”,然后在变量名写上java_home,顾名其意该变量的含义就是java的安装路径,呵呵,然后在变量值写入刚才安装的路径“C:\jdk1.6”.
其次在系统变量里面找到path,然后点编辑,path变量的含义就是系统在任何路径下都可以识别java命令,则变量值为“%java_home%\bin;%java_home%\jre\bin”,(其中“%java_home%”的意思为刚才设置java_home的值),也可以直接写上“C:\jdk1.6\bin”
最后再点“新建”,然后在变量名上写classpath,该变量的含义是为java加载类(classorlib)路径,只有类在classpath中,java命令才能识别。其值为“.;%java_home%\lib;%java_home%\lib\(要加.表示当前路径)”,与相同“%java_home%有相同意思”
以上三个变量设置完毕,则按“确定”直至属性窗口消失,下来是验证看看安装是否成功。 先打开“开始”-;“运行”,打入“cmd”,进入dos系统界面。 然后打“java-version”,如果安装成功。 系统会显示javaversionjdk1.6.0。
确保安装在C盘文件名为jdk1.6,环境变量直接复制就可以了
还有在c盘下保存下面的代码,文件名为的文件。
publicclassMyjava{
publicstaticvoidmain(Stringargs[]){
(试试看,装好了吗?.);
进入cmd打
javaMyjava
如果出现试试看,装好了吗?
就说明安装好了,可以用了。
怎么安装java环境
第一种方法:(自动配置)
你可以直接下载MyEclipse6.0或者以上版本(6.0以下的据说不行)来用,这个不用安装环境(自动设置了环境变量)。 直接安装就可以使用了,希望对你有用。
第二种方法(手动配置):
windowsxp下配置JDK环境变量:
1.安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为D:\java\jdk1.5.0_08;
2.安装完成后,右击“我的电脑”,点击“属性”;
3.选择“高级”选项卡,点击“环境变量”;
4.在“系统变量”中,设置3项属性,JAVA_HOME,PATH,CLASSPATH(大小写无所谓),若已存在则点击“编辑”,不存在则点击“新建”;
_HOME指明JDK安装路径,就是刚才安装时所选择的路径D:\java\jdk1.5.0_08,此路径下包括lib,bin,jre等文件夹(此变量最好设置,因为以后运行tomcat,eclipse等都需要依*此变量);
Path使得系统可以在任何路径下识别java命令,设为:
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
CLASSPATH为java加载类(classorlib)路径,只有类在classpath中,java命令才能识别,设为:
.;%JAVA_HOME%\lib\;%JAVA_HOME%\lib\(要加.表示当前路径)
%JAVA_HOME%就是引用前面指定的JAVA_HOME;
6.“开始”-;;“运行”,键入“cmd”;
7.键入命令“java-version”,“java”,“javac”几个命令,出现画面,说明环境变量配置成功;
8.好了,打完收工。 下面开始你的第一个java程序吧。
怎样在手机上安装JAVA游戏
你在你的手机里打开百宝箱,里面有个安装文件,打开后提示是否安装,点安装即可!需要你安装一个SamsungPCStudio3.0。
然后再试试。 如果是D608传JAVA时安装错误的解决方法(J3版本java安装过程):(1)拿出手机,连接数据线,进入JAVA世界,设定里把接入点名称一定要设为“inter不能为空白,用户名、密码都留空,代理服务器设为“无效”(一定要这样设置,否则手机会重新起动;而k4版本则接入点名称、用户名、密码都留空)(2)安装三星JAVA传输免刷机软件和SoftickPPP软件,注册并设置好参数。
(3)然后打开SoftickPPP软件,并击活SoftickPPP。 (4)在手机上先输入指令#*#,开启java下载(输入一次就可以),会出现提示信息:“SerialJAVAothersdisable”。
等几秒后,按C键回到待机画面,然后再输入指令:#*#进入java下载菜单在菜单中选择第一项“PPPUP”(只能选一次,不然也会重起),然后选第二项“USB”这个选项(USB也只可选择一次,这时侯手机重新启动。 {注:k4版本这一步可能不会启动,而接着操作下面就可以了})。
手机重启后,再把SoftickPPP软件关掉,把数据线也从手机里拔掉。 然后再重新操作一次:手机插上数据线--打开SoftickPPP软件--击活SoftickPPP--输入指令:#*#--再输入指令:#*#--PPPUP--USB(如果到这一步还是重启,则再重新操作一次,在操作前先将电脑重启一次,并且拔掉网线,关掉防火墙,不要运行其他的任何程序,再传就OK了)。
注:本人曾经重复试验多次,不按照以上步骤来的话,结果不是手机重新起动就是安装错误。 (5)打开三星JAVA传输免刷机软件!,点击三星JAVA传输免刷机软件的“加入”来载入一个JAVA文件,扩展名为*,点击打开,游戏会出现在JAVA传输免刷机软件的载入清单了。
(6)接着选手机的“串连埠下载”(USB项下面的一项就是串连埠下载)就可以看到进度条,接着就可以正常下载JAVA游戏了。 如果想继续下载的话,再在JAVA传输免刷机软件中加入一个JAVA文件,然后再输入#*#直接选第二项“串连埠下载”(注意:直接选第二项“串连埠下载”,不要再重复选“PPPUP”和“USB”了,如果选的话手机会重启)下载其他JAVA游戏。
(7)传完你想传的JAVA程序后,还要在手机里输入#*#用来关闭serialjava下载,会提示:“WAPSARenableHTTPdisable”。 (如果你没有输入这个指令那么以后你浏览WAP的时候第一次正常,再浏览WAP时就会死机和PIMFileManager软件找不到小D的端口而不能正常使用。
好像J3版本不输入关闭Java指令也没关系,也一样正常运行,不过为了保险,第7步还是做比较妥当)。 哥哥把分给我好么。
怎么安装JAVA
/b/这个网址1.安装JDK这里假设下载后的JDK安装文件名称是jdk-1_5_0_,双击这个文件可以开始程序的安装。
开始的第一步是同意使用条款,接着则开始安装JDK。 在安装JDK时可以选择安装的项目,如图2-3所示,依次是开发工具(DevelopmentTools)、演示程序(Demos)、API源代码(SourceCode)与公用JRE(PublicJRE)。
开发工具是必需的,范例程序可供您日后编写程序时参考,API源代码可以让您了解所使用的API实际上是如何编写的,而JRE则是执行Java程序所必要的,所以这4个项目基本上都必须安装。 图2-3安装JDK的画面要注意的是图2-3下面的“安装到”,应记下JDK安装的位置,默认是C:\ProgramFiles\Java\jdk1.5.0_06\,待会需要使用到这个信息。
如果想改变安装目的地,可以单击“更改”按钮来改变,接着单击“下一步”按钮就开始进行JDK的安装。 完成JDK的安装之后,接着会安装“公用JRE”。
同样地应留意图2-4下方的“安装到”,了解JRE的安装地址,默认是C:\ProgramFiles\Java\jre1.5.0_06\。 单击“下一步”按钮之后,会询问哪些浏览器要使用JavaPlug-In,这让您的浏览器可以执行JavaApplet。
选择要支持JavaPlug-In的浏览器之后,单击“下一步”按钮可以开始安装公用JRE。 图2-4安装JRE的画面2设置Path与Classpath对于习惯图形化接口操作的初学者而言,在命令符模式下执行程序是一件陌生的事,也因此不了解Path路径设置的方法与作用,而Java执行的平台也有自己的一套路径规则来寻找编写好的Java类,也就是所谓的Classpath设置。
本节将介绍如何进行这些相关的设置。 2.1设置Path在安装好JDK程序之后,在JDK安装目录(假设是C:\ProgramFiles\Java\jdk1.5.0_06)下的bin目录中,会提供一些开发Java程序时必备的工具程序。
对于Java的初学者,建议从命令符模式(在Windows2000/XP下称之为命令提示符)下来操作这些工具程序。 您可以在Windows2000/XP的“开始”菜单中选择“运行”,输入“cmd”命令来打开命令符模式。
虽然您知道JDK的工具程序是位于bin目录下,但您的操作系统并不知道如何找到这些工具程序。 所以当您输入javac尝试执行编译程序时,命令符模式下会告诉您找不到javac工具程序,如图2-8所示。
图2-8出现这个信息表示找不到指定的工具程序您必须告诉操作系统,应该到哪些目录下尝试找到您所想使用的工具程序。 有几个方法可以进行这项设置,最简便的方法就是设置系统变量中的Path环境变量。
在Windows2000/XP下可以选择桌面上的“我的电脑”并单击鼠标右键,选择“属性”后切换至“高级”页面,并单击下方的“环境变量”按钮,在“环境变量”对话框中编辑Path变量,如图2-9所示。 图2-9选择Path变量并单击“编辑”按钮以进行路径设置如图2-10所示,在Path变量的“编辑系统变量”对话框中,在“变量值”文本框中先输入一个“;”,接着输入JDKbin目录的路径(这里假设是C:\ProgramFiles\Java\jdk1.5.0_06\bin),然后单击“确定”按钮即可完成设置。
图2-10在Path变量中加入JDK的bin目录路径设置Path变量之后,要重新打开一个命令符模式才能重新读入Path变量内容,接着如果执行javac程序,应该可以看到图2-11所示的画面。 图2-11若设置Path变量成功,就可以找到指定的工具程序也可以在命令符模式下执行以下的命令,直接设置目前的环境变量,包括Path变量(这个设置在下次重新打开命令符模式时就不再有效):setPath=%Path%;C:\ProgramFiles\Java\jdk1.5.0_06\bin由于以上介绍的Path设置都是寻找JDK安装目录下的bin目录,所以操作系统会搜索JDK安装目录下的工具程序。
这样当执行java程序时,默认会使用JDK所附的JRE(即C:\ProgramFiles\Java\jdk1.5.0_06\jre),而不是公用的JRE(即C:\ProgramFiles\Java\jre1.5.0_06\)。 简单地说,操作系统会尝试在指定的Path变量中寻找指定的工具程序。
当输入javac命令时,由于Path变量中有设置JDK的bin目录的路径,操作系统就可以根据这个信息来找到javac工具程序。 2.2设置ClasspathJava执行环境本身就是一个平台,执行于这个平台上的程序是已编译完成的Java程序(后面会介绍到Java程序编译完成之后,会以文件存在)。
如果将Java执行环境比喻为操作系统,如果设置Path变量是为了让操作系统找到指定的工具程序(以Windows来说就是找到文件),则设置Classpath的目的就是让Java执行环境找到指定的Java程序(也就是文件)。 有几个方法可以设置Classpath,最简单的方法是在系统变量中新增Classpath环境变量。
在图2-9中的“系统变量”下单击“新建”按
可能解决的办法:
- 硬核解决服务器安装forge失败 - 啊秋不是啊酋
- 使用“”进行自动修复
- 安装老版Java Runtime Environment(此方法对此类报错有效)
-若是1.12.2Forge请安装Java SE 8
-其他版本请自行查阅
注意事项:一台计算机中可存在不同版本的Java runtime文件。 但系统只会识别“最新”安装的Java runtime文件。 也就是说你不可以在开Forge1.12.2服务器(Java 8)的时候再开1.19.2(Java 18)服务器。 因为全局Java文件不能同时存在两个或多个。 若想要改变计算机的全局Java只有重新使用Java安装文件。 文件来源可以来自“甲骨文”,文件格式可以是或(Windows)。 如果你认为很有必要,则建议下载压缩包(就是解压完之后就是bin文件夹什么的),然后在文件里面设置Java Runtime Environment的执行文件()的绝对路径。
如果不知道如何设置请网络(有条件上谷歌),互联网永远是你最好且最值得信赖的伙伴。
附:Java Development Kit会携带同版本的Java Runtime Environment。 单独安装的Java Runtime Environment会存在于Program Files x86文件夹中。 而Java Development Kit的Java Runtime Environment文件则会存在于Program Files - jdk### 当中。
内容声明:
1、本站收录的内容来源于大数据收集,版权归原网站所有!
2、本站收录的内容若侵害到您的利益,请联系我们进行删除处理!
3、本站不接受违法信息,如您发现违法内容,请联系我们进行举报处理!
4、本文地址:http://www.jujiwang.com/article/9f3126c114b70896cc1f.html,复制请保留版权链接!
在处理大数据时,日志文件对于跟踪和诊断问题至关重要,plot.log是ApacheSpark生态系统中一个强大的工具,它可以帮助我们分析Spark作业的执行情况,从而提升大数据分析的效率,plot.log简介plot.log是一种用于可视化Spark作业执行过程的工具,它能够将Spark作业的各种指标绘制成图表,例如任务运行时间、任务...。
本站公告 2024-09-30 17:35:14
ActivePerl是一种广泛使用的Perl解释器,允许您开发各种应用程序,从Web脚本到系统管理工具,它的一个主要优势是能够与其他编程语言集成,从而让您构建强大的跨平台解决方案,与C,C,集成ActivePerl可以通过Inline,C和XS模块与C,C,集成,Inline,C允许您在Perl脚本中嵌入C代码段,而XS则提供...。
最新资讯 2024-09-29 21:30:57
在ExcelVBA中,错误处理对于编写鲁棒且可靠的代码至关重要,它使您能够处理代码执行期间可能发生的意外情况并向用户提供有意义的信息,本文将探讨ExcelVBA中的常见错误,并提供避免和解决它们的策略,避免常见错误避免错误的最佳方法是了解可能导致它们的常见原因,以下是ExcelVBA中一些最常见的错误类型,类型不匹配,尝试将一种数据类...。
最新资讯 2024-09-26 04:24:26
什么是多线程,多线程是一种计算机编程技术,它允许一个程序同时执行多个任务,线程是指程序执行过程中的一个独立执行单元,通过创建和管理多个线程,程序可以并发执行不同任务,从而提高效率和响应能力,在多线程程序中,每个线程都有自己的栈空间和程序计数器,但它们共享相同的代码段、数据段和其他全局资源,线程之间的通信和同步是通过共享内存、信号量、锁...。
技术教程 2024-09-24 20:11:47
在现代网站设计中,用户体验,UX,是重中之重,直观且友好的界面对于确保用户满意度和参与度至关重要,其中一个关键元素就是使用div滚动条,它可以增强网站的可用性和可访问性,div滚动条的优势控制内容的可视性,div滚动条允许用户根据自己的需要滚动内容,它使他们能够专注于页面特定区域,而不必加载整个页面,增强导航,滚动条提供了一种快速且简...。
互联网资讯 2024-09-24 11:22:00
在Android开发中,InputType类提供了一系列可用于自定义输入控件行为的数据类型,通过指定正确的InputType,您可以控制键盘类型、文本格式化和输入验证规则,本文将深入探讨InputType数据类型,展示其不同的选项以及如何在您的应用中有效使用它们,InputType枚举InputType是一个枚举类,它包含了大量预定义...。
本站公告 2024-09-23 19:03:28
健康养生的成语上工治未病,最好的医生是能预防疾病,而非治疗疾病,养生之道,保养身体的正确方法,起居有常,生活作息有规律,饮食有节,饮食有规律,不过量,动静结合,劳逸结合,心平气和,保持平和的情绪,乐观豁达,保持乐观的态度,宽容待人,修身养性,修养自身,陶冶情操,寿比南山,祝人长寿,福如东海,祝人福气满满,如何改善身心健康1.保持科学饮...。
最新资讯 2024-09-15 21:46:33
决策基础,可视化数据在现代商业环境中,决策制定是至关重要的,为了做出明智的决策,企业需要访问准确、及时和相关的决策信息,可视化数据提供了这样的信息,通过将复杂的数据转换为易于理解的视觉表示,可视化数据能够,展示关键见解,识别模式和趋势简化复杂信息并提高可读性促进协作和信息共享可视化数据的好处提高决策质量基于可视化数据的决策更具信息性,...。
技术教程 2024-09-14 17:35:30
e考虑您的目标受众的年龄、兴趣和技术水平,以选择一个符合他们需求的模板,设计风格,选择与您的品牌和总体美学相符的设计风格的模板,功能,确定您网站所需的必要功能,例如联系表单、电子商务集成或博客,响应性,确保模板在所有设备上都能无缝显示,包括移动设备,SEO友好,选择一个经过SEO优化的模板,以帮助您提高网站的排名,客户支持,选择提供可...。
技术教程 2024-09-13 16:27:17
>,提供各种工具和实用程序,简化数据库管理任务,例如备份、恢复和优化,选择数据库界面选择合适的数据库界面时,需要考虑以下因素,用户技能水平,一些界面对初学者友好,而另一些界面则更适合高级用户,数据库类型,不同的界面支持不同的数据库类型,所需的特性,不同的界面提供不同级别的功能,成本,一些界面是免费的,而另一些界面则是商业软件,使...。
技术教程 2024-09-13 07:52:15
什么是多线程编程,在多线程编程中,我们创建一个具有多个执行线程的程序,这些线程可以同时运行,从而提高程序的整体性能,C中的多线程编程C中有多种方法可以实现多线程编程,包括,pthread库WindowsAPIOpenMP在本教程中,我们将重点介绍pthread库,pthread库pthread库是POSIX,PortableOpera...。
互联网资讯 2024-09-12 14:54:56
JavaScript是一种动态、基于原型的语言,广泛用于Web开发,了解其核心概念和原则对于掌握JavaScript程序设计至关重要,数据类型JavaScript是一种松散类型语言,这意味着变量不需要明确声明类型,以下是一些常见的JavaScript数据类型,number,用于表示数字,string,用于表示文本,boolean,用于...。
本站公告 2024-09-08 11:44:36