java面试题集

1.java中有哪些基本类型?
byte、short、int、long、float、double、char、boolean
2.Java中创建对象的五种方法
1、使用new关键字创建对象
2、利用java的反射机制,通过java.lang.Class或者java.lang.reflect.Constructor创建对象
3、实现Cloneable接口,然后重写Object.clone()方法创建对象
4、实现序列化serialiable接口,通过反序列化,ObjectInputStream的readObject()方法创建对象
5、String str=“abc” 直接由jvm创建 或者使用 字符串操作符"+" String str1 = “a”+"bc"由jvm创建
3. java为什么能够跨平台运行?
因为Java程序编译之后的代码不是能被硬件系统直接运行的代码,而是一种“中间码”——字节码。然后不同的硬件平台上安装有不同的Java虚拟机(JVM),由JVM来把字节码再“翻译”成所对应的硬件平台能够执行的代码。因此对于Java编程者来说,不需要考虑硬件平台是什么。所以Java可以跨平台。
4.整型数据转换成字符串的方式?
1、 直接在数字后面加上空格;2、 使用String.valueOf(int i);3、 Integer.toString(i);
5.谈谈&和&&的区别?
  &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式。
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作.。
6. 面向对象的基本特征
1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意 与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一 部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2)继承:子类拥有父类一切非私有的属性和方法。
3)封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面 向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装 的对象,这些对象通过一个受保护的接口访问其他对象。
4)多态性:同一种事物的不同种表现形式。
7.final关键字
修饰类:使当前这个类不能有任何子类。
修饰成员方法:当final关键字用来修饰一个方法的时候,这个方法就是最终方法,不能够被覆盖重写
修饰局部变量:这个局部变量就不能更改,“一次赋值,终生不变”
修饰成员变量:如果使用了final关键字修饰,那么这个变量也照样是不可变的
① 由于成员变量具有默认值,所以用了final之后必须手动赋值,不会再给默认值了
② 对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值,只能二选一
③ 必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值
7.2 static关键字是什么意思?
Java中可否重写(Override)一个private或者static方法?
1)static关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
2)Java中static方法不能被重写,因为方法重写是基于运行时动态绑定的,而static方法是编译时静态绑定的,static方法跟类的任何实例都不相关,所以概念上不适用。
8. 重载与重写
(Overload)重载:发生在同一个类之中,方法名相同、参数列表不同,与返回值无关、与final无关、与修饰符无关、与异常无关。
(Override)重写:发生在子类和父类之间,方法名相同、参数列表相同、返回值相同、不能是final的方法、重写的方法不能有比父类方法更为严格的修饰符权限、重写的方法所抛出的异常不能比父类的更大。
如果父类私有的方法,子类拥有方法签名相同的方法,子类不属于重写父类的方法,该方法属于子类的新方法。
9.int和integer的区别?
int是java的基本数据类型,integer是1.4版本后提供的基本类型包装类,当两者作为成员变量时,初始值分别为;int是0;integer是null;其中integer提供了一些对整数操作的方法,还定义了integer型数值的最值,其他基本类型也有对应的包装类,基本类型包装类的出现,使得java完全面向对象.
10.String和StringBuffer的区别?StringBuffer和StringBuilder区别?
String是不可变的,对String类的任何改变都会返回一个新的String 对象。
StringBuffer是可变的,对StringBuffer中的内容修改都是当前这个对象。
String重写了equals方法和hashCode方法,StringBuffer没有重写equals方 法。
String是final的类。StringBuffer不是。
String创建的字符串是在常量池中,创建的变量初始化一次,如果再对该字符串改变会产生新的字符串地址值,StringBuffer是在堆中创建对象,当对字符串改变时不会产生新的字符串地址值,如果对字符串进行频繁修改的话建议使用StringBuffer,以节省内存。
StringBuffer和StringBuilder,StringBuffer是线程安全的,StringBulider是线程不安全的。当不考虑并发问题时候,请使用StringBulider。
11.‘’和equals的区别?
’比较的是两个变量的内容和在内存中的地址值是否全部相等,如果要比较两个基本数据类型那必须用’
equals如果没有重写,则和’
’的意义一样,如果重写了,则会会按照重写的内容进行比较,javaBean规定当重写equals时候必须重写hashCode,如果不重写会出现对象相同但是hashCode不同,这样会出现问题,eg:HashSet存储元素时候是按照hashCode,如果重写equals不重写hashCode会导致同一个对象,存储了两次。
12.error和exception有什么区别?
error表示恢复不是不可能但是很困难的情况下的一种严重问题,例如程序书写错误,虚拟机错误等,exception是一种设计和实现问题,如果程序运行正常,从不会发生的情况。error是可以避免的,exception是不可避免的
13. sleep() 和 wait() 有什么区别?
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
14. List、Set和Map的区别?
a.List和Set是Collection的子接口,map不是。
b.List的底层是数组的方式实现,Set是散列表的方式实现,map是键值对的方式。
c.list是有序可重复的,Set是无序不可重复的,map是有序,key不重复,value可重复
d.list和Set可直接使用itertator来进行遍历,map只能通过先遍历Key在遍历value.
15.ArrayList 和 LinkedList 的区别
ArrayList基于动态数组实现的非线程安全的集合;
LinkedList基于链表实现的非线程安全的集合。
对于随机index访问的get和set方法,一般ArrayList的速度要优于LinkedList。因为ArrayList直接通过数组下标直接找到元素;LinkedList要移动指针遍历每个元素直到找到为止。
新增和删除元素,一般LinkedList的速度要优于ArrayList。因为ArrayList在新增和删除元素时,可能扩容和复制数组;LinkedList实例化对象需要时间外,只需要修改指针即可。
LinkedList集合不支持 高效的随机随机访问(RandomAccess)
ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
16.List集合和Set集合的区别
 List是一个有序的集合(元素存与取的顺序相同),它可以存储重复的元素
 Set是一个无序的集合(元素存与取的顺序可能不同),它不能存储重复的元素
17.键值对HashMap:
内部存储结构:,内部使用Entry[]数组来存放数据,数组初始容量默认是 16,扩容: 翻倍扩容,负载因子loader factor 0.75 .
JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。
当添加一个元素(key-value)时,就首先计算元素key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组同一位置了,这时就添加到同一hash值的元素的后面,他们在数组的同一位置,但是形成了链表,同一各链表上的Hash值是相同的,所以说数组存放的是链表。而当链表长度太长时,链表就转换为红黑树,这样大大提高了查找的效率。
当链表数组的容量超过初始容量的0.75时,再散列将链表数组扩大2倍,把原链表数组的搬移到新的数组中

18.Spring的通知类型有哪些?
通知决定了方面组件功能在目标对象方法上执行的时机.
Spring框架提供了以下5中类型通知.
a.前置通知aop:before
方面功能在目标方法之前调用.
b.后置通知aop:afterReturning
方面功能在目标方法之后调用.(如果目标方法抛出异常则不会执行方面功能)
c.最终通知aop:after
方面功能在目标方法之后调用.(目标方法有无异常都会执行方面功能)
d.环绕通知aop:around
方面功能在目标方法之前和之后调用.
e.异常通知aop:afterThrowing
方面功能在目标方法抛出异常之后调用
19.Redis
是一个key-value存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,包括string、list、set、zset和hash。实现商品查询
20.Redis集群原理
Redis的所有节点都会保存当前redis集群中的全部主从状态信息.并且每个节点都能够相互通信.当一个节点发生宕机现象.则集群中的其他节点通过PING-PONG检测机制检查Redis节点是否宕机.当有半数以上的节点认为宕机.则认为主节点宕机.同时由Redis剩余的主节点进入选举机制.投票选举链接宕机的主节点的从机.实现故障迁移.
Redis的AOF模式
1. AOF模式默认关闭,需要开启.
2. 开启了AOF模式之后,redis采用AOF模式.
3. AOF模式记录的是用户的操作过程.
4. AOF 模式可以实现数据的实时备份.
5. AOF的持久化文件空间占用量大.恢复数据的时间长.

  1. 如果数据不允许丢失,则使用AOF.

  2. 如果要求程序执行的效率最高,则使用RDB

  3. 如果使用AOF模式需要定期整理持久化文件
    21.Linux命令
    ifconfig 检查IP地址 cd . 当前目录cd …返回到上一级目录cd /usr/ 进入到usr目录 mkdir 创建目录mkdir a 创建 a目录
    rm 删除文件rm n.txt 提示y删除n放弃 rm –f n.txt 不提示 rm –rf dirname 不提示递归删除目录下所以内容
    cp复制文件cp nginx.conf n.txt mv 修改文件名,移动文件
    tar –cvf n.tar ./* 压缩当 tar –xvf n.tar 解压查询全部服务命令 ps -ef | grep java
    ls

  4. AOP
    AOP就是在不改变原有系统核心业务代码的基础上动态添加一些扩展功能。
    SpringAOP底层是基于动态代理机制实现的:如果目标对象实现接口,则底层采用JDK动态代理机制为目标对象创建代理对象;如果目标对象没有实现接口,则底层采用CGLIB动态代理机制为目标对象创建代理对象.
    2.aop里面的切面和切点说一下?通知有哪些?
    切面是通知和切入点的结合。横切面对象,一般为一个具体类对象(可以借助@Aspect声明)。
    切入点(pointcut):对连接点拦截内容的一种定义,一般可以理解为多个连接点的结合。 连接点(joinpoint)一般指被拦截到的的方法。
    前置通知(@Before)。返回通知(@AfterReturning)。异常通知(@AfterThrowing)。后置通知(@After)。环绕通知(@Around)
    23.HTTP请求的GET与POST方式的区别
    :Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法。二者主要区别如下:
    1)Get是用来从服务器上获得数据,而Post是用来向服务器上传数据;
    2)Get将表单中数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL;
    3)Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的;
    4)Get传输的数据量小,这主要是因为受URL长度限制;而Post可以传输大量的数据,所以在上传文件只能使用Post;
    5)Get限制Form表单的数据集必须为ASCII字符,而Post支持整个ISO10646字符集;
    6)Get是Form的默认方法。
    24.String字符串常用方法
    数组中的length是属性,调用方法为arr.length,而String的length是方法,调用方法为str.length()。
    length() 获取字符串长度
    equals()判断原字符串的字符是否等于指定字符串的字符。【考点】equals和==的区别
    toLowerCase() 转换字符串中的英文字符为小写
    toUpperCase() 转换字符串的英文字符为大写
    char charAt(int index) 获取指定下标index位置上的字符
    char[] toCharArray() 将字符串转为char数组
    字符串中字符的替换String replace(char oldChar,char newChar) 将字符串中指定的字符oldChar转换为新的字符newChar,并返回替换后的结果
    1、返回指定位置下标的字符 charAt()
    括号中传入一个 >=0 && < 字符串.length()的数字。
    2、指定内容在字符串第一次出现的位置 indexOf()
    括号中传入查询内容,返回下标从 0 开始,若不存在,则返回 - 1。
    3、截取字符串,返回一个字符串类型 substring(,)
    括号中传入开始下标和结束下标,提取字符串中介于两个指定下标之间的字符。其中该方法返回的子串包括开始下标处的字符,但不包括结束下标处的字符。
    4、字符串截取 substr(start,length)
    这也是一个截取字符串的方法,可以发现的是,这儿传入的参数是开始下标和截取长度。返回值是一个新的字符串,包含从开始下标(包括开始下标所指的字符) 处开始的 length 个字符。如果没有指定 length,那么返回的字符串包含从开始下标到 String结尾的字符。

  5. TestNG-常用注解介绍
    Before类别和After类别注解
    我们可以在Before类别的注解方法里面做一些初始化动作,如实例化数据库连接、新建数据库连接池、创建线程池、打开文件流等等。然后,我们可以在After类别的注解方法里面做一些销毁动作,如释放数据库连接、销毁数据库连接池、销毁线程池或者关闭文件流等等。
    1.1 @BeforeSuite
    被@BeforeSuite注解的方法,将会在testng定义的xml根元素里面的所有执行之前运行。
    1.2 @AfterSuite
    被@AfterSuite注解的方法,将会在testng定义的xml根元素里面的所有执行之后运行。
    1.3 @BeforeTest
    被@BeforeTest注解的方法,将会在一个元素定义的所有里面所有测试方法执行之前运行。
    1.4 @AfterTest
    被@AfterTest注解的方法,将会在一个元素定义的所有里面所有的测试方法执行之后运行。
    1.5 @BeforeClass
    被@BeforeClass注解的方法,将会在当前测试类的第一个测试方法执行之前运行。
    1.6 @AfterClass
    被@AfterClass注解的方法,将会在当前测试类的最后一个测试方法执行之后运行。
    1.7 @BeforeMethod
    被@BeforeMethod注解的方法,将会在当前测试类的每一个测试方法执行之前运行。
    1.8 @AfterMethod
    被@AfterMethod注解的方法,将会在当前测试类的每一个测试方法执行之后运行。
    @BeforeGroups 组的列表,这种配置方法将之前运行。此方法是保证在运行属于任何这些组第一个测试方法,该方法被调用。
    @AfterGroups 组的名单,这种配置方法后,将运行。此方法是保证运行后不久,最后的测试方法,该方法属于任何这些组被调用。
    @Factory 作为一个工厂,返回TestNG的测试类的对象将被用于标记的方法。该方法必须返回Object[]。

26.日志级别
每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分为:
A:off 最高等级,用于关闭所有日志记录。
B:fatal 指出每个严重的错误事件将会导致应用程序的退出。
C:error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
D:warn 表明会出现潜在的错误情形。
E:info 一般和在粗粒度级别上,强调应用程序的运行全程。
F:debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
G:all 最低等级,用于打开所有日志记录。
27.Assert各种断言方法详解
1.assertEquals(expected,actual) 和 assertNotEquals(expected,actual);
比较实际值与预期值是否一致。如果一致,程序继续运行,否则抛出异常,会打印报错信息。常用断言方法,便于调试。
2.assertTrue(message,condition) 和 assertFalse(message,condition)
如果条件的真假与预期相同,程序继续运行,否则抛出异常,不会打印报错信息。
3.assertNull(message,object) 和 assertNotNull(message,object)
判断一个对象是否为空,如果结果与预期相同,程序继续运行,否则抛出异常。
4.assertSame(expected,actual) 和 assertNotSame(expected,actual)
判断预期的值和实际的值是否为同一个参数(即判断是否为相同的引用),如果结果与预期相同,程序继续运行,否则抛出异常。
assertSame(expected,actual) 和 assertEquals(expected,actual)的区别;
assertSame(A,B) ————————————> A==B
assertEquals(A,B)————————————>A.equals(B)
28. bean的作用域和生命周期
作用域:5个 Singleton(单例)、Prototype(原型)、Session(会话)、Request(请求)、GlobalSession(全局会话) 生命周期:spring对bean进行实例化,spring将值和引用注入给bean,bean实现接口spring调用相关方法,直到调用distroy方法销毁。
29. mybatis的原理:(将jdbc操作数据库的过程进行了封装)
系统底层会读取mybatis-config.xml核心配置文件,并通过SqlSessionFactoryBuilder构建出SqlSessionFactory工厂,工厂又会生成SqlSession对象,SqlSession对象又会调用底层的Executor对象执行SQL语句,调用底层的MapperStatement对象接收SQL语句的参数并将查询结果输出.
1、注册数据库驱动,2、获取连接之数据库URL,3、Statement传输器对象,4、ResultSet结果集对象,5、释放资源
30. Java中接口和抽象类的区别是什么?
答:Java提供和支持创建抽象类的接口,它们的实现有共同点,不同点在于:
1)接口中所有的方法隐含的都是抽象的,而抽象类则可以同时包含抽象方法和非抽象方法。
2)类可以实现多个接口,但是只能继承一个抽象类。
3)类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法;当然在这种情况下,类也必须声明是抽象的。
4)抽象类可以在不提供接口方法实现的情况下实现接口。
5)Java接口中声明的变量默认是final的,抽象类可以包含非final的变量。
6)Java接口中的成员函数默认是public的,抽象类的成员函数可以是private、protected或public。
7)接口是绝对抽象的,不可以被实例化,抽象类也不可以被实例化,但是如果它包含main方法的话,是可以被调用的。
31. Java集合类框架的基本接口有哪些?
答:Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类,Java集合类里面最基本的接口有:
1)Collection接口:代表一组对象,每一个对象都是它的子元素。
2)Set接口:不包含重复元素的Collection。
3)List接口:有序的Collection,并且可以包含重复元素。
4)Map接口:可以把键(key)映射到值(value)的对象,键不能重复。
32. HashMap和Hashtable有什么区别?
答:HashMap和Hashtable都实现了Map接口,因此很多特性非常相似,但是它们有以下不同点:
1)HashMap允许键和值是null,而Hashtable不允许键或者值是null。
2)Hashtable是同步的,而HashMap不是,因此HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
3)HashMap提供了可供应用迭代的键的集合,因此HashMap是快速失败的,另一方面,Hashtable提供了对键的列举(Enumeration)。
一般认为Hashtable是一个遗留的类。
33. HashSet和TreeSet有什么区别?
答:HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。
另一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是O(logn)。
34. Throw和throws有什么区别?
答:throw关键字用来在程序中明确的抛出异常,相反,throws语句用来表明方法不能处理的异常。每一个方法都必须要指定哪些异常不能处理,所以方法的调用者才能够确保处理可能发生的异常,多个异常是用逗号分隔的。
35异常处理的时候,finally代码块的重要性是什么?
答:无论是否抛出异常,finally代码块总是会被执行。就算是没有catch语句同时又抛出异常的情况下,finally代码块仍然会被执行。最后要说的是,finally代码块主要用来释放资源,比如:I/O缓冲区,数据库连接。
36. 构造函数
与函数名相同,无返回值。作用:一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象的属性和方法
构造函数的特点
1、函数名与类名相同
2、不用定义返回值类型。(不同于void类型返回值,void是没有具体返回值类型;构造函数是连类型都没有)
3、不可以写return语句。(返回值类型都没有,故不需要return语句)
注:一般函数不能调用构造函数,只有构造函数才能调用构造函数。
37. java中continue,return和break区别
1 break用于完全结束一个循环,跳出循环体,执行循环后面的语句。
2 continue是跳过当次循环中剩下的语句,执行下一次循环。
3.return: 跳出整个函数体,函数体后面的部分不再执行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值