关键字优化

密封类(sealed)

≯℡__Kan透↙ 提交于 2020-01-23 14:10:38
密封类 sealed 密封类不能用作基类。因此,它也不能是抽象类。密封类主要用于防止派生。由于密封类从不用作基类,所以有些运行时优化可以使对密封类成员的调用略快。 public sealed class seleg { } 在对基类的虚成员进行重写的派生类上的类成员、方法、字段、属性或事件可以将该成员声明为密封成员。在用于以后的派生类时,这将取消成员的虚效果。方法是在类成员声明中将 sealed 关键字置于 overrride关键字的前面。例如: public class selegc: seleg {   public sealed override void DoWork()   {   } } 来源: https://www.cnblogs.com/wujiang/archive/2010/08/13/1799334.html

资料搜集-JAVA系统的梳理知识5-JAVA基础篇&JVM

亡梦爱人 提交于 2020-01-22 21:29:17
<!-- TOC --> - [Collections 工具类和 Arrays 工具类常见方法](#collections-工具类和-arrays-工具类常见方法) - [Collections](#collections) - [排序操作](#排序操作) - [查找,替换操作](#查找替换操作) - [同步控制](#同步控制) - [Arrays类的常见操作](#arrays类的常见操作) - [排序 : `sort()`](#排序--sort) - [查找 : `binarySearch()`](#查找--binarysearch) - [比较: `equals()`](#比较-equals) - [填充 : `fill()`](#填充--fill) - [转列表 `asList()`](#转列表-aslist) - [转字符串 `toString()`](#转字符串-tostring) - [复制 `copyOf()`](#复制-copyof) <!-- /TOC --> # Collections 工具类和 Arrays 工具类常见方法 ## Collections Collections 工具类常用方法: 1. 排序 2. 查找,替换操作 3. 同步控制(不推荐,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合) ### 排序操作 ```java void

【学习笔记】python字典、函数和闭包

╄→гoц情女王★ 提交于 2020-01-18 13:41:54
小整数对象池 在终端编译时,python中存在一个范围为[-5,256]的小整数对象池,这些整数对象是提前建立好的,不会被垃圾回收 所以,将同一个小整数赋值给不同变量,这些变量指向的内存地址都是一样的 例: >> > age = 8 >> > other_age = 8 >> > print ( age is other_age ) # True 而大整数不存在对象池,将同一个大整数赋值给不同变量,这些变量指向的内存地址是不一样的 例: >> > money = 2000000 >> > salary = 2000000 >> > print ( money is salary ) # False 这个时候,如果直接打开一个文本编辑器去尝试,你会发现,咦,怎么print(money is salary)打印出来的值为True啊,不是应该是False吗? 这是因为在文本编辑器编译时,python解析器会逐行编译,当发现两个变量引用的同一个整数值为一样,则会将这些变量指向同一个内存地址,最后编译完成后,再统一回收,而我们上述代码,都是在终端下执行的,终端是每次执行一次,执行一次就创建一次内存地址,所以打印出来的值为False 对称差集 list1 = [ 5 , 1 , 2 , 9 , 0 , 3 ] list2 = [ 7 , 2 , 5 , 7 , 9 ] set1 = set (

C/C++中volatile关键字详解

拥有回忆 提交于 2020-01-17 05:18:36
1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier 。这是 BS 在 "The C++ Programming Language" 对 volatile 修饰词的说明: A volatile specifier is a hint to a compiler that an object may change its value in ways not specified by the language so that aggressive optimizations must be avoided. volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法: int volatile vInt; 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。例如: 1 volatile int i=10; 2 int a = i; 3 ... 4 // 其他代码,并未明确告诉编译器,对 i

保留字和关键字的区别

試著忘記壹切 提交于 2020-01-17 03:33:25
在java的编写中,有两种是程序员不能用来做标识符的字。那就是保留字和关键字。那么保留字和关键字有什么区别呢? 关键字:在java中拥有特定的含义,所以不能让其他的标识符和关键字一样; 保留字:在Java中没有特定含义,但是也不允许程序员用来作为标识符。 其实java的虚拟机是在不断地更新的,而在每次更新的时候都会对之前的版本进行优化,那么也有可能需要添加某些关键字,但是如果程序员在这之前写的代码有与关键字一样的标识符,那么这些标识符都需要修改。为了避免这种情况,就出现了保留字。 也就是说关键字和保留字的区别就只是有没有特定的含义。 来源: CSDN 作者: 一叶扁舟在大海 链接: https://blog.csdn.net/zixuexiaobaihu/article/details/104009981

Java final关键字详解

时光总嘲笑我的痴心妄想 提交于 2020-01-11 19:35:02
在java中,final的含义在不同的场景下有细微的差别,但总体上来说,它指的是“这是不可变的”。下面,我们来讲final的四种主要用法。 final数据 在编写程序时,我们经常需要说明一个数据是不可变的,我们称为常量。在java中,用final关键字修饰的变量,只能进行一次赋值操作,并且在生存期内不可以再次赋值。更重要的是,final会告诉编译器,这个数据是不会修改的,那么编译器就可能会在编译时期就对该数据进行替换甚至执行计算,这样可以对我们的程序起到一点优化。不过在针对基本类型和引用类型时,final关键字的效果存在细微差别。我们来看下面的例子: package s1; public class L { public static void main(String[] args) { final int i1 = 1; //定义变量并直接赋常量,此时为编译时常量 i1 = 11; //编译出错,因为final数据只能赋值一次 final int i2; //定义变量,但先不赋值;在后面需要的地方再赋值,此时不是编译时常量 i2 = 2; i2 = 12; //编译出错,因为final数据只能赋值一次 //此处i3虽然是final并赋值,但是赋的并不是常量,所以i3不是编译时常量 final int i3 = (int) (Math.random() * 10); i3 = 13

MySQL小表join大表的正确使用姿势(straight_join 关键字的使用)

血红的双手。 提交于 2020-01-09 12:12:24
网上有种说法是:由于一般是采用小表join大表的方式(可以提高效率),所以有人说将小表放在左边,让它先执行,记住,这种说法是错误的!!!有例为证: 我们看上例: film inner join film_actor using(film_id) inner join actor using(actor_id) 的执行顺序是—— actor>>film_actor>>film 如下图: 使用 straight_join 关键字可以保证严格按照书写顺序来作为表的执行顺序,但是却牺牲了性能。 上图中没有使用该关键字,要扫描的行数比使用了 straight_join 关键字的行数要少很多,也就是MySQL自动进行了优化 我们可以使用 show status like 'last_query_cost' 来查询上一条sql需要查询的数据页数量 7892 VS 8885 来源: CSDN 作者: 学亮编程手记 链接: https://blog.csdn.net/a772304419/article/details/103893613

Java 并发进阶常见面试题总结

孤街浪徒 提交于 2020-01-08 23:06:27
Java 并发进阶常见面试题总结 1. synchronized 关键字 1.1. 说一说自己对于 synchronized 关键字的了解 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 另外,在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高,这也是为什么早期的 synchronized 效率低的原因。庆幸的是在 Java 6 之后 Java 官方对从 JVM 层面对synchronized 较大优化,所以现在的 synchronized 锁效率也优化得很不错了。JDK1.6对锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。 1.2. 说说自己是怎么使用 synchronized 关键字,在项目中用到了吗 synchronized关键字最主要的三种使用方式: 修饰实例方法:

详解C中volatile关键字

我们两清 提交于 2020-01-08 08:28:00
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序: short flag; void test() { do1(); while(flag==0); do2(); } 这段程序等待内存变量flag的值变为1(怀疑此处是0,有点疑问,)之后才运行do2()。变量flag的值由别的程序更改,这个程序可能是某个硬件中断服务程序。例如:如果某个按钮按下的话,就会对DSP产生中断,在按键中断程序中修改flag为1,这样上面的程序就能够得以继续运行。但是,编译器并不知道flag的值会被别的程序修改,因此在它进行优化的时候,可能会把flag的值先读入某个寄存器,然后等待那个寄存器变为1。如果不幸进行了这样的优化,那么while循环就变成了死循环,因为寄存器的内容不可能被中断服务程序修改。为了让程序每次都读取真正flag变量的值,就需要定义为如下形式: volatile short flag; 需要注意的是,没有volatile也可能能正常运行

B+树|MYSQL索引使用原则

早过忘川 提交于 2020-01-01 04:57:06
‘’MYSQL一直了解得都不多,之前写sql准备提交生产环境之前的时候,老员工帮我检查了下sql,让修改了一下存储引擎,当时我使用的是Myisam,后面改成InnoDB了。为什么要改成这样,之前都没有听过存储引擎,于是网上查了一下。 事实上使用不同的存储引擎也是有很大区别的,下面猿友们可以了解一下。 一、存储引擎的比较 注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的。 在 MySQL 中,主要有四种类型的索引,分别为: B-Tree 索引, Hash 索引, Fulltext 索引和 R-Tree 索引。 B-Tree 索引是 MySQL 数据库中使用最为频繁的索引类型,除了 Archive 存储引擎之外的其他所有的存储引擎都支持 B-Tree 索引。Archive 引擎直到 MySQL 5.1 才支持索引,而且只支持索引单个 AUTO_INCREMENT 列。 不仅仅在 MySQL 中是如此,实际上在其他的很多数据库管理系统中B-Tree 索引也同样是作为最主要的索引类型,这主要是因为 B-Tree 索引的存储结构在数据库的数据检索中有非常优异的表现。 一般来说, MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的结构来存储的,也就是所有实际需要的数据都存放于 Tree 的 Leaf