Entry

这 35 个 Java 代码优化细节,你用了吗?

喜你入骨 提交于 2020-11-24 02:29:09
前言 代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。 代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。 优化代码的目标是: 减小代码体积 提高代码运行的效率 代码优化细节 1、尽量指定类、方法的final修饰符 带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50% 。 2、尽量重用对象 特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替

Map排序(按key排序,按value排序)

我只是一个虾纸丫 提交于 2020-11-23 23:51:00
  主要分两种,按键排序、按值排序。 而且,按key排序主要用于TreeMap,而按value排序则对于Map的子类们都适用。 一、按键排序 按Key排序主要用于TreeMap,可以实现按照Key值的大小,在对象插入时直接插入到合适的位置,保持Map的顺序性。 来看TreeMap的构造函数: TreeMap ( Comparator <? super K > comparator): 构造一个新的、空的树映射,该映射根据给定比较器进行排序。 这里的比较器是 key的比较器。所以定义比较器时用于比较的两个参数是Key的数据类型的对象。 实例代码如下: public class MapSortTest { public static void main(String[] args) {    Map <String,String> stu=new TreeMap<>(new MyComparator()); // 传进来一个key的比较器对象来构造treemap   stu.put("apple", "55" );   stu.put( "boy", "32" );   stu.put( "cat", "22" );   stu.put( "dog", "12" );   stu.put( "egg", "11" );    // map的遍历:把key抽取出来用set存放

jdk1.8 HashMap底层数据结构:散列表+链表+红黑树(图解+源码)

别说谁变了你拦得住时间么 提交于 2020-11-23 23:49:40
一、前言   本文由jdk1.8源码整理而得,附自制jdk1.8底层数据结构图,并截取部分源码加以说明结构关系。 二、 jdk1.8 HashMap底层数据结构图    三、源码    1.散列表(Hash table,也叫哈希表): /** * 表,第一次使用时初始化(而非实例化集合时进行初始化),并根据需要调整大小。 当分配时,长度总是2的幂。 (在某些操作中,我们还允许长度为零,以允许当前不需要的引导机制。)    */ transient Node<K,V>[] table;    2.链表: /** * Basic hash bin node, used for most entries. (See below for * TreeNode subclass, and in LinkedHashMap for its Entry subclass.) */ static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node <K,V> next;      …… }    3.红黑 树: /** * Entry for Tree bins. Extends LinkedHashMap.Entry (which in turn * extends Node

Mybatis学习系列(三)动态SQL

和自甴很熟 提交于 2020-11-22 06:55:29
  在mapper配置文件中,有时需要根据查询条件选择不同的SQL语句,或者将一些使用频率高的SQL语句单独配置,在需要使用的地方引用。Mybatis的一个特性:动态SQL,来解决这个问题。 mybatis动态sql语句是基于OGNL表达式的,主要有以下几类: 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似 3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀) 4. where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)、 5. set (主要用于更新时) 6. foreach (在实现 mybatis in 语句查询时特别有用) if标签语句   if标签用来实现根据条件拼接sql语句,下面示例用来判断参数如果不为null,则拼接sql 示例: < select id ="ifTest" resultType ="com.sl.po.Product" > select * from products where < if test ="ProductName!=null" > name like #{ProductName} </ if > < if

信不信这些Java面试题,可以把70%程序员劝退?(附带答案讲解)

六眼飞鱼酱① 提交于 2020-11-21 00:31:33
上一篇文章我写了阿里面试官认证的一些非常不错的面试题和一些学习的思路,但是因为文章太长了就分为了两个部分来完成,所以这一篇文章就把最后写的Java面试带上答案一同码了出来,以下为解答大纲,部分作了扩展。 1.private修饰的方法可以通过反射访问,那么private的意义是什么 这题是一道思想题目,天天会碰到private,有没有想过这个问题? 谈谈对java设计的认识程度,主要抓住两点: 1.java的private修饰符并不是为了绝对安全性设计的,更多是对用户常规使用java的一种约束; 2.从外部对对象进行常规调用时,能够看到清晰的类结构。 2.Java类初始化顺序 先说结论: 基类静态代码块,基类静态成员字段(并列优先级,按照代码中出现的先后顺序执行,且只有第一次加载时执行)——>派生类静态代码块,派生类静态成员字段(并列优先级,按照代码中出现的先后顺序执行,且只有第一次加载时执行)——>基类普通代码块,基类普通成员字段(并列优点级,按代码中出现先后顺序执行)——>基类构造函数——>派生类普通代码块,派生类普通成员字段(并列优点级,按代码中出现先后顺序执行)——>派生类构造函数 代码验证: class Log { public static String initLog(String log) { System.out.println(log);return null;

【项目实战】- com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException

こ雲淡風輕ζ 提交于 2020-11-20 16:04:49
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '30YK1BJ2007280075-30YK1FY2007280005' for key 'uniq_1' 原因: 以上提示信息,是在使用mysql时,索引的使用不当,导致的数据重复 Duplicate entry '30YK1BJ2007280075-30YK1FY2007280005' for key 'uniq_1' 此句的意思是在插入'30YK1BJ2007280075-30YK1FY2007280005' 时,使索引'uniq_1'重复 查看我们的数据库,发现有如下索引,其中'uniq_1'索引类型为'Unique' 分析: 当索引类型为unique时,数据表的对应的这个字段必须保证每条记录的唯一性,否则就会产生如上错误。此现象一般发生对数据库的写操作时。 解决: 呃,目前还不知道什么原因造成的重复插入,线上数据,暂时还看不了,先记录一下问题吧,,,,,等能看的时候再找找具体原因。。。。 附上有可能的几种原因和方案: https://www.cnblogs.com/coder-wf/p/12221911.html 来源: oschina 链接: https://my.oschina.net

koa2实现简易的webpack-dev-server

巧了我就是萌 提交于 2020-11-19 05:41:44
koa2实现简易的webpack-dev-server热更新 原文 https://github.com/zhuangZhou/Blog/issues/3 闲来无事,用koa2撸了一个简易的webpack-dev-server;其实网上很多express搭建的热更新,但是koa2很少;欢迎大佬拍砖和赐教; 源码 配置基本的webpack 1、下载安装包 webpack webpack-cli html-webpack-plugin css-loader style-loader 由于这里用的是最新的webpack版本,所以需要安装webpack-cli。 2、创建并配置webpack.config.js 这里就不具体配置了,如需要详细配置教程, 请上这里 ; 基础配置完成后,在plugins里配置HotModuleReplacementPlugin插件用于热更新;由于HotModuleReplacementPlugin是webpack内置的插件,所以不需要安装,直接引用就行 const webpack = require('webpack'); plugins:[ new webpack.HotModuleReplacementPlugin() ] 实现webpack-dev-middleware的koa2中间件 webpack-dev-middleware是实现webpack

redis的过期策略都有哪些?

不打扰是莪最后的温柔 提交于 2020-11-19 04:49:21
1、面试题 redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现? 2、面试官心里分析 1)老师啊,我往redis里写的数据怎么没了? 之前有同学问过我,说我们生产环境的redis怎么经常会丢掉一些数据?写进去了,过一会儿可能就没了。我的天,同学,你问这个问题就说明redis你就没用对啊。redis是缓存,你给当存储了是吧? 啥叫缓存?用内存当缓存。内存是无限的吗,内存是很宝贵而且是有限的,磁盘是廉价而且是大量的。可能一台机器就几十个G的内存,但是可以有几个T的硬盘空间。redis主要是基于内存来进行高性能、高并发的读写操作的。 那既然内存是有限的,比如redis就只能用10个G,你要是往里面写了20个G的数据,会咋办?当然会干掉10个G的数据,然后就保留10个G的数据了。那干掉哪些数据?保留哪些数据?当然是干掉不常用的数据,保留常用的数据了。 所以说,这是缓存的一个最基本的概念,数据是会过期的,要么是你自己设置个过期时间,要么是redis自己给干掉。 2)老师,我的数据明明都过期了,怎么还占用着内存啊? 还有一种就是如果你设置好了一个过期时间,你知道redis是怎么给你弄成过期的吗?什么时候删除掉?如果你不知道,之前有个学员就问了,为啥好多数据明明应该过期了,结果发现redis内存占用还是很高?那是因为你不知道redis是怎么删除那些过期key的。

[Java并发]ThreadLocal

流过昼夜 提交于 2020-11-18 16:09:28
1、基础概念 Stack & Heap Stack和Heap是我们常说的栈和堆,这里不做赘述,只需要备注一点知识即可,Stack是线程私有独享且线程安全的,Heap是所有线程共享非线程安全的。TheadLocal的设计初衷就是希望让线程拥有了自己内部独享的变量,每个线程之间隔离互不干扰以起到线程安全的目的。 ThreadLocal ThreadLocal是我们所说的线程本地变量。如上图所示,它的内部封装了一个非常重要的数据结构ThreadLocalMap来提供线程变量数据的真实获取、存储及移除等操作。我们可以把ThreadLocal理解称为一个封装类或是一个中介对象,所有的核心方法如get、set、remove等都通过ThreadLocal来提供和交互,而真正的幕后大佬是ThreadLocalMap这个封装了最终方法逻辑和内部数据结构的内部类。 private static AtomicInteger nextHashCode = new AtomicInteger ( ) ; private static final int HASH_INCREMENT = 0x61c88647 ; private static int nextHashCode ( ) { return nextHashCode . getAndAdd ( HASH_INCREMENT ) ; }

ubuntu下安装navicat

江枫思渺然 提交于 2020-11-15 06:59:50
1.去官网下载 https://www.navicat.com/en/download/navicat-premium 2.命令行输入(解压命令) tar -zxvf xxxxx.tar.gz 3.移动解压之后的文件到你需要放的位置 格式: CP [选项] 源文件或目录 目的文件或目录 4.进入解压目录后 运行终端输入 ./start_navicat 启动Navicat 5.安装 6.解决navicat界面显示乱码的问题   运行./start_navicat前,用vim编辑器打开start_navicat, 将export LANG="en_US.UTF-8" 更改为export LANG="zh_CN.UTF-8", 重新启动。 7.创建快捷方式 先整一个图片.png 终端输入 sudo vim /usr/share/applicationsnavicat.desktop -----------------------------写入以下内容------------------------------------------------------------------- [Desktop Entry] Type=Application Name=Navicat GenericName=Navicat pro Comment=Navicat:The SQL manager