JDK和IDE
IDE
集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。
JDK
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<String> tempList = new ArrayList<>(); 即泛型实例化类型自动推断
3.语法上支持集合,而不一定是数组
final List<Integer> 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};
JDK1.8特性
前几天电脑上的JDK自动更新到1.8,这两天了解了一下JDK1.8的一些新特性。下面就来浅谈一下我所了解的。
我们都知道,Java是不能多继承的,但是可以多实现。它与C++不同,C++是可以多继承的。尽管Java可以实现多个接口,但是接口中只能有抽象方法,不能有具体的实现。但是在JDK1.8中,接口里新增了默认方法。 可以对默认方法进行具体的实现,但是这个方法必须是default。 看下面这段代码:
1 interface AA{
2 public int add(int a,int b); //申明方法
3 default void sing(String name){ //默认方法
4 System.out.println("The song name is " + name);
5 }
6 }
7
8 public class CC implements AA{
9 public static void main(String[] args){
10 AA aa = new AA(){ //匿名内部类
11 public int add(int a,int b){
12 return (a + b);
13 }
14 };
15 aa.sing("The Bird And The Bee"); //方法调用
16 System.out.println(aa.add(5,3));
17 }
18 }
在接口AA中,我们有两个方法,并且有一个默认方法。在main函数中,我们对AA中的add方法进行实现,之后调用AA中的两个方法,这段代码是正确 的。现在来想一个问题,既然现在接口中可以有方法的实现,而且接口又是可以多继承的,那么如果两个接口中有同样的方法签名的两个方法,那么在实现这两个接 口的实现类中,会有冲突吗?
接口C继承了接口A和B,而在A,B中有相同方法签名的函数。注:函数的方法签名包括:函数名,参数个数,参数类型以及顺序,不包括返回值。代码如下:
1 interface A1{
2 default int add(int a,int b){
3 return (a + b);
4 }
5 default void say(){
6 System.out.println("Hello,I am A1");
7 }
8 }
9
10 interface B1{
11 default int subtraction(int a,int b){
12 return (a - b);
13 }
14 default void say(){
15 System.out.println("Hello,I am B1");
16 }
17 }
18
19 interface C1 extends A1,B1{}
上面这段代码在编译时候会出现错误。
之后我们稍稍修改一下我们的接口C1,让它覆盖父接口的say()方法。并完善我们代码:
1 interface A1{
2 default int add(int a,int b){
3 return (a + b);
4 }
5 default void say(){
6 System.out.println("Hello,I am A1");
7 }
8 }
9
10 interface B1{
11 default int subtraction(int a,int b){
12 return (a - b);
13 }
14 default void say(){
15 System.out.println("Hello,I am B1");
16 }
17 }
18
19 interface C1 extends A1,B1{
20 @Override
21 default void say(){
22 //B1.super.say(); 指定调用父接口中的say()
23 System.out.println("Hello,I am C1"); //有自己的实现
24 }
25 }
26
27 public class Test implements C1{
28 public static void main(String[] args){
29 Test t = new Test();
30 t.say();
31 System.out.println(t.add(3,5));
32 System.out.println(t.subtraction(5,2));
33 }
34 }
我们使用覆盖父类的方式来避免上面错出现的冲突。在覆盖方法中,我们可以有自己的实现,也可以指定实现某个父接口中的方法。好,解决了这个问题, 我们来继续思考另外一个问题,如果一个子类继承一个基类并实现了一个接口,并且不幸的事,基类中有一个方法是接口中的默认方法,此时又会出现冲突吗?
代码如下:
1 interface A1{
2 default int add(int a,int b){
3 System.out.println("add() in interface A1 ---> ");
4 return (a + b);
5 }
6 default void say(){
7 System.out.println("Hello,I am interface A1");
8 }
9 }
10
11 class A2{
12 public int add(int a,int b){
13 System.out.print("add() in class A2 ---> ");
14 return (a + b);
15 }
16 public void say(){
17 System.out.println("Hello,I am class A2");
18 }
19 }
20
21 public class Test extends A2 implements A1{
22 public static void main(String[] args){
23 Test t = new Test();
24 t.say();
25 System.out.println(t.add(3,5));
26 }
27 }
运行结果如下:
从结果可以看出, 当基类和接口中的默认方法具有相同方法签名的函数时,子类优先继承基类中的函数实现,而不是父接口中的默认方法。 如果父类没有相同的方法签名,子类才会继承接口中的默认方法。说了这么多关于默认方法,想一想JDK1.8为什么要新增加这一特性呢?由于 Collection库需要为批处理操作添加新的方法,如forEach(),stream()等,但是不能修改现有的Collection接口——如果 那样做的话所有的实现类都要进行修改,包括很多客户自制的实现类。拿forEach()方法来说,以前我们遍历一个集合的时候,都是自己写遍历操作的代 码,相信下面这段代码我们都是很熟悉的:
1 import java.util.*;
2
3 public class Newlist{
4 public static void main(String[] args){
5 List<String> strList = new ArrayList<String>();
6 strList.add("123");
7 strList.add("234");
8 strList.add("345");
9 strList.add("456");
10 strList.add("567");
11
12 for(String list : strList){
13 System.out.println(list);
14 }
15 }
16 }
但是现在不必要这么麻烦了,我们可以直接使用现成的方法进行遍历。使用下面这行代码,代替上面的for循环,即可。
list.forEach(o->{System.out.println(o);});
forEach()方法在List接口中就是一个默认方法,所以所有实现了这个接口,继承这接口的类或接口都具有这个方法,这就是新增默认方法的原因。
这行代码又引出了一个新特性-->lambda表达式。 lambda表达式就是一个匿名函数,主要用于替换以前广泛使用的内部匿名类,各种回调,比如事件响应器、传入Thread类的Runnable等。 Java8有一个短期目标和一个长期目标。短期目标是:配合“集合类批处理操作”的内部迭代和并行处理(上面将已经讲到);长期目标是将Java向函数式 编程语言这个方向引导(并不是要完全变成一门函数式编程语言,只是让它有更多的函数式编程语言的特性,关于函数式编程语言和命令式编程语言请参看这篇博客 http://blog.jobbole.com/42178/ ),也正是由于这个原因,Oracle并没有简单地使用内部类去实现λ表达式,而是使用了一种更动态、更灵活、易于将来扩展和改变的策略(invokedynamic)。下面举个简单例子了解lambda表达式:
1 interface A{ //函数接口
2 public int add(int a,int b);
3 boolean equals(Object obj);
4 default void say(){
5 System.out.println("Hello,I am A");
6 }
7 }
8 public class Lambda implements A{
9 public static void main(String[] args){
10 /* A a = new A(){ 匿名内部类实现add()
11 public int add(int a,int b){
12 return (a+b);
13 }
14 }; */
15 A a = (x,y)->{return (x+y);};
16 a.say();
17 System.out.println(a.add(5,3));
18 }
19 }
在上面的main中我们使用了lambda表示式对接口A中add()方法进行了实现,上面注释是我们不使用表达式而是使用匿名内部类去实现接口中的非默认方法。可以看出, λ 表达式是由(参数)、->、{}三部分构成的。左边是接口定义方法的参数,可以省略参数类型,并且只有当方法仅唯一参数时,小括号才能省略,没有参 数应该写成()。表达式右边是代码块,也就是我们平时书写函数体中的内容。请注意:能够使用λ表达式的目标类型必须是函数接口,函数接口的定义是:一个接 口,如果只有一个显式声明的抽象方法,那么它就是一个函数接口。一般用@FunctionalInterface标注出来(也可以不标)。说的简单一点就 是在一个接口中只有一个显示申明的函数。在上面的例子中,我们的接口A就是函数接口,因为只有一个显示申明的add()。你可能疑惑,那equals方法 呢?equals方法是Object的,所有的接口都会声明Object的public方法——它是隐式的。 下面举一个线程的例子:
1 public class Lambda{
2 public static void main(String[] args){
3 Thread tt = new Thread(new Runnable(){ //一般做法
4 public void run(){
5 for(int i=0;i<100;i++){
6 System.out.println("normal function!");
7 }
8 }
9 });
10
11 Thread tt = new Thread(()->{ //使用lambda表示式
12 for(int i=0;i<100;i++){
13 System.out.println("lambda expression!");
14 }
15 });
16 tt.start();
17 }
18 }
JDK1.8有很多新特性,我列出的只是很小一部分,作为Java语言忠实的粉丝,感觉学习Java越来越有趣。
JDK和IDE的更多相关文章
- Java 学习笔记 ------第二章 从JDK到IDE
本章学习目标: 了解与设定PATH 了解与指定CLASSPATH 了解与指定SOURCEPATH 使用package与import管理类别 初步认识JDK与IDE的对应关系 一.第一个Java程序 工 ...
- JVM/JDK/JRE/IDE—区别(很经典)
转载于 http://blog.csdn.net/jojo52013145/article/details/5801916 只是为了学习,转载没有别的目地,就是爱copy,copy一点点,进步一点点 ...
- 问题002:我们要使用的Java是哪个版本的?什么是JVM、JRE、JDK、IDE、API?
三个版本:1.java SE 标准版 2.java EE企业版 3.Java ME 小型版本 JVM (java virtual machine) java虚拟机 JRE(java runtime e ...
- 安装 jdk 和 IDE软件
1.jdk的安装 通过官方网站获取JDK http://www.oracle.com 针对不同操作系统,下载不同的JDK版本 识别计算机的操作系统 下载完后进行安装,傻瓜式安装,下一步下一步即可.用j ...
- salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载
目前国内已经有很多公司做salesforce,但是国内相关的资料确是少之又少.上个月末跳槽去了新公司,主要做的就是salesforce,不过当时想要看一些相关资料确实比较难.为了避免想要零基础学习的人 ...
- 《JDK 8.0 学习笔记》1~3章
第一章 Java平台概论 了解Java的发展历程和相关术语如JDK.JVM.JRE等 第二章 从JDK到IDE 书本介绍了新建Java程序的注意事项以及在cmd和Eclipse环境下如何运行Java, ...
- 【转载】salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载
salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载 目前国内已经有很多公司做salesforce,但是国内相关的资料确是少之又少.上个月末跳槽去了新 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Java语言程序设计(基础篇)第一章
第一章 计算机.程序和Java概述 1.1 引言 什么是程序设计呢? 程序设计就是创建(或者开发)软件,软件也称为程序. 1.2 什么是计算机 计算机是存储和处理数据的电子设备,计算机包括硬件(har ...
随机推荐
- DynamicJson
json字符串解析成Dynamic对象,开源地址http://dynamicjson.codeplex.com/,访问比较慢.使用方法摘录如下: Project Descriptiondynamic ...
- 移动apache访问日志后如何立即生效
一次偶然测试发现移动了apache下的access_log日志后或者修改了access_log的名称,该移动的日志或修改名称的日志文件仍记录了apache访问信息,即没有实时生效,后来查了资料才知道: ...
- maven pom.xml
什么是pom? pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的u ...
- C#之委托
委托是C#中非常重要的一个概念,并在C#中得到了丰富的应用,如事件,线程等.那什么是委托呢?具体来说,委托是一种引用方法的类型.一旦为委托分配了方法,委托将与该方法具有完全相同的行为.委托方法的使用可 ...
- Cannot send session cache limiter Cannot modify header information
当php报出 Cannot send session cache limiter 或Cannot modify header information 的错误时 其理论上是因为php代码以前有 ...
- mysql数据库及oracle数据库的定时备份
一.oracle数据库备份bat文件 @echo off md "%date:~0,10%" cd "%date:~0,10%" echo exp 用户名/密码 ...
- 高性能javascript(记录二)
js中有四种基本的数据存取位置.分别是:字面量.本地变量.数组元素.对象成员. 字面量:只代表自身,不存储在特定位置.js的字面量有:字符串.数字.布尔值.对象.数组.函数.正则表达式.以及特殊的nu ...
- iOS UISearchBar 设置取消按钮,回收键盘,并修改cancel为“取消”
继承协议: UISearchBarDelegate 在代理方法中设置: #pragma mark --- 搜索框开始编辑 --- - (void)searchBarTextDidBeginEditin ...
- Android中的Service小结
简介 Service适合执行不需要和用户交互,而且长期运行的任务.即使程序被切换回后台,服务仍然可以正常运行.Service并不自动开启线程,默认运行在主线程中. Service中需要重载的函数 on ...
- Linux中的历史命令
Linux中的历史命令一般保存在用户 /root/.bash_history history 选项 历史命令保存文件夹 选项 -c:清空历史命令 -w :把缓存中的历史命令写入历 ...