当前位置:网站首页 > Java教程 > 正文

算法教程java



我比较推荐大家用 Java 语言学习算法,主要有以下几个原因:

1、Java 是强类型语言。因为我们就是要学习运用各种数据结构写算法嘛,所以清楚地知道每个变量是什么类型非常重要,方便你 debug,也方便 IDE 进行语法检查。如果是 Python 这样的动态语言,每个变量的类型不明显,可能有碍大家的理解。

2、Java 这种语言中规中矩,没有什么花里胡哨的语言特性。即便你之前没学过 Java 语言,单看代码也能轻易地理解逻辑。

另外,抛开算法不谈,单就编程技术的学习来说,我也建议大家多学习几门语言,尤其是像 Java 这种使用非常广泛的语言。因为任何人的职业生涯都不可能只用一种编程语言的,一般都是换个工作就会换一套技术栈,所以主流编程语言最基本的语法要能看的懂,这对以后得工作也会有很大帮助。

本站的所有解法代码都会避开 Java 的高级语言特性,用最朴素的、最容易看懂的方式写代码。

下面我会带大家过一遍学习我的算法教程所需的 Java 基本用法,以便不了解 Java 的小伙也能伴顺畅地学习我的文章。

首先,Java 的基本知识网上有很多,我就不重复造轮子了,我就随便贴一个中文教程吧,你如果有更喜欢的 Java 教程也可以看你喜欢的:

https://www.runoob.com/java/java-tutorial.html

我圈出的这一部分是 Java 的基本用法,你需要看一下。当然这个网站也有其他的 Java 基础知识,你有空也可以快速浏览一下:

下面我具体介绍一下我在教程中会用到的 Java 的标准库的数据结构以及一些可能踩坑的语言特性。

Java 中最基本的数据类型叫 Primitive Type(原始类型),比如 这种小写字母的关键字。大家应该都学过 C 语言,所以对于原始类型应该不陌生,因为 C 语言里几乎只有原始类型,连字符串都只能用 字符数组来表示,只能使用指针进行操作,使用起来非常不方便。

当然,作为高级编程语言,Java 提供了很多高级数据类型,都封装成了标准库中的(Java 中类的名字都以大写字母开头),比如 Java 中的字符串就是 类,这个类有 等方法,这样我们就不用管底层的操作细节,使用起来方便多了。

以下是一些基本的 Java 类型。

1、数组

初始化方法:

作为原始类型,这就类似 C 语言的 数组,如果涉及到比较复杂的操作,用起来比较麻烦,所以我们更多地使用 动态数组。

2、字符串

Java 的字符串处理起来挺麻烦的,因为它不支持用 直接访问其中的字符,而且不能直接修改,要转化成 类型才能修改。主要说下 中我们会用到的一些特性:

Java 的字符串不能直接修改,要用 转化成 的数组进行修改,然后再转换回 类型。

另外,虽然字符串支持用 进行拼接,但是效率并不高,并不建议在 for 循环中使用。如果需要进行频繁的字符串拼接,推荐使用 :

还有一个重要的问题就是字符串的相等性比较,这个问题涉及语言特性,简单说就是一定要用字符串的 方法比较两个字符串是否相同,不要用 比较,否则可能出现不易察觉的 bug。

3、动态数组

相当于把 Java 内置的数组类型做了包装,初始化方法:

我们做算法题时这些最简单的方法就够用了,你应该看一眼就能明白。

在数据结构基础部分,我会在 中带着大家实现一个 ,以便了解这种常见数据结构的底层原理。

4、双链表

列表底层是数组实现的,而 底层是双链表实现的,初始化方法也是类似的:

这些也都是最简单的方法,和 不同的是,我们更多地使用了 对于头部和尾部元素的操作,因为底层数据结构为链表,直接操作头尾的元素效率较高。其中只有 方法的时间复杂度是 ,因为必须遍历整个链表才能判断元素是否存在。

在数据结构基础部分,我会在 中带着大家实现一个 ,以便了解这种常见数据结构的底层原理。

5、哈希表

哈希表是非常常用的数据结构,用来存储键值对映射,初始化方法:

6、哈希集合

初始化方法:

等你实现了 ,就知道 底层和 其实是一样的。

首先说一下泛型编程。泛型是 Java 提供的一种模板,能够将数据结构的实现和数据类型解耦。

比如说我们在使用 双链表的时候,可以随意设置其中的元素类型。不过需要注意,在泛型中只能使用类,不能使用原始类型:

我们在实现自己的数据结构类时,也需要使用泛型,以便我们的数据结构能够装任何类型。

比如在 中实现的 ,在 new 的时候传入什么类型,那么这个 就会变成什么类型:

当然,某些特殊数据结构对存储的数据类型有要求。比如 这种数据结构,由于底层是用 BST(二叉搜索树)来存储键值对,所以 要求存入其中的键必须是「可比较的」,即对于任意两个键,必须能够知道它俩谁大谁小。

在 Java 中,可以给泛型变量添加 来指定该泛型的某些特性:

这个 是 Java 标准库提供的一个接口,实现如下:

所以 的意思就是说,泛型 实现了这个接口,即类型 有 这个方法,这意味着两个 类型的数据可以比较大小。

另外再说下 Java 的接口,免得有些读者疑惑。我们有时候会看到这样的写法:

实际 出来的是 类型,但为什么用 类型和 类型接收呢?因为 和 都是 Java 标准库中的接口类型:

所谓接口,就是一组方法的集合,只要一个类使用 关键词申明自己实现了接口中的所有方法,那么就可以用这个接口的类型来接收这个类的实例化对象。

具体地,标准库提供的 类实现了 接口中的所有方法:

所以可以用 接口接收 类型, 接口同理。

当然,编程语言的接口和继承往深里说有很多设计方法的学问,大家有兴趣可以自己搜索学习。因为我们当前的重点在数据结构和算法,所以掌握这些最最基本的知识完全足够你理解我写的 Java 算法代码了。

  • 上一篇: 循序渐进java2教程
  • 下一篇: java循环教程
  • 版权声明


    相关文章:

  • 循序渐进java2教程2025-01-27 19:02:05
  • java编程教程书籍2025-01-27 19:02:05
  • Java EE企业级应用开发实例教程2025-01-27 19:02:05
  • java websocket 视频教程2025-01-27 19:02:05
  • java异步模式教程2025-01-27 19:02:05
  • java循环教程2025-01-27 19:02:05
  • java36教程2025-01-27 19:02:05
  • java拆解教程2025-01-27 19:02:05
  • java素数教程2025-01-27 19:02:05
  • 问道JAVA端修改教程2025-01-27 19:02:05