带你了解10道java入门面试题

目录
  • 1. 谈谈你对面向对象的了解? (谈谈你对面向对象和面向过程的了解?)
  • 2.==与equals的比较(笔试中常见)
  • 3.fianl关键字
    • final的作用:
  • 4.为什么局部内部类与匿名内部类只能访问局部的final变量?
  • 5.String,StringBuffer,StringBuilder 三者的区别与使用场景?
  • 6.重载和重写(覆盖)的区别?
  • 7.接口与抽象类的区别?
  • 8.list与set的区别?
  • 9.hashCode与equals
  • 10.ArryList与LinkList的区别?
  • 总结

1. 谈谈你对面向对象的了解? (谈谈你对面向对象和面向过程的了解?)

面向对象与面向过程相比较,面向过程注重事件的步骤与顺序,比较直接高效,面向对象注重事件参与的对象与对象各己需要做的事,更易于复用,维护与扩展。(以举例来说明更加形象)

(例:拿常见手机支付来看)

面向过程:1,手机扫码——>2,输入密码——>3,确认是否支付成功——>4,离开

面向对象:拆出人与手机二个对象,(人:输入密码,离开,手机:手机扫码,确认是否支付成功)

下面就要谈谈面向对象的三大特征:封装。继承与多态

封装的意义:明确标识出允许外部使用的属性与方法,内部细节对外部隐藏,外部调用无需修改和关心内部如何实现。

继承:继承父类(基类)的方法,不包括私有化的部分,引用父类的方法或者按自己需求进行修改与扩展。

多态:(条件:1,在继承的基础上,2,存在方法重写,3,父类的引用指向子类的对象),基于对象所属类的不同,子类对父类同一个方法的调用,实际执行的逻辑不同。(无法调用调用子类特有的方法)。

2.==与equals的比较(笔试中常见)

==:比较的是栈中的值,基本上就是比较的变量当中的值,引用类型是堆中的内存对象地址、

equals:Object默认采用“==”比较,通常继承后会进行重写比较的为对象的内容(例如String)。

例题:

public class Taxi {
    public static void main(String[] args) {
        String str1="hello";
        String str2=new String("hello");
        String str3=str2;
        System.out.println(str1==str2);//false
        System.out.println(str1==str3);//false
        System.out.println(str2==str3);//true
        System.out.println(str1.equals(str2));//true
        System.out.println(str1.equals(str3));//true
        System.out.println(str2.equals(str3));//true
    }
}

解析:在Java中字符串是对象,字符串在生成时其实是在内存常量池当中生成。所以str1指向的“hello”的对象内存地址,str2因为new关键字在堆中开辟内存,但内存指向常量池中的“hello”,str2指向开辟内存的对象地址。str3==str2,所以str3指向str2指向开辟内存的对象地址。因为str1与str2和str1与str3“==”比较内存地址不同返回flase,str2与str3的内存地址相同返回ture,字符串方法中equals重写过,比较的是内容,str1与str2与str3的内容相同为“hello”,所以返回的是ture.

3.fianl关键字

final的作用:

该类不能被继承
方法 该方法不能被重写,但可以重载
变量 变量一旦被赋值就不能修改
成员变量(普通) 在声明的时候就需要赋值,或者静态块中与构造函数中赋值
成员变量(静态) 在声明的时候就需要赋值,或者静态块中赋值
局部变量 系统不会给变量初始化,必须程序员写入,在初始化时不会报错,但在使用前一定要初始化,不然报错
基本数据类型 基本数据类型的数值初始化后不能改变
引用数据类型 初始化后不能指向另一个对象,但引用的值是可以改变的

4.为什么局部内部类与匿名内部类只能访问局部的final变量?

首先必须知道,内部类与外部类,内部类不会因为定义在方法中,跟方法执行完一起回收,就会产生一个问题,外部方法结束时,就会回收局部变量,但内部类对象(当没有引用时回收)还存在,就存在了一个问题,内部类访问了一个不存在的变量,所以在jdk当中为了解决这个办法,局部就复制了一份内部类成员变量,当局部变量回收后仍可以访问局部变量,但实际访问的是“copy”过的值。(为了复制的局部变量必须与原局部变量一样,所以使用final修饰)

public class Management {
    private int id=10;
    //final修饰局部变量
    public void outPrint(final String x){
        class InClass{
            public void Inprint(){
                System.out.println(x);
                System.out.println(id);
            }
        }
        new InClass().Inprint();
    }
    public static void main(String[] args) {
       Management m=new Management();
        m.outPrint("小罗");
    }
}

5.String,StringBuffer,StringBuilder 三者的区别与使用场景?

String:final修饰的,不可变的,每次操作会产生新的对象。

StringBuffer,StringBuilder:对原对象进行操作,不产生新对象。

性能上:StringBuilder (线程不安全)> StringBuffer(线程安全) > String

使用场景:当需要对字符串内容进行多次改变时,使用StringBuffer,StringBuilder。但因为性能原因优先使用StringBuilder ,需要多线程,共享变量时使用StringBuffer。

6.重载和重写(覆盖)的区别?

重载:发生在类当中,方法名称必须相同,参数的类型,个数顺序不同。方法返回值与修饰符可以不同。(下图:不是重载,方法名称必须相同,参数的类型,个数顺序相同,重载与返回值没有关系)

 public void outPrint(String x,int i){

    }
public int outPrint(String x,int i){
       //这个不是重载,编译时会报错
    }

重写(覆盖):发生在继承的父类与子类当中,方法名与参数列表必须相同,返回值的范围小于等于父类,如果存在异常,抛出异常范围小于等于父类,修饰符的权限必须大于等于父类。如果父类方法以private修饰则子类不能重写该方法。

7.接口与抽象类的区别?

1,抽象类可以存在普通成员函数,而接口只能存在public abstract 方法,

2,抽象类只能继承一个,而接口可以s实现多个。

3,抽象类中成员变量可以是任何类型,而接口中成员变量只能是public static final 类型的。

(高级:接口设计的目的:是对类行为进行约束,抽象类的目的:提高代码的复用性,抽象类不允许实例化)

使用场景:当你关注的是事务本身时,就用抽象类,当你关注操作时就使用接口。

8.list与set的区别?

list:有序,可重复的,按对象进入顺序进行存储,允许多个null对象,可以使用迭代器取出所以元素,还可以所以get方法获取指定下标的元素。

set:无序,不可重复。只允许有一个null对象,只能使用迭代器遍历元素。

9.hashCode与equals

equals:Object默认采用“==”比较,通常继承后会进行重写比较的为对象的内容(例如String)。

hashCode:定义在Object中hashCode()会获取哈希码(又称为散列码),确定哈希表表上的索引,并返回int整数。特点“根据键快速找到与之对应的值”

联系与规则:

1,如果二个对象相等,hashCode一定也是相等的

2,如果二个对象相等,二个对象调用equals返回ture。

3,二个对象的hashCode一样,他们不一定相等。

4,equals方法被覆盖,hashCode方法也必须覆盖。

5,hashCode默认行为是堆上的对象独特值,如果没有重写hashCode(),则该类二个对象无论如何都不会相等。

10.ArryList与LinkList的区别?

ArryList:基于动态数组,连续存储,适合下标访问,扩容机制:因为数组长度是固定的,超过固定长度会新建立一个数组,长度扩大原来1.5倍,回收老数组。

LinkList:基于列表,可以存储在分散的内存当中。适合插入,删除,不适合查询。LinkList一般使用迭代器进行遍历。不建议使用for循环遍历,因为每一次遍历都会get方法,消耗性能大,不使用indexOf来返回元素索引,和遍历元素。用indexOf遍历list进行遍历时,当结果为空时还遍历这个列表。

总结

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

(0)

相关推荐

  • 三道java新手入门面试题,通往自由的道路--多线程

    目录 1. 你知道线程安全问题吗? 2. 那如何解决线程安全问题呢? 3. 那你讲下死锁是什么吧? 总结 1. 你知道线程安全问题吗? 线程安全问题:一般指在多线程模式下,多个线程对同一个共享数据进行操作时,第一个线程还没来得及更新共享数据,从而导致另外一个线程没得到最新的数据,并更新数据,从而产生线程安全问题.比较常见的场景有买票. 我举个例子吧: 需求:比如买周杰伦演唱会的门票,此时有三个窗口同时卖总共100张票.窗口就是线程对象,而100张票的资源,此时就相当于多个线程去抢占cpu的资源去

  • 三道java新手入门面试题,通往自由的道路--JVM

    目录 1. 你知道JVM内存模型吗? 2. 你知道重排序是什么吗? 3. happens-before是什么,和as-if-serial有什么区别 总结 1. 你知道JVM内存模型吗? 在Java的并发中采用的就是JVM内存共享模型即JMM(Java Memory Model),它其实是是JVM规范中所定义的一种内存模型,跟计算机的CPU缓存内存模型类似,是基于CPU缓存内存模型来建立的,Java内存模型是标准化的,屏蔽掉了底层不同计算机的区别. 那我们先来讲下计算机的内存模型: 其实早期计算机

  • 每日六道java新手入门面试题,通往自由的道路--线程池

    目录 1. 你知道线程池吗?为什么需要使用线程池? 小结: 2. 你知道有多少种创建线程池的方式 3. 线程池的五种状态你有了解吗? 4. 你知道ThreadPoolExecutor的构造方法和参数吗 5. 你可以说下线程池的执行过程原理吗 6. 能否写一个简单线程池的demo? 总结 1. 你知道线程池吗?为什么需要使用线程池? 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源. 而在Java中, JVM 中每创建和销毁线程就需要资源和时间的损耗了,

  • 三道java新手入门面试题,通往自由的道路--锁+Volatile

    目录 1. 你知道volatile是如何保证可见性吗? 小结: 2. 悲观锁和乐观锁可以讲下你的理解吗? 3. 你还知道什么其他的锁吗? 总结 1. 你知道volatile是如何保证可见性吗? 我们先看一组代码: public class VolatileVisibleDemo { public static boolean initFlag = false; public static void main(String[] args) { new Thread(new Runnable() {

  • 每日几道java新手入门面试题,通往自由的道路

    目录 1.请你说一下什么是面向对象? 2.请你简述一下面向对象的三个基本特征? 3.为什么说 Java 是一种半解释半编译的程序设计语言呢? 4.请你说一下Java中的8大基本类型是那些? 5.请你讲讲抽象类和接口有什么区别? 6.请判断当一个对象被当作参数传递给一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 7.请你说一下JVM/JRE/JDK的区别? 8.请你说一下方法重载和方法重写的区别? 9.请你说一下List接口和Set接口的区别? 1

  • 带你了解10道java入门面试题

    目录 1. 谈谈你对面向对象的了解? (谈谈你对面向对象和面向过程的了解?) 2.==与equals的比较(笔试中常见) 3.fianl关键字 final的作用: 4.为什么局部内部类与匿名内部类只能访问局部的final变量? 5.String,StringBuffer,StringBuilder 三者的区别与使用场景? 6.重载和重写(覆盖)的区别? 7.接口与抽象类的区别? 8.list与set的区别? 9.hashCode与equals 10.ArryList与LinkList的区别? 总

  • 10道springboot常见面试题

    本文为大家分享了10道springboot常见面试题,供大家参考,具体内容如下 1.什么是Spring Boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问https://spring.io/projects页面,我们就会看到可以在我们的应用程序中使用的所有Spring项目的不同功能. 如果必须启动一个新的Spring项目,我们必须添加构建路径或添加Maven依赖关系,配置应用程序服务器,添加spring配置. 因此,开始一个新的spring项目需要很多努力,因为我们现在必

  • 50 道Java 线程面试题(经典)

    下面是 Java 线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要 100 毫秒,那么用十个线程完成改任务只需 10 毫秒.Java 在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点.欲了解更多详细信息请点击这里. 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很

  • 每日六道java新手入门面试题,通往自由的道路--多线程

    目录 1. 你可以讲下进程与线程的区别?为什么要用多线程? 2. 什么是上下文切换? 3. 说说你知道的几种创建线程的方式 4. 昨天你讲到创建线程后使用start方法去调用线程,为什么run方法不行呢?有什么区别? 5. 你知道你开启一个线程后,它的状态有那些吗? 6. 既然讲到超时方法,那你讲下sleep和wait的区别和他们需要怎样唤醒 总结: 1. 你可以讲下进程与线程的区别?为什么要用多线程? 进程:进程是程序的一次执行过程,是系统运行程序的基本单位. 线程:单个进程中执行中每个任务就

  • 每日六道java新手入门面试题,通往自由的道路--JVM

    目录 1. JVM是如何判断对象是否可回收 2. 你知道有什么垃圾回收的常见算法吗? 3. 你知道有什么垃圾收集器吗? 4. 那你知道什么时候才会触发Full GC 5. JVM中四种引用你有了解过吗? 6. 说说你知道的几种主要的JVM参数 1.堆设置 2.收集器设置 3.并行收集器设置 4.并发收集器设置 5.JVM 调优的参数 总结 1. JVM是如何判断对象是否可回收 垃圾收集器在做垃圾回收的时候,首先需要判断一个对象是存活状态还是死亡状态,死亡的对象将会被标识为垃圾数据并等待收集器进行

  • 每日六道java新手入门面试题,通往自由的道路第二天

    目录 1. 你可以讲下你对String类有什么其他的了解吗? 2. == 和 equals 的区别 3. String s= new String("nz")创建了几个字符串对象? 4. 你可以讲下JVM的运行时数据区或者说内存结构吗? 5. 类加载过程 6. 而其中类加载器是什么,那有哪些呢? 总结 1. 你可以讲下你对String类有什么其他的了解吗? 在看String的源码过程中,可以发现String 内部实际存储结构为 char数组,在String中有几个比较重要的构造函数:

随机推荐