用for遍历数组 用while把当前值与前一个值比一下,如果满足条件,交换当前两个数据位置,直到条件不满足或者数组到0的位置。...核心: while条件ai的值。 if条件j– == 0,这个是数组坐标向下减,也就是往回走。...每次for循环一次,数组向前走一个,然后把这个位置的值取出来和前一个比对,一直比到0位,或者不小于当前值。 看一次,永远记住!
; } public Main(int[] a){ System.out.println("排序前:"); print(a); quickSort...; } public int getMiddle(int[] list,int low,int high){ int temp=list[low];//数组的第一个作为中轴...high= "+high); return low;//返回中轴位置 //判断得知,最后三个中轴为3 2 0 } public void quickSort...high){ if(low<high){ int middle=getMiddle(a, low, high);//将数组a一分为二 quickSort...(a, low, middle-1);//对小于中轴的部分递归排序 quickSort(a, middle+1, high);//对大于中轴的部分递归排序 }
目前,最常见的排序算法大概有七八种,其中"快速排序"(Quicksort)使用得最广泛,速度也较快。它是图灵奖得主C. A. R. Hoare(1934--)于1960时提出来的。...(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。 ...下面参照网上的资料(这里和这里),用Javascript语言实现上面的算法。 首先,定义一个quickSort函数,它的参数是一个数组。...var quickSort = function(arr) { }; 然后,检查数组的元素个数,如果小于等于1,就返回。...(left).concat([pivot], quickSort(right)); }; 使用的时候,直接调用quickSort()就行了。
大家好,又见面了,我是你们的朋友全栈君。 一、简介 快速排序是(Quick sort)是对冒泡排序的一种改进,是非常重要且应用比较广泛的一种高效率排序算法。...---- 二、算法思路 快速排序是通过多次比较和交换来实现排序,在一趟排序中把将要排序的数据分成两个独立的部分,对这两部分进行排序使得其中一部分所有数据比另一部分都要小,然后继续递归排序这两部分,最终实现所有数据有序...将大于或等于分界值的数据集中到右边,小于分界值的数据集中到左边。...一趟排序过后,左边部分中各个数据元素都小于分界值,而右边部分中各数据元素都大于或等于分界值,且右边部分个数据元素皆大于左边所有数据元素。...first]; } num[first]=key; //递归左右部分进行快排 quick_sort(num,l,first); quick_sort(num,first+1,r); } ---- Java
if语句if语句是Java语言中的一种条件语句,用于在程序运行时基于给定的条件选择要执行的语句块。...如果条件为true,那么将执行if代码块中的语句;否则,将执行else代码块中的语句。...除了基本的if语句,Java还提供了一些变体,可以更灵活地控制代码的执行流程。下面是其中一些常见的变体:if-else-if语句在需要根据多个条件进行选择的情况下,可以使用if-else-if语句。...如果所有条件都不满足,那么将执行else代码块中的语句。...三目运算符Java还提供了一种特殊的条件语句,称为三目运算符(或者叫条件运算符)。它的基本语法结构如下:result = condition ?
对于Scanner的进一步理解还是在LeetCode的一道算法题上,题目大意是输入一组分式加法构成的字符串,要求输出分式相加的结果。首先是输入”-2/3+2/3-4/5″,接着求其和。...首先第一步需要解析字符串为所需的数据,我使用了split()的方式,有位大哥就使用了`scanner.useDelimiter(pattern)`方法,直接将数据解析到了Scaner对象中。...# Scanner的工作方式 Scanner的分隔符模式将输入分割到令牌(token,就是临时存储区域),默认情况下以**空格**分割。然后可以使用各种next方法将得到的令牌转换成不同类型的值。...`pattern的模式`,并返回一个新的Scanner对象。...**总结:使用Scanner+正则的组合可以简化很多字符串的处理,而无需使用大量的代码分割字符串和数值转换。
大家好,又见面了,我是你们的朋友全栈君。 展开全部 代码块是一种常见的代码形式。...代码块的格式如下: 1、普通代码块:是最常见的代码块,在方法里用一对“{}”括起来的数据,就是普通的代码块, 2、构造代码块:是在类中直接定义的,用“{}”括起来的代码。...3、静态代码块:他在类中的成员位置,用“{}”括起来的代码。...所以他会执行class Nihaoa类下的静态块,在执行 main方法,编译class GouZao类,然后执行代码,静态的执行一次,构造方法块每次执行 java中“:” 如果是switch...中的,是它的一种固定写法。
,但是此类算法对于带有重复性的排序很不友好,还是太慢了,因此对于这道题,也是一道经典的荷兰国旗问题,使用类似双指针算法中的移动零那道题的方法,划分区间比较排序,衍生出来了一种三划分排序算法,也叫作快速排序...第一步: 首先我们这题要排序的是0、1、2三个数字,所以划分为三个区间,分别是小于1的区间,等于1的区间,大于1的区间。...,只不过该题才是真正的将快速排序的方法效率最大化,能普及到大部分的题目上,重点是要选取基准元素划分区间 第一步: 根据算法导论的期望严谨证明,发现用随机的方式选取基准元素是最优的算法,因此我们可以使用rand...right) { int r = rand(); return nums[r % (right - left + 1) + left]; } }; 4.数组中的第...k个最大元素 ✏️题目描述: ✏️示例: 传送门:数组中的第k个最大元素 题解: 本题要求找数组中的第k个最大元素,本质是快速排序算法中的快速选择算法,该方法同样适用第k小,前k大,前k小 细节问题
一个例子 Object类是所有类的父类,如果你去查看java.lang.Object类的源码,你会发现里面有个finalize方法,这个方法没有默认实现,需要子类根据实际情况重写这个方法,但是如果不恰当使用...类里也有一个引用队列,这个引用队列是JVM和垃圾回收器打交道的唯一途径,当垃圾回收器需要回收该对象时,会把该对象放到引用队列中,这样java.lang.ref.Finalizer类就可以从队列中取出该对象...$100(Finalizer.java:14) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160) 这个线程唯一的职责就是不断的从...java.lang.ref.Finalizer.ReferenceQueue队列中取对象,当一个对象进入到队列中,finalizer线程就执行对象的finalize方法并且把对象从队列中删除,因此在下一次...histo:live 8700|head -n 10命令强制触发一次GC,结果和前面的分析一致,Finalizer对象都放到引用队列中,并依次调用了对象的finalize方法,内存中java.lang.ref.Finalizer
大家好,又见面了,我是你们的朋友全栈君。 Java反射学习 所谓反射,可以理解为在运行时期获取对象类型信息的操作。...1,获得类型类 我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类。Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类。...类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型。所有的类型类都是Class类的实例。...可以看到,对象a是A的一个实例,A某一个类,在if语句中使用a.getClass()返回的结果正是A的类型类,在Java中表示一个特定类型的类型类可以用“类型.class”的方式获得,因为a.getClass...特别注意的是,类型类是一一对应的,父类的类型类和子类的类型类是不同的,因此,假设A是B的子类,那么如下的代码将得到 “unequal”的输出: A a = new A(); if(a.getClass(
概述: Java Stream API 有助于处理元素序列,提供过滤、映射和减少等操作。...流可用于以声明方式执行操作,类似于对数据的类似 SQL 的操作 关键概念: 流:支持顺序和并行聚合操作的元素序列 中间操作:返回另一个流且延迟的操作(例如,filter、map) 码头运营:产生结果或副作用且不懒惰的操作...; import java.util.List; import java.util.stream.Collectors; public class Main { public static void...Collectors.toList()); names.forEach(System.out::println); } } 收集:收集将流的元素收集到集合或其他数据结构中...它允许: 滤波:根据条件选择元素 映射:转换元素 收集:将元素收集到集合或其他数据结构中 减少:将元素组合成一个结果。 平面映射:展平嵌套结构。 排序:Order 元素。
大家好,又见面了,我是你们的朋友全栈君。 JAVA提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。...这个String类提供了不可改变的字符串。 而这个StringBuffer类提供的字符串可以进行修改。 String: 为不可变对象,一旦被创建,就不能修改它的值....对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去....;//error 对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer 中付值的时候可以通过它的append方法. ss.append(“w!”)...而String是不能被修改的,只能重复的去创建对象来实现修改。——如果频繁的对字符串进行追加、替换、修改、插入、删除操作,最好使用StringBuffer。
Java中的异常 异常:直观的理解就是不正常,不完全正确,可能存在某些问题。在实际编写程序的过程中,往往可能出于疏忽而导致程序出现bug。...合理的处理异常,会使得程序的健壮性,可读性以及可维护性得到大大的提高。 在java中,提供了优秀的异常机制,当程序出现在运行时期的异常和编译阶段的异常,提供解决错误的方法。...错误:是指系统出现错误或运行环境出现的错误,此类错误非常严重。即使捕捉到也不能够有效的处理,由java虚拟机生成并抛出,通常这类型的错误是由系统错误引起的。...下图是java中异常的层次结构: 在程序中显式的进行异常的处理 1.捕获可能存在的异常。...使用自定义的异常 有时候,系统的提高的异常并不能完全够实际的开发使用,由于java的继承机制,可以很好的提高代码复用。
---- 欢迎跳转到本文的原文链接:https://honeypps.com/java/locks-in-java/ 在学习或者使用Java的过程中进程会遇到各种各样的锁的概念:公平锁、非公平锁、自旋锁...这里整理了Java中的各种锁,若有不足之处希望大家在下方留言探讨。 WARNING:本文适合有一定JAVA基础的同学阅读。...##自旋锁 Java的线程是映射到操作系统的原生线程之上的,如果要阻塞或唤醒一个线程,都需要操作系统来帮忙完成,这就需要从用户态转换到核心态中,因此状态装换需要耗费很多的处理器时间,对于代码简单的同步块...博主在Java对象大小内幕浅析中提到了Java对象的内存布局分为:对象头、实例数据和对齐填充,而对象头又可以分为”Mark Word”和类型指针klass。”...---- 参考资料 《深入理解Java虚拟机》周志明著 《Java并发编程的艺术》方腾飞等著 Java对象大小内幕浅析 JVM内部细节之一:synchronized关键字及实现细节(轻量级锁Lightweight
如果对应的key被回收,则这个key指向的对象会被从Map容器中移除。 ...中的a将自动被回收掉。 ...b对象虽然指向了null,但HashMap中还有指向b的指针。 ...在get方法中,也是优先从eden中找对应的v,如果没有则进入longterm缓存中查找,找到后就加入eden缓存并返回。 ...参考文献 WeakHashMap的使用场景Java中的WeakHashMap
1 static 静态变量 1.1 静态变量的使用 static变量也称作静态变量,也叫做类变量 静态变量被所有的对象所共享,在内存中只有一个副本 当且仅当在类初次加载时会被初始化 静态变量属于类 通过类名就可以直接调用静态变量...静态变量随着类的加载,存在于方法区中; 实例变量随着对象的建立,存在于堆内存中。 静态变量在程序开始时创建,在程序结束时销毁; 实例变量在对象创建时创建,在对象被销毁时销毁。...2 静态方法 static修饰的方法,叫静态方法,也叫做类方法 静态方法中,不能直接访问非静态成员变量和非静态成员方法 静态方法中,不能使用 this 关键字 通过类名可以直接调用静态方法 也可以通过对象名...:静态块 --> 匿名块 --> 构造方法 4 静态引入 如果我们需要频繁引用某一个类下的方法,比如 java.lang.Math 类下相关的数据计算类,或者是用于进行单元测试的 org.junit.Assert...import static java.lang.Math.random; import static org.junit.Assert.assertTrue; public class test {
单行注释 写法: //此行后面均是注释内容 例如://我是一行注释|´・ω・)ノ 多行注释 写法: /* 我是注释内容1 我是注释内容2 */ 单/多行注释的作用: 增强代码的可读性 文档注释...写法: /** *我是文档注释内容 */ 文档注释的作用: 注释允许你在程序中嵌入关于程序的信息。...你可以使用 javadoc 工具软件来生成信息,并输出到HTML文件中。 说明注释,使你更加方便的记录你的程序信息。...javadoc标签 在开始的 /** 之后,第一行或几行是关于类、变量和方法的主要描述。 之后,你可以包含一个或多个各种各样的 @ 标签。...每一个 @ 标签必须在一个新行的开始或者在一行的开始紧跟星号(*). 多个相同类型的标签应该放成一组。例如,如果你有三个 @see 标签,可以将它们一个接一个的放在一起。 示例:
大家好,又见面了,我是你们的朋友全栈君。 从初学者的角度,认真地学习Java中队列的使用和设计。...参考 java doc DelayQueue详解 ---- Queue 继承Collection接口 Deque 一个支持两端插入和删除的线性集合,此接口支持容量受限和不受限的双端队列(大多数实现容量不受限...堆栈方法等同于Deque方法如下表所示: 强烈建议不要在队列中插入null ,因为null是队列中某些方法的返回值,具有特殊意义,比如队列中没有元素了。...队列的开头是已在队列中停留最长时间的元素。队列的尾部是最短时间位于队列中的元素。新元素插入到队列的尾部,并且队列检索操作在队列的开头获取元素。...若一进来,x元素就>=父节点,则k=入参中的k //2.
点击上方 好好学java ,选择 星标 公众号 重磅资讯、干货,第一时间送达今日推荐:用好Java中的枚举,真的没有那么简单!...” 先来看下利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。 具体表现为以下3种形式。 对于普通同步方法,锁是当前实例对象。...2.2.3 锁存放的位置 锁标记存放在Java对象头的Mark Word中。 ? Java对象头长度 ? 32位JVM Mark Word 结构 ? 32位JVM Mark Word 状态变化 ?...2.2.4 锁的优缺点对比 ? image.png 2.3、CAS ★CAS,在Java并发应用中通常指CompareAndSwap或CompareAndSet,即比较并交换。...3、Java中的锁实现 3.1、队列同步器(AQS) ★队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架。
在这篇文章中,我们对 Java 中的 NaN 进行一些简单的描述和说明和在那些操作的过程中可以尝试这个值,和可以如何去避免。 什么是 NaN NaN 通常表示一个无效的操作结果。 ...例如,你尝试将数字 0 去除以 0,这个在数学中是不存在的,同时在 Java 中定义 NaN 也确实就是通过这个不存在的操作来定义的。 我们通常也使用 NaN 来表示不能显示的变量值。 ...在 Java 中没有针对其他数据类型定义的 NaN 了。...NaN 在绝大部分情况下都不是一个有效的输入参数,因此在 Java 的方法中,我需要对输入的参数进行比较,以确保输入的参数中的值不是 NaN,然后我们能够对输入参数进行正确的处理。...,我们对 NaN 的情况进行了一些简单的讨论,同时我们也讨论了在实际的计算中可能会有哪些情况会导致产生 NaN,同时对如何进行 NaN 在 Java 中的比较和计算也提供了一些实例。
领取专属 10元无门槛券
手把手带您无忧上云