
Java
文章平均质量分 87
阿飞__
熟悉 Android、C++ 等
展开
-
Java/Android中汉字转拼音的两种方法,优劣比较
常见的两种汉字转拼音的方法,分析和比较原创 2016-05-25 22:21:55 · 15060 阅读 · 0 评论 -
Java 插入排序法
一、原理简介插入排序的原理即是,从第二个元素开始,找到合适的位置,将元素插入到之前已排好序的元素中去,依次下去最终完成排序。就类似打扑克牌,每次抓到一张新的牌时,都将其插入到手中已排好序的牌组中。插入排序适用于少量数据的排序,特别是将一个新的元素插入到已有的排好序的数组中,插入排序是一种稳定的排序方法。 二、时间复杂度插入排序的时间复杂度为 O(n^2)。由于每次插入一个新...原创 2018-10-06 09:40:46 · 1374 阅读 · 0 评论 -
Java 归并排序法
一、原理简介归并排序又称合并排序,即针对两个已经排序好的数组,将其合并为一个排序数组。归并过程中,依次比较两个数组中的元素,将较小值(假设为升序排序)放入新数组中,最终遍历完两个数组后完成排序。归并排序是一种速度较快的排序方法。 二、时间复杂度当我们合并 两个已排序的数组,只需要遍历一遍即可,其时间复杂度为 O(n)。当我们对一个 无序数组 使用归并排序法进行排序,我们可以...原创 2018-10-06 13:10:52 · 477 阅读 · 0 评论 -
用 Java 手把手写一个“二叉搜索树”,支持泛型
一、二叉搜索树先说一下二叉树,二叉树是一种至多只有左右两个子结点的树形结构。二叉搜索树是二叉树的一种,对于任意一个结点 x,其左子树的任一结点的值都不大于 x 的值,其右子树的任一结点的值都不小于 x 的值。二叉搜索树上的基本操作有 查询 (search)、最小值 (minimum)、最大值 (maximum)、前驱值 (predecessor)、后继值 (successor)、插入 ...原创 2018-10-13 14:39:24 · 5147 阅读 · 5 评论 -
堆排序法(Java & C/C++ 实现)
一、前言堆排序是利用堆这种数据结构而设计的一种排序算法。时间复杂度为 O(n * lg n)。介绍堆排序前,我们先介绍一下堆的相关概念,如果你对堆的概念还不熟悉的话可以看看。 二、堆1. 示意图2. 性质除最底层外,该树是完全充满的,且是从左到右填充。树的根结点是 A[ 1 ],若某一结点下标为 i,则很容易得到它的父节点为 i/2,左子结点为 2i,右子结点为...原创 2018-10-07 15:27:39 · 404 阅读 · 0 评论 -
计数排序:时间复杂度仅为 O(n) 的排序算法
一、简介计算排序假设 n 个输入元素都是 0 到 k 区间内的一个整数,其中 k 为某个整数。基本原理:创建一个长度为 k+1 的数组 count[],它的 count[i] 的值对应输入数组中 i 出现的次数。通过遍历一次输入数组并统计每个元素出现次数,最后遍历 count[] 输出。 二、时间复杂度计算排序的时间复杂度为 O(n)。计算排序不是比较排序算法,它没有元...原创 2018-10-07 18:40:10 · 6544 阅读 · 0 评论 -
Java 桶排序,详细分析
一、简介桶排序也是时间复杂度仅为 O(n) 的一种排序方法,它假设输入数据服从均匀分布,我们将数据分别放入到 n 个桶内,先对桶内数据进行排序,然后遍历桶依次取出桶中的元素即可完成排序。和计数排序类似,桶排序也对输入数据作了某种假设,因此它的速度也很快。具体来说,计数排序假设了输入数据都属于一个小区间内的整数,而桶排序则假设输入数据是均匀分布的,即落入每个桶中的元素数量理论也是差不多的,...原创 2018-10-08 11:42:17 · 13548 阅读 · 15 评论 -
Java 基数排序
一、简介基数排序是这样一种排序算法,我们可以从低位(个位)开始,根据个位数排序一次,然后根据十位数排序,再根据百位数进行排序……最终完成整个数组的排序。对于十进制数字而言,每一位只会是 0~9 这十个数字,我们通常使用桶排序(计数排序)来完成每一位数的排序。桶排序是一种稳定的排序算法,基数排序的正确性依赖一种稳定的排序算法。基数排序其实是分 LSD(从低位向高位排序) 和 MSD(从...原创 2018-10-08 17:46:45 · 2415 阅读 · 0 评论 -
有权最短路径问题:贝文曼福德(Bellman Ford)算法 & Java 实现
一、贝尔曼福德算法1. 简介贝尔曼福德(Bellman Ford)算法也是求解单源最短路径问题,相比狄克斯特拉(dijkstra)算法,它运行效率会差一些,但是它可以处理边的权重为负值的情况,而狄克斯特拉算法要求变的权重不能为负数。备注:狄克斯特拉算法,可以戳这个链接:https://blog.youkuaiyun.com/afei__/article/details/833522052. 算法思想...原创 2018-10-25 13:54:17 · 2276 阅读 · 0 评论 -
Java 希尔排序
一、简介希尔排序名称源于它的发明者 Donald Shell,又称缩小增量排序。本质上讲,希尔排序是直接插入排序的一种改进,减少了复制次数,提升了速度。其原理为选定一个增量 increment,使得数组中间隔为 increment 的元素放在一个子序列中,对每个子序列进行插入排序。然后逐渐缩小 increment,重复上述划分和排序,直至 increment 缩小到 1 时完成排序。二、图解...原创 2018-10-21 20:10:16 · 421 阅读 · 0 评论 -
最小生成树问题:算法分析 & Java 实现
一、简介1. 什么是最小生成树将一个有权图中的所以顶点都连接起来,并保证连接的边的总权重最小,即最小生成树(mini spanning tree)问题。例如,电子电路设计中,将所有组件的针脚连接在一起,且希望所使用的连线长度最短。2. 图示如上图(这里借用的是《算法导论》一书中的图)所示,每条边上的数字表示权重。我们使用阴影边连接了所有的顶点,并保证了其总权重是最小的。注意最小生成树...原创 2018-10-23 22:22:37 · 7352 阅读 · 4 评论 -
有权最短路径问题:狄克斯特拉(Dijkstra)算法 & Java 实现
一、有权图之前我们知道,在无权重的图中,求两个顶点之间的最短路径,可以使用 广度优先搜索 算法。但是,当边存在权重(也可以理解为路程的长度)时,广度优先搜索不再适用。针对有权图中的两点间最短路径,目前主要有 狄克斯特拉算法 和 贝尔曼福德算法 两种解决方法。本博客以狄克斯特拉算法为例。备注:广度优先搜索不了解的,可以戳这个链接:https://blog.youkuaiyun.com/afei__/ar...原创 2018-10-24 22:37:12 · 4949 阅读 · 2 评论 -
JNI基础:JNI数据类型和类型描述符
一、简介 在 JNI 开发中,我们知道,Java 的数据类型并不是直接在 JNI 里使用的,例如 int 就是使用 jint 来表示。那么,就如我们来认识一下这些数据类型吧。 二、基本数据类型 Java数据类型 JNI本地类型 C/C++数据类型 数据类型描述 boolea...原创 2018-07-03 15:57:37 · 19764 阅读 · 0 评论 -
浅谈 JNIEnv 和 JavaVM
一、概念1. JavaVmJavaVM 是虚拟机在 JNI 层的代表,一个进程只有一个 JavaVM,所有的线程共用一个 JavaVM。2. JNIEnvJNIEnv 表示 Java 调用 native 语言的环境,是一个封装了几乎全部 JNI 方法的指针。JNIEnv 只在创建它的线程生效,不能跨线程传递,不同线程的 JNIEnv 彼此独立。native 环境中创建的线程...原创 2018-07-10 15:07:22 · 13681 阅读 · 0 评论 -
JNI 方法大全及使用示例
一、说明这里介绍的函数大多是 NDK 开发中常用的函数,但并不是全部,内容稍多,基本可以满足我们的开发需求了,建议通过目录索引来找需要了解的。 这里的函数都是 JNIEnv 操作的相关函数,JNI_OnLoad 等 JavaVM 的方法不在这里介绍。 JNI 有 C、C++ 两种代码风格,即: C风格:(*env)->NewStringUTF(env, "Hellow Wo...原创 2018-07-12 16:04:38 · 16746 阅读 · 4 评论 -
Java环境搭建,以win10为例
一、下载地址 jdk和jre官方网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 根据你的系统选择你需要下载的jdk,32位系统对应x86,64位系统对应x64 下载完后得到一个可执行文件,点击运行进入安装 二、安原创 2016-05-20 21:59:45 · 63843 阅读 · 22 评论 -
LimitQueue固定长度的队列
在开发过程中,有时会有这样的需求,一个固定长度的集合里,当收到新的数据时自动丢掉最旧的数据这样的队列结构。其实实现并不难,即一个队列结构的集合,在推送新数据时判断一下,当集合大小已经达到限制长度时自动丢掉最旧的数据。import java.util.LinkedList;public class LimitQueue<E>{ private int limit; //...原创 2016-06-03 18:32:02 · 19257 阅读 · 1 评论 -
Java / Android 正则表达式判断是否为手机号码
在开发中有时会有这样的需求,就是判断用户输入的手机号码是否正确,这里最好是使用正则表达式来解决。下面是提供一个大致思路,作为学习和参考吧,具体一些场景和特例可能也没考虑到,贴出一个电话号码检查的工具类,基本的电话号码格式都能够满足了。 由百度知道得知:(更新于 2018-03-31) 中国电信号段:133、149、153、173、177、180、181、189、199 ...原创 2016-05-23 16:39:36 · 65615 阅读 · 13 评论 -
交换两个值的三种方法,详细分析
开发中我们经常会需要交换两个值,常见有几种方式:备注:交换前可以先判断两个数是否相等,相等的话就可以跳过交换过程了。方式一:int a = 3;int b = 4;// swapint temp = a;a = b;b = temp;这种方式是最直接也是最容易让你理解的方式了(为了代码的易读性,还是推荐使用这种形式),不过有一个临时变量temp,如果你不想创建临时变...原创 2018-05-01 18:57:40 · 7979 阅读 · 0 评论 -
Java 选择排序法
原理简介 选择排序原理即是,遍历元素找到一个最小(或最大)的元素,把它放在第一个位置,然后再在剩余元素中找到最小(或最大)的元素,把它放在第二个位置,依次下去,完成排序。时间复杂度 选择排序的时间复杂度为 O(n^2)。 第一次需要检查n个元素,但随后检查的元素数依次为n - 1, n – 2, …, 2和1。平均每次检查的元素数为1/2 ...原创 2018-05-01 20:43:12 · 44264 阅读 · 2 评论 -
Java 快速排序法
原理简介 快速排序原理即是,选择数组中的一个元素作为基准值 pivot(通常使用第一个就行),然后遍历其他元素,将小于 pivot 的元素放置在左边,将大于 pivot 的元素放置在右边。如是你可以得到两个子数组,再依次对子数组进行快速排序,最终完成排序。时间复杂度 快速排序比选择排序快得多,其时间复杂度为 O(n * lg n),是最快的排序算法之一。最糟糕...原创 2018-05-05 16:06:32 · 2957 阅读 · 0 评论 -
Java 求最大公约数(欧几里德算法证明)
基本概念如果数a能被数b整除,a就叫做b的倍数,b就叫做a的约数。几个整数中公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数(greatest common divisor)。 代码示例1.使用循环public static int getGCD(int a, int b) { if (a < 0 || b < 0) { ...原创 2018-05-06 17:29:45 · 9792 阅读 · 0 评论 -
几张图看懂进程、线程和锁
进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。1.计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。2.假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。3.进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是...转载 2018-05-27 12:14:01 · 11119 阅读 · 4 评论 -
判断一个数是不是质数(素数),3种方式介绍
一、概念介绍 大家中学都学过,就不过多介绍了,大致提两点: 质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。 0和1既不是质数也不是合数,最小的质数是2二、方法介绍1.最直观,但效率最低的写法public static boolean isPrime(int n){ if (n <= ...原创 2018-06-10 09:56:59 · 292102 阅读 · 51 评论 -
Java线程池介绍和使用
一、背景一张网络图片需要展示在页面上,通常需要开启一个线程去执行下载任务。然而当存在几十上百张图片的时候,每张图片都去开启一个独立的线程去进行下载任务,虽然可行但这并不是一个很好的做法,因为创建一个线程本身就是一个比较大的开销,其次一直创建新的线程,内存也会猛增。那么怎么做比较好呢?对,就是使用线程池来优化,通过重复利用线程对象,既可以避免创建新线程带来的开销问题,也可以通过控制池...原创 2018-06-27 08:57:16 · 2931 阅读 · 0 评论 -
JNI 静态注册和动态注册
一、前言 当执行一个 Java 的 native 方法时,虚拟机是怎么知道该调用 so 中的哪个方法呢?这就需要用到注册的概念了,通过注册,将指定的 native 方法和 so 中对应的方法绑定起来(函数映射表),这样就能够找到相应的方法了。 注册分为 静态注册 和 动态注册 两种。默认的实现方式即静态注册。 二、静态注册1. 定义 通过 JNIEXPORT...原创 2018-07-13 15:18:07 · 12853 阅读 · 1 评论 -
ReentrantLock的介绍使用及“生产者消费者”模式实现
一、简介ReentrantLock 即可重入锁的意思,是 java 控制线程同步的一种方式。和 synchronized 一样都是独占锁,只允许拿到锁的线程访问临界区。synchronized 优点是使用简单,不需要用户手动操作,加锁解锁的过程都是隐式的。ReentrantLock 则需要我们手动加锁和解锁(解锁操作通常放在 finally 代码块中保证执行),虽然使用更复杂但是其灵活性更好...原创 2019-07-02 16:58:52 · 1539 阅读 · 0 评论