关键字优化

深入理解Java中的final关键字

。_饼干妹妹 提交于 2019-12-04 22:47:58
Java中的final关键字非常重要,它可以应用于类、方法以及变量。这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使用final关键字的实例。final经常和static一起使用来声明常量,你也会看到final是如何改善应用性能的。 final关键字的含义? final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。 什么是final变量? 凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量。final变量经常和static关键字一起使用,作为常量。下面是final变量的例子: 1 2 public static final String LOAN = "loan" ; LOAN = new String( "loan" ) //invalid compilation error final变量是只读的。 什么是final方法? final也可以声明方法。方法前面加上final关键字,代表这个方法不可以被子类的方法重写。如果你认为一个方法的功能已经足够完整了,子类中不需要改变的话

Java中的static关键字解析

我与影子孤独终老i 提交于 2019-12-04 22:40:33
Java中的static关键字解析   static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一。下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题。以下是本文的目录大纲:   一.static关键字的用途   二.static关键字的误区   三.常见的笔试面试题   若有不正之处,希望谅解并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:    http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途   在《Java编程思想》P86页有这样一段话:    “static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”    这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之,一句话来描述就是:    方便在没有创建对象的情况下来进行调用(方法/变量)。    很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了

八大排序之堆排序--堆排序 java

做~自己de王妃 提交于 2019-12-04 22:29:04
堆排序及其优化 java https://www.cnblogs.com/CherishFX/p/4643940.html 堆排序,是利用堆结构进行排序,一般是利用最大堆,即根节点比左右两个子树的节点都大。 堆排序是一种树形选择排序方法,它的特点是:在排序的过程中,将array[0,…,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子节点之间的内在关系,在当前无序区中选择关键字最大(最小)的元素。 1、什么是堆? 堆是有如下特点的二叉树: 1)它是完全二叉树。即除了树的最后一层节点不需要是满的,其他的每层从左到右完全是满的。 2)它常常是数组实现的。 3)堆中的每个节点都必须满足堆的条件。 每个节点的关键字都不大于其子节点的关键字,这种堆称为小根堆。 每个节点的关键字都不小于其子节点的关键字,这种堆称为大堆根。本文采用此结构演示 综上所述,堆是一棵顺序存储的按照特定规则的完全二叉树。 数组的节点的索引为index,则: 1)它的父节点的下标为:(index-1)/2 2)它的左子节点的下标为:2 index + 1 3)它的右子节点的下标为:2 index + 2 2、堆与二叉搜索树的不同: 堆和二叉搜索树相比是弱序的。在二叉搜索树中,所有节点的关键字大于其左子树的关键字,小于其右子树的关键字。但是在堆中,每个节点都不小于其子节点,即从

mysql为什么用b+树做索引

不问归期 提交于 2019-12-04 21:44:01
关键字就是key的意思 一、B-Tree的性质 1、定义任意非叶子结点最多只有M个儿子,且M>2; 2、根结点的儿子数为[2, M]; 3、除根结点以外的非叶子结点的儿子数为[M/2, M]; 4、每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字) 5、非叶子结点的关键字个数=指向儿子的指针个数-1; 6、非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1]; 7、非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树; 8、所有叶子结点位于同一层; 二、B+Tree B+树的性质(下面提到的都是和B树不相同的性质) 1、非叶子节点的子树指针与关键字个数相同; 2、非叶子节点的子树指针p[i],指向关键字值属于[k[i],k[i+1]]的子树.(B树是开区间,也就是说B树不允许关键字重复,B+树允许重复); 3、为所有叶子节点增加一个链指针; 4、所有关键字都在叶子节点出现(稠密索引). (且链表中的关键字恰好是有序的); 5、非叶子节点相当于是叶子节点的索引(稀疏索引),叶子节点相当于是存储(关键字)数据的数据层; 6、更适合于文件系统; 三、为什么说B

volatile 关键字特性解析及单例模式下的使用

我是研究僧i 提交于 2019-12-04 18:28:25
一、什么是 volatile ? volatile 是 Java 中的一个关键字,Java 虚拟机提供的轻量级同步机制。 二、JMM(Java Memory Model) 为了更好的理解 volatile 关键字,应该了解了解 JMM。 JMM(Java内存模型Java Memory Model,简称 JMM)本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范通过规范定制了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。 JMM 的特点: 1、可见性 2、原子性 3、有序性 JMM关于同步规定: 1、线程解锁前,必须把共享变量的值刷新回主内存 2、线程加锁前,必须读取主内存的最新值到自己的工作内存 3、加锁解锁是同一把锁 由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方成为栈空间),工作内存是每个线程的私有数据区域,而Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可访问, 但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝到自己的工作空间,然后对变量进行操作,操作完成再将变量写回主内存 ,不能直接操作主内存中的变量,各个线程中的工作内存储存着主内存中的变量副本拷贝,因此不同的线程无法访问对方的工作内存,此案成间的通讯(传值) 必须通过主内存来完成

日志检索关键字并截取上下行关联内容

三世轮回 提交于 2019-12-04 15:55:48
一,需求说明   我们有一个老系统,每天日志量挺大的(有可能是1G左右),比如要搜索某一个订单从生成到关闭完成,其中有很多步骤,而且有时候订单是批量操作的,如果某一个订单出现问题,从大量日志中排查的话,比较困难。1G的日志文件,我们拉下来取分析的话,电脑配置不行会很卡~而且为了找一个订单号要从头到尾,查找一遍,过程十分痛苦。   所以,想到能不能把日志文件拆分部分来分析,当时使用了一下“文件杀手”这个工具,不过我的电脑配置比较差,虽然分成4小部分,依然觉得卡。后来想能不能根据原文件根据订单号把有关系的部分全部展示出来,中间一大批没关系的部分剔除掉就ok! 二,实现思路 首先,我们需要用一个 固定大小的集合(队列) 来存放我们需要的 关键字上下相关部分 的内容,特点: 先进先出 ,保持存储的是关键字上下行内容; 然后,定一个 afterCount 计数关键字后面紧跟的行数,行数达到阀值 (关键字行处于队列中间位置) 可以输出整个队列并清空; 最后,有几种特殊情况,比如两个关键字行相邻比较近,做法是将 前一个关键字 在队列中填充空白元素行,使前一个关键字 移动 到队列 中间 并全部输出队列,后一个关键字继续放到队列中; 三,代码部分 固定长度队列 package utils.queue; import java.util.Collection; import java.util

C# OOP编程

[亡魂溺海] 提交于 2019-12-04 08:14:47
1:面向对象的概念:什么是类、对象。以及类与对象的关系。 面向对象三大特征: 封装/继承/多台 2:封装性: 用访问修饰符来体现封装性。 Public 公共的/ private 私有的/Protected 受保护的/Internal 本程序集的 3:构造函数。 功能:是维护一个类的完整性。可以通过类的构造函数,使得一个类构造出不同(型号/类别)的对象实体。 特征: 1)构造函数名称与类名相同。 2)构造函数没有返回数值,也不加 void 关键字。 3)构造函数不需要调用,可以直接运行。 4:方法的定义。 方法的构成: 4部分 1) 方法的名称。 2) 方法的参数列表 3) 方法的返回类型,如果没有返回数值,要加“ void” 关键字。 4) 方法体(方法的内容) 5:学习 static 关键字。 特点: 5.1: 用 static 修饰的方法,叫静态方法。 5.2: 在实例方法中,调用静态方法,需要使用类名称调用。 在静态方法中,调用静态方法,可以直接调用。 用途: 是简化编写,为了更容易被访问。 6:继承的概念。 继承使用符号“:”来表示继承。 7:在继承关系下,构造函数的规则。 规则: 实例化子类,系统先自动调用父类的构造函数,然后调用子类构造函数。 8:学习关键字。 base, this. Base: 代表父类对象。 This: 代表本类对象。 适用范围: 在子类与父类发生

详解C中volatile关键字

五迷三道 提交于 2019-12-03 23:43:13
在PHP官网上看到一个浮点数BUG, 测试代码 。在SVN里看了一下修复方法:在变量的声明前加了个volatile关键字。不知道这个是什么意思,特意去网上查了一下,找到了这篇文章,写得不错,转载一下。 volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如 果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举 例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序: short flag; void test() { do1(); while(flag==0); do2(); } 这段程序等待内存变量flag的值变为1(怀疑此处是0,有点疑问,)之后才运行do2()。变量flag的值由别的程序更改,这个程序可能是某个硬件中 断服务程序。例如:如果某个按钮按下的话,就会对DSP产生中断,在按键中断程序中修改flag为1,这样上面的程序就能够得以继续运行。但是,编译器并 不知道flag的值会被别的程序修改,因此在它进行优化的时候,可能会把flag的值先读入某个寄存器,然后等待那个寄存器变为1。如果不幸进行了这样的 优化,那么while循环就变成了死循环

深入理解Java中的final关键字

坚强是说给别人听的谎言 提交于 2019-12-03 20:53:40
final关键字的含义? final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。 什么是final变量? 凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量。final变量经常和static关键字一起使用,作为常量。下面是final变量的例子: public static final String LOAN = "loan"; LOAN = new String("loan") //invalid compilation error final变量是只读的。 什么是final方法? final也可以声明方法。方法前面加上final关键字,代表这个方法不可以被子类的方法重写。如果你认为一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为final。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。下面是final方法的例子: class PersonalLoan{ public final String getName(){ return "personal loan"; } } class

笔记:数据结构与算法

隐身守侯 提交于 2019-12-03 02:31:02
数据结构与算法 常用排序算法 实现比较丑陋,勿喷啊 冒泡排序 :从前向后比较相邻的元素。如果前一个比后一个大,就交换他们两个,每一轮把一个最大的数运到数组最后面。 public static int[] sort(int[] arr) { int len = arr.length; // 冒泡总次数 for (int i = 1; i < len; i++) { boolean flag = true; // 每次冒泡过程 for (int j = 0; j < len - i; j++) { if (arr[j] > arr[j + 1]) { MyUtils.swap(arr, j, j + 1); flag = false; } } if (flag) { // 如果一个冒泡过程没改变,退出返回已经有序 break; } } return arr; } 选择排序 :每次从未排序数组中找一个最小的元素,放到以有序数组后面 public static int[] sort(int[] arr) { int len = arr.length; // 选择次数 for (int i = 0; i < len - 1; i++) { int min = i; // 每次选择过程 for (int j = i + 1; j < len; j++) { if (arr[j] < arr