汇智动力学院——Java 浅谈数据结构和算法

以前不管自己还是朋友在面试java工程师岗位的时候,都会被问到这样的问题:

“介绍下java中的数据结构和算法”,

很多朋友被问到的时候发现无从下口,甚至特别是一些初级java工程师更是一脸懵逼!那么本篇文章就针对数据结构和算法给大家简单介绍下。

首先要知道我们为什么要学习数据结构和算法?

这里举个简单的例子。编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱。一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数据结构和算法的人也能编程。但是如果一个开车的人懂变速箱的原理,比如降低速度来获得更大的牵引力,或者通过降低牵引力来获得更快的行驶速度。

那么爬坡时使用1档,便可以获得更大的牵引力;下坡时便使用低档限制车的行驶速度。回到编程而言,比如将一个班级的学生名字要临时存储在内存中,你会选择什么数据结构来存储,数组还是ArrayList,或者HashSet,或者别的数据结构。如果不懂数据结构的,可能随便选择一个容器来存储,也能完成所有的功能,但是后期如果随着学生数据量的增多,随便选择的数据结构肯定会存在性能问题,而一个懂数据结构和算法的人,在实际编程中会选择适当的数据结构来解决相应的问题,会极大的提高程序的性能。

1、数据结构

数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。

通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

一、数据结构的基本功能

①、如何插入一条新的数据项

②、如何寻找某一特定的数据项

③、如何删除某一特定的数据项

④、如何迭代的访问各个数据项,以便进行显示或其他操作

二、常用的数据结构

汇智动力李章丰:Java 浅谈数据结构和算法

 

这几种结构优缺点如下:先有个大概印象,后面会详细讲解!!!

汇智动力李章丰:Java 浅谈数据结构和算法

常用的数据结构优缺点

2、算法

算法简单来说就是解决问题的方案步骤。

在Java中,算法通常都是由类的方法来实现的。前面的数据结构,比如链表为啥插入、删除快,而查找慢,平衡的二叉树插入、删除、查找都快,这都是实现这些数据结构的算法所造成的。后面我们讲的各种排序实现也是算法范畴的重要领域。

 一、算法的五个特征

①、有穷性(Finiteness)

算法的有穷性是指算法必须能在执行有限个步骤之后终止;

②、确切性(Definiteness)

算法的每一步骤必须有确切的定义;

③、输入项(Input)

一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;

④、输出项(Output)

一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;

⑤、可行性(Effectiveness)

算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。

二、算法的设计原则

①、正确性:首先,算法应当满足以特定的“规则说明”方式给出的需求。其次,对算法是否“正确”的理解可以有以下四个层次:

一、程序语法错误。

二、程序对于几组输入数据能够得出满足需要的结果。

三、程序对于精心选择的、典型、苛刻切带有刁难性的几组输入数据能够得出满足要求的结果。

四、程序对于一切合法的输入数据都能得到满足要求的结果。

PS:通常以第 三 层意义的正确性作为衡量一个算法是否合格的标准。

②、可读性:算法为了人的阅读与交流,其次才是计算机执行。因此算法应该易于人的理解;另一方面,晦涩难懂的程序易于隐藏较多的错误而难以调试。

③、健壮性:当输入的数据非法时,算法应当恰当的做出反应或进行相应处理,而不是产生莫名其妙的输出结果。并且,处理出错的方法不应是中断程序执行,而是应当返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。

④、高效率与低存储量需求:通常算法效率值得是算法执行时间;存储量是指算法执行过程中所需要的最大存储空间,两者都与问题的规模有关。

前面三点 正确性,可读性和健壮性相信都好理解。对于第四点算法的执行效率和存储量,我们知道比较算法的时候,可能会说“A算法比B算法快两倍”之类的话,但实际上这种说法没有任何意义。因为当数据项个数发生变化时,A算法和B算法的效率比例也会发生变化,比如数据项增加了50%,可能A算法比B算法快三倍,但是如果数据项减少了50%,可能A算法和B算法速度一样。所以描述算法的速度必须要和数据项的个数联系起来。也就是“大O”表示法,它是一种算法复杂度的相对表示方式,这里我简单介绍一下,后面会根据具体的算法来描述。

相对(relative):你只能比较相同的事物。你不能把一个做算数乘法的算法和排序整数列表的算法进行比较。但是,比较2个算法所做的算术操作(一个做乘法,一个做加法)将会告诉你一些有意义的东西;

表示(representation):大O(用它最简单的形式)把算法间的比较简化为了一个单一变量。这个变量的选择基于观察或假设。例如,排序算法之间的对比通常是基于比较操作(比较2个结点来决定这2个结点的相对顺序)。这里面就假设了比较操作的计算开销很大。但是,如果比较操作的计算开销不大,而交换操作的计算开销很大,又会怎么样呢?这就改变了先前的比较方式;

复杂度(complexity):如果排序10,000个元素花费了我1秒,那么排序1百万个元素会花多少时间?在这个例子里,复杂度就是相对其他东西的度量结果。

然后我们再说说算法的存储量,包括:

程序本身所占空间;

输入数据所占空间;

辅助变量所占空间;

一个算法的效率越高越好,而存储量是越低越好。

三、算法的分类

算法可以宏泛的分为三类

一,有限的,确定性算法 这类算法在有限的一段时间内终止。他们可能要花很长时间来执行指定的任务,但仍将在一定的时间内终止。这类算法得出的结果常取决于输入值。

二,有限的,非确定算法 这类算法在有限的时间内终止。然而,对于一个(或一些)给定的数值,算法的结果并不是唯一的或确定的。

三,无限的算法 是那些由于没有定义终止定义条件,或定义的条件无法由输入的数据满足而不终止运行的算法。通常,无限算法的产生是由于未能确定的定义终止条件。

Java中常见的算法有:

①、排序

排序就是对一组数据按照一定的顺序(从大到小或者从小到大)进行排序;

常见排序如下:

简单排序:冒泡排序、选择排序、插入排序;

高级排序:快速排序、希尔排序、归并排序、基数排序、鸡尾酒排序等等;

②、递归

递归是一种直接或者间接调用自身的一种算法,递归的目的是简化程序设计使程序更加易读;

③、查找

在一些(有序的/无序的)数据元素中,通过一定的方法找出与给定关键字相同的数据元素就叫做查找;

④、统计

指对有关数据的搜集、整理、计算、分析、解释、表述等的活动。

 

3、总结

本章主要简单介绍了下数据结构和算法的概念,后面会继续带大家讲解下它们的一些实现过程,敬请期待吧骚年!

本文作者汇智动力学院资深开发讲师李章丰。

<think>好的,我现在需要帮助用户准备能能源公司的Java面试题。首先,用户提到想了解技术问题准备资料,我需要先整理常见的Java面试考点,并结合公司可能的业务方向给出建议。 首先,Java基础是必考的,比如集合框架、多线程、JVM这些。特别是集合类,像HashMap的工作原理,ConcurrentHashMap的线程安全机制,这些经常被问到。然后多线程方面,线程池的参数、锁机制,还有volatilesynchronized的区别都需要掌握。JVM部分,内存模型、垃圾回收算法、类加载机制这些也是重点。 接下来是框架部分,SpringSpring Boot几乎是必问的。IOCAOP的原理,Spring MVC的处理流程,以及Spring Boot的自动配置机制。可能还会涉及到ORM框架,比如MyBatis的一二级缓存,动态SQL的实现方式。 数据库方面,用户需要熟悉MySQL的索引优化、事务隔离级别,以及锁机制。SQL优化技巧,比如执行计划的分析,慢查询的处理方法也很重要。此外,NoSQL如Redis的使用场景、持久化机制集群方案可能也会被问到。 分布式系统相关知识,像CAP理论、服务注册与发现、分布式事务解决方案(如Seata)都需要了解。微服务架构中的问题,比如服务熔断、降级,以及Spring Cloud组件的使用经验也可能被考察。 项目经验部分,用户需要准备好介绍自己参与的项目,尤其是遇到的难点解决方案。比如在能源这样的能源公司,可能涉及高并发数据处理或物联网设备通信,可以结合具体案例说明如何优化系统性能或解决技术难题。 算法题方面,快速排序、二叉树遍历、动态规划等常见题目需要练习。LeetCode牛客网的题库都是不错的资源,尤其是《剑指Offer》里的题目,很多公司都会参考。 另外,公司业务相关的技术点需要针对性准备。能源可能涉及能源管理系统、大数据分析或物联网平台,了解相关的技术架构,比如使用Hadoop处理数据,Kafka进行消息队列,或者Netty处理网络通信,这些都可能成为面试问题。 最后,建议用户参考牛客网上的面经,特别是其他应聘者分享的能源面试经验,了解具体的考察重点。同时,模拟面试练习,加强表达能力问题解决思路的清晰度也很重要。</think>### 能源 Java 面试准备指南 #### 一、技术准备重点 1. **Java 核心基础** - **集合框架**:掌握$HashMap$与$ConcurrentHashMap$的实现差异(红黑树优化、分段锁机制)[^1],$ArrayList$扩容机制(默认容量为10,扩容系数1.5) - **多线程**:线程池参数(核心线程数、阻塞队列类型),$synchronized$与$ReentrantLock$的区别,$volatile$关键字的内存可见性原理 - **JVM**:内存模型(堆、方法区、栈),垃圾回收算法(标记-清除、G1),OOM 排查工具(如$jmap$、$VisualVM$) 2. **主流框架** - **Spring**:IOC 容器实现原理(BeanFactory 与 ApplicationContext),AOP 动态代理(JDK Proxy 与 CGLIB) - **Spring Boot**:自动配置原理(@EnableAutoConfiguration 与 spring.factories),启动流程(Embedded Tomcat 初始化) - **MyBatis**:一级缓存(SqlSession 级别)与二级缓存(Mapper 级别)的作用域,$#\{\}$与$\$\{\}$的区别(防 SQL 注入) 3. **数据库与优化** - **MySQL**:索引失效场景(如函数操作、类型隐式转换),事务隔离级别(脏读、幻读问题) - **Redis**:持久化机制(RDB 快照与 AOF 日志),缓存穿透/雪崩解决方案(布隆过滤器、分级缓存) 4. **分布式系统** - 微服务治理:Spring Cloud Alibaba 组件(Nacos 注册中心、Sentinel 流控) - 分布式事务:Seata 的 AT 模式原理(全局锁+反向补偿) #### 二、业务场景适配 能源可能涉及 **能源管理系统** 或 **物联网平台**,需针对性准备: 1. **高并发场景**:如何设计电表数据采集系统(使用$Kafka$削峰填谷,$Redis$缓存实时数据) 2. **设备通信协议**:熟悉 TCP/IP 长连接(如$Netty$实现心跳机制),MQTT 协议在物联网中的应用 3. **数据存储优化**:时序数据库(如 InfluxDB)在能源监控中的使用场景 #### 三、算法与编码 1. **手撕代码高频题** - 二叉树:层序遍历(队列实现)、最近公共祖先(递归回溯) - 动态规划:背包问题(状态转移方程推导) ```java // 示例:快速排序实现 public void quickSort(int[] arr, int low, int high) { if (low < high) { int pivot = partition(arr, low, high); quickSort(arr, low, pivot - 1); quickSort(arr, pivot + 1, high); } } private int partition(int[] arr, int low, int high) { int pivot = arr[high]; int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] < pivot) { i++; swap(arr, i, j); } } swap(arr, i + 1, high); return i + 1; } ``` #### 四、项目经验梳理 - **难点举例**:在能源监控系统中,如何解决海量数据写入性能瓶颈? - 解决方案:分库分表(按区域哈希分片)+ 批量插入(JDBC 的$addBatch()$优化) - **技术深度**:若使用 Spring Cloud 架构,如何保证服务间调用的幂等性?(Token 机制或数据库唯一约束) #### 五、推荐资料 1. 书籍:《Java 编程思想》《深入理解 Java 虚拟机》 2. 刷题平台:LeetCode 热题 HOT 100,牛客网《Java 工程师校招面试真题》 3. 面经参考:牛客网搜索“能源 Java 面经”[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值