1. 聚能聊>
  2. 话题详情

Java 9 已在路上,程序员们都准备好了吗?

Oracle 的 Iris Clark 在发送给 OpenJDK 邮件列表的邮件中宣布,Java 9 的公共审查规范草案已可用。并表示,如果所有人都对草案感到满意,会将其提交给 JCP 项目管理办公室(PMO),以便下星期进入正式的公众审查期。

Clark 解释说,“主要规范与 EDR 略有不同,主要是减少了第10节中提议删除的 API 数量。我们还注意到,两个JEP(252 - 默认使用 CLDR 语言环境数据,280 - 字符串连接表示)对 SE API 有影响,因此将它们添加到第5和6节的功能列表中。
草案请查看此处>>

640

邮件中还包括一些其它附件:

详细的 API 规范 - 变更概要>>

包含与 Java SE 8 -JSR 337 的精确差异的注释的 API 规范>>

包含 Java 语言规范 -JLS-和 Java 虚拟机规范-JVMS>>

Java 本地接口规范-JNI 的注释版本,显示与 Java SE 8 的差异>>

    
然而JAVA9都快出来了,为什么我们还停留在JAVA5、6、7上?

1:稳定性是最重要的,企业发展需要稳定性,分分钟几百万打水漂可不是开玩笑的。
2:未经长时间生产环境考验,不敢轻易使用。
3:遗留系统,改造起来需要花费巨大成本。
4:IDE版本比较老,要使用新的JDk就得统一升级IDE。

那么我们就一起聊聊

你的JAVA用的什么版本,使用的原因是什么?

新版本出来了,到底该不该升级,哪些新功能是你更加期望的?

大的互联网公司又是如何来看待这个问题的,比如阿里的JAVA相关系统是否都已是JAVA8了呢?

参与话题

奖品区域 活动规则 已 结束

  • 奖品一

    优酷VIP月卡 x 4

  • 奖品二

    虾米VIP月卡 x 4

  • 奖品三

    技术书籍 x 2

105个回答

5

浩瀚动酷1 已获得优酷VIP月卡 复制链接去分享

我们现在还用的是jdk1.6,使用sca方案SOA架构体系,通过user library 方式来集成包,这样包之间依赖比较强,都不敢动jdk版本,所以上次搞solr只能用了5.0以下版本了。但这种方式部署有好处:比如开发速度快,框架拷贝即用,代码分工明确,技术和业务可以随时拆分,我们最忙一个月上了五个项目!互联网攻城拔地要的就是速度,升级框架也就只能往后再做了

blood味道 回复

确实,现在公司都需要一个稳定的开发环境,真是不敢随便用新技术

吴二货他哥 回复

厉害了word哥

史迪克孙 回复

干的漂亮

吴二货他哥 回复

祝你早日拿到Java大神之“葵花宝典”,走向人生巅峰,出任CTO,迎娶百富美。fighting !

hch68_dn11 回复

新技术要厉害的哥去研究哈

评论
5

似水的流年 已获得优酷VIP月卡 复制链接去分享

真正的原因是 JRE 和 JDK 不是向下兼容的。我用 JDK 1.7 打的包,在 JRE 1.6 上没法跑;JDK 1.8 打的包,在 JRE 1.7 上没法跑。正常的 Java 程序员当然更愿意用新版的 JDK,但服务器上都是几年前的 JRE,根本没法用。要是想升级到新版,几十个依赖的库都不支持。
新的jdk有很多新特性不是一两天就能掌握的。 其次新版的兼容行也需要更深入的了解。 再者就是新版的稳定性都是不确定的。特别是出了新的问题时,很难查找。 说白了。就是没有很深入的了解新版的。
用旧版本主要是为了保证兼容旧的系统。旧系统已经投放到生产环境,经过了时间和实践的考验是可以平稳运行的,没有必要增加风险去体验一个新的JDK版本。
通常遇到的情况是:老系统可能长久使用一些在高版本中已经失效的工具类(开源的jar包都会有一些后来改进或者废除的方法)。更新整个生产系统的风险是非常大的,没有人愿意承担这个风险和成本。

小鱼纸币 回复

风险与机遇 并存~~

kill_it 回复

向下兼容一般指的是1.8可以兼容1.7,1.6之类的,你说的应该是向上兼容,向上兼容本来就是个悖论

runer 回复

同意

小柒2012 回复
回复@kill_it:

嗯 有道理,一般来说 567 打的包 能够在 8 上运行,只是相应的API可能不再建议使用,还是向下兼容的。哈哈,向上兼容就是个悖论。

lngg 回复

你这典型的儿子不行怪老子的

评论
3

琴瑟 已获得优酷VIP月卡 复制链接去分享

1.5
1.自动装箱与拆箱:
2.枚举(常用来设计单例模式)
3.静态导入
4.可变参数
5.内省

1.6
1.Web服务元数据
2.脚本语言支持
3.JTable的排序和过滤
4.更简单,更强大的JAX-WS
5.轻量级Http Server
6.嵌入式数据库 Derby

1.7
1,switch中可以使用字串了
2.运用List tempList = new ArrayList<>(); 即泛型实例化类型自动推断
3.语法上支持集合,而不一定是数组
4.新增一些取环境信息的工具方法
5.Boolean类型反转,空指针安全,参与位运算
6.两个char间的equals
7.安全的加减乘除
8.map集合支持并发请求,且可以写成 Map map = {name:”xxx”,age:18};

1.8

  1. 允许在接口中有默认方法实现
  2. Lambda表达式
  3. 函数式接口
  4. 方法和构造函数引用
  5. Lambda的范围
  6. 内置函数式接口
  7. Streams
  8. Parallel Streams
  9. Map
  10. 时间日期API
  11. Annotations

1.9

  1. Jigsaw 项目;模块化源码
  2. 简化进程API
  3. 轻量级 JSON API
  4. 钱和货币的API
  5. 改善锁争用机制
  6. 代码分段缓存
  7. 智能Java编译, 第二阶段
  8. HTTP 2.0客户端
  9. Kulla计划: Java的REPL实现

企业发展需要稳定性,稳定性是最重要的。
至于阿里的JAVA相关系统是否都已是JAVA8了,我想咱们社区的尊渊大牛已给出答案:http://click.aliyun.com/m/9140/

小柒2012 回复

了解了一下,果然已经全面切换为JDK8。

评论
2

阿狸小狐 已获得虾米VIP月卡 复制链接去分享

1:学新特性需要花不少时间,不学就不知道新的有什么好
2:未经长时间考验,不敢用
3:遗留系统,不一定兼容新版本。比如override注解,5和6下面不一样
4:守旧

聚小编 回复

怀旧是关键

程序猿008 回复

怀旧的确很好,但步子也要迈开呀

评论
1

老虎是个蛋 已获得技术书籍 复制链接去分享

就拿我们公司来说吧,jdk的版本从1.6到1.8都有在使用,还是看项目的立项时间吧,老项目一般都是1.6或者1.7,不过新项目我们都会心照不宣的使用1.8,并不是因为我们不怕不兼容的问题,而是作为一个程序员还是喜欢对一些新东西进行探索的,毕竟一些新特性还是不错的,比如一下几点:

1、Lambda表达式和函数式接口

2、Java 8增加了两个新的概念在接口声明的时候:默认和静态方法。默认方法和Trait有些类似,但是目标不一样。默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说不会强迫实现接口的类实现默认方法。

3、方法引用提供了一个很有用的语义来直接访问类或者实例的已经存在的方法或者构造方法。结合Lambda表达式,方法引用使语法结构紧凑简明。不需要复杂的引用。

4、自从Java 5支持注释以来,注释变得特别受欢迎因而被广泛使用。但是有一个限制,同一个地方的不能使用同一个注释超过一次。 Java 8打破了这个规则,引入了重复注释,允许相同注释在声明使用的时候重复使用超过一次。

5、Java 8在类型推断方面改进了很多,在很多情况下,编译器可以推断参数的类型,从而保持代码的整洁

6、Java 8扩展了注解可以使用的范围,现在我们几乎可以在所有的地方:局部变量、泛型、超类和接口实现、甚至是方法的Exception声明。

7、Java 8引入了新的日期时间API(JSR 310)改进了日期时间的管理。

8、Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。

9、对Base64的支持最终成了Java 8标准库的一部分,非常简单易用

10、Java 8新增加了很多方法支持并行的数组处理。最重要的大概是parallelSort()这个方法显著地使排序在多核计算机上速度加快。

11、HashMap性能大幅提升,尤其在hash碰撞严重的情况下,更引入了红黑树替换链表

不管怎么说,新东西还是多尝试以下还是挺不错的。

小柒2012 回复

话说 阿里已经全面JDK8了,加油啊骚年~~

评论
2

我很无奈 已获得技术书籍 复制链接去分享

公司选用技术版本,这得看公司具体是否可以用的上以及公司的需求,有的公司追求的是稳定性,不需要所谓的性能,新特性,低版本完全可以满足公司业务,而且升级的话,有时候会出现一些千奇百怪的问题,需要花费精力来解决问题,徒增一些麻烦,所以公司一般对老系统,或者已经定型,能不动尽量不动,除非是要重构,或者说目前的系统已经不能够满足当前的业务了,需求整体迁移,像我现在的公司,刚来的时候就在迁移glassfish,我还不知道 那玩意是啥,再一个就是公司追求新特性,新技术,现在的互联网公司 很多用到的技术都比较新,相对传统项目的公司,因为老的技术或者低版本在很大程度上已经无法满足现在的业务需求,只有去寻求新的解决方案,这样也促使了技术的不断更新与进步

1

sea-line 已获得虾米VIP月卡 复制链接去分享

够用就好。这真的是首要原因,没有Bug,能解决需求,谁管理用什么。
稳定安全。就不说JDK7带来的新GC坑了多少人了,到JDK8,官方直接说带着Bug上线,你敢再生产环境用?你们老大知道你这么屌吗?
老程序猿。以上两点的阻力就是这一点造成的吧。拥有了10年丰富开发经验的Leader们,新技术玩累了,坑填厌了,也就开始信仰『普普通通就是好,平平安安就是福』了。

1

keller.zhou 已获得虾米VIP月卡 复制链接去分享

Java8 运行应用时速度更快。通常,升级至 Java8 的应用都能得到速度上的提升,即便没有做任何改变或调优。对于为了迎合特定 JVM 而做出调整的应用,这或许并不适用。但 Java8 性能更优的理由还有很多:

常见数据结构的性能提升:对广受欢迎的 HashMap 进行的基准测试表明,它们在 Java8 中的性能更好。这种提升非常吸引人——你无需学习新的 Streams API 或 Lambda 语法,甚至不需要改变现有的代码,就能提升应用的性能。

垃圾回收器提升:通常,Java 应用性能取决于垃圾回收的效率。的确,糟糕的垃圾回收会很大程度上影响应用性能。Java8 对垃圾回收做了很多改变,能有效提升性能并简化调优。最为人熟知的改变是 PermGen 的移除与 Metaspace 的引入。

Fork/Join 速度提升:fork/join 框架是在 Java7 中首次引入的,目的是简化使用 JVM 的并发程序。Java8 中投入了很多努力进一步提升该框架。现在,fork/join 在 Streams API 中用于并发操作。

此外,Java8 中还包含诸多改进以支持并发。Oracle 在 JDK 8 中总结了这些性能提升。

代码行更少

Java 经常被人们诟病其样本代码太多。为此,Java8 新的 API 采用了更具功能性的方式,专注于实现什么而不是如何实现。

Lambda 表达式

Java8 中的 Lambda 表达式不仅是 Java 已有的匿名内部类—— Java8 推出之前传递行为的方法之外的语法糖衣。Lambda 表达式采用了 Java 7 的内部改变,因此运用起来相当流畅。

0

秋名山86 已获得虾米VIP月卡 复制链接去分享

现在我们还是在用1.7版本,大部分使用的框架都可以兼容,新的特性使用的比较少,对于提升生产力来说使用新版本是双刃剑,企业应用最重要还是核心功能的稳定性.
1.8引入lambuda函数和其它新特性有所了解,但都不是不可或缺的.语法糖相对多,但最关键的还是生产效率和协作效率.如果要使用新特性,需要对所有员工进行统一的培训.
改变是需要很好的理由的,因为都有成本在的.

0

张维-IT&amp;middot;教育 已获得优酷VIP月卡 复制链接去分享

Java5:
1、泛型 Generics:
引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处。Parameterized Type作为参数和返回值,Generic是vararg、annotation、enumeration、collection的基石。
A、类型安全
抛弃List、Map,使用List、Map给它们添加元素或者使用Iterator遍历时,编译期就可以给你检查出类型错误
B、方法参数和返回值加上了Type
抛弃List、Map,使用List、Map
C、不需要类型转换
List list=new ArrayList();
String str=list.get(i);
D、类型通配符“?”
假设一个打印List中元素的方法printList,我们希望任何类型T的List都可以被打印:
代码:
public void printList(List<?> list,PrintStream out)throws IOException{
for(Iterator<?> i=list.iterator();i.hasNext();){
System.out.println(i.next.toString());
}
}
如果通配符?让我们的参数类型过于广泛,我们可以把List<?>、Iterator<?> 修改为
List<? Extends Number>、Iterator<? Extends Number>限制一下它。
2、枚举类型 Enumeration:
3、自动装箱拆箱(自动类型包装和解包)autoboxing & unboxing:
简单的说是类型自动转换。
自动装包:基本类型自动转为包装类(int ——Integer)
自动拆包:包装类自动转为基本类型(Integer——int)
4、可变参数varargs(varargs number of arguments)
参数类型相同时,把重载函数合并到一起了。
如:public void test(object... objs){
for(Object obj:objs){
System.out.println(obj);
}
}
5、Annotations 它是Java中的metadata
A、Tiger中预定义的三种标准annotation
a 、Override
指出某个method覆盖了superclass 的method当你要覆盖的方法名拼写错时编译不通过
b、Deprecated
指出某个method或element类型的使用是被阻止的,子类将不能覆盖该方法
c、SupressWarnings
关闭class、method、field、variable 初始化的编译期警告,比如:List没有使用 Generic,则@SuppressWarnings("unchecked")去掉编译期警告。
B、自定义annotation
public @interface Marked{}
C、meta-annotation
或者说annotation的annotation
四种标准的meta-annotation全部定义在java.lang.annotaion包中:
a, Target
指定所定义的annotation可以用在哪些程序单元上
如果Target没有指定,则表示该annotation可以使用在任意程序单元上
代码

  1. @Target({ElementType.ANNOTATION_TYPE,
  2. ElementType.CONSTRUCTOR,
  3. ElementType.FIELD,
  4. ElementType.LOCAL_VARIABLE,
  5. ElementType.METHOD,
  6. ElementType.PACKAGE,
  7. ElementType.PARAMETER,
  8. ElementType.TYPE})
  9. public @interface TODO {}

b, Retention
指出Java编译期如何对待annotation
annotation可以被编译期丢掉,或者保留在编译过的class文件中
在annotation被保留时,它也指定是否会在JVM加载class时读取该annotation
代码

  1. @Retention(RetentionPolicy.SOURCE) // Annotation会被编译期丢弃
  2. public @interface TODO1 {}
  3. @Retention(RetentionPolicy.CLASS) // Annotation保留在class文件中,但会被JVM忽略
  4. public @interface TODO2 {}
  5. @Retention(RetentionPolicy.RUNTIME) // Annotation保留在class文件中且会被JVM读取
  6. public @interface TODO3 {}

c, Documented
指出被定义的annotation被视为所熟悉的程序单元的公开API之一
被@Documented标注的annotation会在javadoc中显示,这在annotation对它标注的元素被客户端使用时有影响时起作用
d, Inherited
该meta-annotation应用于目标为class的annotation类型上,被此annotattion标注的class会自动继承父类的annotation

D, Annotation的反射
我们发现java.lang.Class有许多与Annotation的反射相关的方法,如getAnnotations、isAnnotationpresent
我们可以利用Annotation反射来做许多事情,比如自定义Annotation来做Model对象验证
代码

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target({ ElementType.FIELD, ElementType.METHOD })
  3. public @interface RejectEmpty {
  4. /* hint title used in error message /
  5. String value() default "";
  6. }
  7. @Retention(RetentionPolicy.RUNTIME)
  8. @Target( { ElementType.FIELD, ElementType.METHOD })
  1. public @interface AcceptInt {
  2. int min() default Integer.MIN_VALUE;
  3. int max() default Integer.MAX_VALUE;
  4. String hint() default "";
  5. }
    使用@RejectEmpty和@AcceptInt标注我们的Model的field,然后利用反射来做Model验证

6、新的迭代语句(for(int n:numbers))
7、静态导入(import static )
8、新的格式化方法(java.util.Formatter)
formatter.format("Remaining account balance: $%.2f", balance);
9、新的线程模型和并发库Thread Framework
HashMap的替代者ConcurrentHashMap和ArrayList的替代者CopyOnWriteArrayList
在大并发量读取时采用java.util.concurrent包里的一些类会让大家满意BlockingQueue、Callable、Executor、Semaphore...

Java6:
1、引入了一个支持脚本引擎的新框架
2、UI的增强
3、对WebService支持的增强(JAX-WS2.0和JAXB2.0)
4、一系列新的安全相关的增强
5、JDBC4.0
6、Compiler API
7、通用的Annotations支持

Java7:
1,switch中可以使用字串了
String s = "test";
switch (s) {
case "test" :
System.out.println("test");
case "test1" :
System.out.println("test1");
break ;
default :
System.out.println("break");
break ;
}

2.运用List tempList = new ArrayList<>(); 即泛型实例化类型自动推断

3.语法上支持集合,而不一定是数组

final List piDigits = [ 1,2,3,4,5,8 ];
4.新增一些取环境信息的工具方法

File System.getJavaIoTempDir() // IO临时文件夹

File System.getJavaHomeDir() // JRE的安装目录

File System.getUserHomeDir() // 当前用户目录

File System.getUserDir() // 启动java进程时所在的目录5

5.Boolean类型反转,空指针安全,参与位运算

Boolean Booleans.negate(Boolean booleanObj)

True => False , False => True, Null => Null

boolean Booleans.and(boolean[] array)

boolean Booleans.or(boolean[] array)

boolean Booleans.xor(boolean[] array)

boolean Booleans.and(Boolean[] array)

boolean Booleans.or(Boolean[] array)

boolean Booleans.xor(Boolean[] array)

6.两个char间的equals
boolean Character.equalsIgnoreCase(char ch1, char ch2)

7.安全的加减乘除
int Math.safeToInt(long value)

int Math.safeNegate(int value)

long Math.safeSubtract(long value1, int value2)

long Math.safeSubtract(long value1, long value2)

int Math.safeMultiply(int value1, int value2)

long Math.safeMultiply(long value1, int value2)

long Math.safeMultiply(long value1, long value2)

long Math.safeNegate(long value)

int Math.safeAdd(int value1, int value2)

long Math.safeAdd(long value1, int value2)

long Math.safeAdd(long value1, long value2)

int Math.safeSubtract(int value1, int value2)

8.map集合支持并发请求,且可以写成 Map map = {name:"xxx",age:18};

1

peaceful 复制链接去分享

不论哪个版本,能用就行,新版本有它的好处,但一开始估计是区分不太明显的,慢慢摸索咯,毕竟要向前看嘛。

小柒2012 回复

嗯 毕竟稳定性还是最重要的~

评论
0

it民工198807 复制链接去分享

感觉好屌我就是来打个酱油的,新东西出来总是要试试嘛

小柒2012 回复

试完就说说嘛~~

评论
1

站长大大 复制链接去分享

java8,lambda好用支持😊,还有强迫症,必须用最新的

1

1318311737673471 复制链接去分享

目前正在使用Java8,以前是使用java6,突然跨度过多少不适应,Lambda表达式,集合流操作、函数式接口...,感觉部分从面向对象转向面向过程感觉...;用的多些是集合流操作,把listmap之间变换、排序,过滤,虽然代码精简啦,但给维护增加难度,据他人资料介绍,说是集合流操作还没有自己写的性能好...总体来说功能的确比以前强大啦,对新人来说共容易上手

1

aliang886 复制链接去分享

觉得oracle重新设计一下java版本的升级机制,系统化路线。加入版本控制系统。未来科技化发展的前提就得统一下见零散。

0

kamino 复制链接去分享

不会java 但我的php版本已经从7降到5了

技术达人 回复

怎么会要降呢?不习惯吗?

评论
1

爵霸 复制链接去分享

我使用的是1.6
Web服务元数据 嵌入式数据库 Derby 支持脚本语言 轻量级Http Server JTable的排序和过滤 JAX-WS

0

高夷飞 复制链接去分享

作为一名大二的学生,感觉升级还是有必要的,但是希望一些语法不要有太大的变动,今后学习起来也不是很费力,希望可以得到技术书籍

屁孩儿 回复

图书馆,技术书籍,好多阿~~~

评论
0

1494490010916823 复制链接去分享

我女儿在国外客商要付款不成功。95187打不进,除了95187怎么联系?

聚小编 回复

帮你反馈一下

评论
0

小鱼纸币 复制链接去分享

首选,我觉得JAVA才是最好的额语言,JAVAer才是最牛的程序员。什么拍簧片啊都是浮云。

当然说到,JAVA版本的问题,主要还是看公司吧,很多时候公司的决策不是我们普通程序员说了算的。

聚小编 回复

明显是去PHP话题砸场子的,哈哈

评论
6