面试问答-更新

 1.equals和==的区别?什么时候应该用equals,什么时候用==?

基本数据类型中,==和equals都是比较值,通常我们用==;

引用数据类型中,“==”是指对内存地址进行比较 , 重写了equals()方法后是对字符串的内容进行比较

2.重写与重载

方法重载:

发生在同一个类中,方法名相同,参数列表不同
1、同一个类中
2、方法名相同,参数列表不同(参数顺序、个数、类型)
3、方法返回值、访问修饰符任意
4、与方法的参数名无关

方法重写:

发生在父子类中

两同两小一大:方法名相同,参数列表相同;子类的返回值小于父类,子类抛出的异常小于父类;子类的访问权限大于父类.

方法名相同,参数列表相同
1、有继承关系的子类中
2、方法名相同,参数列表相同(参数顺序、个数、类型),方法返回值相同
3、访问修饰符,访问范围需要大于等于父类的访问范围
4、与方法的参数名无关

区别点       重载方法         重写方法
参数列表     必须修改         一定不能修改
返回类型     可以修改         一定不能修改
异常         可以修改         可以减少或删除,一定不能抛出新的或者更广的异常
访问         可以修改         一定不能做更严格的限制(可以降低限制)

3.被static修饰的变量有什么特性?

1.什么时候需要加static:当一个方法或者变量需要初始化加载,或者是经常被调用的.
2.类中被static修饰的变量在类的方法中可以使用类名调用、self调用、static调用
3.类中被static修饰的方法,同样可以使用类名调用、self调用、static调用
4.类中被static修饰的方法,在外部可以直接使用类名进行调用。
5.static变量和普通变量的区别在于非静态全局变量的作用域不同

4.StringBuilder和StringBuffer有什么区别?

StringBuffer 和 StringBuilder 都是两种字符串处理类、StringBuffer是线程安全的、StringBuilder不是线程安全的
StringBuffer线程安全,但是内存开销比较大;
StringBuilder线程不安全,但是内存开销比较小;

5.try catch finally,如果try里有return,finally还执行吗?

不管有木有出现异常,finally块中代码都会执行;

6.spring架构的分层?每层的职责是什么?

Controller,Service和Repository
控制,服务,连接数据源

7.查询线程使用情况

1.查看线程pid,可以使用top命令:
     top

2.使用jstack命令dump线程信息(需使用启动当前线程的用户下执行该命令)
     jstack 1221 > dump1

3.统计所有线程都处于什么状态:
     grep java.lang.Thread.State dump1 | awk '{print $2$3$4$5}' | sort | uniq -c
     8 RUNNABLE
     2 WAITING(onobjectmonitor) 

8.Tomcat了解吗

9.讲讲你对Spring的理解?

Spring以IoC、AOP为主要思想,其中IoC,Inversion of Control 指控制反转或反向控制。在Spring框架中我们通过配置创建类对象,由Spring在运行阶段实例化、组装对象。
AOP,Aspect Oriented Programming,面向切面编程,其思想是在执行某些代码前执行另外的代码,使程序更灵活、扩展性更好,可以随便地添加、删除某些功能。Servlet中的Filter便是一种AOP思想的实现。 
Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
即Spring在JavaEE的三层架构[表现层(Web层)、业务逻辑层(Service层)、数据访问层(DAO层)]中,每一层均提供了不同的解决技术。如下:
• 表现层(Web层):Spring MVC
• 业务逻辑层(Service层):Spring的IoC
• 数据访问层(DAO层):Spring的jdbcTemplate

10.Redis的理解

1、Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted
set:有序集合)。

2、集群模式和哨兵模式的区别
哨兵模式监控权交给了哨兵系统,集群模式中是工作节点自己做监控哨兵模式发起选举是选举一个leader哨兵节点来处理故障转移,集群模式是在从节点中选举一个新的主节点,来处理故障的转移.

11.分布式锁实现的三种方式:


1. 基于数据库实现分布式锁;
2. 基于缓存(Redis等)实现分布式锁;
3. 基于Zookeeper实现分布式锁;

12.简述static和final的用法?

static:修饰属性,方法,代码块

(1)静态属性:也可叫类变量  类名.属性名  来访问

       (共有的类变量与对象无关,只和类有关)

   注意:类中的实例变量是在创建对象时被初始化的,被static修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,类加载的过程是进行一次。也就是类变量只会被创建一次。

(2)静态方法:类名.方法名  直接访问  

   注意:static修饰的方法,不能直接访问本类中的非静态(static)成员(包括方法和属性)

本类的非静态方法可以访问本类的静态成员(包括方法和属性),可以调用静态方法。

修饰变量,方法,类

final:修饰变量,类,方法

(1)修饰变量

   被fianl修饰的成员变量就是常量(常量名大写),一旦赋值不能改变  

   修饰局部变量:修饰基本数据类型 -> 变量的值不能改变

                 修饰引用 -> 引用只能指向固定的对象

   修饰实例变量:默认值不生效,可以再赋值

(2)修饰方法 :不能被子类覆盖 

(3)修饰类:不能被继承 

    在一个final类中的所有方法,默认都是final的

  注意:final,不能用来修饰构造方法。
 

13.写出冒泡排序的算法
for(int i=0;i<arr.length-1;i++){ //控制轮数

  for(int j=0;j<arr.length-1-i;j++){ //控制每一轮的次数

    if(arr[j]>arr[j+1]){ //每次都是和它下一个元素比

           int t=arr[j];

           arr[j]=arr[j+1];

           arr[j+1]=t;

         }

  }

}
 

14.abstract class 和 interface 有什么区别?

1.相同点

  A. 两者都是抽象类,都不能实例化。

  B. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。

2. 不同点

  A. interface需要实现,要用implements,而abstract class需要继承,要用extends。

  B. 一个类可以实现多个interface,但一个类只能继承一个abstract class。

  C. interface强调特定功能的实现,而abstract class强调所属关系。

  D. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。

15.类有哪三个基本特性?各特性的优点?
类具有封装性、继承性和多态性。

封装性:类的封装性为类的成员提供公有、默认、受保护和私有等访问权限,目的是隐藏类中的私有变量和类中方法的实现细节。

继承性:允许通过继承原有类的某些特性或全部特性而产生全新的类,原有的累称为父类,产生的新类称为子类。子类不仅可以直接继承父类的共性,而且也可以创建它特有的个性。

多态性:是指在基类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同行为,多态性有两种表现形式:重载和重写。

16.Error和Exception有什么区别? 列出你见过的Exception并简要说明


error表示系统级的错误和程序不必处理的异常,

是恢复不是不可能但很困难的情况下的一种严重问题;

比如内存溢出,不可能指望程序能处理这样的情况;

exception表示需要捕捉或者需要程序进行处理的异常,

是一种设计或实现问题;也就是说,它表示如果程序运行正常,

从不会发生的情况。 常见异常有: NullPointerException:

当操作一个空引用时会出现此错误。 NumberFormatException:

数据格式转换出现问题时出现此异常。 ClassCastException:

强制类型转换类型不匹配时出现此异常。 ArrayIndexOutOfBoundsException:

数组下标越界,当使用一个不存在的数组下标时出现此异常。
 

17. java中会存在内存泄露吗?请简单描述。
内存泄露是指系统中存在无法回收的内存,

有时候会造成内存不足或系统崩溃。Java存在内存泄露。

Java中的内存泄露是指:存在无用但是垃圾回收器无法回收的对象。

而且即使有内存泄露问题存在,也不一定会表现出来。

自己实现堆栈的数据结构时有可能会出现内存泄露。

18.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
答:多线程有两种实现方法:继承Thread类或者实现Runnable接口。

实现同步也有两种方法:一种是同步方法,另一种是同步代码块。

同步方法是在方法返回类型前面加上synchronized关键字

同步代码块是synchronized (这里写需要同步的对象){...}

19.sleep()和wait()有什么区别?
不同点:

1. Thread类的方法:sleep(),yield()等

Object的方法:wait()和notify()等

2.每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。

sleep方法没有释放锁,

wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

3.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用

4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
 

20.谈谈java跟你所知道的其它的语言相比,有什么优点?


Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
Java是功能完善的通用程序设计语言,可以用来开发可靠的、要求严格的应用程序。
java是纯面向对象开发,功能强大,分支众多,没有java不能做的软件。C/S也好B/S也好。从功能上讲,没有语言可以和java相比。

C是面向过程编程的,这样往往会导致所谓的单一程序,既所有的功能只能包含在几个(通常是一个)代码模块中。当然,C语言也有自身的不足,比如:C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数族下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。

21. 谈谈你对面向对象的理解?


   所谓的面向对象就是将我们的程序模块化,对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面,这就是封装。封装是我们所说的面相对象编程的特征之一。除此之外还有继承和多态。继承有点类似与我们生物学上的遗传,就是子类的一些特征是来源于父类的,儿子遗传了父亲或母亲的一些性格,或者相貌,又或者是运动天赋。面向对象里的继承也就是父类的相关的属性,可以被子类重复使用,子类不必再在自己的类里面重新定义一回,父类里有我们只要拿过来用就好了。而对于自己类里面需要用到的新的属性和方法,子类就可以自己来扩展了。当然,会出现一些特殊情况,就是我们在有一些方法在父类已经定义好了,但是子类我们自己再用的时候,发现,其实,我们的虽然都是计算工资的,但是普通员工的工资计算方法跟经理的计算方法是不一样的,所以这个时候,我们就不能直接调用父类的这个计算工资的方法了。这个时候我们就需要用到面向对象的另一个特性,多态。我们要在子类里面把父类里面定义计算工资的方法在子类里面重新实现一遍。多态包含了重载和重写。重写很简单就是把子类从父亲类里继承下来的方法重新写一遍,这样,父类里相同的方法就被覆盖了,当然啦,你还是可以通过super.方法来调用父类的工资计算方法。而重载就是类里面相同方法名,不同形参的情况,可以是形参类型不同或者形参个数不同,或者形参顺序不同,但是不能使返回值类型不同。

22.简单讲一下java的跨平台原理


  java源程序(.java文件)通过编译器编译成为Class文件(字节码文件),而它的class文件是基于字节码(以byte为单位存储的文件)的,而字节码文件是描述程序要运行的的虚指令的集合,这些虚指令的集合与任何的平台无关,Java虚拟机认识它(只要在不同的平台下部署相应的jre,运行jvm!就可以了)

23. 有了基本数据类型,为什么还需要包装类型?
我们知道Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。

另外,当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的包装器类了。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曲悦丹田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值