java基本面试题

1."=="和equals方法究竟有什么区别?
(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚)
操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用操作符。

equals方法是用于比较两个独立对象的内容是否相同

2.说说&和&&的区别。
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式

&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,
&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,
来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。

3.跳出多重循环
使用break

4.switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
expr1只能是一个整数表达式或者枚举常量(更大字体)byte,short,char都可以隐含转换为int, 显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中

5.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

6.char型变量中能不能存贮一个中文汉字?为什么?
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字

7.使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。

8.四种八种基本数据类型

1.byte(1字节) short(2个字节) int(4个字节) long(8个字节) float(4个字节) double(8个字节) boolean(八分之一个字节 1个字节) char(2个字节,一个字符能存储下一个中文汉字)
java.lang

数值型 { 整数类型 (byte short int longg)
		
	  浮点类型(double float) 	}	

基本数据类型

字符型(char)
布尔型 boolean 

byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean
String不算基本类型 引用数据类型

9.简述并画出集合框架关系图 (10分)

collection :
List ArrayList查询快,增删改慢 数组类型
LinkedList查询慢,增删改查快 链表
Set HashSet 无顺序
LinkedSet 有顺序
Map HashMap 包含了key-value对。 Map不能包含重复的key。 Map纵向数组 横向链表-查询快
SortedMap 是一个按照升序排序key的Map
10.java多线程的概念
进程:运行中的应用程序称为进程,拥有系统资源(cpu、内存)

线程:进程中的一段代码,一个进程中可以有多段代码。本身不拥有资源(共享所在进程的资源)

在java中,程序入口被自动创建为主线程,在主线程中可以创建多个子线程。
多进程: 在操作系统中能同时运行多个任务(程序)

多线程: 在同一应用程序中有多个功能流同时执行

java单继承 多实现
1、继承Thread类实现多线程
2、实现Runnable接口方式实现多线程
3、使用ExecutorService、Callable、Future实现有返回结果的多线程
4、线程池
start()和run()区别
start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。
通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,
并没有运行,一旦得到cpu时间片,就开始执行run()方法,
run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
extends 和 runnable的区别
extends因为线程类已经继承了Thread类,所以不能再继承其他的父类。
runnable线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,
可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况。

3.1 起始类Executors,创建线程池,并定义有几个存活线程
3.2 使用Runnable方法,生成实例
3.3 在线程池中,获取可用线程连接,执行任务
3.4 完毕后,关闭线程连接,归还线程到线程池

11.泛型
泛型,即“参数化类型”
限定某一个条件入到一个物体里面
强制类型转换

12.java流(Stream)、文件、io

BufferedReader FileOutStream FileInputStream FileWrite FileReader

13.数组和集合
数组不是面向对象的,存在明显的缺陷,集合完全弥补了数组的一些缺点,
比数组更灵活更实用,可大大提高软件的开发效率而且不同的集合框架类可适用于不同场合。
具体如下:
1)数组的效率高于集合类. 查快 增删改慢
2)数组能存放基本数据类型和对象,而集合类中只能放对象。
3)数组容量固定且无法动态改变,集合类容量动态改变。
4)数组无法判断其中实际存有多少元素,length只告诉了array的容量。
5)集合有多种实现方式和不同的适用场合,而不像数组仅采用顺序表方式。
6)集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率。
集合:查慢 增删改快(链表格式)

14.mybatis-plus 和mybatis 的区别
Mybatis-Plus是一个Mybatis的增强工具,它在Mybatis的基础上做了增强,却不做改变。
我们在使用Mybatis-Plus之后既可以使用Mybatis-Plus的特有功能,又
能够正常使用Mybatis的原生功能。
Mybatis-Plus(以下简称MP)是为简化开发、提高开发效率而生,但它也提供了一些很有意思的插件,比如代码生成器,条件构造器。
底层实现是hibernate框架结构。用类和方法来实现SQL功能,
MyBatis-Plus不是为了取代MyBatis,是在其基础上做的功能升级,但无法替代,他们双生的魂斗罗。
实体类,Dao层,Service层开启AR后,可以使用MP的内置方法,减少了SQL代码的重复书写。

15.JSON
简单地说 ,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,
FastJSON提供了大量静态方法,调用简洁方便
Jackson须实例化类,调用相对繁琐,可通过封装成JSON工具类简化调用
jackjson:特点是兼容性高,对于部分特殊字符也能转换成功。 而且:转换的时候是逐级转换,也就是说,无论你json字符串有多少层次,他都会转换成Object或者Map
fastjson:这种方式转换,特点:简单明了,但是对于部分特殊字符无法转换(比如html标签+文件特殊符号),
还有个特点:他是直接转换的,而不是逐层转换
Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,
前者实现反序列化,后者实现了序列化;同时每个方法都提供了重载方法

16.重载和重写
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
重写 继承一个父类 重写抽象方法 方法名和类名和父类一样 即外壳不变,核心重写

17.jdk: 默认,面向接口
cglib: 面向继承类(推荐)

18.api java.lang.Object

19.synchronized(临界资源)

  1. Sync对临界资源加锁,保证临界资源的原子性,不可交互分割
  2. 第一个访问线程拥有锁标记,其它线程再次访问,将会被阻塞
  3. 直到第一个线程运行完毕,释放锁标记,其它线程开始争抢锁标记
  4. Sync可以锁方法(粗精度)和对象(细精度)

19.数据库池
创建数据源 使用的是dbcp c3p0 druid(alibaba)数据源 basicDataSource

20.单例模式
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例
单例模式特点:
  1、单例类只能有一个实例。
  2、单例类必须自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。

单例模式保证了全局对象的唯一性,比如系统启动读取配置文件就需要单例保证配置的一致性。

21.动静分离
动态的数据依然存在数据库 静态的数据存在一个文件服务器中 加载速度很快
把动态的数据和静态数据分开来

22.字符串池
对象的的比较是比较地址
当出现相同的值时候,就不用新建对象,
String sc= new String(“abc”)
就创建了两个对象,一个new对象
一个是str=“abc”
所以字符串池的意思,就是这个意思,

23.什么是servlet和tomcat 和 JSP

java Servlet 是运行在 Web 服务器或应用服务器上的程序,
它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

tomcat
Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展,处理动态网页部分
JSP
JSP 技术是以 Java 语言作为脚本语言的,
JSP 网页为整个服务器端的 Java 库单元提供了一个接口来服务于HTTP的应用程序。

24.文件上传和下载
action="${pageContext.request.contextPath}" enctype=“multipart/form-data”
public void imgUpload(HttpServletRequest request,MultipartFile file)
//获取项目名的全路径
String projectPath = request.getServletContext().getRealPath("");
//获取文件名
String fileName = file.getOriginalFilename();
//拼接完整文件路径
String realPath=projectPath+“static\Image\”+fileName;
//生成上传路径对象
File upload=new File(projectPath+“static\Image”);
//开始文件上传
try {
file.transferTo(new File(realPath));
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
logger.warn(e.getMessage());
}
25.文件下载
public void imgDownload(String fileName,HttpServletRequest request,HttpServletResponse response){
//设置下载文件MIME类型
response.setContentType(request.getServletContext().getMimeType(fileName));
//设置下载后文件名
response.setHeader(“Content-Disposition”,“attachment;filename=”+fileName);
//获取目标文件的绝对路径
String fullFileName = request.getServletContext().getRealPath("/static/Image/"+fileName);
//读取文件
InputStream in = new FileInputStream(fullFileName);
OutputStream out=response.getOutputStream();
//写文件
byte[] bytes=new byte[1024];
//初始下载长度
int length=0;
while((length=in.read(bytes))!=-1) {
out.write(bytes,0,length);
}
in.close();
out.close();

26.Redis
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:

Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。

27.Aop
两种方式
jdk:默认的 面向接口 需要耗费的资源低 效率低
cglib:字节码增强,面向继承类(推荐) 需要耗费的资源高 效率高
AOP(Aspect Oriented Programming),通常称为面向切面编程
。它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,
并将其命名为"Aspect",即切面。
简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,
便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
切面 切入点 通知:前置 后置 环绕 异常 最终

28.封装、面向对象、继承、多态
封装从字面上来理解就是包装的意思,专业点就是信息隐藏,
是指利用抽象数据类型将数据和基于数据的操作封装在一起,
使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,
尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系

面向对象
将跟对象有关的功能都封装在其内
继承
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
多态
多态是同一个行为具有多个不同表现形式或形态的能力。

多态就是同一个接口,使用不同的实例而执行不同操作

29.springboot
多数Spring Boot应用只需要很少的Spring配置。
SpringBoot是Spring和SpringMVC的整合升级体,利
用注解来完成Spring和SpringMVC的大部分配置,
省略了大量配置文件代码。
SpringBoot自带tomcat组件,因此这个功能可省略。

30.反射
相当于车的发动机
我们相当于驾驶员 不关心发动机
提供了动态功能
JVM运行之间就能创建对象

java.lang.class对象模型
Student student=new Student();
student 类的对象
Student 类对象
反射机制是一个很高级的功能
他提供了一个动态功能,通过反射机制相关的API就可以获取任何java类里的任何信息,
包括属性、方法、修饰符、构造器等信息

  1. 在JVM运行之前,确定类名,先不生成对象
  2. 在JVM运行期间,通过类名反射创建对象,动态创建对象
  3. 框架的适用性

31.大数据(Hadoop)开源存储和计算框架
1.数据量大
2.数据有价值
3.数据种类多
4.处理速度快
Zookeeper集群(监控NameNode)

NameNode(Master) NameNode(slave)备份

DataNode-DataNode-DataNode
大数据存储和计算
先分开再合在一起

32.JSP:
内置九大对象:request response session pagecontext config out
appliction exception page

33.Spring核心:

aop(面向切面 ) di(依赖注入) ioc(控制反转)

34.什么是事务
事务是访问数据库的一个操作序列
每个SQL语句都是一个独立的事务,当数据库系统执行完一个SQL语句后,会自动提交事务。

35.JVM
JVM则是JRE中的核心组成部分,是一个虚拟机-内存模型。
JVM通过类加载器(Class Loader)加类Java应用,并通过Java API进行执行。
GC内存垃圾回收

36.iso七层模型
应用层(网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS)、
表现层(数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
格式有,JPEG、ASCll、DECOIC、加密格式等)、
会话层(建立、管理、终止会话)、
传输层(定义传输数据的协议端口号,以及流控和差错效验。
协议有:TCP UDP)、
网络层(进行逻辑地址寻址,实现不同网络之间的路径选择。IPV4 IPV6)、
数据链路层(建立逻辑连接、进行硬件地址寻址、差错效验等功能)、
物理层(建立、维护、断开物理连接。(由底层网络定义协议))

37.权限管理怎么实现

38.windows和Linux区别
1、centos是基于linux建立的操作系统。
2、linux属于内核系统,只有终端命令界面,无图形界面。
3、centos同时拥有终端命令界面和图形界面。
4、linux和centos都是属于开源系统。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值