Java面试题冲刺第十七天--基础篇3


Posted in 面试题 onAugust 07, 2021

面试题1:JDK1.8的新特性有哪些?

接口的默认和静态方法:

Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法。

public interface JDK8Interface {  
    // static修饰符定义静态方法  
    static void staticMethod() {  
        System.out.println("接口中的静态方法");  
    }  
    // default修饰符定义默认方法  
    default void defaultMethod() {  
        System.out.println("接口中的默认方法");
    }
}

Lambda 表达式:

例如:(x, y) -> { return x + y; };λ表达式有三部分组成:参数列表,箭头(->),以及一个表达式或语句块。

在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:

 

Collections.sort(names, (String a, String b) -> {
      return b.compareTo(a);
});

方法与构造函数引用:

Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用,上面的代码展示了如何引用一个静态方法,我们也可以引用一个对象的方法:

 

converter = something::startsWith;
String converted = converter.convert("Java");
System.out.println(converted);

函数式接口:

所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。

Annotation 注解:支持多重注解:

很多时候一个注解需要在某一位置多次使用。

 

@YourAnnotation
@YourAnnotation
public void test(){
    //TODO
}

新的日期时间 API:

Java 8新的Date-Time API (JSR 310)受Joda-Time的影响,提供了新的java.time包,可以用来替代java.util.Date和java.util.Calendar。

一般会用到Clock、LocaleDate、LocalTime、LocaleDateTime、ZonedDateTime、Duration这些类,对于时间日期的改进还是非常不错的。

Base64编码:

Base64编码是一种常见的字符编码,可以用来作为电子邮件或Web Service附件的传输编码。

在Java 8中,Base64编码成为了Java类库的标准。Base64类同时还提供了对URL、MIME友好的编码器与解码器。

JavaScript引擎Nashorn:

Nashorn允许在JVM上开发运行JavaScript应用,允许Java与JavaScript相互调用。

Stream的使用:

Stream API是把真正的函数式编程风格引入到Java中。其实简单来说可以把Stream理解为MapReduce,当然Google的MapReduce的灵感也是来自函数式编程。她其实是一连串支持连续、并行聚集操作的元素。从语法上看,也很像linux的管道、或者链式编程,代码写起来简洁明了,非常酷帅!

Optional:

Java 8引入Optional类来防止空指针异常,Optional类最先是由Google的Guava项目引入的。Optional类实际上是个容器:它可以保存类型T的值,或者保存null。使用Optional类我们就不用显式进行空指针检查了。

扩展注解的支持:

Java 8扩展了注解的上下文,几乎可以为任何东西添加注解,包括局部变量、泛型类、父类与接口的实现,连方法的异常也能添加注解。

并行(parallel)数组:

支持对数组进行并行处理,主要是parallelSort()方法,它可以在多核机器上极大提高数组排序的速度。

编译器优化:

Java 8将方法的参数名加入了字节码中,这样在运行时通过反射就能获取到参数名,只需要在编译时使用-parameters参数。

其他核心 API 的改进

Java IO改进

一些IO改进包括:

  • Files.list(Path dir) 返回延迟填充的Stream,其元素是目录中的条目。
  • Files.lines(Path path) 从文件中读取所有行作为流。
  • Files.find() 通过在以给定起始文件为根的文件树中搜索文件,返回通过路径延迟填充的Stream。
  • BufferedReader.lines() 返回一个Stream,其元素是从此BufferedReader中读取的行。

集合 API 的改进

我们已经看到了 forEach()方法和用于集合的 Stream API。Collection API还有一些新方法是:

  • Iterator forEachRemaining(Consumer action)在所有元素都已处理完毕或该动作引发异常之前,对每个剩余元素执行给定操作的默认方法。
  • Collection removeIf(Predicate filter)删除此集合中所有满足特定条件的元素的默认方法。
  • Collection spliterator() 该方法返回Spliterator实例,该实例可用于顺序或并行遍历元素。
  • map replaceAll(),compute(),merge()方法。
  • 具有键冲突的HashMap类的性能改进

面试题2:什么是内部类?内部类的作用?

将一个类定义在另一个类或者另一个方法里面,这样的类称着内部类;值得注意的是,内部类能够访问外部类的所有成员,包括private修饰的。

举例:把类Inner定义在类Outer中,类Inner就被称为内部类。

class Outer {
    class Inner {
    }
}

注意:

内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为 outer 的外部类和其内部定义的名为 inner 的内部类。编译完成后出现 outer.class 和 outer$inner.class 两类。所以内部类的成员变量/方法名可以和外部类的相同。

内部类的作用

1、内部类可以很好的实现隐藏。

非内部类是不可以使用 private和 protected修饰的,但是内部类却可以,从而达到隐藏的作用。同时也可以将一定逻辑关系的类组织在一起,增强可读性。

2、间接的实现多继承。

内部类提供了Java的"多重继承"的解决方案,弥补了Java类是单继承的不足

每个内部类都能独立地继承自一个(接口的)实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。所以说内部类间接的实现了多继承。

内部类特点

  • 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号
  • 内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的
  • 内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量

面试题3:内部类有哪几种?分别介绍一下

成员内部类

​局部内部类

静态内部类

匿名内部类

成员内部类

成员内部类——就是位于外部类成员位置的类

​
public class Outer {
    //不对外开放的
    class Inner{
        public void show(){
            System.out.println("成员内部类");
        }
    }
}

特点:

  • 内部类就像一个实例成员一样存在于外部类中。
  • 内部类可以访问外部类的所有成员就想访问自己的成员一样没有限制。
  • 内部类中的 this 指的是内部类的实例对象本身,如果要用外部类的实例对象就可以用类名 .this 的方式获得。
  • 内部类对象中不能有静态成员,原因很简单,内部类的实例对象是外部类实例对象的一个成员。

局部内部类

局部内部类——就是定义在一个方法或者一个作用域里面的类;

class Outer {
      public void method(){
          class Inner {
             System.out.println("局部内部类");
          }
      }
  }

特点:

  • 方法中的内部类没有访问修饰符, 即方法内部类对包围它的方法之外的任何东西都不可见。
  • 方法内部类只能够访问该方法中的局部变量,所以也叫局部内部类。而且这些局部变量一定要是final修饰的常量。

静态内部类

我们所知道static是不能用来修饰类的,但是成员内部类可以看做外部类中的一个成员,所以可以用static修饰,这种用static修饰的内部类我们称作静态内部类,也称作嵌套内部类.

特点:不能使用外部类的非static成员变量和成员方法

class Outter {
      int age = 10;
      static age2 = 20;
      public Outter() {        
      }
      static class Inner {
          public method() {
              System.out.println(age);//错误
              System.out.println(age2);//正确
          }
      }
  }
  ​
  public class Test {
      public static void main(String[] args)  {
          Outter.Inner inner = new Outter.Inner();
          inner.method();
      }
  }

匿名内部类

一个没有名字的类,是内部类的简化写法

本质:其实是继承该类或者实现接口的子类匿名对象

public abstract class A implements B{
    public void A(){
        System.out.println("A");
    }
}
public interface B{
     public void B();
 }
public class Test {
    public static void main(String[] args) {
        //new出接口或者实现类
        A a= new A (){
            //实现接口里未实现的方法
            public void B() {
                System.out.println("匿名内部类");
            }
        };
        a.A();
        a.B();
}

特点:

一个类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的事先或是覆盖。

只是为了获得一个对象实例,不需要知道其实际类型。

类名没有意义,也就是不需要使用到。 每日小结

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注三水点靠木的更多内容!


Tags in this post...

面试题 相关文章推荐
同步和异步有何异同,在什么情况下分别使用他们?举例说明
Feb 27 面试题
WebSphere 应用服务器都支持哪些认证
Dec 26 面试题
2019年Java 最常见的 面试题
Oct 19 面试题
求最大连续递增数字串(如"ads3sl456789DF3456ld345AA"中的"456789")
Sep 11 面试题
在什么时候需要使用"常引用"
Dec 31 面试题
XML文档面试题
Aug 05 面试题
nohup的用法
Nov 26 面试题
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
Sep 07 面试题
nohup的用法
Aug 10 面试题
敏捷开发的主要原则都有哪些
Apr 26 面试题
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
Aug 18 面试题
JAVA高级程序员面试题
Sep 06 面试题
Java面试题冲刺第十六天--消息队列
Java面试题冲刺第十五天--设计模式
Promise面试题详解之控制并发
北京捷通华声语音技术有限公司Java软件工程师笔试题
Apr 10 #面试题
顺丰快递Java软件工程师面试题
Jul 31 #面试题
Java软件工程师综合面试题笔试题
Sep 08 #面试题
JAVA软件工程师测试题
Jul 25 #面试题
You might like
有道搜索和IP138的IP的API接口(PHP应用)
2012/11/29 PHP
php抽奖小程序的实现代码
2013/06/18 PHP
PHP实现的一致性哈希算法完整实例
2015/11/14 PHP
PHP验证码生成原理和实现
2016/01/24 PHP
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
jQuery中find()方法用法实例
2015/01/07 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
2016/12/31 Javascript
jQuery EasyUI ProgressBar进度条组件
2017/02/28 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
2017/03/04 Javascript
基于vue-ssr服务端渲染入门详解
2018/01/08 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
JS 封装父页面子页面交互接口的实例代码
2019/06/25 Javascript
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
在Python中利用Into包整洁地进行数据迁移的教程
2015/03/30 Python
Python的Django中将文件上传至七牛云存储的代码分享
2016/06/03 Python
Python内建模块struct实例详解
2018/02/02 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
对Python3 goto 语句的使用方法详解
2019/02/16 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
python sorted方法和列表使用解析
2019/11/18 Python
Python grpc超时机制代码示例
2020/09/14 Python
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
阿联酋航空丹麦官方网站:Emirates DK
2019/08/25 全球购物
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
Python面试题集
2012/03/08 面试题
小学教师自我鉴定
2013/11/07 职场文书
园艺师求职信
2014/03/10 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
导游词书写之黄山
2019/08/06 职场文书
python 实现两个变量值进行交换的n种操作
2021/06/02 Python
【2·13】一图读懂中国无线电发展
2022/02/18 无线电
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python
Python开发简易五子棋小游戏
2022/05/02 Python