咨询网站模板,fullpane 单页视差多用途 wordpress主题,网站设计制作程序,网站维护一般多少钱在广州一家中大公司面试#xff08;BOSS标注是1000-9999人#xff0c;薪资2-3k#xff09;#xff0c;招聘上写着Java开发#xff0c;基本没有标注前端要求#xff0c;但是到场知道是前后端分离人不分离。开始先让你做笔试#xff08;12道问答4道SQL题#xff09;… 在广州一家中大公司面试BOSS标注是1000-9999人薪资2-3k招聘上写着Java开发基本没有标注前端要求但是到场知道是前后端分离人不分离。开始先让你做笔试12道问答4道SQL题接着面试也是八股文之类的没有问项目没有做算法现分享笔试和面试题目给大家做参考。基础的没复习忘了不会只会几道感觉已经寄了最重要的是前端基本不会 一、笔试内容
1.Java有哪些数据类型什么是自动装箱和拆箱
Java有两种类型基本数据类型和引用数据类型
1byte1字节short2字节int4字节long8字节float4字节double8字节char2字节boolean只有两个值true或false
字节为n, 范围为 -2^(n-1) ~ 2^(n-1) - 1
2类class如StringEmployee等接口Interface数组Array
3自动装箱是Java编译器自动将基本数据类型转化为对应的包装类对象的过程。例如
int num 5;
Integer boxedNum num; // 自动装箱拆箱Unboxing**是自动将包装类对象转换为基本数据类型的过程。例如
Integer boxedNum 5;
int num boxedNum; // 拆箱
这种机制使得 Java 可以在基本数据类型和其对应的包装类之间进行自动转换从而简化代码。 2.HashMap和Hashtable有什么区别
HashMap和Hashtable都是Java中用于存储键值对的哈希表类区别如下
1线程安全HashMap不是线程安全的如果多个线程并发访问HahsMap并且至少有一个线程做了修改他必须通过外部同步来保证线程安全否则可能会导致数据不一致的情况而Hashtable是线程安全的他的方法都被synchronized修饰可以在多线程环境下安全的被访问
2性能HashMap性能通常优于Hashtable特别是在单线程环境下而Hashtable由于方法上都有同步锁性能较差
3Null值HashMap允许一个null值键唯一性和多个null值而Hashtable不允许出现null键或null值。 3.String 和 StringBuilder有什么区别
String 和 StringBuilder 都用于表示和操作字符串但它们在实现和使用上有一些关键的区别。以下是它们的主要区别
1不可能性和可变性String是不可变的一旦被创建它的内容就不能被更改。如果对String进行修改操作比如拼接实际上是创建了一个新的String对象StringBuilder是可变的它允许直接修改字符串的内容而不需要创建新的对象
2性能由于String不可变每次修改都会创建一个新的对象会导致性能的损失StringBuilder直接修改原值比String更高效
3线程安全性String是线程安全的因为它不可变不会被修改多个线程可以共享一个String对象而StringBuilder是线程不安全的他没有同步机制多线程环境下同时修改同一个StringBuilder可能会导致数据不一致。 4.int 和 Integer有什么区别
1数据类型int是Java中的基本数据类型Integer是Java中的引用类型是一个包装类
2存储方式int直接存储数值Integer是个对象它内部存储了一个int值因此int性能更好
3可否为nullint不能为null只能存储一个具体的整数值Integer可以为null表示没有值或空的情况 5.error 和 exception有什么区别
1定义和分类error是指验证的错误通过是由JVM级别的错误引起的这些错误通常是无法控制和处理的比如内存溢出、线程死锁等exception是指程序中的问题或异常情况通常是由程序代码中的错误或不符合预期的情况引起的
2继承关系Error是Throwable类的一个子类表示JVM无法恢复的严重问题exception也是Throwable的子类表示程序中的异常问题exception可以分为受检查异常Checked Exception和运行时异常Runtime Exception
3能否恢复Error是不可恢复的它们代表了无法控制的系统级错误程序通常无法处理这些错误JVM 会退出或导致程序崩溃Exception通常是可恢复的特别是 Exception 类中的受检查异常。程序员可以捕获并处理这些异常恢复程序的正常运行。 6.抽象类和接口有什么区别
抽象类Abstract Class和接口Interface在 Java 中都用于定义类的公共行为规范但它们有一些显著的区别。以下是抽象类和接口的主要区别
1继承关系 抽象类抽象类是一个不能实例化的类用于定义子类的公共行为和属性。一个类只能继承一个抽象类Java 不支持多继承。 接口接口是一个完全抽象的类只包含常量和抽象方法。一个类可以实现多个接口Java 支持接口的多实现。
2定义方法
抽象类使用 abstract 关键字来声明抽象类类中可以有普通方法有实现和抽象方法没有实现。抽象类可以有成员变量、构造方法和其他方法。
public abstract class Animal {public abstract void makeSound(); // 抽象方法public void sleep() { // 普通方法System.out.println(Sleeping);}
}接口使用 interface 关键字来声明接口接口中的方法默认是 public 和 abstract并且不能包含方法的实现Java 8 之后接口可以包含默认方法 default 和静态方法 static。接口只能有常量public static final不能有实例变量。
public interface Animal {void makeSound(); // 抽象方法default void sleep() {System.out.println(Sleeping);}
}3方法实现 抽象类可以包含已经实现的方法也可以有抽象方法没有实现。抽象方法的子类必须实现所有的抽象方法除非该子类也是抽象类。 接口接口中的方法默认是 抽象的必须由实现接口的类来实现方法。Java 8 引入了 默认方法default method允许接口中有方法的实现。
7.同步代码方法和同步代码块有什么区别
同步代码和同步代码块在 Java 中用于保证多线程环境下的数据一致性和线程安全。它们的区别主要体现在 作用范围 和 使用方式 上。以下是它们的主要区别
1同步方法是指在方法定义上使用 synchronized 关键字来标识这意味着在方法执行时必须保证同一时刻只有一个线程可以执行该方法。
2同步代码块是通过 synchronized 关键字来修饰某一段代码而不是整个方法。它允许在多线程环境中更加灵活地控制同步的范围只锁定需要同步的部分代码。 8.创建线程的方式有哪些你喜欢哪一种为什么
1继承Thread类并重写run( ) 方法
2实现Runnable接口并实现run方法
3实现Callable接口并实现call( )方法。两个接口的区别为Runnable接口的run方法没有返回值而Callable接口是个泛型它的call方法有返回值可以利用Futrue来获取结果Callable接口的call方法允许抛出异常而Runable接口的run方法的异常只能在内部处理try-catch不能向上抛。
4创建线程池使用submit方法提交任务shutdown方法关闭线程池。
创建线程池比较常用因为它避免了频繁的创建和销毁线程的开销可以复用线程适用于高并发的场景
9.数据库的优化
1表设计优化
选择合适的数据类型尽量使用最小的数据类型比如使用INT替代BIGINT使用CHAR替代VARCHAR来减少存储和查询成本分区表对于数据量极大的表可以考虑分区表将表按某些规则分割成多个小表提高查询效率主从复制、读写分离如果数据库读的操作比较多为了避免写操作所造成的性能影响可以采用读写分离的架构
2索引优化
创建适当的索引避免过多的索引查照索引的创建原则覆盖索引使用索引覆盖查询避免回表调高效率
3SQL语句优化
尽量明确指定需要的列避免使用SELECT *以减少不必要的数据传输SQL语句要避免造成索引失效的写法尽量用union all 替代 union union多了一次过滤效率较低避免子查询特别是当子查询返回大量数据时可以考虑JOIN或WITH子句替代 10.怎么选择表中的前50条数据
SELECT * FROM table_name LIMIT 50;11.final, finally, finalize有什么区别
final、finally 和 finalize 都是 Java 中的关键字或术语但它们的功能和使用场景完全不同。下面是这三者的区别
1. final
final 是一个修饰符用于声明常量、方法、类或变量表示这些元素是不可更改或不可继承的。它有四种主要用途 修饰变量常量 当 final 修饰变量时表示该变量的值一旦赋值就不能更改即常量。如果是引用类型的变量final 表示引用不可修改但引用对象的内容可以修改。
final int MAX_VALUE 100;
MAX_VALUE 200; // 编译错误因为 MAX_VALUE 是常量不能改变其值修饰方法 当 final 修饰方法时表示该方法不能被子类重写Override。
public class Parent {public final void show() {System.out.println(This is a final method.);}
}public class Child extends Parent {Overridepublic void show() { // 编译错误无法重写父类中的 final 方法System.out.println(Child method.);}
}修饰类 当 final 修饰类时表示该类不能被继承。
public final class MyClass {// 类的内容
}// 编译错误无法继承 final 类
public class SubClass extends MyClass {
}修饰参数 当 final 修饰方法参数时表示该参数的值在方法内部不能改变。
public void myMethod(final int value) {value 10; // 编译错误value 是 final不能修改
}2. finally
finally 是一个用于异常处理的块它总是会执行不管是否发生异常。finally 主要用于释放资源、清理操作等无论是否发生异常都确保资源被正确释放。
finally 语句块通常与 try-catch 配合使用确保某些资源的清理操作如文件关闭、数据库连接关闭等始终会执行即使 try 块中发生了异常。 public void myMethod() {try {// 可能抛出异常的代码int result 10 / 0;} catch (ArithmeticException e) {System.out.println(Error: e.getMessage());} finally {System.out.println(This will always execute, whether or not an exception occurs.);}
} 输出 Error: / by zero
This will always execute, whether or not an exception occurs.如果 try 或 catch 中有 return 语句finally 块仍然会执行且在 finally 块执行之后再返回结果。
3. finalize
finalize 是 Object 类的一个方法用于在对象被垃圾回收之前执行清理操作。该方法在垃圾回收器准备销毁对象之前调用通常用于释放资源如关闭文件流或数据库连接等。它不是强制执行的不一定每次都会被调用。
finalize() 方法通常不建议使用因为垃圾回收的时机不确定而且无法保证一定会被调用。现在更多推荐使用 try-with-resources 语句和 AutoCloseable 来进行资源管理。 public class MyClass {Overrideprotected void finalize() throws Throwable {System.out.println(finalize() method called. Resource cleanup...);super.finalize();}
} finalize() 可能会被 JVM 在垃圾回收时自动调用或者由开发者显式调用但这不应作为释放资源的主要方法因为垃圾回收的时机不确定。 12. char 和 varchar有什么区别
char 和 varchar 都是用于存储字符数据的 SQL 数据类型但它们有一些显著的区别主要体现在 存储方式、占用空间 和 性能 等方面。以下是它们的详细区别
1. 存储方式 char用于存储定长固定长度的字符串。无论实际存储的数据的长度如何都会使用指定的长度来存储数据。即使存储的字符串长度小于定义的长度char 也会在末尾填充空格通常是空格字符。 例如定义 char(10)如果插入的数据是 abc它会自动补充 7 个空格使得存储的实际数据变为 abc 。 varchar用于存储变长可变长度的字符串。它只会根据实际存储的数据的长度来占用空间不会填充空格。 例如定义 varchar(10)如果插入的数据是 abc它只会占用 3 个字符的空间而不会填充空格。
2. 占用空间 char无论实际存储的字符串长度是多少它都会占用固定的字节数。比如定义 char(10)不管你存储的是 3 个字符还是 10 个字符它都会占用 10 个字符的空间。 varchar只会根据实际存储的数据长度来占用空间不会浪费空间。例如定义 varchar(10) 存储 3 个字符时只会占用 3 个字符的空间。
3. 性能 char由于是定长字段因此在读取数据时数据库知道每个字段的长度是固定的因此读取速度可能比 varchar 更快尤其是在存储大量小数据如固定格式的字符数据时。 varchar由于是变长字段数据库需要存储每个字符串的实际长度因此可能会有一些额外的开销。不过当存储的字符串长度差异很大时varchar 更节省空间性能表现会更好。
13.一个接口可以实现另一个接口吗
在 Java 中一个接口 不能实现 另一个接口但它可以 继承 另一个接口。 14. 一个类可以继承多个类吗
在 Java 中一个类 不能继承多个类。这是 Java 的一个重要特性称为 单继承。也就是说一个类只能继承自一个直接父类。 15.String a new String(123); 这条语句创建了几个String Object?
在 Java 中语句 String a new String(123); 如果字符串常量池已经存在就创建一个不存在就创建了 两个 String 对象分别是 一个字符串常量对象123 是一个字符串常量。每当你在代码中使用字符串字面量如 123时Java 会检查字符串常量池中是否已经存在该字符串。如果没有它会创建一个新的字符串对象并将其存储在字符串常量池中。 一个新的 String 对象new String(123) 会创建一个新的 String 对象该对象是通过构造函数显式地创建的并且该对象的内容是 123。这个对象是在堆内存中创建的。
123在字符串常量池中创建了一个字符串对象如果之前没有创建过。new String(123)在堆内存中创建了一个新的 String 对象内容为 123并且该对象引用了常量池中的 123。 16. NOW() 和 CURRENT_DATE有什么区别
1时间精度NOW放回当前日期和时间精确到秒CURRENT_DATE只返回当前的日期不包含时间
2NOW返回DATETIME或TIMESTAMP类型CURRENT_DATE返回DATE类型 17. Array 和 ArrayList有什么区别
1大小容量Array是固定大小的一旦创建后大小就无法改变ArrayList是动态扩展的当ArrayList的元素个数达到数组长度就执行扩容新数组的长度为原来的1.5倍
2存储类型Array可以存储基本数据类型和对象ArrayList只能存储对象类型不能直接存储基本数据类型但Java提供了自动装箱机制可以将基本数据类型转化为包装类对象因此添加元素的时候可以直接添加基本数据类型 二、面试内容
1.能说一下你对redis的理解吗几种数据缓存的应用为什么要使用redis?
对 Redis 的理解
RedisRemote Dictionary Server是一个开源的内存数据存储系统常用作数据库、缓存和消息中间件。它支持多种数据结构比如 字符串、哈希、列表、集合、有序集合、位图、HyperLogLog 和 地理位置 等提供了高性能的数据存取能力广泛应用于 缓存、会话管理、分布式锁、消息队列 等场景。
Redis 主要特点包括
高性能通过内存存储Redis 在数据读写方面速度非常快能够支持每秒数十万次读写操作。支持丰富的数据类型不仅支持常见的字符串类型还支持哈希、列表、集合等多种复杂的数据结构。持久化机制Redis 提供了两种持久化方式RDB 和 AOF可以根据需求选择是否持久化数据。分布式特性支持主从复制、分片和高可用集群等功能能够在分布式系统中有效地扩展。支持事务通过 Redis 提供的事务机制可以保证多个命令的原子性执行。
为什么要使用 Redis 进行数据缓存
Redis 被广泛用作缓存系统原因如下 高性能 Redis 作为一个基于内存的数据存储读取和写入操作速度极快适用于需要高并发和快速响应的场景。例如缓存数据库查询结果或频繁访问的数据时Redis 能显著提高性能减少数据库压力。 减少数据库负载 在高并发系统中数据库可能成为性能瓶颈。通过将热数据缓存在 Redis 中可以有效减轻数据库的压力避免频繁的磁盘访问和复杂查询减少数据库负载提高整个系统的响应速度和吞吐量。 支持丰富的数据结构 Redis 提供了多种数据结构如哈希、列表、集合、排序集合等这使得它不仅仅是一个简单的 key-value 存储。可以根据具体需求选择不同的数据结构提升缓存系统的灵活性。 分布式特性 Redis 支持主从复制和分布式集群能够在分布式架构中横向扩展满足大规模数据缓存的需求。可以通过 Redis Cluster 实现数据的分片保证数据的高可用性和负载均衡。 持久化机制 Redis 提供了持久化选项RDB 快照和 AOF 日志即使发生故障数据也不会丢失适合需要缓存数据持久化的场景。比如存储用户的购物车数据尽管是缓存但如果系统宕机用户数据依然可以恢复。
2.说一下spring的核心是什么 依赖注入Dependency InjectionDI 依赖注入是 Spring 框架的核心功能之一它通过控制反转IoCInversion of Control来实现。传统的开发中组件通常会显式地创建其依赖的对象而 Spring 的 IoC 容器则负责管理对象的生命周期及其依赖关系。简化开发通过将对象的创建和管理交给 Spring 容器开发者只需要关注业务逻辑而无需手动创建和管理对象的实例。解耦对象之间的依赖关系由 Spring 容器管理而不是硬编码在代码中这样可以降低模块之间的耦合度提高代码的灵活性和可测试性。 依赖注入方式 构造器注入通过构造器传递依赖对象。Setter 注入通过 setter 方法注入依赖对象。字段注入直接在字段上使用注解来注入依赖。 面向切面编程Aspect-Oriented ProgrammingAOP AOP 允许通过横切关注点如日志、事务管理等来分离业务逻辑减少代码重复。Spring 的 AOP 功能使得开发者可以在不修改核心业务代码的情况下添加额外的功能例如日志记录、性能监控、事务管理等。切面AspectAOP 的核心组成部分表示对特定功能如日志、事务等的抽象。通知Advice定义在切点上执行的操作。切点Joinpoint程序执行过程中的某个点例如方法调用或方法执行之前、之后等。织入Weaving将切面应用到目标对象的过程。 Spring 的 IoC 容器 IoC 容器是 Spring 的核心容器它负责管理 Bean 的创建、配置和生命周期。容器通过配置文件如 XML 配置文件或注解如 Component、Autowired 等来扫描和注入依赖。Bean在 Spring 中管理的对象被称为 Bean。Spring 容器负责这些 Bean 的实例化、配置和管理。ApplicationContextApplicationContext 是 Spring 容器的一个实现提供了更强大的功能如事件传播、国际化支持等。
3.说一下Linux的一些基本命令
Linux 是一个功能强大的操作系统广泛应用于服务器和开发环境中。了解一些基本的 Linux 命令对于日常的系统管理和开发工作非常重要。下面是一些常用的 Linux 基本命令及其功能
文件和目录操作命令 ls列出目录内容 ls列出当前目录的文件和文件夹。ls -l显示详细的文件信息权限、所有者、大小、修改时间等。ls -a显示所有文件包括隐藏文件以点 . 开头的文件。ls -lh显示详细信息并且以可读性更高的方式显示文件大小例如KB、MB。 cd改变目录 cd 目录路径切换到指定目录。cd ..返回到上一级目录。cd ~切换到用户的主目录。 pwd显示当前工作目录的路径 pwd打印当前的工作目录路径。 mkdir创建目录 mkdir 目录名创建一个新目录。 rmdir删除空目录 rmdir 目录名删除指定的空目录。 rm删除文件或目录 rm 文件名删除文件。rm -r 目录名递归删除目录及其内容。rm -f 文件名强制删除文件不询问确认。 touch创建空文件或更改文件时间戳 touch 文件名创建一个空文件或者更新现有文件的访问时间和修改时间。 cp复制文件或目录 cp 源文件 目标文件复制文件。cp -r 源目录 目标目录递归复制目录。 mv移动或重命名文件/目录 mv 源文件/目录 目标路径将文件或目录移动到指定路径或者重命名文件。 find查找文件 find 路径 -name 文件名在指定路径下查找指定名称的文件。find . -name *.txt在当前目录及其子目录中查找所有 .txt 文件。
文件内容查看和操作命令 cat查看文件内容 cat 文件名查看文件的内容。 more分页显示文件内容 more 文件名分页显示文件内容适用于文件内容较多的情况。 less分页显示文件内容比 more 更强大 less 文件名与 more 类似但可以向前和向后滚动支持更多的交互功能。 head查看文件的开头部分 head 文件名查看文件的前 10 行。head -n 20 文件名查看文件的前 20 行。 tail查看文件的末尾部分 tail 文件名查看文件的最后 10 行。tail -n 20 文件名查看文件的最后 20 行。tail -f 文件名实时查看文件的新增内容常用于日志文件。 grep在文件中查找指定的字符串 grep 关键词 文件名查找文件中包含指定关键词的行。grep -r 关键词 目录递归查找目录中的文件。 wc统计文件中的字数、行数和字符数 wc 文件名输出文件的行数、字数、字符数。wc -l 文件名仅统计文件的行数。
文件权限和所有者管理命令 chmod修改文件或目录的权限 chmod 权限 文件名修改文件或目录的权限。chmod 755 文件名将文件权限设置为可读、可写、可执行对于所有者可读、可执行对于其他用户。 chown修改文件或目录的所有者 chown 用户:用户组 文件名修改文件或目录的所有者和用户组。 chgrp修改文件或目录的用户组 chgrp 用户组 文件名将文件或目录的用户组更改为指定组。
系统信息命令 ps查看当前正在运行的进程 ps显示当前终端的进程信息。ps aux显示所有进程信息。ps -ef显示所有进程信息Linux 系统常用格式。 top实时查看系统资源使用情况 top实时显示进程和系统资源的使用情况CPU、内存等。 df查看磁盘空间 df显示文件系统的磁盘空间使用情况。df -h以人类可读的格式如 GB、MB显示磁盘空间。 du查看磁盘使用情况 du 目录查看目录及其子目录的磁盘使用情况。du -sh 目录显示目录的总大小。 free查看内存使用情况 free显示系统的内存使用情况。free -h以人类可读的格式显示内存使用情况。 uptime查看系统运行时间和负载 uptime显示系统的运行时间、当前时间、用户数和系统负载。 hostname查看或设置主机名 hostname显示当前系统的主机名。hostname 新主机名设置系统的主机名。
网络命令 ping测试与目标主机的网络连接 ping IP地址或域名发送 ICMP 请求检查与目标主机的连接是否正常。 ifconfig旧版命令/ ip新版本命令查看或配置网络接口 ifconfig显示网络接口的配置信息。ip a显示网络接口信息。ip addr show显示 IP 地址和网络接口的信息。 netstat显示网络连接、路由表、接口统计等信息 netstat显示所有网络连接的状态。netstat -tuln显示所有正在监听的端口。 curl与服务器进行数据交互 curl URL发送 HTTP 请求并显示返回的响应。curl -I URL仅获取 HTTP 响应头。 ssh远程登录到服务器 ssh 用户名主机IP通过 SSH 协议远程登录到指定主机。
进程管理命令 kill终止进程 kill 进程ID发送信号终止指定的进程。kill -9 进程ID强制终止指定进程。 killall根据进程名终止进程 killall 进程名终止所有名为 进程名 的进程。 bg将任务放到后台执行 bg 作业号将暂停的作业放到后台继续执行。 fg将任务放到前台执行 fg 作业号将后台的作业调到前台。
压缩和解压命令 tar打包和解包 tar -cvf 压缩包名 目录将指定目录打包成 .tar 文件。tar -xvf 压缩包名解压 .tar 文件。 gzip / gunzip压缩和解压 .gz 文件 gzip 文件名压缩文件成 .gz 格式。gunzip 文件名.gz解压
4.你会JS吗不会