当我遵循了这 16 条规范写代码,同事只对我说了三个字: 666

2023-11-04

作者 | 涛姐涛哥
链接 | cnblogs.com/taojietaoge/p/11575376.html
如何更规范化编写Java 代码

Many of the happiest people are those who own the least. But are we really so happy with our IPhones, our big houses, our fancy cars?

忘川如斯,拥有一切的人才更怕失去。

背景:如何更规范化编写Java 代码的重要性想必毋需多言,其中最重要的几点当属提高代码性能、使代码远离Bug、令代码更优雅。

一、MyBatis 不要为了多个查询条件而写 1 = 1

当遇到多个查询条件,使用where 1=1 可以很方便的解决我们的问题,但是这样很可能会造成非常大的性能损失,因为添加了 “where 1=1 ”的过滤条件之后,数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(即全表扫描) 以比较此行是否满足过滤条件,当表中的数据量较大时查询速度会非常慢;此外,还会存在SQL 注入的风险。

反例:

<select id="queryBookInfo" parameterType="com.tjt.platform.entity.BookInfo" resultType="java.lang.Integer">	
 select count(*) from t_rule_BookInfo t where 1=1	
<if test="title !=null and title !='' ">	
 AND title = #{title} 	
</if> 	
<if test="author !=null and author !='' ">	
 AND author = #{author}	
</if> 	
</select>

正例:

<select id="queryBookInfo" parameterType="com.tjt.platform.entity.BookInfo" resultType="java.lang.Integer">	
 select count(*) from t_rule_BookInfo t	
<where>	
<if test="title !=null and title !='' ">	
 title = #{title} 	
</if>	
<if test="author !=null and author !='' "> 	
 AND author = #{author}	
</if>	
</where> 	
</select>

UPDATE 操作也一样,可以用<set> 标记代替 1=1。

二、 迭代entrySet() 获取Map 的key 和value

当循环中只需要获取Map 的主键key时,迭代keySet() 是正确的;但是,当需要主键key 和取值value 时,迭代entrySet() 才是更高效的做法,其比先迭代keySet() 后再去通过get 取值性能更佳。

反例:

//Map 获取value 反例:	
HashMap<String, String> map = new HashMap<>();	
for (String key : map.keySet()){	
String value = map.get(key);	
}

正例:

  //Map 获取key & value 正例:	
HashMap<String, String> map = new HashMap<>();	
 for (Map.Entry<String,String> entry : map.entrySet()){	
     String key = entry.getKey();	
     String value = entry.getValue();	
}

三、使用Collection.isEmpty() 检测空

使用Collection.size() 来检测是否为空在逻辑上没有问题,但是使用Collection.isEmpty() 使得代码更易读,并且可以获得更好的性能;除此之外,任何Collection.isEmpty() 实现的时间复杂度都是O(1) ,不需要多次循环遍历,但是某些通过Collection.size() 方法实现的时间复杂度可能是O(n)。O(1)纬度减少循环次数 例子

反例:

LinkedList<Object> collection = new LinkedList<>();	
if (collection.size() == 0){	
  System.out.println("collection is empty.");	
 }

正例:

LinkedList<Object> collection = new LinkedList<>();	
  if (collection.isEmpty()){	
      System.out.println("collection is empty.");	
  }	
  	
  //检测是否为null 可以使用CollectionUtils.isEmpty()	
  if (CollectionUtils.isEmpty(collection)){	
      System.out.println("collection is null.");	

	
  }

四、初始化集合时尽量指定其大小

尽量在初始化时指定集合的大小,能有效减少集合的扩容次数,因为集合每次扩容的时间复杂度很可能时O(n),耗费时间和性能。

反例:

//初始化list,往list 中添加元素反例:	
int[] arr = new int[]{1,2,3,4};	
List<Integer> list = new ArrayList<>();	
for (int i : arr){	
  list.add(i);	
}

正例:

//初始化list,往list 中添加元素正例:	
  int[] arr = new int[]{1,2,3,4};	
  //指定集合list 的容量大小	
  List<Integer> list = new ArrayList<>(arr.length);	
  for (int i : arr){	
      list.add(i);	
  }

五、使用StringBuilder 拼接字符串

一般的字符串拼接在编译期Java 会对其进行优化,但是在循环中字符串的拼接Java 编译期无法执行优化,所以需要使用StringBuilder 进行替换。

反例:

//在循环中拼接字符串反例	
String str = "";	
for (int i = 0; i < 10; i++){	
  //在循环中字符串拼接Java 不会对其进行优化	
  str += i;	
}

正例:

//在循环中拼接字符串正例	
 String str1 = "Love";	
 String str2 = "Courage";	
 String strConcat = str1 + str2;  //Java 编译器会对该普通模式的字符串拼接进行优化	
  StringBuilder sb = new StringBuilder();	
  for (int i = 0; i < 10; i++){	
     //在循环中,Java 编译器无法进行优化,所以要手动使用StringBuilder	
      sb.append(i);	
  }

 六、若需频繁调用Collection.contains 方法则使用Set

在Java 集合类库中,List的contains 方法普遍时间复杂度为O(n),若代码中需要频繁调用contains 方法查找数据则先将集合list 转换成HashSet 实现,将O(n) 的时间复杂度将为O(1)。

反例:

//频繁调用Collection.contains() 反例	
List<Object> list = new ArrayList<>();	
for (int i = 0; i <= Integer.MAX_VALUE; i++){	
  //时间复杂度为O(n)	
  if (list.contains(i))	
  System.out.println("list contains "+ i);	
 }

正例:

//频繁调用Collection.contains() 正例	
  List<Object> list = new ArrayList<>();	
  Set<Object> set = new HashSet<>();	
  for (int i = 0; i <= Integer.MAX_VALUE; i++){	
      //时间复杂度为O(1)	
      if (set.contains(i)){	
          System.out.println("list contains "+ i);	
      }	
  }

七、使用静态代码块实现赋值静态成员变量

对于集合类型的静态成员变量,应该使用静态代码块赋值,而不是使用集合实现来赋值。

反例:

//赋值静态成员变量反例	
    private static Map<String, Integer> map = new HashMap<String, Integer>(){	
        {	
            map.put("Leo",1);	
            map.put("Family-loving",2);	
            map.put("Cold on the out side passionate on the inside",3);	
        }	
    };	
    private static List<String> list = new ArrayList<>(){	
        {	
            list.add("Sagittarius");	
            list.add("Charming");	
            list.add("Perfectionist");	
        }	
    };

正例:

//赋值静态成员变量正例	
private static Map<String, Integer> map = new HashMap<String, Integer>();	
    static {	
        map.put("Leo",1);	
        map.put("Family-loving",2);	
        map.put("Cold on the out side passionate on the inside",3);	
    }	
    	
private static List<String> list = new ArrayList<>();	
    static {	
        list.add("Sagittarius");	
        list.add("Charming");	
        list.add("Perfectionist");	
    }

八、删除未使用的局部变量、方法参数、私有方法、字段和多余的括号。

九、工具类中屏蔽构造函数

工具类是一堆静态字段和函数的集合,其不应该被实例化;但是,Java 为每个没有明确定义构造函数的类添加了一个隐式公有构造函数,为了避免不必要的实例化,应该显式定义私有构造函数来屏蔽这个隐式公有构造函数。

反例:

public class PasswordUtils {	
  //工具类构造函数反例	
  private static final Logger LOG = LoggerFactory.getLogger(PasswordUtils.class);	

	
  public static final String DEFAULT_CRYPT_ALGO = "PBEWithMD5AndDES";	

	
  public static String encryptPassword(String aPassword) throws IOException {	
      return new PasswordUtils(aPassword).encrypt();	
  }

正例:

public class PasswordUtils {	
  //工具类构造函数正例	
  private static final Logger LOG = LoggerFactory.getLogger(PasswordUtils.class);	

	
  //定义私有构造函数来屏蔽这个隐式公有构造函数	
  private PasswordUtils(){}	
  	
  public static final String DEFAULT_CRYPT_ALGO = "PBEWithMD5AndDES";	

	
  public static String encryptPassword(String aPassword) throws IOException {	
      return new PasswordUtils(aPassword).encrypt();	
  }

十、删除多余的异常捕获并抛出

用catch 语句捕获异常后,若什么也不进行处理,就只是让异常重新抛出,这跟不捕获异常的效果一样,可以删除这块代码或添加别的处理。

反例:

//多余异常反例	
private static String fileReader(String fileName)throws IOException{	

	
    try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {	
        String line;	
        StringBuilder builder = new StringBuilder();	
        while ((line = reader.readLine()) != null) {	
            builder.append(line);	
        }	
        return builder.toString();	
    } catch (Exception e) {	
        //仅仅是重复抛异常 未作任何处理	
        throw e;	
    }	
}

正例:

//多余异常正例	
private static String fileReader(String fileName)throws IOException{	

	
    try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {	
        String line;	
        StringBuilder builder = new StringBuilder();	
        while ((line = reader.readLine()) != null) {	
            builder.append(line);	
        }	
        return builder.toString();	
        //删除多余的抛异常,或增加其他处理:	
        /*catch (Exception e) {	
            return "fileReader exception";	
        }*/	
    }	
}

十一、字符串转化使用String.valueOf(value) 代替 " " + value

把其它对象或类型转化为字符串时,使用String.valueOf(value) 比 ""+value 的效率更高。

反例:

//把其它对象或类型转化为字符串反例:	
int num = 520;	
// "" + value	
String strLove = "" + num;

正例:

//把其它对象或类型转化为字符串正例:	
int num = 520;	
// String.valueOf() 效率更高	
String strLove = String.valueOf(num);

十二、避免使用BigDecimal(double)

BigDecimal(double) 存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。

反例:

// BigDecimal 反例	
BigDecimal bigDecimal = new BigDecimal(0.11D);

正例:

// BigDecimal 正例	
BigDecimal bigDecimal1 = bigDecimal.valueOf(0.11D);

图1. 失去精度

640

十三、返回空数组和集合而非 null

若程序运行返回null,需要调用方强制检测null,否则就会抛出空指针异常;返回空数组或空集合,有效地避免了调用方因为未检测null 而抛出空指针异常的情况,还可以删除调用方检测null 的语句使代码更简洁。

反例:

//返回null 反例	
public static Result[] getResults() {	
    return null;	
}	

	
public static List<Result> getResultList() {	
    return null;	
}	

	
public static Map<String, Result> getResultMap() {	
    return null;	
}

正例:

//返回空数组和空集正例	
public static Result[] getResults() {	
    return new Result[0];	
}	

	
public static List<Result> getResultList() {	
    return Collections.emptyList();	
}	

	
public static Map<String, Result> getResultMap() {	
    return Collections.emptyMap();	
}

十四、优先使用常量或确定值调用equals 方法

对象的equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals 方法。

反例:

 //调用 equals 方法反例	
private static boolean fileReader(String fileName)throws IOException{	
   // 可能抛空指针异常	
   return fileName.equals("Charming");	
 }

正例:

//调用 equals 方法正例	
private static boolean fileReader(String fileName)throws IOException{	

	
    // 使用常量或确定有值的对象来调用 equals 方法	
    return "Charming".equals(fileName);	
    	
    //或使用:java.util.Objects.equals() 方法	
   return Objects.equals("Charming",fileName);	
 }

十五、枚举的属性字段必须是私有且不可变

枚举通常被当做常量使用,如果枚举中存在公共属性字段或设置字段方法,那么这些枚举常量的属性很容易被修改;理想情况下,枚举中的属性字段是私有的,并在私有构造函数中赋值,没有对应的Setter 方法,最好加上final 修饰符。

反例:

public enum SwitchStatus {	
    // 枚举的属性字段反例	
    DISABLED(0, "禁用"),	
    ENABLED(1, "启用");	

	
    public int value;	
    private String description;	

	
    private SwitchStatus(int value, String description) {	
        this.value = value;	
        this.description = description;	
    }	

	
    public String getDescription() {	
        return description;	
    }	

	
    public void setDescription(String description) {	
        this.description = description;	
    }	
}

正例:

public enum SwitchStatus {	
    // 枚举的属性字段正例	
    DISABLED(0, "禁用"),	
    ENABLED(1, "启用");	

	
    // final 修饰	
    private final int value;	
    private final String description;	

	
    private SwitchStatus(int value, String description) {	
        this.value = value;	
        this.description = description;	
    }	

	
    // 没有Setter 方法	
    public int getValue() {	
        return value;	
    }	

	
    public String getDescription() {	
        return description;	
    }	
}

十六、tring.split(String regex)部分关键字需要转译

使用字符串String 的plit 方法时,传入的分隔字符串是正则表达式,则部分关键字(比如 .[]()\| 等)需要转义。

反例:

 // String.split(String regex) 反例	
String[] split = "a.ab.abc".split(".");	
System.out.println(Arrays.toString(split));   // 结果为[]	
String[] split1 = "a|ab|abc".split("|");	
System.out.println(Arrays.toString(split1));  // 结果为["a", "|", "a", "b", "|", "a", "b", "c"]

正例:

// String.split(String regex) 正例	
// . 需要转译	
String[] split2 = "a.ab.abc".split("\\.");	
System.out.println(Arrays.toString(split2));  // 结果为["a", "ab", "abc"]	

	
// | 需要转译	
String[] split3 = "a|ab|abc".split("\\|");	
System.out.println(Arrays.toString(split3));  // 结果为["a", "ab", "abc"]

图2. String.split(String regex) 正反例

640

640?wx_fmt=jpeg

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我遵循了这 16 条规范写代码,同事只对我说了三个字: 666 的相关文章

  • Oracle 取出动态sql 执行的结果的两种方式

    以下是怎么取出动态sql执行结果的两种方式 第一种 直接 execute immediate insert into newTable id name select id name from dual 执行后 放到一个新的表里 第二种方式
  • JDBC、MAVEN概述

    1 什么是JDBC JDBC Java DataBase Connectivity Java数据库连接 其实就是 利用Java语言 程序连接并访问数据库的一门技术 之前我们可以通过CMD或者navicat等工具连接数据库 但在企业开发中 更
  • 本地访问远程web服务

    1 2 以管理员身份运行cmd ssh username remote address L 127 0 0 1 8888 127 0 0 1 8008 3 在远程服务器上去运行web服务 4 本地访问
  • 设置flex:1效果异常(父容器撑高/其它子元素高度缩小)

    先讲解决方案 1 自动占满容器 设置height min height 0 2 设置overflow hidden 原理是flex内容溢出原理 1 开发中想利用flex 1实现容器自动占满剩余高度 效果如下图 2 实现的时候div3是一个容
  • mysql grouping sets_Hive.GROUPINGSETS的“陷阱”

    之前整理了一下Hive 0 10版引进的GROUPING SETS子句特性 并作了简单的句法使用体验和数据验证 但是当时没有注意到稍微复杂一点的情况 然后 在实际使用过程中 妥妥地就中了一枪 这一枪发生在有JOIN操作的时候 情况是这样的
  • Typora 常用快捷键大全

    Typora 常用快捷键大全 Ctrl 1 一级标题 Ctrl 2 二级标题 Ctrl 3 三级标题 Ctrl 4 四级标题 Ctrl 5 五级标题 Ctrl 6 六级标题 Ctrl 0 段落 Ctrl 提升标题等级 Ctrl 降低标题等级
  • 期货开户的身份识别验证

    无论你是开通商品期货 原油期货还是股指期货以及期权 现在都支持网上办理 原油期货和股指期货以及期权品种都是在商品期货账户的基础上满足条件后再另外开通交易权限 叁格期权小编在这里为各位投资者详细介绍商品期货网上开户流程 一 开户前准备 开户准
  • markdown 表格不能换行吗

    在 Markdown 表格中 不能使用换行符来换行 如果您希望在表格中的单元格内换行 可以使用 HTML 语法 br 例如 列 1 列 2 这是第一列 这是第二列 br 换行了
  • Android 的Activity.getWindowManager().getDefaultDisplay().getWidth()过时了

    Android获取屏幕宽度和高度的方法 1 下面方发已经过时在API 13就已经放弃了 Activity getWindowManager getDefaultDisplay getWidth 获取屏幕宽度 Activity getWind
  • 练习项目npm start启动时报错的个人解决办法

    错误原因 这几天在学习react 跟着慕课网的视频学习 React实战 打造画廊应用 上 React实战 打造画廊应用 下 在用yeoman最初构建项目 完成后需要启动项目 运行npm start时 出现了错误 gt 0 0 1 start
  • Windows环境下基于Python的PyUSB库开发USB通讯

    最近在研究USB通讯 想用Python来实现 比较好用的一个库是PyUSB 但发现相关中文资料比较少 在这里做一个整理 系统是Windows 10 64位 1 安装PyUSB 运行cmd用pip安装pyusb pip install pyu
  • webservice的接口测试工具

    一 webservice介绍 webservice是一个跨语言跨平台的技术 使用webservice进行接口测试时不需要知道每一种语言和操作系统 webservice工作原理 webservice主要核心技术 HTTP 使用http来传输数
  • 解决java或jsp中的For input string的错误

    目录 问题 解决方案 方案一 方案二 方案三 备注 问题 我们在做接jsp开发时 不论是在jsp页面 还是在controller中 都会遇到这样的错误 For input String错误 为什么会出现这样的错误呢 当时 我在init中从数
  • beamer笔记——幻灯片比例改为16:9

    beamer进阶学习 幻灯片比例改为16 9 将幻灯片比例改为16 9 documentclass aspectratio 169 beamer 幻灯片包括的比例主要有 16 10 14 9 1 41 1 5 4 4 3 default 3
  • 【CTF】Python原型链污染

    Python原型链污染 原型链 在Python中每个对象都有一个原型 原型上定义了对象可以访问的属性和方法 当对象访问属性或方法时 会先在自身查找 如果找不到就会去原型链上的上级对象中查找 原型链污染攻击的思路是通过修改对象原型链中的属性
  • Java,微信群

    一起进行Java的知识传递与分享 快来加入吧 有问题可加个人微信 Ysrbj18 备注Java交流 拉你入群 可扫码加我
  • muduo库学习-日志模块的学习以及C++日志模块封装

    前言 开发一款软件 一个好的日志库肯定是必不可少的 c 作为一门这么古老的开发语言 按理说应该有一些好用的日志库 但是在网上找到的那些日志库感觉用起来都不是很得心应手 因此就自己动手写了一个日志库 源码放在github上 我自己写的这个日志
  • Channel On Live(离散化)

    题目网址 https acm ecnu edu cn contest 103 problem C 离散化 1 unique函数 c unique t 1 t 1 n t 1 此为去重函数 12335去重后为12355 即去掉重复的 后面的不
  • R7-9 统计Java程序中关键词的出现次数

    编写程序统计一个输入的Java源码中关键字 区分大小写 出现的次数 说明如下 Java中共有53个关键字 自行百度 从键盘输入一段源码 统计这段源码中出现的关键字的数量 注释中出现的关键字不用统计 字符串中出现的关键字不用统计 统计出的关键
  • [Python+Django]Web图书管理系统毕业设计之数据库及系统实现源码篇

    前排提醒 本文干货超多 为避免消化不良建议配合目录食用 本系列博文献给即将毕业的程序猿们 系列文章共三篇 在编写的过程中可以说几乎是参照毕业设计目录样式来进行的 相关图表和截图也都几乎按照毕业设计论文的要求来编制 完整阅读消化此系列博文套上

随机推荐

  • 人眼定位python代码_使用dlib,OpenCV和Python进行人脸识别—人眼眨眼检测

    前期文章我们分享了如何使用python与dlib来进行人脸识别 以及来进行人脸部分的识别 如下图 dlib人脸数据把人脸分成了68个数据点 从图片可以看出 人脸识别主要是识别 人眉 人眼 人鼻 人嘴以及人脸下颚边框 每个人脸的部位都有不同的
  • 百度营销:百度扩量投放技巧

    众所周知百度是国内大部分用户都在使用的搜索引擎 百度搜索投放的是关键词形式 今天将带来一些账户优化的建议 放量模式 共享预算有哪些投放细节呢 以下梳理了5个小技巧 1 适合的账户类型 更适合预算充足的广告主 如果当前 你每天的获客量远远满足
  • layui之ajax--回调函数

    问题 一个简单的AJAX提交表单操作 经常发生后台数据保存好了 前端layer弹出层没有关闭 父页面没有刷新 定位发现是回调函数没有执行 用Google Chrome浏览器这种现象较少 而Safari 和 firefox浏览器100 发生
  • 2021-02-09 链表复制

    给你一个长度为 n 的链表 每个节点包含一个额外增加的随机指针 random 该指针可以指向链表中的任何节点或空节点 构造这个链表的 深拷贝 深拷贝应该正好由 n 个 全新 节点组成 其中每个新节点的值都设为其对应的原节点的值 新节点的 n
  • mysql查看数据库状态

    很赞的文章 https codeplayer vip p j7sc4 官方教程是最应该查看的文档 https dev mysql com doc refman 5 5 en show html 我真正关心的数据 比如一秒钟到底能插入多少行数
  • Package javax.ws.rs

    http docs oracle com javaee 6 api javax ws rs package summary html Annotation Types Summary ApplicationPath Identifies t
  • 新路程------imx6的模块编译的Makefile

    KERNEL SOURCE opt IMX6 linux 3 0 35 obj m ldb o default make C KERNEL SOURCE M PWD modules arm hismall linux gcc pcf8563
  • python numpy从坐标序列中计算累计移动距离

    也是从其他程序中学习得到计算距离 position 通过list来存储坐标xy position append x y position np array position 转换成数组 dist arr np concatenate np
  • 基于docker一行命令搭建个人博客wordPress

    前言 作为对技术热爱的一群小伙伴们 技术分享开源社区的贡献都是我们技术人引以为傲的一件事情 不仅如此 技术分享或者记录也是对自己职业成长的记录 更甚者 如果你的技术分享深度不错 并且帮助到别人那么在面试中也是又很大帮助的 今天就给大家谈一下
  • 两条轨迹相似度算法,轨迹相似性度量

    百度地图 百度地图是百度提供的一项网络地图搜索服务 覆盖了国内近400个城市 数千个区县 在百度地图里 用户可以查询街道 商场 楼盘的地理位置 也可以找到离您最近的所有餐馆 学校 银行 公园等等 2010年8月26日 在使用百度地图服务时
  • VS2019环境下C++配置环境/创建动态链接库

    文章目录 前言 一 配置环境 0 准备 1 添加项目表 2 include文件与lib文件的配置 include文件设置 lib文件配置 二 使用已有代码生成动态链接库 前言 最近有一个收尾的项目分到了手里 由于基本没有使用过VS2019所
  • linux内核oops错误码说明,Linux Kernel Oops异常分析

    0 linux内核异常常用分析方法 异常地址是否在0附近 确认是否是空指针解引用问题 异常地址是否在iomem映射区 确认是否是设备访问总线异常问题 如PCI异常导致的地址访问异常 异常地址是否在stack附近 如果相邻 要考虑是否被踩 比
  • 验证尼科彻斯定理

    验证尼科彻斯定理 即 任何一个整数的立方都可以写成一串连续奇数的和 问题分析与算法设计 本题是一个定理 我们先来证明它是成立的 对于任一正整数a 不论a是奇数还是偶数 整数 a a a 1 必然为奇数 构造一个等差数列 数列的首项为 a a
  • SVN迁移至GIT,并附带历史提交记录

    文章目录 SVN代码同步至GIT 背景 准备工作 操作步骤 SVN代码同步至GIT 背景 近年随着信息工程的多元化发展 GIT逐渐取代SVN成为主流的版本管理工具 部门的项目代码也决定迁移至git进行管理 所以就调研了一下具体的实现方案 要
  • linux创建git仓库

    1 安装 yum install y git 2 查看 Git 版本 git version 3 查看有没有git用户 id git 没有用户创建 useradd git 设置密码 passwd git 删除密码 passwd d f gi
  • Tomcat配置远程调试端口

    1 Linxu系统 bin startup sh开始处中增加如下内容 Java代码 declare x CATALINA OPTS server Xdebug Xnoagent Djava compiler NONE Xrunjdwp tr
  • JVM系列-第10章-垃圾回收概述和相关算法

    文章目录 toc 垃圾回收概述 大厂面试题 蚂蚁金服 百度 天猫 滴滴 京东 阿里 字节跳动 什么是垃圾 为什么需要GC 早期垃圾回收 Java 垃圾回收机制 自动内存管理 应该关心哪些区域的回收 垃圾回收相关算法 标记阶段 引用计数算法
  • Python实现选择排序

    选择排序简介 选择排序 Selection sort 是一种简单直观的排序算法 简单来说就是从无序队列里面挑选最小的元素 和无序队列头部元素替换 放到有序队列中 最终全部元素形成一个有序的队列 选择排序原理 首先在未排序序列中找到最小 大
  • tomcat的启动流程及原理

    组件介绍 Tomcat 最重要的是两个组件是 Connector 连接器 和 Container 容器 集装箱 Connector 组件是可以被替换 这样可以提供给服务器设计者更多的选择 因为这个组件是如此重要 不仅跟服务器的设计的本身 而
  • 当我遵循了这 16 条规范写代码,同事只对我说了三个字: 666

    作者 涛姐涛哥 链接 cnblogs com taojietaoge p 11575376 html 如何更规范化编写Java 代码 Many of the happiest people are those who own the lea