大数据开发java面试题

java基本概念

1.如果main方法被声明为private会怎样?

能正常编译,但运行的时候会提示”main方法不是public的”。

2.Java里的传引用和传值的区别是什么?

传引用是指传递的是地址而不是值本身,传值则是传递值的一份拷贝。

引用作为实参能被修改,传值则不影响原来的值

3.Java的”一次编写,处处运行”是如何实现的?

Java程序会被编译成字节码组成的class文件,这些字节码可以运行在任何平台,因此Java具有跨平台性。

4.说明一下public static void main(String args[])这段声明里每个关键字的作用

public: main方法是Java程序运行时调用的第一个方法,因此它必须对Java环境可见。所以可见性设置为pulic.

static: Java平台调用这个方法时不会创建这个类的一个实例,因此这个方法必须声明为static。

void: main方法没有返回值。

String是命令行传进参数的类型,args是指命令行传进的字符串数组。

5.如果去掉了main方法的static修饰符会怎样?

程序能正常编译。运行时会抛NoSuchMethodError异常。

6.什么是Java API?

是Java库,并且可以像使用软件的构建块一样使用它,从而可以加快开发速度.

7.为什么Java里没有全局变量?

局变量是全局可见的,Java不支持全局可见的变量,因为:全局变量破坏了引用透明性原则。全局变量导致了命名空间的冲突

8.在System.out.println()里面,System, out, println分别是什么?

System是系统提供的预定义的final类,out是一个PrintStream对象,println是out对象里面一个重载的方法。

9.Java是如何处理整型的溢出和下溢的?

Java根据类型的大小,将计算结果中的对应低阶字节存储到对应的值里面。

10.public static void写成static public void会怎样?

程序正常编译及运行。

11.声明变量和定义变量有什么不同?

声明变量我们只提供变量的类型和名字,并没有进行初始化。

定义包括声明初始化两个阶段

12.你怎么理解变量?

变量是一块命名的内存区域,以便程序进行访问。变量用来存储数据,随着程序的执行,存储的数据也可能跟着改变。

类型转换、进制、运算符

1.什么是隐式的类型转化?显式的类型转化是什么?

隐式的类型转化就是简单的一个类型赋值给另一个类型,没有显式的告诉编译器发生了转化。并不是所有的类型都支持隐式的类型转化。

显式的类型转化是明确告诉了编译器来进行对象的转化。

long i = 700.20;
int j = (int) i; //Explicit casting

2.数值提升是什么?

数值提升是指数据从一个较小的数据类型转换成为一个更大的数据类型,以便进行整型或者浮点型运算。

在数值提升的过程中,byte,char,short值会被转化成int类型。需要的时候int类型也可能被提升成long。long和float则有可能会被转换成double类型。

3.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

short+1是int,需要强转,可以用s1+=1;

3.用最有效率的方法算出2乘以8等於几?

2 << 3

流程控制和循环

1.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

JDK1.7之前,只能用byte short int char

jdk1.7后,整型,枚举类型,boolean,字符串都可以

2.while循环和do循环有什么不同?

while是先判断再执行循环体,do是至少会执行一次循环体。

一般判断条件先依赖循环体就使用do,do和判断有逻辑上的先后

数组

1.怎么判断数组是null还是为空?

输出array.length的值,如果是0,说明数组为空。如果是null的话,会抛出空指针异常。

2.数组有没有length()这个方法? String有没有length()这个方法?

数组没有length()这个方法,有length的属性。

关键字

1.final, finally, finalize的区别

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以重写此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

2.Java的访问修饰符是什么?

访问权限修饰符是表明类成员的访问权限类型的关键字。使用这些关键字来限定程序的方法或者变量的访问权限。它们包含:

public: 所有类都可以访问

protected: 同一个包内以及所有子类都可以访问

private: 只有归属的类才能访问

default: 归属类及相同包下的子类可以访问

3.transient变量有什么特点?

transient变量不会进行序列化。

例如一个实现Serializable接口的类在序列化到ObjectStream的时候,transient类型的变量不会被写入流中,同时,反序列化回来的时候,对应变量的值为null。

面向对象

1.如果要重写一个对象的equals方法,还要考虑什么?为什么?

hashCode。

hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值,返回该对象的哈希码值

在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数

如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。当重写equals时,需要判断实际意义上的相等就需要为不相等的对象生成不同整数结果可以提高哈希表的性能。

HashMap对象是根据其Key的hashCode来获取对应的Value。
在重写父类的equals方法时,也重写hashcode方法,使相等的两个对象获取的HashCode也相等,这样当此对象做Map类中的Key时,两个equals为true的对象其获取的value都是同一个,比较符合实际。

2.==与equals的区别

==:

​ 基本数据类型比较的是值。image-20210318112327075

​ 引用数据类型比较的是引用,即内存地址

equals:

​ 是object中的方法,如果不进行重写的话,比较的也是引用的地址值,实际和==一样

​ 如果子类重写则按照子类重写规则判断对象是否相等

String, BitSet, Date, 和File都对equals方法进行了重写,对两个String对象 而言,值相等意味着它们包含同样的字符序列。对于基本类型的包装类来说,值相等意味着对应的基本类型的值一样。

3.面向对象编程的原则是什么?

封装继承多态

封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。便于外界调用,从而提高系统的可扩展性、可维护性、安全性。

封装的基本要求

  1. 把所有的属性私有化。
  2. 对每个属性提供 gettersetter 方法。
  3. 如果有一个带参的构造函数的话,那一定要写一个不带参的构造函数。
  4. 建议重写 toString 方法,但这不是必须的。

继承:是对有着共同特性的多类事物,进行再抽象成一个类。

  • 提高代码的复用性

  • 提高代码的扩展性

  • 类与类之间产生了关系,是学习多态的前提

多态:相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。

有两种多态的机制:编译时多态、运行时多态

4.介绍下继承的原则

继承使得一个对象可以获取另一个对象的属性。使用继承可以让已经测试完备的功能得以复用,并且可以一次修改,所有继承的地方都同时生效。

5.静态变量在什么时候加载?编译期还是运行期?静态代码块加载的时机呢?

当类加载器将类加载到JVM中的时候就会创建静态变量,这跟对象是否创建无关。

静态变量加载的时候就会分配内存空间。静态代码块的代码只会在类第一次初始化的时候执行一次。一个类可以有多个静态代码块,它并不是类的成员,也没有返回值,并且不能直接调用。

静态代码块不能包含this或者super,它们通常被用初始化静态变量。

6.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

方法的重写Override和重载Overload是Java多态性的不同表现。

重写Override是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Override)。

如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overload)。Overload的方法是可以改变返回值的类型。

7.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

都不可

8.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?

接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。

9.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。

而按共享传递其实只是按值传递的一个特例罢了。所以我们可以说Java的传递是按共享传递,或者说Java中的传递是值传递。

  • 按共享传递,是指在调用函数时,传递给函数的是实参的地址的拷贝(如果实参在栈中,则直接拷贝该值)。在函数内部对参数进行操作时,需要先拷贝的地址寻找到具体的值,再进行操作。如果该值在栈中,那么因为是直接拷贝的值,所以函数内部对参数进行操作不会对外部变量产生影响如果原来拷贝的是原值在堆中的地址,那么需要先根据该地址找到堆中对应的位置,再进行操作。因为传递的是地址的拷贝所以函数内对值的操作对外部变量是可见的。

简单点说,Java中的传递,是值传递,而这个值,实际上是对象的引用。

基本java类

1.String 和StringBuffer/StringBuilder的区别

简单地说,就是一个变量和常量的关系

StringBuffer对象的内容可以修改;而String对象一旦产生后就不可以被修改

具体的内部实现方式和字符串不同:

String对象每次修改都会在元空间开辟新的内存,而StringBuilder对象在修改时不会生成新的对象,在内存使用上要优于串型。

常用方法append,deleteCharAt,insert,reverse

2.GregorianCalendar类是什么东西?

GregorianCalendar提供了西方传统日历的支持。

3.ResourceBundle类是什么?

ResourceBundle用来存储指定语言环境的资源,应用程序可以根据运行时的语言环境来加载这些资源,从而提供不同语言的展示。

4.如何将String类型转化成Number类型?

Integer类的valueOf方法可以将String转成Number

String numString =1000;
int id=Integer.valueOf(numString).intValue();

5.SimpleTimeZone类是什么?

SimpleTimeZone提供公历日期支持。

6.String s = new String(“xyz”);创建了几个String Object?

两个对象,一个是"xyx",一个是指向"xyx"的引用对象s。

7.Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;

在数轴上取值最接近的整数,中间值(0.5)向右取。

异常

1.给我一个你最常见到的runtime exception。

ArithmeticException,数学运算异常

ArrayStoreException,

BufferOverflowException,

BufferUnderflowException,

CannotRedoException,

CannotUndoException,

ClassCastException, 类归属异常

CMMException,

ConcurrentModificationException,

DOMException,

EmptyStackException,

IllegalArgumentException,非法参数异常

IllegalMonitorStateException,

IllegalPathStateException,

IllegalStateException,

ImagingOpException,

IndexOutOfBoundsException,数据越界异常

MissingResourceException,

NegativeArraySizeException,

NoSuchElementException,

NullPointerException, 空指针异常

ProfileDataException,

ProviderException,

RasterFORMatException,

SecurityException,

SystemException,

UndeclaredThrowableException,

UnmodifiableSetException,

UnsupportedOperationException

2.error和exception有什么区别?

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。

exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

exception包括受检/非受检异常

3.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

会执行,在return前执行。

内部类、注解

多线程与并发

1.多线程有几种实现方法,都是什么?哪一种方式比较优秀?同步有几种实现方法,都是什么?如何选择?

线程有四种实现方式:继承Thread类,实现Runnable接口,实现Callable接口,创建线程池

前两种没有返回值,因为重写run是void。后两种有返回值,因为实现call返回Object。

Thread类 使用简单,但只能单继承一般不用

Runnable可以继承其他类,同一实现接口的实例可以通信,但代码较复杂

Callable可以获取异步任务的返回值

线程池能实现自动化装配,提高响应速度,降低资源消耗,便于线程管理。常采用这种实现

同步有两种实现方式:synchronized修饰方法,synchronized关键字修饰的语句块(同步代码块),重入锁Lock接口。

image-20210318110654119

2.方法可以同时即是static又是synchronized的吗?

可以。如果这样做的话,JVM会获取和这个对象关联的java.lang.Class实例上的锁。这样做等于:

synchronized(XYZ.class) {
}

3.怎么理解什么是同步?

同步用来控制共享资源在多个线程间的访问,以保证同一时间内只有一个线程能访问到这个资源。

在非同步保护的多线程程序里面,一个线程正在修改一个共享变量的时候,可能有另一个线程也在使用或者更新它的值。同步避免了脏数据的产生。

4.sleep() 和 wait() 有什么区别?

sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;

sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;

wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态;

5.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

一个线程在访问一个对象的同步方法时,另一个线程可以同时访问这个对象的非同步方法

一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个对象的其他同步方法

一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个同步方法。

6.Java自带哪几种线程池?

7.什么是分布式锁

8.什么是分布式事务

泛型与集合

1.说出ArrayList,Vector, LinkedList的存储性能和特性

ArrayList和Vector都是使用数组方式存储数据,具有索引元素快而元素修改慢的特性。

ArraryList数组元素大于实际储存的数据1.5倍,Vector数组元素大于实际储存的数据1.5倍,以便于增加和插入元素。

因为是数据结构所以允许按照索引寻找元素,但是因为数据组是一片连续的内存空间,插入、删除等修改操作 反而慢。Vector由于使用了synchronized的方法,通常性能比Arraylist差。

LinkedList使用双向链表实现存储,具有修改元素快,而查找慢的特性。

按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

2.HashMap和Hashtable的区别

3.Collection 和 Collections的区别。

Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。

Collection是个java.util下的接口,它是各种集合结构的父接口。

4.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

4.HashMap底层源码,数据结构

IO流

1.java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类

字节流,字符流。字节流继承与inputStream/outputStream,字符流继承于inputStreamReader/outputSteamWriter

2.为什么不用 Java 的序列化?

Java 的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带 很多额外的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。所以, hadoop 自己开发了一套序列化机制(Writable),精简、高效。

网络编程

反射

1.什么是反射API?它是如何实现的?

新特性

JDBC

JVM

1.程序中可以允许多个类同时拥有都有main方法吗?

可以。当程序运行的时候,我们会指定运行的类名。JVM只会在你指定的类中查找main方法。因此多个类拥有main方法并不存在命名冲突的问题。

2.简单的介绍下JVM是如何工作的?

JVM是一台抽象的计算机,就像真实的计算机那样,它们会先将.java文件编译成.class文件(.class文件就是字节码文件),然后用它的解释器来加载字节码。

3.JVM自身会维护缓存吗,是不是在堆中进行对象分配,操作系统的堆还是JVM自己管理的堆?为什么?

是的,JVM自身会管理缓存,它在堆中创建对象,然后在栈中引用这些对象。

4.虚拟内存是什么?

虚拟内存又叫延伸内存,利用硬盘扩展内存,实际上并不存在真实的物理内存。

5.GC是什么? 为什么要有GC? (基础)。

GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:

System.gc()

Runtime.getRuntime().gc()

其他真题

大数据岗位必知必会的53个Java基础

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值