java面试集合(一) --- 基础知识点

  • 这些面试点是在 java后端进阶的文章里拷贝的。但我要把答案整理出来,有什么问题还希望大家指正。
  • 1、Java基础面试知识点

    Java中==和equals和hashCode的区别 

    • ==  运算符用来比较两个变量的值是否相等。

      • 如果是基本数据类型(byte,short,int char long float double boolean)就是直接比较两个变量的大小

      • 但如果是引用类型(类,接口,数组)的比较,是比较内存中的存放地址。

    • equals 该方法主要用于判断对象的内存地址引用是否是同一个地址

      • 但是不同的子类,对equals进行了重写,String中先比较地址,相同就相等,如果不同就比较字符串内容。

    • ==比较的是栈中的值,equals比较的是堆中对象内容。

    • ==默认比较对象在JVM中的地址。

    •  hashCode 默认返回对象在JVM中的存储地址。

    • equal比较对象,默认也是比较对象在JVM中的地址,同==

  • int、char、long各占多少字节数 

    • int 4字节

    • char 2字节

    • long 8 字节

  • int与integer的区别 

    • Integer是int的包装类;int是基本数据类型;

    • Integer变量必须实例化后才能使用;int变量不需要;

    • Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;

    • Integer的默认值是null;int的默认值是0。

  •  

    谈谈对Java多态的理解 
    • 面向对象的三大基本特征是:封装,继承,多态
    • 多态性是面向对象程序设计的重要部分。通常使用方法的重写和重载来实现类的多态性。
  • String、StringBuffer、StringBuilder区别 
    • String 是字符串常量
    • StringBuffer:字符串变量 线程安全
    • StringBuilder:字符串变量 线程不安全 速度最快
  • 什么是内部类?内部类的作用 
    • 将一个类定义到另一个类的内部,叫做内部类。内部类分为四种:静态内部类,成员内部类、局部内部类、匿名内部类
    • 静态内部类是指被声明为static的内部类,他可以不依赖内部类而实例,而通常的内部类需要实例化外部类,从而实例化。静态内部类不可以有与外部类有相同的类名。不能访问外部类的普通成员变量,但是可以访问静态成员变量和静态方法(包括私有类型)
    • 一个 静态内部类去掉static 就是成员内部类,他可以自由的引用外部类的属性和方法,无论是静态还是非静态。但是不可以有静态属性和方法、
    • 局部内部类 就是定义在一个代码块的内类,他的作用范围是所在代码块,是内部类中最少使用的一类型。局部内部类跟局部变量一样,不能被public ,protected,private以及static修饰,只能访问方法中定义final类型的局部变量。
    • 匿名内部类是一种没有类名的内部类,不使用class,extends,implements,没有构造函数,他必须继承其他类或实现其他接口。匿名内部类的好处是使代码更加简洁,紧凑,但是带来的问题是易读性下降。他一般应用于GUI编程来实现时间处理等 。
    • 在使用匿名内部类时,需要牢记以下几个原则。
      • 1》内部类没有构造方法
        2》匿名内部类不能定义静态成员,方法和类
        3》匿名内部类不能是public protected private static
        4》只能创建匿名内部类的一个实例
        5》一个匿名内部类可以在new后面,这个匿名类必须继承一个父类或实现接口
        6》因为匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效 --------------------- 本文来自 LianXu3344 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/lianxu3344/article/details/79473607?utm_source=copy

 

  • 抽象类和接口区别 
    • 参数抽象类接口
      默认的方法实现它可以有默认的方法实现接口完全是抽象的。它根本不存在方法的实现
      实现子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
      构造器抽象类可以有构造器接口不能有构造器
      与正常Java类的区别除了你不能实例化抽象类之外,它和普通Java类没有任何区别接口是完全不同的类型
      访问修饰符抽象方法可以有publicprotecteddefault这些修饰符接口方法默认修饰符是public。你不可以使用其它修饰符。
      main方法抽象方法可以有main方法并且我们可以运行它接口没有main方法,因此我们不能运行它。
      多继承抽象方法可以继承一个类和实现多个接口接口只可以继承一个或多个其它接口
      速度它比接口速度要快接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
      添加新方法如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。如果你往接口中添加方法,那么你必须改变实现该接口的类。
  • 抽象类的意义 
    • 抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板
  • 抽象类与接口的应用场景 
    • 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
    • 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
    • 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
  • 抽象类是否可以没有方法和属性? 
    • ???
  • 接口的意义 
    • 接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情
  • 泛型中extends和super的区别 
    • <? extends T> 只能用于方法返回,告诉编译器此返参的类型的最小继承边界为T,T和T的父类都能接收,但是入参类型无法确定,只能接受null的传入
    • <? super T>只能用于限定方法入参,告诉编译器入参只能是T或其子类型,而返参只能用Object类接收
  • 父类的静态方法能否被子类重写 
    • 不能。父类的静态方法不能被子类继承,更谈不上重写,就算是子类中有一个和父类一模一样的静态方法,那也是子类本身的,和父类的那个静态方法不是一回事。方法加静态后就属于类不属于对象了
  • 进程和线程的区别 
    • https://www.cnblogs.com/lgk8023/p/6430592.html
    • 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
  • final,finally,finalize的区别 
    • final修饰符出现主要作用是为了使相应的变量,对象或者方法一旦创建后,就不在发生任何改变
    • finally关键字一般也用在处理try{}catch{}finally{}的异常中,finally里面的内容一定会执行。
    •   finalize在垃圾回收中会使用。finalize是Object类中的方法。在垃圾回收器执行的时候会调用被回收对象的此方法。

               用户可以重写此方法,已完成对其它资源的回收。如关闭文件等。

  • 序列化的方式 
    • https://blog.csdn.net/pistolove/article/details/60321123
    • Java原生以流的方法进行的序列化、Json序列化、FastJson序列化、Protobuff序列化。
      • Java原生序列化方法即通过Java原生流(InputStream和OutputStream之间的转化)的方式进行转化。需要注意的是JavaBean实体类必须实现Serializable接口,否则无法序列化。
      • Json序列化一般会使用jackson包,通过ObjectMapper类来进行一些操作,比如将对象转化为byte数组或者将json串转化为对象。现在的大多数公司都将json作为服务器端返回的数据格式。比如调用一个服务器接口,通常的请求为xxx.json?a=xxx&b=xxx的形式。
      • fastjson 是由阿里巴巴开发的一个性能很好的Java 语言实现的 Json解析器和生成器。特点:速度快,测试表明fastjson具有极快的性能,超越任其他的java json parser。功能强大,完全支持java bean、集合、Map、日期、Enum,支持范型和自省。无依赖,能够直接运行在Java SE 5.0以上版本。支持Android。使用时候需引入FastJson第三方jar包
      • ProtoBuff序列化对象可以很大程度上将其压缩,可以大大减少数据传输大小,提高系统性能。对于大量数据的缓存,也可以提高缓存中数据存储量。原始的ProtoBuff需要自己写.proto文件,通过编译器将其转换为java文件,显得比较繁琐。百度研发的jprotobuf框架将Google原始的protobuf进行了封装,对其进行简化,仅提供序列化和反序列化方法。其实用上也比较简洁,通过对JavaBean中的字段进行注解就行,不需要撰写.proto文件和实用编译器将其生成.java文件,百度的jprotobuf都替我们做了这些事情了。
  • Serializable 和Parcelable 的区别 
  • 静态属性和静态方法是否可以被继承?是否可以被重写?以及原因? 
  • 静态内部类的设计意图 
  • 成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用 
  • 谈谈对kotlin的理解 
  • 闭包和局部内部类的区别 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值