大数据开发面试题整理——java部分

  • (1) Java支持的数据类型有哪些?什么是自动拆装箱
    • ① Java支持8种基本数据类型:byte short int long float double boolean char
    • ② 自动装箱时Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化,即基本数据类型–>对象包装类型,比如int转化成Integer,反之就是自动拆箱
  • (2) Java的”一次编写,处处运行”是如何实现的?
    答案:Java程序会被编译成字节码组成的class文件,这些字节码可以运行在任何平台,因此Java是平台独立的。
  • (3) 说明一下public static void main(String args[])这段声明里每个关键字的作用
    答案:public: main方法是Java程序运行时调用的第一个方法,因此它必须对Java环境可见。所以可见性设置为pulic.
    • ① static: Java平台调用这个方法时不会创建这个类的一个实例,因此这个方法必须声明为static。
    • ② void: main方法没有返回值。
    • ③ String是命令行传进参数的类型,args是指命令行传进的字符串数组
  • (4) public static void写成static public void会怎样?
    程序正常编译及运行
  • (5) Java的访问修饰符是什么?
    答案:访问权限修饰符是表明类成员的访问权限类型的关键字。使用这些关键字来限定程序的方法或者变量的访问权限。它们包含:
    • ① public: 所有类都可以访问
    • ② protected: 同一个包内以及所有子类都可以访问
    • ③ private: 只有归属的类才能访问默认: 归属类及相同包下的子类可以访问
  • (6) 如果main方法被声明为private会怎样?
    答案:能正常编译,但运行的时候会提示”main方法不是public的”
  • (7) 如果去掉了main方法的static修饰符会怎样?
    答案:程序能正常编译。运行时会抛NoSuchMethodError异常
  • (8) 在System.out.println()里面,System, out, println分别是什么?
    答案:System是系统提供的预定义的final类,out是一个PrintStream对象,println是out对象里面一个重载的方法
  • (9) 你怎么理解变量?
    变量是一块命名的内存区域,以便程序进行访问。变量用来存储数据,随着程序的执行,存储的数据也可能跟着改变
  • (10) 声明变量和定义变量有什么不同?
    • ① 声明变量我们只提供变量的类型和名字,并没有进行初始化。
    • ② 定义包括声明和初始化两个阶段
  • (11) 静态变量和实例变量的区别
    • ① 静态变量属于类,不属于类的任何一个对象,在内存中有且只有一个拷贝
    • ② 实例变量必须依存某一个实例,需要创建对象才能进行访问
  • (12) 面向对象
    面向对象思想是一种编程思想, 它是基于面向过程的, 强调的是以对象为基础完成各种操作。
  • (13) 面向对象三大特征
    封装、继承、多态
    • 封装
      隐藏对象的属性的方法,仅仅提供公共的访问方式,提高了安全性和复用性.
      大白话:就是成员变量都用private修饰, 并提供对应的getXxx()和setXxx()方法, 除此以外, 都用public修饰.
    • 继承
      多个类中存在相同属性和行为时, 将这些内容抽取到单独的一个类中, 那么这多个类就无需再定义这些属性和行为了,只要继承那个类即可,这个关系就叫继承
      • 好处
        • a.提高了代码的复用性
        • b.提高了代码的可维护性
        • c.让类与类之间产生关系, 是多态的前提
      • 弊端
        • 让类与类之间产生了关系, 也就让类的耦合性增强了
        • 解释:
          开发原则: 高内聚, 低耦合.
          • 内聚: 指的是类自己独立完成某些事情的能力
          • 耦合: 指的是类与类之间的关系
      • 特征(注意):
        • Java中类与类之间只能单继承, 不能多继承.
          public class 类A extends 类B,类C { } //这种写法会报错
        • Java中类与类之间, 可以多层继承.
          public class A { }
          public class B extends A{ }
          public class C extends B{ } //这种写法可以
    • 多态
      多态指的是同一个事物(或者对象)在不同时刻表现出来的不同状态
      • 前提条件

        • a.要有继承关系
        • b.要有方法重写
        • c.要有父类引用指向子类对象
      • 多态中的成员访问特点(记忆

        • a. ★成员变量: 编译看左, 运行看左.

          • a)编译的时候, 看左边的数据类型有没有这个变量, 有不报错, 没有就报错.
          • b)运行的时候, 具体运行的是左边的数据类型里边的: 此变量.
            (如父类定义变量age,赋值age= 15 /相当于定义了一个常量/,子类继承父类赋值age= 30 新建对象,调用成员变量,打印age,其值为age= 15 )
        • b. ★成员方法: 编译看左, 运行看右.

          • a)编译的时候, 看左边的数据类型有没有这个方法, 有不报错, 没有就报错.
          • b)运行的时候, 具体运行的是右边的数据类型里边的: 此方法.
            (子类继承父类并进行方法重写,调用方法就是调用的子类重写后的方法)
        • c. 原因是因为: 方法有重写, 而变量没有

      • 好处和弊端

        • 好处:提高了程序的扩展性.
        • 弊端:父类引用不能访问子类的特有功能. 可通过向下转型来解决这个问题
  • (14) 所有类的父类是什么
    答案:Object
  • (15) 接口和抽象类的区别
    • ① 接口所有的方法隐含的都是抽象的,而抽象类则可以同时包含抽象和非抽象的方法
    • ② 类可以实现多个接口,但是只能继承一个抽象类
    • ③ 类如果要实现一个接口,必须实现接口所有的方法,但是类可以不实现抽象类所有的方法,当然在这种情况类也必须是抽象的
    • ④ 抽象类可以在不提供接口方法实现的情况下实现接口
    • ⑤ Java接口声明的变量默认都是final的,抽象类可以包含非final的变量
    • ⑥ Java接口中方法默认是public abstract的,而抽象类则没有这个限制
    • ⑦ 接口是绝对抽象的,不可被实例化,抽象类也不可以被实例化,但是如果它包含main方法是可以被调用的
  • (16) 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);其中有隐含的强制类型转换
  • (17) 重载和重写的区别,用自己的语言描述。
    • ① 方法重载:方法重载出现在同一个类中,两个方法的方法名相同,但两种方法的参数列表不同(参数个数,类型,顺序不同,类型不同是指对应位置的参数类型不同);
    • ② 方法重写:方法重写出现在子类继承父类方法的时候,子类需继承父类的方法,但需要将父类的方法进一步具体化,即加入自己特有的功能,通俗的讲就是在继承的基础上发扬光大,但本质不变,这里的本质指的是子类返回值的数据类型必须与父类保持一致。
  • (18) 构造器(constructor)是否可被重写(override)?
    不能,因为构造器不能被继承,所以不能被重写,但是可以被重载
  • (19) 是否可以继承String类
    不可以,因为string类是final类,不可以被继承
  • (20)String和StringBuilder、StringBuffer的区别?
    • ①相同点:都可以存储和操作字符串
    • ②不同点:String是只读字符串,String引用的字符串内容不能被改变,但是StringBuilder、StringBuffer类表示的字符串对象可以直接进行修改
      • StringBuilder是Java5中引入的,它比StringBuffer效率高,但是只能在单线程环境下使用
      • StringBuffer线程安全,StringBuilder线程不安全.因为StringBuffer所有公开的方法都是synchronized修饰
  • (21)多线程有几种实现方法,都是什么?哪一种方式比较优秀?同步有几种实现方法,都是什么?
    • ①多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
    • ②实现Runnable接口比较好,因为实现类可以实现多个接口,而只能继承一个类。
    • ③同步的实现方面有两种,分别是synchronized,wait与notify
  • (22)Synchronized与Lock的区别
    • ①Synchronized能实现的功能Lock都可以实现,而且Lock比Synchronized更好用,更灵活。
    • ②Synchronized可以自动上锁和解锁;Lock需要手动上锁和解锁
  • (23) 解释内存中的栈,堆,方法区的用法
    • ① 栈空间:定义基本数据类型,一个对象的引用,函数的调用都保存在栈空间
    • ② 堆空间:通过new关键字和构造器创建的对象则放在堆空间.
    • ③ 栈空间操作起来最快,但是栈空间小,通常大量的对象都是放在堆空间.
    • ④ 方法区和堆都是各个线程共享的内存区域,用于存储已经被JVM加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据;程序中的字面量(literal)如直接书写的100、"hello"和常量都是放在常量池中,常量池是方法区的一部分
  • (24) Final、Finally、Finalize
    • ① Final:是关键字,有三种用法,修饰类,修饰方法,修饰变量
    • ② Finally:表示一定会执行,是在异常的处理的时候使用的,用在 try…catch后面,使用它意味着无论是否有异常,都要执行Finally中的代码.
    • ③ Finalize:表示释放资源。GC垃圾回收
  • (25) finally里边的代码真的永远会执行吗?
    答:不是,当虚拟机终止时不执行,如当在程序中使用了System.exit(0) //终止JVM虚拟机
  • (26) Java中的final关键字有哪些用法?
    • ① 修饰类:表示类不能被继承
    • ② 修饰方法:表示方法不能被重写
    • ③ 修饰变量:表示变量只能赋值一次(常量)
  • (27) 列出一些你常见的运行时异常
    • ① ArithmeticException(算术异常)
    • ② ClassCastException (类转换异常)
    • ③ IllegalArgumentException (非法参数异常)
    • ④ IndexOutOfBoundsException (下标越界异常)
    • ⑤ NullPointerException (空指针异常)
    • ⑥ SecurityException (安全异常)
  • (28) List、Set、Map是否继承自Collection接口?
    • ① Map不是,Map是键值对映射容器
    • ② List和Set是,但是Set是不允许存在重复值得,LIst可以存在,List是线性结构的容器,适用于按照数值索引访问元素的情形.
  • (29) HashMap和HashTable区别
    • ① HashMap:线程不安全,key和value可以是null
    • ② HashTable:线程安全,key和value不可谓null
  • (30) TreeSet和HashSet区别
    • ① HashSet是采用hash表来实现的,其中的元素没有按顺序排列,add(),remove()和contains()方法都是复杂度为O(1)的方法
    • ② TreeSet是采用树结构实现(红黑树算法).元素是按顺序进行排列,但是add(),remove(),和contains()等方法都是复杂度为O(log n)的方法,它还提供了一些方法来处理排序的Set,如first(),last(),headSet(),tailSet()
  • (31) HashSet保证元素唯一性源码分析***(面试问题) ★★★★★
    通过源码我们发现HashSet集合保证元素的唯一性, 和下边这行代码相关:
//已知: HashSet中已经有了"hello", "world",  我们现在要往里边添加"world"

//hash: "world"的哈希值,  					key: "world"
//p.hash: 集合中已经存在的元素的哈希值		 k: 集合中的元素对象: "hello", "world"
   (	true       && (     false         ||  ( false  &&    )   )              
if (p.hash == hash && ((k = p.key) == key || ( key != null && key.equals(k)))){
    //走到这里, 说明是同一个元素, 不添加.
} else {
    //走这里, 说明不是同一个元素, 就添加.
}
  • 具体的判断流程:
  1. 判断两个对象(集合中已经存在的某个元素 和 要添加的元素)的哈希值是否相同
    哈希值相同: 说明可能是同一个元素, 程序继续往下执行
    哈希值不同: 说明不是同一个元素, 就添加
  2. 比较两个对象的地址值是否相同
    地址值相同: 说明是同一个元素, 不添加
    地址值不同: 说明可能不是同一个对象, 程序继续往下执行
  3. 判断要添加的元素是否为null
    如果为null: 不是同一个元素, 就添加
    如果不为null: 说明可能是同一个元素, 程序继续往下执行
  4. 比较对象的各个属性值是否相同
    如果相同: 说明是同一个元素, 不添加
    如果不同: 说明不是同一个元素, 就添加
问题: 为什么要设计的这么复杂呢? 直接通过equals()比较两个属性的属性值不就好了吗? 
答案: 确实可以这样设计, 但是效率比较低, 程序之所以写的这么繁琐, 就是为了降低调用equals()方法的次数, 从而实现 节约资源, 提高效率!
结论:HashSet保证元素的唯一性, 依赖hashCode()equals()方法
  • (32) Java中有几种类型的流?
    • ① 字节流:字节流继承于InputStream、OutputStream
    • ② 字符流:字符流继承于Reader、Writer
  • (33) == 和equals区别
    • ① == 如果比较的是基本数据类型,那么比较的是变量的值
    • ② == 如果比较的是引用数据类型,那么比较的是地址值(两个对象是否都指向同一块内存)
    • ③ equals 如果没有重写equals方法,比较的是两个对象的地址值,若重写方法后往往比较的是对象中属性内容
    • ④ equals方法是从Object类中继承的,默认的实现就是使用==
  • (34) Error和Exception的区别
    • ① 共同点:
      Exception和Error都继承自Throwable类,它是异常处理机制的基本组成类型.Exception和Error体现了java这门语言对于异常处理的两种方式.
    • ② 不同点:
      • Exception是java程序运行中可预知的异常情况,分为两种:运行时异常(运行时会报错,runtimeException)和编译时异常(ideal编程时会报红),可获取到这些异常,并且对这些异常进行业务外的处理,可以被抛出(throw)或者抓取(try,catch).
      • Error是Java程序中不可预料的异常情况,这种异常发生后会直接导致JVM不可处理或者不可恢复的情况.所以这种异常不可能抓取到,比如OutOfMemoryError,NoClassDefoundError等.
  • (35) while循环和do循环有什么不同?
    答案:while结构在循环的开始判断下一个迭代是否应该继续。do/while结构在循环的结尾来判断是否将继续下一轮迭代。do结构至少会执行一次循环体
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值