吐槽,Java 设计的槽点

java/php/net/python吐槽论坛设计 本系统带文档lw万字以上+答辩PPT+查重 如果这个题目不合适,可以去我上传的资源里面找题目,找不到的话,评论留下题目,或者站内私信我, 有时间看到机会给您发 1、关于吐槽论坛管理系统的基本要求 (1)功能要求:可以管理个人中心、论坛公告管理、图片素材管理、视频素材管理、话题讨论管理、吐槽类别管理、管理员管理等功能模块。 (2)性能:在不同操作系统上均能无差错实现在不同类型的用户登入相应界面后能不出差错、方便地进行预期操作。 (3)安全与保密要求:用户都必须通过管理员审核才能进入系统。 (4)环境要求: 阅读详情

今天不灌水,直接上干货!希望下面的讲解,能与你产生一些共鸣。

1. 求长度各有千秋

你是否曾经在面试的时候,经常被问到:数组有没有 length() 方法?字符串有没有 length() 方法? 集合有没有 length() 方法?

面对这个问题,那么不得不吐槽一下,Java 中获取长度的方式,设计着实有点乱,对刚入门的程序猿而言,那绝对是一脸的懵逼。

String[] array = {"abc", "def"};

String str = "abcedf";

List<String> list = new ArrayList<String>();

list.add("abc");

list.add("def");

System.out.println("数组的长度: " + array.length);

System.out.println("字符串的长度: " + str.length());

System.out.println("集合的长度: " + list.size());

正式科普一下,希望能够铭记你心中。数组求长度用 length 属性;字符串求长度用 length() 方法;集合求长度用 size() 方法。

2. 字符串截取有深意

对于程序猿来说,编程规范能够养成良好的编程习惯,提高代码质量,减少沟通成本。

阿里 Java 开发手册编程规约中记载,【强制】方法名、參数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从驼峰形式。

看到这里,不得不提 String 中的 substring 方法,你是不是经常把“substring”写成“subString”。本次这个命名不是吐槽的重点。主要想分享如下代码片段。

public class StringInterview {

   public static void main(String[] args) {

       String str = "......abcdefgh.......";

       String subStr = str.substring(1,3);

       str = null;

       System.out.println(subStr);

   }
}

假如上述这段程序在 Java 1.6 中运行,代码中虽然强制使 str 引用为空,本意是释放 str 占用的空间,但是这个时候,GC 是无法回收这个大的 char 数组的,因为还在被 subStr 字符串内部引用着,虽然 subStr 只截取这个大数组的一小部分。当 str 是一个非常大字符串的时候,这种浪费是非常明显的,甚至会带来内存泄露问题。

深入 Java 1.6 中 substring 的设计一探究竟。

public String substring(int beginIndex, int endIndex) {

  if (beginIndex < 0) {
      //。。 。。 。。
  }

  if (endIndex > count) {
      //。。 。。 。。
  }

  if (beginIndex > endIndex) {
      //。。 。。 。。
  }

  return ((beginIndex == 0) && (endIndex == count)) ? this :
   new String(offset + beginIndex, endIndex - beginIndex, value);
}

上述方法调用的构造方法

String(int offset, int count, char value[]) {

  this.value = value;

  this.offset = offset;

  this.count = count;

}

到此你应该拨云见日豁然开朗。当我们调用字符串 str 的 substring 得到字符串 subStr,其实这个操作,无非就是调整了一下 subStr 的 offset 和 count ,用到的内容还是 str 之前的 value 字符数组,并没有重新创建新的专属于 subStr 的内容字符数组。如果 subStr 的生命周期要长于 str 或者手动设置 str 为null,当垃圾回收进行后,str 被回收掉,subStr 没有回收掉,那么内存占用依旧存在,因为 subStr 持有 str 字符数组的引用。

正式科普一下,这个问题出现在 Java 1.6,并且 Java 1.7 中已经修复。虽然已经修复,并不代表我们就不需要了解,如果你正在求职路上,稍微了解一下,说不定会加分。

3. 一条 if 语句引发不满

先给各位抛一段 Java LinkedList 类的代码片段,一起吐槽吐槽。

public E getFirst() {

   final Node<E> f = first;

  if (f == null)

       throw new NoSuchElementException();

   return f.item;

}

JDK 中 if 语句后只有一条语句,大部分都是这么实现的。原则上,if 语句如果后面跟着只有一句话,是可以不加的。但是在我们实际开发中,有些现象却会让你匪夷所思,不信你看看下面的代码片段。

片段一:

 if (f == null)

   //抛出异常,或者加一条打印语句,加上此句注释逻辑就变了

   throw new NoSuchElementException();

片段二:

public class Interview {

   public static void main(String[] args) {
       Class c = Interview.class;
       try {
           Object o = c.newInstance();
           if (o instanceof Interview)
               Interview tt = (Interview) o; //为什么会报错?请各位解释原因
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

正式科普一下,看似一个简单的编码规范,背后隐藏了多少坑啊,所以为了良好的编程习惯,建议还是统一加上大括号为好,良好的编码习惯是真重要啊。

4. 时间实现也找茬

Tiago Fernandez 做过一次投票,选举最烂的 Java API,排第二的就是日期 API(Date 和Calender)。一言不合就抛代码,如下片段是计算两个日期之间的天数。

public static void main(String[] args) {
   Calendar begin = Calendar.getInstance();
   begin.set(1990, Calendar.JUNE, 17);
   Calendar end = Calendar.getInstance();
   System.out.println(alculatedDays(begin, end));
   System.out.println(alculatedDays(begin, end)); // 为什么显示 0?
}

public static long alculatedDays(Calendar begin, Calendar end) {
   long days = 0;
   while (begin.before(end)) {
       begin.add(Calendar.DAY_OF_MONTH, 1);
       days++;
   }

   return days;
}

alculatedDays 方法,如果连续计算两个 Date 实例的话,第二次会取得 0,因为 Calendar 状态是可变的,考虑到重复计算的场合,最好复制一个新的 Calendar,改造如下

public static long alculatedDays(Calendar begin, Calendar end) {
   Calendar calendar = (Calendar) begin.clone(); // 复制
   long days = 0;
   while (calendar.before(end)) {
       calendar.add(Calendar.DAY_OF_MONTH, 1);
       days++;
   }

   return days;
}

不过万物都在向前进化,因为由于原来老旧的日期 API 一直被人诟病,所以 JDK 1.8 中对日期的改动是特别大的,基本上是引入了一套全新易用的 API,各位有时间可以体验一下。

好了,吐槽中见真谛,今天就讲这么多吧,希望你能 get 到一点点共鸣。

一起聊技术、谈业务、喷架构,少走弯路,不踩大坑。欢迎关注「一猿小讲」,会持续输出原创精彩分享,敬请期待!

盘点java种过度设计的组件和功能 边界维度控制机制目标内存固定尺寸+平坦存储消除间接访问,提升缓存命中率类型无标识+结构相等避免副作用,简化推理泛型条件特化+自动装箱兼容现有生态,渐进式迁移安全非空保证+递归初始化消除空指针,保障内存安全逃生降级应对特殊场景Valhalla项目的智慧不追求完美理论模型,而是通过精确的边界约束,在现实工程限制下实现最大价值。值类型的边界设计本质是在内存效率与对象模型之间划出一道可控的隔离带,让开发者能安全地触及硬件级性能。 阅读详情

相关推荐

流媒体弱网优化之路(NACK)——纯NACK方案的优化探索

流媒体学习之路(NACK)——纯NACK方案的最高性能 文章目录流媒体学习之路(NACK)——纯NACK方案的最高性能一、NACK简介二、Nack的理解2.1 一种补救策略2.2 什么时候要?2.3 要多少?2.4 怎么要?三、计算分析3.1 rtt强相关3.2 补包次数计算3.3 Nack的定时发送3.4 nack重传限制四、实验   近期在针对纯丢包场景做一些简单的探索实验,一个让我困扰的问题就是:不使用FEC而只是通过纯NACK进行补偿,到底能在实验环境下抵抗多少的丢包呢?每一次丢包补偿的最大时长

qw225967的博客 1万+

吐槽一下Java的不友好

整体来说,Java和C#可以算作是非常近亲的语言,基本架构其实都差不多。最近在做Java的框架,框架基本做完(后面我会开源这个项目),今天来吐槽一下Java语法的不友好度(开发工具就不要对比了,VS确实是宇宙第一): 1) 属性     C#类的成员分域,属性和方法,Java没有属性的概念,本质上Java的域+访问器就等于C#的属性,但方便度真的不如C#,C#的语法非常简洁:property ...

三人行必有我师,手写三行必有所悟 3378

AIGC实战:用ComfyUI和Lora微调打造专属原神角色(含完整工作流)

本文详细介绍了如何利用ComfyUI和Lora微调技术打造专属原神风格角色,涵盖从环境配置、数据集准备到工作流构建和Lora训练的全过程。通过模块化节点设计和高级控制技术,创作者可实现高度个性化的AIGC艺术创作,提升二次元角色生成的效率与质量。

weixin_29185199的博客 348

Java为什么这么垃圾?

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84046876的博客 1420

嘉立创EDA报错:元件引脚与焊盘未对应报错解决记录

原件引脚与焊盘未对应报错解决方法,一文总结!

2303_77013775的博客 1万+

保姆级教程:用LoRA微调Chinese-Mistral-7B模型,并一键部署到Ollama(附完整代码)

本文提供了一份详细的LoRA微调Chinese-Mistral-7B模型的保姆级教程,涵盖环境配置、数据预处理、微调实战、模型量化及Ollama部署全流程。通过实战案例和完整代码,帮助开发者快速构建专属中文大模型,适用于医疗、法律等垂直领域。

weixin_30369041的博客 249

吐槽java之《程序员的呐喊》读后总结

《程序员的呐喊》读后总结 ——关于java的批判 一、写在总结前面的一些废话 《程序员的呐喊》(后文简称呐喊),是一本非常有趣的散篇,全文都是作者对目前软件开发界的看法,主要翻译者也很可爱,用了一些中国化的文字进行描述,感觉看的时候十分畅快,当然前提你得是个程序员。作者,是一名开发了20几年的软件工程师,用过10几门主流语言,开发过无数大型项目和平台,曾在亚马逊和谷歌工作。 作

qiubaihong的博客 4312

精益六西格玛Python数字化应用开发-Day18 应用场景:家电企业生产效率优化

本文将重点介绍专门针对精益六西格玛黑带使用场景的 Python 库,这些库功能侧重于数据分析和流程优化,特别适用于 DMAIC 方法论和看板管理。考虑到读者具备中高级Python 使用经验,我们将深入探讨各库的高级功能和实际应用应用场景。 某家电企业生产线自动化程度高,数据量巨大,希望通过精益管理提升生产效率。企业借助 Python 脚本,打通各类数据源(MES、ERP、设备日志),自动归集生产数据,分析各工序的生产节拍、设备停机、效率损失,快速定位瓶颈环节

m0_56592100的博客 905

吐槽:那些Java设计中不得不说的槽点

1. 求长度各有千秋 你是否曾经在面试的时候,经常被问到:数组有没有 length() 方法?字符串有没有 length() 方法? 集合有没有 length() 方法? 面对这个问题,那么不得不吐槽一下,Java 中获取长度的方式,设计着实有点乱,对刚入门的程序猿而言,那绝对是一脸的懵逼。 String[] array = {"abc", "def"}; String str = "abcedf...

215

Flink SQL数据血缘实战:如何用Calcite追踪字段级数据流向(附源码示例)

本文深入探讨了如何利用Apache Calcite解析Flink SQL执行计划,实现字段级数据血缘的追踪。通过扩展Calcite的元数据处理器,特别是针对Flink特有的Snapshot等节点,文章提供了从获取优化后的逻辑计划到提取并可视化血缘关系的完整实战方案,并附有核心源码示例,帮助开发者构建实时数仓的数据治理能力。

weixin_29032337的博客 142

2、MOSFET基本物理效应及其BSIM4模型解析

本文深入探讨了MOSFET的基本物理效应及其在BSIM4模型中的数学表述,涵盖门和沟道的几何结构、温度依赖性、材料模型选项、阈值电压计算、以及其他关键物理效应如LDD电阻、有限电荷厚度、有效迁移率等。同时解析了机械应力、邻近效应及布局依赖效应对MOSFET性能的影响,并通过参数表和建模流程提供了精确建模的指导,旨在帮助读者优化MOSFET器件性能与可靠性。

purple的博客 565

满集网java开发怎么样_吐槽,Java 设计的槽点

今天不灌水,直接上干货!希望下面的讲解,能与你产生一些共鸣。1. 求长度各有千秋你是否曾经在面试的时候,经常被问到:数组有没有 length() 方法?字符串有没有 length() 方法? 集合有没有 length() 方法?面对这个问题,那么不得不吐槽一下,Java 中获取长度的方式,设计着实有点乱,对刚入门的程序猿而言,那绝对是一脸的懵逼。String[] array = {"abc", "...

weixin_42102634的博客 84

在 Esp32 摄像头上实现边缘脉冲 FOMO 物体检测

本文将详细介绍如何在 Esp32 摄像头上实现边缘脉冲 FOMO 物体检测,并提供实现源码

DT程序员的博客 705

java代码实现图片找茬_吐槽,Java 设计的槽点

今天不灌水,直接上干货!希望下面的讲解,能与你产生一些共鸣。1. 求长度各有千秋你是否曾经在面试的时候,经常被问到:数组有没有 length() 方法?字符串有没有 length() 方法? 集合有没有 length() 方法?面对这个问题,那么不得不吐槽一下,Java 中获取长度的方式,设计着实有点乱,对刚入门的程序猿而言,那绝对是一脸的懵逼。String[] array = {"abc", "...

weixin_42168750的博客 513

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

透过J2Cache的吐槽,领悟代码的设计

经常去开源社区的,大部分应该都知道J2Cache吧,不过没听说过也没关系,这 是 开源中国社区OSChina 目前正在使用的两级缓存框架,托管在OSG@Git上,大部分由设计人红薯来维护。它的第一级缓存使用 Ehcache,第二级缓存使用 Redis 。由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目标是降低对 L2 的读取次数。该缓存框架主要用于集群环境中。单机也可

Java我人生的技术博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

那些Java设计中不得不说的槽点 侵删

转自:http://www.mamicode.com/info-detail-2719942.html 1. 求长度各有千秋 你是否曾经在面试的时候,经常被问到:数组有没有 length() 方法?字符串有没有 length() 方法? 集合有没有 length() 方法? 面对这个问题,那么不得不吐槽一下,Java 中获取长度的方式,设计着实有点乱,对刚入门的程序猿而言,那绝对是一脸的懵逼...

心神沫沫的收藏 93

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

吐槽kotlin之垃圾设计

本文重点在于吐槽垃圾设计,全是缺点,不说优点。

weixin_43328357的博客 927

程序员大吐槽,各个编程语言都有哪些“黑点”

在知乎上看到一张调侃各个编程语言的图片,十分有趣,感受到了来自程序猿们浓浓的幽默感,整理出来供大家一笑。

Happyapp的博客 2650

吐槽大全 -GoF《设计模式》

对GoF《设计模式》等面向对象设计的经典书籍的吐槽。分散在各文章中的吐槽将被删除。

yqj2065的博客 1531

Java毕业设计要疯了?不用怕,源码宝库拯救你!

毕业设计其实是大学生活中的一个大挑战,同时也是展示自己学习成果和能力的好机会。选对合适的Java项目,结合一些实用的开发技巧,你一定能让自己的毕业设计在答辩中脱颖而出。如果你还对某些Java项目的选题和实现有困惑,不妨多看看网上的开源项目,借鉴一些设计思路。同时,也可以多向身边的同学和老师请教,相信大家都会乐于帮助你。总之,毕业设计只是大学生活中的一个小插曲,相信大家通过合理的努力和巧妙的应对,都能顺利完成并取得满意的成绩。祝各位学弟学妹们早日毕业,迎接崭新的未来!点击进入Java源码宝库。

dragon 800

程序员发帖吐槽:在阿里和百度工作七年,去面试小公司却挂了

近日在互联网论坛,一名程序员大肆吐槽:我就郁闷了,在阿里工作五年,百度工作两年,去面试hulu,上来啥都不问就两道算法题,我没有第一时间给出最优解,想了一会儿才做出来,结果就把我挂了,工作那么多年了,还这样面试也是醉了 能进阿里和百度工作,实力自然不菲,没想到面试一家公司却挂了,站在楼主的角度来看,觉得自身肯定没问题,毕竟有科技大厂的经验。 一瞬间,楼主的贴文引得不...

yalin7076的博客 9748

应聘Java岗啥都答不出,面试官无奈吐槽“啥时候能有人给我挖坑”

Java 面试中的重要话题 除了你看到的惊人的问题数量,我也尽量保证质量。我不止一次分享各个重要主题中的问题,也确保包含所谓的高级话题,这些话题很多程序员不喜欢准备或者直接放弃,因为他们的工作不会涉及到这些。 Java NIO 和 VM 底层就是最好的例子。你也可以将设计模式划分到这一类中,但是越来越多有经验的程序员了解 GOF 设计模式并应用这些模式。我也尽量在这个列表中包含2020 年最新的面试问题,这些问题可能是大家关注的核心。为了给你一个大致的了解,下面列出这份 Java 面试问题列表包含的主题

文章中资料均可获取,有需要请添加yunduoa2019即可 8471
下一篇: 程序猿出马,鲁迅终于不用背黑锅了?!
一猿小讲
博客等级 码龄15年 294粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值