zoukankan      html  css  js  c++  java
  • java8新特性入门摘要

    本文是针对java8做的入门摘要笔录,详细分析可参见如下原文。

    原文地址

    http://www.javacodegeeks.com/2013/02/java-8-from-permgen-to-metaspace.html

    http://ifeve.com/java-8-features-tutorial/

    http://ifeve.com/java-permgen-removed/

    http://blog.csdn.net/ioriogami/article/details/12782141

    一、JVM特性

      Permanence Generation 永久移除,参数-XX:PermSize和-XX:MaxPermSize也被移除,取而代之的是Metaspace

      PermGen中类的元数据信息在每次FullGC的时候可能会被收集,但成绩很难令人满意。而且应该为PermGen分配多大的空间很难确定,因为PermSize的大小依赖于很多因素,比如JVM加载的class的总数,常量池的大小,方法的大小等,同时伴随性能问题。

      Metaspace,本地内存,类的元数据(metadata)保存于此,string常量移动到堆中。默认情况下,class metadata的分配仅受限于可用的native memory总量。由于类的元数据可以在本地内存(native memory)之外分配,所以其最大可利用空间是整个系统内存的可用空间。这样,你将不再会遇到OOM错误,溢出的内存会涌入到交换空间。最终用户可以为类元数据指定最大可利用的本地内存空间,JVM也可以增加本地内存空间来满足类元数据信息的存储。

      注:永久代的移除并不意味者类加载器泄露的问题就没有了。因此,你仍然需要监控你的消费和计划,因为内存泄露会耗尽整个本地内存,导致内存交换(swapping),这样只会变得更糟。

    二、Lambda表达式

     λ表达式的目标类型是“函数接口(functional interface)”

    相当于内部类

    //java7
    public interface Runnable {
        public abstract void run();
    }
    new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("test");
                }
            }).start();
    //java8
    @FunctionalInterface
    public interface Runnable {
        public abstract void run();
    }
    new Thread(() -> {
                System.out.println("test");
            }).start();
    @FunctionalInterface
    public interface MyInterface {
        // 只能声明一个抽象方法
        int add(int a, int b);
    }
    //p1,p2入参
    //{}中相当于对接口add的实现
    MyInterface myInterface = (p1,p2) -> {
          int t = p1 + p2;
          return t;
    };
    System.out.println(myInterface.add(1,2));

    集合

    List list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    //第一种写法
    // o为入参,可简写去掉小括号,大括号{}是针对接口Consumer中accept方法的实现
    list.forEach((o) -> {
        System.out.println(o);
    });
    //第二种写法
    Consumer consumer = o ->{
        System.out.println(o);
    };
    list.forEach(consumer);
    
    //Consumer源码
    @FunctionalInterface
    public interface Consumer<T> {
        void accept(T t);
        // 其他方法略...  
    }

    总结:

    λ表达式只是为你节省了几行代码。但将λ表达式引入Java的动机并不仅仅为此。Java8有一个短期目标和一个长期目标。短期目标是:配合“集合类批处理操作”的内部迭代和并行处理(下面将要讲到);长期目标是将Java向函数式编程语言这个方向引导(并不是要完全变成一门函数式编程语言,只是让它有更多的函数式编程语言的特性),也正是由于这个原因,Oracle并没有简单地使用内部类去实现λ表达式,而是使用了一种更动态、更灵活、易于将来扩展和改变的策略(invokedynamic)。

     三、接口

    接口声明里可以有方法实现了,叫做默认方法( Default method)。

    由于Collection库需要为批处理操作添加新的方法,如forEach(),stream()等,但是不能修改现有的Collection接口——如果那样做的话所有的实现类都要进行修改,包括很多客户自制的实现类。所以只好使用这种妥协的办法。

    四、Stream

    List list1 = new ArrayList<>();
    list1.add(1);
    list1.add(2);
    list1.add(3);
    list1.stream().filter(a->(Integer) a == 2).forEach(b->System.out.println(b));

    五、Optional

    Optional< String > temp1 = Optional.ofNullable( null );
    System.out.println(temp1.orElseGet( () -> "为空" ) );
    Optional< String > temp2 = Optional.of( "test");
    System.out.println(temp2.orElseGet( () -> "为空" ) );

    六、Nashorn javascript引擎

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName( "JavaScript" );
    
    System.out.println( engine.getClass().getName() );
    System.out.println( "Result:" + engine.eval( "function f() { return 1; }; f() + 1;" ) );

    七、parallelXXX并行

    long[] arrayOfLong = new long [ 200 ];        
    Arrays.parallelSetAll( arrayOfLong, index -> ThreadLocalRandom.current().nextInt( 1000000 ) );
    Arrays.stream( arrayOfLong ).limit( 10 ).forEach( i -> System.out.print( i + " " ) );
    System.out.println();
    Arrays.parallelSort( arrayOfLong );
    Arrays.stream( arrayOfLong ).limit( 10 ).forEach( i -> System.out.print( i + " " ) );

    八、其他(类型推断、注解扩展、反射方法参数、日期API、分析工具(jdeps、jjs))

  • 相关阅读:
    Notepad++ 配置信息导出导入(快捷键配置导出导入等等)
    SQL 删除重复数据
    PostgreSQL Update 根据B表更新A表
    桌面应用基本创建流程
    Android shape和selector完全总结
    Android 第三方框架之Charts
    java常见五种排序方式
    Objective-c之字典精讲
    OC语言之---NSArray
    Objective-c编程之NSString精讲
  • 原文地址:https://www.cnblogs.com/liuxinan/p/5209835.html
Copyright © 2011-2022 走看看