Java의 기본을 배울 때 jdk 1.5부터 1.9까지의 새로운 기능을 요약했습니다. 각 버전은 각자의 필요에 따라 선택할 수 있습니다. Apache php mysql
jdk1.5의 새로운 기능:
1. Generics
ArrayList list=new ArrayList()------>ArrayList
2 자동 박싱/언박싱
nt i=list.get(0).parseInt();--------->int i=list.get(0); 원래 유형 및 대응 래퍼 클래스 명시적인 변환이 필요하지 않습니다
3 for-each
i=0;i
4 static import
Math.sqrt();--------------->sqrt();
5 가변 길이 매개변수
int sum(int ...intlist) 있습니다. 매개변수 개수에 관계없이 배열로 처리합니다
jdk1.6의 새로운 기능:
1. 향상된 for 루프 문
Integer[] 숫자 = ComputeNumbers();
for (int i=0; i < ; 숫자.길이 ; i++)
sum += 숫자[i];
||
int sum = 0;
for ( int 숫자: ComputeNumbers() )
sum += 숫자;
2. 모니터링 및 관리 메모리 누수에 대한 분석 및 진단 기능이 향상되었습니다. java.lang.OutOfMemory 예외가 발생하면 전체 스택 정보를 얻을 수 있으며, 힙이 가득 차면 이 치명적인 오류를 기록하기 위해 로그 파일이 생성됩니다. 또한 JVM에는 힙이 가득 찼을 때 스크립트를 실행할 수 있는 옵션이 추가되었습니다.
3. 플러그인 주석 처리
플러그인 주석 처리 API(JSR 269)는 주석 처리를 위한 표준 API 세트를 제공합니다
4. 보안
jdk1.7의 새로운 기능:1. Java7 또한 속도를 높이기 위해 모듈 분할 방법을 사용합니다. 가상 머신에 필요할 때 일부 불필요한 모듈을 다운로드하여 설치하는 동시에 시작 속도도 크게 향상됩니다. 2. 다중 언어 지원
Java7의 가상 머신은 Ruby, Python 등과 같은 다중 동적 프로그래밍 언어에 대한 지원을 추가합니다.
3. 개발자의 개발 효율성이 향상되었습니다.
스위치에서 문자열을 사용할 수 있습니다.
멀티 스레드 동시성 및 제어 측면에서 경량 분리 및 병합 프레임워크, 동시 액세스를 지원하는 HashMap 등
주석을 통해 프로그램의 정적 검사가 향상되었습니다.
파일 시스템 액세스, 비동기식 입력 및 출력 작업, 소켓 채널 구성 및 바인딩, 다중 지점 데이터 패킷 전송 등을 위한 몇 가지 새로운 API를 제공합니다.
4. 실행 효율성 향상
객체 포인터를 64비트에서 32비트 포인터로 압축하는 기술은 메모리 및 메모리 블록의 소비를 크게 줄여 실행 효율성을 향상시킵니다.
가비지 수집 부하를 줄이고 가비지 수집 효과를 높이기 위해 새로운 가비지 수집 메커니즘(G1)을 제공합니다.
JDK1.8의 새로운 기능:
1. 인터페이스의 기본 메서드
Java 8에서는 기본 키워드를 사용하여 인터페이스에 비추상 메서드 구현을 추가할 수 있습니다.
2. 람다 표현식
Java 8에서는 더 이상 이 전통적인 익명 객체 메서드를 사용할 필요가 없습니다. Java 8은 보다 간결한 구문인 람다 표현식을 제공합니다.
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
3. 기능적 인터페이스
Java 유형 시스템에서 람다 표현식은 어떻게 표현되나요? 각 람다 식은 유형(일반적으로 인터페이스 유형)에 해당합니다. "기능적 인터페이스"는 하나의 추상 메소드만 포함하는 인터페이스를 나타냅니다. 이 유형의 모든 람다 표현식은 이 추상 메소드와 일치합니다. 기본 메서드는 추상 메서드로 간주되지 않으므로 기능 인터페이스에 기본 메서드를 추가할 수도 있습니다.
4. 메소드 및 생성자 참조
Java 8에서는 :: 키워드를 사용하여 메소드 또는 생성자 참조를 전달할 수 있습니다. 위 코드는 객체의 메소드를 참조하는 방법도 보여줍니다.
converter = Something :: startWith;
String Converted = Converter.convert("Java");
System.out.println(converted);
5. Lambda 범위
람다 표현식에서 외부 범위 및 이전 버전의 익명 개체에 액세스하는 방법은 매우 유사합니다. final로 표시된 외부 지역 변수나 인스턴스 필드 및 정적 변수에 직접 액세스할 수 있습니다.
6. 로컬 변수에 액세스
람다 표현식에서 외부 로컬 변수에 직접 액세스할 수 있습니다.
7. 객체 필드 및 정적 변수에 액세스
로컬 변수와 달리 람다는 내부적으로 인스턴스 필드 및 정적 변수에 액세스할 수 있습니다. 이 동작은 익명 개체와 일치합니다.
8. 인터페이스에 액세스하는 기본 방법
JDK 1.8 API에는 이전 Java에서 일반적으로 사용되는 Comparator 또는 Runnable 인터페이스와 같은 많은 내장 기능 인터페이스가 포함되어 있습니다. 람다에서 사용할 수 있습니다.
Java 8 API는 작업을 보다 편리하게 만들기 위해 많은 새로운 기능적 인터페이스를 제공합니다. 일부 인터페이스는 Google Guava 라이브러리에서 가져온 것입니다. 이러한 인터페이스에 익숙하더라도 이러한 인터페이스가 람다에서 어떻게 확장되는지 확인해야 합니다.
java 7은 2011년에 출시되었고, Java 8은 2014년에 출시되었으며, java9는 2017년 9월 21일에 출시되었습니다. Java 9의 모듈 시스템에 대해 들어보셨을 수도 있지만 이 새 버전에는 다른 많은 업데이트도 포함되어 있습니다. 다음은 Java 9에서 제공되는 9가지 흥미로운 새 기능입니다.
Java 9의 가장 큰 특징은 새로운 모듈 시스템입니다. 코드 기반이 커질수록 복잡하고 난해한 "스파게티 코드"를 생성할 가능성이 기하급수적으로 늘어납니다. 이때 두 가지 기본적인 문제에 직면해야 합니다. 코드를 실제로 캡슐화하기가 어렵고 시스템이 서로 다른 부분(즉, JAR 파일) 간의 종속성에 대한 명확한 개념을 갖고 있지 않습니다. 모든 공용 클래스는 클래스 경로의 다른 공용 클래스에서 액세스할 수 있으며, 이로 인해 공개적으로 액세스할 수 없는 API를 실수로 사용할 수 있습니다. 또한 클래스 경로 자체에 문제가 있습니다. 필요한 모든 JAR이 이미 있는지 또는 중복 항목이 있는지 어떻게 알 수 있습니까? 모듈 시스템이 두 가지 문제를 모두 해결합니다.
모듈식 JAR 파일에는 추가 모듈 설명자가 포함되어 있습니다. 이 모듈 설명자에서 다른 모듈에 대한 종속성은 "requires"를 통해 표현됩니다. 또한 "exports" 문은 다른 모듈에서 액세스할 수 있는 패키지를 제어합니다. 내보내지 않은 모든 패키지는 기본적으로 모듈에 캡슐화됩니다. 다음은 "module-info.java" 파일에 있는 모듈 설명자의 예입니다.
module blog { exports com.pluralsight.blog; requires cms; }
모듈을 다음과 같이 표시할 수 있습니다.
두 모듈 모두 캡슐화된 패키지를 포함하고 있다는 점에 유의하세요. 내보내지지 않습니다(주황색 방패를 사용하여 시각화됨). 우연히 이러한 패키지의 클래스를 사용하는 사람은 없습니다. Java 플랫폼 자체도 자체 모듈 시스템을 사용하여 모듈화되어 있습니다. JDK의 내부 클래스를 캡슐화함으로써 플랫폼이 더욱 안전해지고 지속적인 개선이 쉬워집니다.
모듈형 애플리케이션을 시작할 때 JVM은 `requires` 문을 기반으로 모든 모듈이 사용 가능한지 확인합니다. 이는 취약한 클래스 경로에서 큰 진전입니다. 모듈을 사용하면 애플리케이션의 구조적 캡슐화를 더 효과적으로 적용하고 종속성을 명시적으로 만들 수 있습니다. 이 과정에서 Java 9의 모듈 작업에 대해 자세히 알아볼 수 있습니다.
当你使用具有显式依赖关系的模块和模块化的 JDK 时,新的可能性出现了。你的应用程序模块现在将声明其对其他应用程序模块的依赖以及对其所使用的 JDK 模块的依赖。为什么不使用这些信息创建一个最小的运行时环境,其中只包含运行应用程序所需的那些模块呢? 这可以通过 Java 9 中的新的 jlink 工具实现。你可以创建针对应用程序进行优化的最小运行时映像而不需要使用完全加载 JDK 安装版本。
许多语言已经具有交互式编程环境,Java 现在加入了这个俱乐部。您可以从控制台启动 jshell ,并直接启动输入和执行 Java 代码。 jshell 的即时反馈使它成为探索 API 和尝试语言特性的好工具。
测试一个 Java 正则表达式是一个很好的说明 jshell 如何使您的生活更轻松的例子。 交互式 shell 还可以提供良好的教学环境以及提高生产力,您可以在此了解更多信息。在教人们如何编写 Java 的过程中,不再需要解释 “public static void main(String [] args)” 这句废话。
有时一些小事情可以带来很大的不同。你是否就像我一样在一直使用 Google 来查找正确的 Javadoc 页面呢? 这不再需要了。Javadoc 现在支持在 API 文档中的进行搜索。另外,Javadoc 的输出现在符合兼容 HTML5 标准。此外,你会注意到,每个 Javadoc 页面都包含有关 JDK 模块类或接口来源的信息。
通常,您希望在代码中创建一个集合(例如,List 或 Set ),并直接用一些元素填充它。 实例化集合,几个 “add” 调用,使得代码重复。 Java 9,添加了几种集合工厂方法:
Set<Integer> ints = Set.of( 1 , 2 , 3 ); List<String> strings = List.of( "first" , "second" );
除了更短和更好阅读之外,这些方法也可以避免您选择特定的集合实现。 事实上,从工厂方法返回已放入数个元素的集合实现是高度优化的。这是可能的,因为它们是不可变的:在创建后,继续添加元素到这些集合会导致 “UnsupportedOperationException” 。
长期以来,Stream API 都是 Java 标准库最好的改进之一。通过这套 API 可以在集合上建立用于转换的申明管道。在 Java 9 中它会变得更好。Stream 接口中添加了 4 个新的方法:dropWhile, takeWhile, ofNullable。还有个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代:
IntStream.iterate( 1 , i -> i < 100 , i -> i + 1 ).forEach(System.out::println);
第二个参数是一个 Lambda,它会在当前 IntStream 中的元素到达 100 的时候返回 true。因此这个简单的示例是向控制台打印 1 到 99。
除了对 Stream 本身的扩展,Optional 和 Stream 之间的结合也得到了改进。现在可以通过 Optional 的新方法 `stram` 将一个 Optional 对象转换为一个(可能是空的) Stream 对象:
Stream<Integer> s = Optional.of( 1 ).stream();
在组合复杂的 Stream 管道时,将 Optional 转换为 Stream 非常有用。
Java 8 为我们带来了接口的默认方法。 接口现在也可以包含行为,而不仅仅是方法签名。 但是,如果在接口上有几个默认方法,代码几乎相同,会发生什么情况? 通常,您将重构这些方法,调用一个可复用的私有方法。 但默认方法不能是私有的。 将复用代码创建为一个默认方法不是一个解决方案,因为该辅助方法会成为公共API的一部分。 使用 Java 9,您可以向接口添加私有辅助方法来解决此问题:
public interface MyInterface { void normalInterfaceMethod(); default void interfaceMethodWithDefault() { init(); } default void anotherDefaultMethod() { init(); } // This method is not part of the public API exposed by MyInterface private void init() { System.out.println( "Initializing" ); } }
Java 9 中有新的方式来处理 HTTP 调用。这个迟到的特性用于代替老旧的 `HttpURLConnection` API,并提供对 WebSocket 和 HTTP/2 的支持。注意:新的 HttpClient API 在 Java 9 中以所谓的孵化器模块交付。也就是说,这套 API 不能保证 100% 完成。不过你可以在 Java 9 中开始使用这套 API:
HttpClient client = HttpClient.newHttpClient(); HttpRequest req = HttpRequest.newBuilder(URI.create( "http://www.google.com" )) .header( "User-Agent" , "Java" ) .GET() .build(); HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());
HttpResponse
除了这个简单的请求/响应模型之外,HttpClient 还提供了新的 API 来处理 HTTP/2 的特性,比如流和服务端推送。
我们最后要来着重介绍的这个特性对于库的维护者而言是个特别好的消息。当一个新版本的 Java 出现的时候,你的库用户要花费数年时间才会切换到这个新的版本。这就意味着库得去向后兼容你想要支持的最老的 Java 版本 (许多情况下就是 Java 6 或者 7)。这实际上意味着未来的很长一段时间,你都不能在库中运用 Java 9 所提供的新特性。幸运的是,多版本兼容 JAR 功能能让你创建仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本:
multirelease.jar ├── META-INF │ └── versions │ └── 9 │ └── multirelease │ └── Helper. class ├── multirelease ├── Helper. class └── Main. class
在上述场景中, multirelease.jar 可以在 Java 9 中使用, 不过 Helper 这个类使用的不是顶层的 multirelease.Helper 这个 class, 而是处在“META-INF/versions/9”下面的这个。这是特别为 Java 9 准备的 class 版本,可以运用 Java 9 所提供的特性和库。同时,在早期的 Java 诸版本中使用这个 JAR 也是能运行的,因为较老版本的 Java 只会看到顶层的这个 Helper 类。
end:写的有点长,内容也比较多,可能也掺杂很多废话,希望多多谅解哈,大家多多鼓励,我会持续更新更多优质的文章,分享使我快乐!
相关文章:
相关视频:
위 내용은 쉬운 비교를 위해 버전 1.5부터 1.9까지 JDK의 새로운 기능을 체계적으로 설명합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!