大数据面试之Java面试题

时间:2025-02-17 07:17:43

Java的基本数据类型

byte

int

short

long

double

float

Boolean

char

什么是面向对象

面向对象是一种思想,是面向过程而言的,将功能封装到对象之中,让对象去实现具体的目的.比如说我想倒水,可以将倒水的操作封装到对象中,通过创建对象来实现倒水的操作.使得操作更加便捷.

面向对象的三大特性:封装,继承,多态

  • 封装:隐藏对象的属性的方法,仅仅提供公共的访问方式,提高了安全性和复用性.

  • 继承:将两者事物之间存在关联性的,继承的类可以从被继承的类中获得一些属性和方法,这样可以提高代码的复用性.继承是多态的前提.

    注:
    ①子类中所有的构造函数都会默认访问父类中的空参数的构造函数,默认第一行有super();若无空参数构造函数,子类中需指定;另外,子类构造函数中可自己用this指定自身的其他构造函数。

  • 多态:父类或者接口的引用指向了子类对象,这样提高了程序的扩展性(父类引用不能访问子类中成员的特有方法和属性)

short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?

s1 = s1 + 1不正确,因为1是int类型,s1+1也是int类型,赋值给s1需要进行强转才能生效.所以错误

s1 += 1正确,因为s1+= 1;相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换.

解释内存中的栈,堆,方法区的用法

  • 栈空间:定义基本数据类型,一个对象的引用,函数的调用都保存在栈空间
  • 堆空间:通过new关键字和构造器创建的对象则放在堆空间.
  • 栈空间操作起来最快,但是栈空间小,通常大量的对象都是放在堆空间.
  • 方法区和堆都是各个线程共享的内存区域,用于存储已经被JVM加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据;程序中的字面量(literal)如直接书写的100、"hello"和常量都是放在常量池中,常量池是方法区的一部分

构造器(constructor)是否可被重写(override)?

不能,因为构造器不能被继承,所以不能被重写,但是可以被重载.

是否可以继承String类

不可以,因为string类是final类,不可以被继承.

String和StringBuilder、StringBuffer的区别?

  • 相同点:都可以存储和操作字符串

  • 不同点:String是只读字符串,String引用的字符串内容不能被改变,但是StringBuilder、StringBuffer类表示的字符串对象可以直接进行修改.

    • StringBuilder是Java5中引入的,它比StringBuffer效率高,但是只能在单线程环境下使用
    • StringBuffer线程安全,StringBuilder线程不安全.因为StringBuffer所有公开的方法都是synchronized修饰

重载和重写的区别

都是实现多态的方式,但是重载是编译时的多态性,重写实现的是运行时的多态性,重载发生在一个类中.同名方法如果有不同的参数列表(参数类型不一样,参数个数不一样或者两者都不一样)则视为重载.

重写发生在父类与子类之间重写要求子类重写方法与父类被重写方法的返回类型一致.

静态变量和实例变量的区别

  • 静态变量属于类,不属于类的任何一个对象,在内存中有且只有一个拷贝
  • 实例变量必须依存某一个实例,需要创建对象才能进行访问.

Java 中的final关键字有哪些用法?

  • 修饰类:表示类不能被继承
  • 修饰方法:表示方法不能被重写
  • 修饰变量:表示变量只能赋值一次(常量)

列出一些你常见的运行时异常?

  • ArithmeticException(算术异常)
  • ClassCastException (类转换异常)
  • IllegalArgumentException (非法参数异常)
  • IndexOutOfBoundsException (下标越界异常)
  • NullPointerException (空指针异常)
  • SecurityException (安全异常)

List、Set、Map是否继承自Collection接口?

Map不是,Map是键值对映射容器

List和Set是,但是Set是不允许存在重复值得,LIst可以存在,List是线性结构的容器,适用于按照数值索引访问元素的情形.

Java中有几种类型的流?

  • 字节流:字节流继承于InputStream、OutputStream
  • 字符流:字符流继承于Reader、Write

Final、Finally、Finalize

  • Final:是关键字,有三种用法,修饰类,修饰方法,修饰变量
  • Finally:是在异常的处理的时候使用的,用在 try…catch后面,使用它意味着无论是否有异常,都要执行Finally中的代码.
  • Finalize:Object类中定义的方法,在垃圾收集器将对象从内存中清除出去之前做的必要工作,

==和Equals区别

  • == 如果比较的是基本数据类型,name比较的是变量的值
  • == 如果比较的是引用数据类型,那么比较的是地址值
  • Equals如果没有重写equals方法,比较的是两个对象的地址值
  • Equals如果重写了equals方法,那么比较的是对象中属性值得内容.

Synchronized与Lock的区别

  • Synchronized能实现的功能Lock都可以实现,而且Lock比Synchronized更好用,更灵活。
  • Synchronized可以自动上锁和解锁;Lock需要手动上锁和解锁

说说你所熟悉或听说过的设计模式以及你对设计模式的看法

23种设计模式,包括:AbstractFactory(抽象工厂模式),Builder(建造者模式),Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式);Facade(门面模式),Adapter(适配器模式),Bridge(桥梁模式),Composite(合成模式),Decorator(装饰模式),Flyweight(享元模式),Proxy(代理模式);Command(命令模式),Interpreter(解释器模式),Visitor(访问者模式),Iterator(迭代子模式),Mediator(调停者模式),Memento(备忘录模式),Observer(观察者模式),
State(状态模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibility(责任链模式)。自己任意选择几个模式说

个人答案:Builder(建造者模式),Singleton(单例模式),Observer(观察者模式),Template Method(模板方法模式)

看法:设计模式就是一套被反复使用的代码设计经验的总结.使用设计模式可以提高代码的复用性,让代码更容易被他人理解.保证代码的可靠性.设计模式就是对面向对象的编程原则的实践

面向对象编程原则包括

  • 单一职责原则:高内聚低耦合是面向对象的原则,一个类只做一件事情,让每个类专注做一件事情,功能单一.方便各个类之间*组合.
  • 开闭原则:对扩展开放,对修改关闭.
  • 依赖倒转原则:面向接口编程.
  • 里氏替换原则:任何时候都可以用子类类型替换父类类型,能用父类类型的地方就可以用子类类型
  • 接口隔离原则:接口也要高内聚,低耦合,要小而专.
  • 合成聚合复用原则:优先使用聚合或者合成关系复用代码
  • 迪米特法则:迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解.也是低耦合的实现.

大数据开发中你会用到什么设计模式

  • 模板方法设计模式:提供一个抽象类,将部分逻辑以具体方法或者构造器的形式实现,然后声明一些抽象方法迫使子类实现剩余的逻辑.
  • 工厂模式:工厂类根据条件生成不同的子类实例,这些子类有一个公共的抽象父类且实现了相同的方法,但是这些方法针对不同数据进行不同的操作(多态方法),得到子类的实例之后,开发人员可以调用基类中的方法而不需要考虑到底返回的是哪一个子类的实例