Java面试问题基础篇

面向对象

面向对象编程:拿东西过来做对应的事情

特征:

  • 封装:对象代表什么,就要封装对应的数据,并提供数据对应的行为

  • 继承:Java中提供一个关键字extends,用这个关键字可以让一个类和另一个类建立起继承关系,可以把子类中重复代码抽取到父类中,提高代码复用性。子类可以在父类基础上增加其他功能,使子类更强大

  • 多态:同类型的对象表现出不同形态。前提是有继承关系,有父类引用指向子类对象,有方法重写

方法重载和重写的区别

方法重载:用于一个类中,通过不同的参数列表实现相同方法名的不同功能。

例如:计算器类中,通过处理不同类型的参数或不同数量的参数,实现两个整数相加、两个浮点数相加,或者多个数相加,方法名都为add

方法重写:主要用于子类和父类之间,通过重写父类的方法实现多态性。

例如:有一个动物类,有一个叫声的方法,不同子类(猫或者狗)分别实现"汪汪汪"和"喵喵喵"的叫声,通过动物类调用方法时,根据实际对象的类型发出不同的声音

接口与抽象类的区别

接口:不能包含具体实现代码,只能声明方法和变量,使用interface关键字定义。类通过implements关键字实现接口时,必须实现接口中声明的所有抽象方法

抽象类:不能被实例化的类,它可以包含抽象方法(没有具体实现的方法)和具体方法。使用abstract关键字定义,类通过extends关键字继承抽象类,可以选择性实现抽象类中的抽象方法,但必须实现所有未实现的抽象方法才能实例化

深拷贝和浅拷贝

浅拷贝:只会拷贝基本数据类型的值,以及实例对象的引用地址,并不会复制一份引用地址所指的对象,也就是内部的类属性指向是同一个对象

深拷贝:既拷贝基本数据类型的值,也会针对实例对象的引用地址所指向的对象进行复制,也就是说内部的类执行指向的不是同一个对象

sleep和wait的区别

  • sleep:是thread类的静态方法,用于暂停当前线程的执行。作用是让当前线程暂停指定的时间,在此期间线程不会占用CPU资源

  • wait:是object类的方法,用于让当前线程暂停执行,直到其他线程调用该对象的notify或者notifyAll方法,作用是让当前线程暂停执行,并释放当前对象的锁(必须在同步上下文中调用),直到其他线程调用该对象的notify或者notifyAll方法

同步上下文

通常与synchronized关键字相关,用于定义一个代码区域,该区域内的代码在执行时候需要获取特定的锁(对象锁或类锁),在同步上下文中,线程必须先获取锁,才能执行该区域内的代码

什么是自动拆装箱

基本数据类型不具备对象的特征,不能调用方法

装箱:将基本类型转换成包装类对象

拆箱:将包装类对象转换为基本类型的值

int和Integer区别

  • Integer是int的包装类,int是Java的基本数据类型

  • Integer变量必须实例化后才能使用

  • Integer实际是对象的引用,new时实际上是生成一个指针指向此对象,Int是直接存储数据值

  • Integer默认值是null,int是0

==和equals区别

  • ==是一个比较运算符,用于比较两个变量的值是否相等,可以用于比较基本数据类型和引用类型

  • equals用于比较两个对象的内容是否相等,主要用于引用类型的对象。如果没重写比较的是地址值,如果重写了比较的是对象中属性的内容

String buffer 和String builder的区别

两者中的方法和功能完全是等价的

String buffer 中方法大多采用了synchronized关键字进行修饰,是线程安全的

在单线程程序下,String builder效率更快,因为他不需要加锁,不具备多线程安全

final finally finalize

  • final:修饰类意味着不能再派生新的子类,即不能被继承。修饰变量时,该变量使用中不被改变,必须在声明时给定初值,在引用中只能读取不可修改,即为常量。修饰方法时,只能使用,不能在子类中被重写

  • finally:在try...catch代码块后面构造最终执行代码块,只要JVM不关闭,里面代码都能执行,可以把释放外部资源的代码写在其中

  • finalize:这个方法是由垃圾收集器在销毁对象时调用的,通过重写方法可以整理系统资源或执行其他清理工作

ArrayList和LinkList区别

  • ArrayList:基于动态数组实现,数组大小可以根据需要动态扩展。可以通过索引随机访问元素,但插入和删除操作需要移动大量元素

  • LinkedList:基于双向链表实现,每个节点包含数据部分和指向前后节的指针,提供高效的插入和删除操作,只需要修改指针,但访问效率低,需要遍历链表

HashMap底层是数组+链表+红黑树,为什么要用这几类结构

HashMap提供高效的键值对存储和检索功能。为了在各种场景下都能提供高效的性能,同时平衡时间和空间复杂度

数组:用于存储哈希表的"桶"(bucket),支持通过索引进行快速访问,通过哈希函数计算键的哈希值,然后将哈希值映射到数组的某个索引位置,可以直接访问对应的桶。数组在内存中是连续存储的,使得缓存命中率极高,进一步提升性能。数组大小是固定的,但可以通过动态扩展来适应更多的键值对。当数组的负载因子达到一定阈值时,数组会扩容并重新哈希所有键值对

链表:用于解决哈希冲突,当多个键的哈希值映射到同一个数组索引时,这些键值对会被存储在同一个桶中,形成一个链表。链表长度可以动态变化,不需要预先分配固定大小的空间,使得HashMap在处理大量数据时更加灵活

红黑树:链表长度超过一定阈值(默认为8),链表会转换为红黑树。在最坏情况下,链表长度可能很长,导致查找、插入、删除操作时间复杂度退化为O(n)。红黑树操作时间复杂度为O(log n)。红黑树在插入和删除节点时会自动调整树的结构,以保持平衡

HashMap和HashTable区别

HashMap:不是线程安全的,如果多个线程同时对其进行写操作,可能会导致数据不一致或运行时异常。允许一个键为null,也允许多个值为null。默认初始化容量为16,默认负载因子为0.75。当实际大小超过容量*负载因子时,会触发扩容。

HashTable:是线程安全的,性能在高并发场景下可能会受到影响,因为每次操作都需要获取锁。容量扩展机制比较简单,每次扩容时会重新计算所有键的哈希值,性能开销较大。不允许键或值为null,尝试插入会抛出异常。默认初始化容量为11,默认负载因子为0.75。

线程创建方式

1.继承Thread类创建线程

package untitled.MyThread;
​
public class MyThread extends Thread{public void run(){System.out.println("Thread is running");}
}

2.实现Runnable接口创建线程

package untitled.MyThread;
​
public class MyThread implements Runnable{
​@Overridepublic void run() {Thread t=Thread.currentThread();System.out.println("线程名称:"+t.getName());}
}

3.使用Callable和Future创建线程 有返回值

package untitled.MyThread;
​
import java.util.concurrent.Callable;
​
public class MyThread implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int sum=0;for(int i=0;i<100;i++){sum+=i;}return sum;}
}
​
package untitled.MyThread;
​
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
​
public class test {public static void main(String[] args) {MyThread t=new MyThread();FutureTask<Integer> task=new FutureTask<>(t);Thread  t1=new Thread(task);t1.start();Integer res= null;try {res = task.get();} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}System.out.println(res);
​}
}

线程的转换状态

  • 新建状态(New) :线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。

  • 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。处于就绪状态的线程,随时可能被CPU调度执行。

  • 运行状态(Running):线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。

  • 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种: 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。 其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

  • 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

反射

反射允许对成员变量,成员方法和构造方法的信息进行编程访问

获取class对象三种方式

  • Class.foeName("全类名")

  • 类名.class

  • 对象.getClass

利用反射获取构造方法

利用反射获取成员变量

利用反射获取成员方法

什么是 java 序列化,如何实现 java 序列化

序列化流:可以把Java中的对象写到本地文件中,也叫对象操作输出流

public ObjectOutputStream(OutputStream out) 把基本流包装成高级流

public final void writeobject(Object obj)把对象序列化(写出)到文件中去

需要让Javabean类实现Serializable接口

反序列化流:把序列化到本地文件中的对象,读取到程序中来,也叫对象操作输入流

public ObjectInputStream(InputStream out)把基本流变成高级流

public Object readObject()把序列化到本地文件中的对象,读取到程序中来

HTTP常见状态码

  • 200 OK //客户端请求成功

  • 301 Permanently Moved (永久移除),请求的 URL 已移走。Response 中应该包含一个 Location URL, 说明资源现在所处的位置

  • 302 Temporarily Moved 临时重定向

  • 400 Bad Request //客户端请求有语法错误,不能被服务器所理解

  • 401 Unauthorized //请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用

  • 403 Forbidden //服务器收到请求,但是拒绝提供服务

  • 404 Not Found //请求资源不存在,eg:输入了错误的 URL

  • 500 Internal Server Error //服务器发生不可预期的错误

  • 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

GET和POST区别

  • GET 请求的数据会附在URL 之后,以?分割URL 和传输数据,参数之间以&相连、

  • POST 把提交的数据则放置在是 HTTP 包的包体中。

  • GET 方式提交的数据最多只能是 1024 字节,理论上POST 没有限制,可传较大量的数据。其实这样说是错误的,不准确的:“GET 方式提交的数据最多只能是 1024 字节",因为 GET 是通过 URL 提交数据,那么 GET 可提交的数据量就跟URL 的长度有直接关系了。而实际上,URL 不存在参数上限的问题,HTTP 协议规范没有对 URL 长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE 对URL 长度的限制是2083 字节(2K+35)。对于其他浏览器,如Netscape、FireFox 等,理论上没有长度限制,其限制取决于操作系统的支持。

  • POST 的安全性要比GET 的安全性高。注意:这里所说的安全性和上面 GET 提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的 Security 的含义,比如:通过 GET 提交数据,用户名和密码将明文出现在 URL 上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用 GET 提交数据还可能会造成 Cross-site request forgery 攻击。

  • Get 是向服务器发索取数据的一种请求,而 Post 是向服务器提交数据的一种请求

  • 在 FORM(表单)中,Method默认为"GET"

Cookie和Session的区别

  • Cookie 是 web 服务器发送给浏览器的一块信息,浏览器会在本地一个文件中给每个 web 服务器存储 cookie。以后浏览器再给特定的 web 服务器发送请求时,同时会发送所有为该服务器存储的 cookie

  • Session 是存储在 web 服务器端的一块信息。session 对象存储特定用户会话所需的属性及配置信息。当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去

  • Cookie 和session 的不同点 无论客户端做怎样的设置,session 都能够正常工作。当客户端禁用 cookie 时将无法使用 cookie

    session 能够存储任意的Java对象,cookie 只能存储 String 类型的对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/80926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot的前世今生

1. Spring Spring 特性&#xff1a;IOC、AOP、DI&#xff0c; Spring&#xff1a;解决对象耦合的问题&#xff0c;在 applicationContext.xml 中申明 bean&#xff0c;Spring在启动时会解析xml文件进行装载&#xff0c;当需要用对象时直接从容器中拿取bean。 Spring万能胶&a…

微信小程序自行diy选择器有效果图

效果图 实现思路 主要运用到小程序自带视图容器《swiper》 运用到的属性《vertical》《display-multiple-items》《current》《animationfinish》 滑动方向变为纵向 vertical&#xff1a;true 显示的滑块数量 display-multiple-items&#xff1a;5 当前所在滑块的 index curr…

【实用教程】如何快速搭建一套私有的埋点系统?

这篇教程将基于开源项目-ClkLog&#xff0c;教大家快速搭建一套自有的埋点系统&#xff0c;从0开始完成数据采集、分析与展示&#xff0c;全流程掌控用户行为数据。 ClkLog是一款支持私有化部署的全开源用户行为数据采集与分析系统&#xff0c;兼容Web、App、小程序多端埋点&am…

falsk模型-flask_sqlalchemy增删改查

1、增、删、改 增 home_bp.route(/useradd) def user_add():users []for i in range(10,20):user User()user.name 冰冰 str(i)user.age 20iusers.append(user)try:db.session.add_all(users)db.session.commit()return jsonify({code:1,info:success})except Exception…

【专题】机器学习期末复习资料

机器学习期末复习资料&#xff08;题库&#xff09; 链接&#xff1a;https://blog.csdn.net/Pqf18064375973/article/details/148105494?sharetypeblogdetail&sharerId148105494&sharereferPC&sharesourcePqf18064375973&sharefrommp_from_link 【测试】 Art…

SpringCloud Alibaba微服务-- Sentinel的使用(笔记)

雪崩问题&#xff1a; 小问题引发大问题&#xff0c;小服务出现故障&#xff0c;处理不当&#xff0c;可能导致整个微服务宕机。 假如商品服务出故障&#xff0c;购物车调用该服务&#xff0c;则可能出现处理时间过长&#xff0c;如果一秒几十个请求&#xff0c;那么处理时间过…

5:OpenCV—图像亮度、对比度变换

1.更改图像和视频的亮度 更改亮度 更改图像的亮度是常用的点操作。在此操作中&#xff0c;图像中每个像素的值应增加/减少一个常数。要更改视频的亮度&#xff0c;应对视频中的每一帧执行相同的操作。 如果要增加图像的亮度&#xff0c;则必须为图像中的每个像素添加一些正常…

【工作流】Fastgpt配置豆包模型-火山引擎

V4.9.7 Fastgpt现在不通过oneapi 来配置模型和渠道了&#xff0c; 可以直接在页面进行设置 首先在账号- 模型提供商里面 填入豆包的信息&#xff1a; 渠道名随便填&#xff0c;厂商选豆包&#xff0c; 然后选3个模型&#xff0c;如图所示 如果没有填入模型映射的话是没办法 …

2025年系统架构师---综合知识卷

1.进程是一个具有独立功能的程序关于某数据集合的一次运行活动,是系统进行资源分配和调度的基本单位(线程包含于进程之中,可并发,是系统进行运算调度的最小单位)。一个进程是通过其物理实体被感知的,进程的物理实体又称为进程的静态描述,通常由三部分组成,分别是程序、…

LangChain4j入门AI(六)整合提示词(Prompt)

前言 提示词&#xff08;Prompt&#xff09;是用户输入给AI模型的一段文字或指令&#xff0c;用于引导模型生成特定类型的内容。通过提示词&#xff0c;用户可以告诉AI“做什么”、 “如何做”以及“输出格式”&#xff0c;从而在满足需求的同时最大程度减少无关信息的生成。有…

如何使用 Docker Compose 部署 Immich

如何使用 Docker Compose 部署 Immich Immich 是一个开源的自建照片和视频备份解决方案&#xff0c;通过 Docker 部署可以快速构建一个稳定的自主管理系统。本文将带你一步步完成使用 Docker Compose 部署 Immich 的过程&#xff0c;帮助你在生产环境中实现高效的媒体管理。 1…

Mac远程连接Windows电脑教程

在 Mac 上通过微软官方远程桌面工具&#xff08;Windows App&#xff09;连接局域网内的 Windows 电脑&#xff0c;需按照以下步骤操作&#xff1a; 一、准备工作 确认 Windows 版本支持远程连接 Windows 专业版/企业版/教育版 支持远程桌面功能。家庭版不支持&#xff0c;需使…

从0到1打造AI Copilot:用SpringBoot + ChatGPT API实现智能开发助手

本文将从0到1系统性地讲解如何基于SpringBoot与OpenAI ChatGPT API打造一款智能开发助手&#xff08;AI Copilot&#xff09;。文章首先介绍AI Copilot的背景与价值&#xff0c;接着深入架构设计与环境准备&#xff0c;然后通过详尽的代码示例演示SpringBoot项目的搭建、依赖配…

Crawl4AI:高效的AI数据抓取工具

在大数据时代&#xff0c;抓取并处理大量数据是进行人工智能&#xff08;AI&#xff09;研究与开发的基础。而网络爬虫是获取网页数据的重要工具。今天&#xff0c;我想介绍一个功能强大的爬虫框架——Crawl4AI&#xff0c;它为数据抓取和机器学习任务提供了无缝的支持。Crawl4…

从单链表 list 中删除第 i 个元素--Python

从单链表 list 中删除第 i 个元素 一、问题引入二、解题步骤1.思维导图2.解题步骤 三、代码实现四、个人总结 一、问题引入 请编写程序&#xff0c;将 n 个整数顺次插入一个初始为空的单链表的表头。随后对任意给定的位序 i&#xff0c;删除链表中第 i 个结点。注意&#xff1…

git学习与使用(远程仓库、分支、工作流)

文章目录 前言简介git的工作流程git的安装配置git环境&#xff1a;git config --globalgit的基本使用新建目录初始化仓库&#xff08;repository&#xff09;添加到暂存区新增/修改/删除 文件状态会改变 提交到仓库查看提交&#xff08;commit&#xff09;的历史记录git其他命令…

九、日志分析和系统故障排查

目录 1、日志分析1.1、日志介绍1.1.1、日志的功能1.1.2、日志文件的分类1.1.3、日志保存位置1.2、rsyslog服务1.2.1、发送日志到远程日志服务器1.3、查看日志文件1.3.1、/var/log/messages文件的内容示例1.3.2、用户登录、退出系统的相关日志1.4、日志级别1.5、程序日志分析1.6…

C++ 非类成员变量 非类成员函数 全局变量 使用

1 使用特点 加 :: 变量使用 #include <iostream> using namespace std; int qwer 100; int asdf 900; void sitl(){std::cout <<"globe dog is sitting." << std::endl; }class Cat { public:static int num;}; int Cat::num 99;class Dog { …

【小乌龙问题】stm32供电,用过的ch340缺无法被识别

解决&#xff1a;更换正确供电&#xff08;stlink&#xff09;&#xff0c;不能用usb-ttl的仅供电&#xff0c;会干扰的&#xff01;&#xff01;&#xff01;&#xff01; 原来用stlink供电&#xff0c;今天没拿就想着usb-ttl的电源供电&#xff0c;然后用ch340传输数据&…

使用 Navicat 17 for PostgreSQL 时,请问哪个版本支持 PostgreSQL 的 20150623 版本?还是每个版本都支持?

&#x1f9d1;‍&#x1f4bb; PostgreSQL 用户 使用 Navicat 17 for PostgreSQL 时&#xff0c;请问哪个版本支持 PostgreSQL 的 20150623 版本&#xff1f;还是每个版本都支持&#xff1f; &#x1f9d1;‍&#x1f527; 官方技术中心 Navicat Premium 17 和 Navicat for P…