1.java基础面试题-日月积累

1.1.java基础

1.1.1:java基本数据类型及包装类?

	基本数据类型:   
	  		整型:byte short int long
	        浮点型:float double
	        字符型:char
	        逻辑型:boolean
	包装类:
	Byte Short Integer Long Float Double Character Boolean

1.1.2:重载和重写的区别?

重载: 发生在同一个类中,方法名必须相同,参数类型、个数、顺序不同,与返回值类型,访问修饰符无关,发生在编译时。
重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类, 访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。

1.1.3:IOC和AOP区别

IOC控制反转,像我们之前开发,如果想创建一个对象,就new一个,如果想这个对象中定义其他的变量或者对象,就在对象内部创建一个成员变量。但是现在的话,如果想用这个类的对象,咱们可以在spring的配置文件中配置一个bean,指定对应的全路径名称。

AOP执行过程是一个纵向的过程,把每个方法当作一个点.基于这些点可以进行增强处理.形成了横向的切面,包含了原有方法和增强方法.不改变原有代码结构,还添加了额外的功能

1.1.4 String StringBuffer和StringBuilder的区别?

String:字符串常量,字符串长度不可变。Java中String 是(不可变)的。用于存放字符的数组被声明为final的,因此只能赋值一次,不可再更改。

StringBuffer:字符串变量(Synchronized,即线程安全)。如果要频繁对字符串内容进行修改,考虑效率的话最好使用 StringBuffer,如果想转成 String 类型,可以调用 StringBuffer 的 toString() 方法。Java.lang.StringBuffer 线程安全的可变字符序列。在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。

StringBuilder:字符串变量(非线程安全)。在内部 StringBuilder 对象被当作是一个包含字符序列的变长数组。
基本原则:
如果不是在循环体中进行字符串拼接的话,直接使用 String 的 “+” 就好了;
单线程循环中操作大量字符串数据 → StringBuilder.append();
多线程循环中操作大量字符串数据 → StringBuffer.append();
S
tring:字符串常量
StringBuffer:字符串变量(有同步锁)
StringBuilder:字符串变量(无同步锁)

1.1.5 @Autowired和@Resource的区别

@Autowired默认的是按照类型进行注入, 如果没有类型会按照名称注入
@Resource(name=”value”) 默认的会按照名称注入,名称找不着会按照类型来找,如果写了名称的话,就直接按照名称找了不会按类型找

1.1.6:== 和equals?

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)

equals(): 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于调用了Object类的equals() 方法,也就是通过“==”比较这两个对象。

情况2:类覆盖了 equals() 方法。一般,我们都会覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

1.1.7:final、finally、finalize 的区别?

final是一个安全修饰符,就是用final修饰的类不能被继承,用final声明的方法不能被重写,使用final声明的变量就相当于常量,不能被修改。
finally是在异常里经常用到的,就是try和cach里的代码执行完以后,必须要执行的方法,我们经常在finally里写一些关闭资源的方法,关闭IO流什么的,就算是try和catch里有return代码,也会执行finally里的内容的。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以被垃圾回收。

1.1.8:抽象类和接口的区别?

相同点:都不能被实例化,都可以定义抽象方法
不同点:
接口使用iterface声明,抽象类使用abstract class 声明。
jdk1.7之前接口中声明的所有方法都是public 的抽象方法(没有方法体);jdk1.8后接口中可以声明默认/静态方法; 抽象类中不仅可以声明抽象方法还可以声明普通方法(带有方法体)
接口里定义的变量只能是公共的静态的常量,抽象类中可以声明常量跟变量
接口中不能声明构造器,抽象类中可以声明构造器(用于被子类调用)
从设计层面来说,抽象是对类的抽象,是一种模板设计(抽象类型),接口是行为的抽象,是一种行为的规范(抽象功能)。

1.1.9:抽象类和普通类的区别?

 a.抽象类 和 接口 都是用来抽象具体对象的. 但是接口的抽象级别最高
 b.抽象类可以有具体的方法 和属性, 接口只能有抽象方法和不可变常量
 c.抽象类主要用来抽象类别,接口主要用来抽象功能.
 d.抽象类中,且不包含任何实现,派生类必须覆盖它们。接口中所有方法都必须 是未实现的。
 e.接口是设计的结果 ,抽象类是重构的结果

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

静态变量:独立存在的变量,只是位置放在某个类下,可以直接类名加点调用静态变量名使用。并且是项目或程序一启动运行到该类时就直接常驻内存。不需要初始化类再调用该变量。用关键字static声明。静态方法也是同样,可以直接调用。
实例变量:就是相当于该类的属性,需要先初始化该类,就是new 该类后,才可以调用。但是该类未被再次使用,被垃圾回收器回收后,该实例也将不存在了,就是不在内存中了。

1.1.11: java类加载机制

验证:确保被加载的类的正确性
准备:为类的静态变量分配内存,并将其设置为默认值
解析:将类中的符号引用转换为直接引用
初始化:顺序执行静态代码,即为类的静态变量赋予正确的初始值以及执行静态代码块

1.1.12:面向对象的特征有哪些方面?

抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两
方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义
的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。

继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超
类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。

多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当 A 系统访问 B 系统提供的服务时,B 系统有多种提供服务的方式,但一切对 A 系统来说都是透明的(就像电动剃须刀是 A 系统,它的供电系统是 B 系统,B 系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A 系统只会通过 B 类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。

1.1.13:在Java 中,如何跳出当前的多重嵌套循环?

要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的的break语句,即可跳出。
举例:
ok:
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
system.out.println(“i=”+i+",j="+j);
if(j==5)
break ok;
}
}

1.1.14:java 的类加载顺序?

第一,所有的类都会优先加载基类;
第二,静态成员的初始化优先;
第三,成员初始化后,才会执行构造方法;
静态成员的初始化与静态块的执行,发生在类加载的时候;成员加载在对象创建时;类对象的以及静态块的访问,都会触发类的加载。

1.1.15:什么是反射?

反射是指在运行状态中,可以获取任意一个类或一个对象的所有信息(类中声明的方法、属性、构造器)以及动态调用对象中方法、构造器的机制。
一般都是使用Class clazz=Class.forName(“类的全路径”)这个方法,获取到class对象,然后通过该class对象获取到类中所有的method方法、属性,调用Method的invoke方法就可以执行该方法,但是如果是私有方法的话,必须通过getDeclaredMethod获取,还需要调用方法的setAccessible设置为true才可以执行。

1.1.16: JRE、JDK、JVM 及 JIT 之间有什么不同?

JRE 代表 Java 运行时,是运行 Java 引用所必须的。
JDK 代表 Java 开发工具,是 Java 程序的开 发工具,如 Java编译器,它也包含 JRE。
JVM 代表 Java 虚拟机,它的责任是运行 Java 应用。
JIT 代表即时编译,当代码执行的次数超过一定的阈值时,会将 Java 字节码转换为本地代码,如,主要的热点代码会被准换为 本地代码,这样有利大幅度提高 Java 应用的性能。

具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。

1.1.17 日志

Log4j 介绍
Log4j(log for java)是 Apache 的一个开源项目,通过使用 Log4j,我们可以控制日志信息输出到日志文件、也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用程序的代码。
Log4j 有三个主要组件:记录器, appender 和布局。这三种类型的组件协同工作,使开发人员能够根据消息类型和级别记录消息,并在运行时控制这些消息的格式和报告位置。
Log4j 建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。
比如定义了 INFO 级别,只有等于及高于这个级别的才进行处理,则应用程序中所有 DEBUG 级别的日志信息将不被打印出来。ALL,打印所有的日志;OFF,关闭所有的日志输出。
appenderName,就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。

1.1.18: int和integer的区别

Integer是int的包装类 int则是java的一种数据类型
Integer变量必须实例化后才能使用 而int变量不需要
Integer实际是对象的引用 当new一个integer实际上生成一个指针指向此对象
而int则是直接存储数据值
Intger的默认值是null int默认是0

1.1.19: Session和Cookie的区别?

1、数据存储位置:cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、安全性:cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

3、服务器性能:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

4、数据大小:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、信息重要程度:可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

1.1.20 什么是跨平台性?原理是什么

所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。
实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行java程序。

1.1.22 java类加载顺序

加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载
(1)加载
  首先通过一个类的全限定名来获取此类的二进制字节流;其次将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;最后在java堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口。总的来说就是查找并加载类的二进制数据。
(2)链接:
  验证:确保被加载类的正确性;
  准备:为类的静态变量分配内存,并将其初始化为默认值;
  解析:把类中的符号引用转换为直接引用;
(3)为类的静态变量赋予正确的初始值
3、类的初始化
(1)类什么时候才被初始化
  1)创建类的实例,也就是new一个对象
  2)访问某个类或接口的静态变量,或者对该静态变量赋值
  3)调用类的静态方法
  4)反射(Class.forName(“com.lyj.load”))
  5)初始化一个类的子类(会首先初始化子类的父类)
  6)JVM启动时标明的启动类,即文件名和类名相同的那个类
(2)类的初始化顺序
  1)如果这个类还没有被加载和链接,那先进行加载和链接
  2)假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)
  3)加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句。

4)总的来说,初始化顺序依次是:(静态变量、静态初始化块)–>(变量、初始化块)–> 构造器;

如果有父类,则顺序是:父类static方法 –> 子类static方法 –> 父类构造方法- -> 子类构造方法

4、类的加载
  类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的java.lang.Class对象,用来封装类在方法区类的对象
  在这里插入图片描述

1.1.23||和|什么区别

|表示对所以的条件进行判断 其中有一个满足就ture
||表示只要满足第一个条件后面就不再判断 输出结果ture 当然第一个条件不满足 第二个条件对了 输出结果依然为ture;

1.1.24java是值传递还是引用传递

java中只有值传递,值传递:调用函数的时候,只传递参数的副本。所以这就导致了: 1、如果参数是基本数据类型:那么函数中对此参数副本的改变,并不会影响原函数中的参数值。 2、如果参数是引用数据类型:那么由于原参数和参数副本指向同一个对象,所以参数副本对对象中成员变量的改变,会引起原参数指向的对象的改变。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值