Java编程问题top100---基础语法系列(二)
Java编程问题top100---基础语法系列(二)
- 六、如何测试一个数组是否包含指定的值?
- 简单且优雅的方法:
- 自己动手写逻辑
- 对象数组
- JDK 8 API
- JDK 9 API Set.of()
- 七、重写(Override)equlas和hashCode方法时应考虑的问题
- 理论上讲(编程语言、数学层面)
- 实践上讲
- 八、从一个多层嵌套循环中直接跳出
- 九、如何将String转换为Int
- 十、如何分割(split)string字符串
- Java编程问题top100---基础语法系列导航
感觉github上的翻译质量并没有想象中的那么好,感谢前辈的努力,但是还是得自力更生一步一步看国外文章自己动手翻译整合,码字不易,点赞支持~
萌新须知:平时写代码要老老实实判空,毕竟平时都是共同开发,不是你一个人单干,万一哪天对方改代码了,你调人家方法,返回个null给你,你也得背锅,另外不建议用assert断言,生产环境会关掉assert的。
六、如何测试一个数组是否包含指定的值?
指定数组,如:
public static final String[] VALUES = new String[]{"id", "name", "location"};
有哪些比较好的方式,判断这个数组 VALUES 是否包含值id?
简单且优雅的方法:
-
Arrays.asList(…).contains(…)
-
使用 Apache Commons Lang包中的ArrayUtils.contains(需要先引入Maven)
在pom.xml
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.11</version></dependency>
import org.apache.commons.lang3.ArrayUtils;// 测试一个数组是否包含指定的值
public class test01 {public static final String[] VALUES = new String[]{"id", "name", "location"};public static void main(String[] args) {if (ArrayUtils.contains(VALUES, "id")) {System.out.println("Contain");} else {System.out.println("Does Not Contain");}}
}
自己动手写逻辑
其实本质就是一个查找问题,即查找一个数组是否包含某个值。对于原始类型,若是无序的数组,可以直接写一个 for 循环:
import java.util.Objects;
// 无序数组public static boolean useLoop(String[] arr, String targetValue) {for (String s : arr) {// if (s.equals(targetValue)) {//不推荐这样用,以避免s为null,会不安全,改为下面这种if (Objects.equals(s,targetValue)) {return true;}}return false;}
若是有序的数组,可以考虑二分查找或者其他查找算法:
import java.util.Arrays;
// 有序数组public static boolean useArraysBinarySearch(String[] arr, String targetValue) {int a = Arrays.binarySearch(arr, targetValue);if (a >= 0) {return true;} else {return false;}}
对象数组
若数组里包含的是一个个对象,实际上比较就是引用是否相等(String 类型是判断值是否相等),本质就是比较 hashcode 和 equal 方法,可以考虑使用 List 或者 Set,如下:
public static boolean useList(String[] arr, String targetValue) {return Arrays.asList(arr).contains(targetValue);}
JDK 8 API
jdk 8及之后的jdk版本可以使用Streams
// 使用Streamspublic static void useStreams(String[] arr, String targetValue) {if (Arrays.stream(VALUES).anyMatch("id"::equals)) {System.out.println("Contain");} else {System.out.println("Does Not Contain");}}
要检查是不是int ,或double的数组或者long包含值IntStream,请分别使用 ,DoubleStream或LongStream。
举个int的例子
int[] a = {1,2,3,4};if(IntStream.of(a).anyMatch(x -> x == 4)){System.out.println("Contain");} else {System.out.println("Does Not Contain");}
JDK 9 API Set.of()
再三提示,jdk9,jdk9,jdk9。jdk 9及之后的jdk版本可以使用Set.of
jdk8的别凑热闹,不过可以知道下这个知识点,但这数据量太少,效率不高。
// 测试一个数组是否包含指定的值
public class test01 {private static final Set<String> VALUES = Set.of("id", "name", "location");public static boolean useSet(String[] arr) {if (VALUES.contains(s)) {System.out.println("Contain");} else {System.out.println("Does Not Contain");}}
}
O(1),很简洁、很漂亮~(就是开发用的JDK8用不上hh)
补充
如果数组数据量非常大,还经常使用查找的话,一般方法是O(n)线性查找,可以改用map系列。
map集合有三个常见的实现类:HashMap,TreeMap,LinkedHashMap。
TreeMap基于红黑树(一种自平衡二叉查找树)实现的,时间复杂度平均能达到O(log n)。
HashMap是基于散列表实现的,时间复杂度平均能达到O(1)。正常是O(1)到O(n)jdk1.8添加了 红黑树 是 O(log n)
TreeMap的get操作的时间复杂度是O(log(n))的,相比于HashMap的O(1)还是差不少的。
LinkedHashMap的出现就是为了平衡这些因素,能以O(1)时间复杂度查找元素,又能够保证key的有序性
为了更安全,不让修改的话,上这个Collections.unmodifiableSet,一旦修改就会报错。
/* Set<String> set = new HashSet<String>();set.add("id");set.add("name");set.add("location");Set unmodset = Collections.unmodifiableSet(set);unmodset.add("Hello");//编译运行会报错*/
七、重写(Override)equlas和hashCode方法时应考虑的问题
理论上讲(编程语言、数学层面)
equals() 定义了对象的相等关系(自反性、对称性、传递性) 。
另外,它还具有一致性(如果一个对象没有修改,那么对象的equals方法,应总是返回相同的值),此外,o.equals(null)应当总是返回false。
hashCode()也必须具备一致性的(如果equal的结果没有变,那么hashcode()也应总是返回相同的值)
总的来说,这两个方法的关系:
假如a.equals(b),那么a.hashCode() 应等于b.hashCode()
实践上讲
如果你重写了其中一个方法,那么务必重写另外一个方法
equals()和hashCode()所计算的属性集(set of fields)应当是一样的
如何更快地重写这两个方法呢?
- 使用Apache Commons Lang library中的EqualsBuilder、HashCodeBuilder
public class Person {private String name;private int age;// ...public int hashCode() {return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers// if deriving: appendSuper(super.hashCode()).append(name).append(age).toHashCode();// 我感觉IDEA直接生成的这个也不错// return Objects.hash(name, age);}public boolean equals(Object obj) {if (!(obj instanceof Person))return false;if (obj == this)return true;Person rhs = (Person) obj;return new EqualsBuilder().// if deriving: appendSuper(super.equals(obj)).append(name, rhs.name).append(age, rhs.age).isEquals();// 我感觉IDEA直接生成的这个也不错// return age == person.age && Objects.equals(name, person.name);}
}
- 代码编辑区右键,然后
(idea)选择 Generate… > equals() and hashCode()
(eclipse)选择 Source > Generate hashCode() and equals()
另外请记得
当你使用一些基于Hash的 Collection 、 Map,例如HashSet, LinkedHashSet, HashMap, Hashtable, 、WeakHashMap等。在键值对被放到集合中之后,请确保其key值所对应的hashCode()是保持不变的。比较可靠的一个办法,是保持这些key是不可变的,这也能带来不少好处
八、从一个多层嵌套循环中直接跳出
问题:
Java中如何从一个多层嵌套循环中退出,例如下面,有两个循环,break只能退出一个for循环,不能直接跳过第二个for循环
for (Type type : types) { for (Type t : types2) { if (some condition) { // Do something and break... break; // 这样只退出了最里的for循环 }
}}
回答:
可以用break+label的语法,例子如下
public class Test03 {public static void main(String[] args) {outerloop:for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) {if (i * j > 6) {System.out.println("Breaking");break outerloop;}System.out.println(i + " " + j);}}System.out.println("Done");}
}
有一点要注意,break label的位置一定要在label代码块的内部。否则无效,语法错误。
首先在for循环前加标签,如例子中的outerloop,然后在for循环内break label(如本例的outerloop),就会跳出该label指定的for循环。
九、如何将String转换为Int
##如何将String转换为Int
有两种方式
Integer x = Integer.valueOf(str);// orint y = Integer.parseInt(str);
这两种方式有一点点不同:
valueOf返回的是java.lang.Integer的实例parseInt返回的是基本数据类型 int
Short.valueOf/parseShort,Long.valueOf/parseLong等也是有类似差别。
另外还需注意的是,在做int类型转换时,可能会抛出NumberFormatException,因此要做好异常捕获
public class Test04 {public static void test(String[] args) {int foo;String StringThatCouldBeANumberOrNot = "26263Hello"; //will throw exceptionString StringThatCouldBeANumberOrNot2 = "26263"; //will not throw exceptiontry {foo = Integer.parseInt(StringThatCouldBeANumberOrNot);} catch (NumberFormatException e) {//Will Throw exception!//do something! anything to handle the exception.}try {foo = Integer.parseInt(StringThatCouldBeANumberOrNot2);} catch (NumberFormatException e) {//No problem this time but still it is good practice to care about exceptions.//Never trust user input :)//do something! anything to handle the exception.}}
}
十、如何分割(split)string字符串
如下所示:
String string = "004-034556";
String[] parts = string.split("-");
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556
需要注意的是,该方法的参数是个正则表达式,要注意对某些字符做转码。例如.在正则表达式中表示任意字符,因此,如果你要通过.号做分割,需要这样写,split("\\.")或者split(Pattern.quote("."))
如果只是为了验证字符串中是否包含某个字符,使用String的contains()方法就行。注意该方法的参数,不是正则表达式
Java编程问题top100—基础语法系列导航
Java编程问题top100—基础语法系列(一)
Java编程问题top100—基础语法系列(二)
Java编程问题top100—基础语法系列(三) 待更新
如有错误,还请多多指教!
转载或者引用本文内容请注明来源及原作者:橘足轻重;
相关文章:
Java编程问题top100---基础语法系列(二)
Java编程问题top100---基础语法系列(二)六、如何测试一个数组是否包含指定的值?简单且优雅的方法:自己动手写逻辑对象数组JDK 8 APIJDK 9 API Set.of()七、重写(Override)equlas和hashCode方法时应考虑的问题理论上讲&…...
网页打印与导出word实现在A4纸上相同效果
在工作中遇到这样一个需求,客户要求: 1、实现在浏览器中打印和导出到word中,要求浏览器打印出来的效果和word中打印的效果基本一致。2、打印的内容要自动分页,第一页的顶部有文件头,最后一页的底部有页尾。 这里记录一…...
备战英语6级——记录复习进度
开始记录—— 学习:如何记录笔记? 1:首先我认为:电脑打字比较适合我! 2:先记笔记,再“填笔记”! 记笔记就是一个框架,记录一个大概的东西。后面需要在笔记中࿰…...
实例10:四足机器人运动学逆解可视化与实践
实例10: 四足机器人运动学逆解单腿可视化 实验目的 了解逆运动学的有无解、有无多解情况。了解运动学逆解的求解。熟悉逆运动学中求解的几何法和代数法。熟悉单腿舵机的简单校准。掌握可视化逆向运动学计算结果的方法。 实验要求 拼装一条mini pupper的腿部。运…...
Elasticsearch7.8.0版本优化——路由选择
目录一、Elasticsearch 如何知道一个文档存放在哪个分片二、不带 routing 查询三、带 routing 查询一、Elasticsearch 如何知道一个文档存放在哪个分片 其实是通过这个公式来计算出来:shard hash(routing) % number_of_primary_shardsrouting 默认值是文档的 id&a…...
Go常量的定义和使用const,const特性“隐式重复前一个表达式”,以及iota枚举常量的使用
Go常量的定义和使用const,以及iota枚举常量的使用Go常量constGo中常量的定义和使用Go特性const,"隐式重复前一个表达式"iota 实现枚举常量Go常量const Go语言中的const整合了C语言中的宏定义常量,const只读变量枚举变量 绝大多数情况下,Go常…...
Git学习(1)pro git阅读
目录 目录: 1. 起步 2. Git 基础 3. Git 分支 4. 服务器上的 Git 5. 分布式 Git 第一章 1.3 Git是什么 1.6运行git前的配置 该开源图书网站 Git - Book (git-scm.com) 目录: 1. 起步 1.1 关于版本控制1.2 Git 简史1.3 Git 是什么?1…...
PHY自协商
1. 自协商定义 自动协商模式是端口根据另一端设备的连接速度和双工模式,自动把它的速度调节到最高的公共水平,即线路两端能具有的最快速度和双工模式。 自协商功能允许一个网络设备能够将自己所支持的工作模式信息传达给网络上的对端,并接受对…...
【大数据离线开发】8.2 Hive的安装和配置
8.3 Hive的安装和配置 安装模式: 嵌入模式 :不需要使用MySQL,需要Hive自带的一个关系型数据库:Derby本地模式、远程模式 ----> 需要MySQL数据库的支持 安装 hive 安装包 1、解压tar -zxvf apache-hive-2.3.0-bin.tar.gz -C…...
Capture Modules:车载网络报文捕获模块
(以下所有图片均来源于Technica官网) Technica Engineering的新一代硬件设备,即Capture Modules,提供了五种变体以涵盖不同带宽的车载以太网(100BASE-T1和1000BASE-T1)以及常见的IVN技术(CAN、C…...
数据结构与算法系列之时间与空间复杂度
这里写目录标题算法的复杂度大O的渐进表示法实例分析空间复杂度每日一题算法的复杂度 衡量一个算法的好坏,一般 是从时间和空间两个维度来衡量的, 即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算法的运行快慢, 空间复杂度主要衡量一个…...
Python代码使用PyQt5制作界面并封装
目录参考链接续:https://blog.csdn.net/yulinxx/article/details/93344163 若要对此程序进行封装,加个界面,然后制作成 EXE, 使用 PyQt5 制作界面,PyInstaller 进行封装成 EXE 可参考: Python制作小软件…...
【Node.js】MySQL数据库的第三方模块(mysql)
mysql安装操作MySQL数据库的第三方模块(mysql)通过第三方模块(mysql2)连接到MySQL数据库mysql插入数据mysql插入数据的便捷方式mysql更新数据mysql更新数据的便捷方式mysql删除数据安装操作MySQL数据库的第三方模块(my…...
Docker中安装并配置单机版redis
1、使用docker安装redis 搜索Reis镜像,这里展示的是官方最新的镜像docker search redis 使用官方dockerhub搜索redis 2、选用常用的redis5.0作为安装的版本docker pull redis:5.0 3、运行redis容器的两种方式 3.1 不映射外部配置文件直接运行redis5.0镜像docker …...
模拟微信聊天-课后程序(JAVA基础案例教程-黑马程序员编著-第八章-课后作业)
【案例9-1】 模拟微信聊天 【案例介绍】 1.案例描述 在如今,微信聊天已经人们生活中必不可少的重要组成部分,人们的交流很多都是通过微信来进行的。本案例要求:将多线程与UDP通信相关知识结合,模拟实现微信聊天小程序。通过监…...
html2canvas将页面dom元素内容渲染成图片保存至本地
html2canvas:https://html2canvas.hertzen.com/configuration/ github:https://github.com/niklasvh/html2canvas 效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compa…...
前端进阶JS运行原理
JS运行原理 深入了解V8引擎原理 浏览器内核是由两部分组成的,以webkit为例: WebCore:负责HTML解析、布局、渲染等等相关的工作;JavaScriptCore:解析、执行JavaScript代码; 官方对V8引擎的定义࿱…...
Python识别二维码的两种方法(cv2)
在学习Python处理二维码的过程中,我们看到的大多是“用python生成酷炫二维码”、“用Python制作动图二维码”之类的文章。而关于使用Python批量识别二维码的教程,并不多见。所以今天我会给大家分享两种批量识别二维码的Python技巧!pyzbar PI…...
用一个例子告诉你 怎样使用Spark中RDD的算子
目录 1. 前言 1.1 操作分类 1.2 语法知识 2. transformations 2.1 map 2.2 mapPartitions 2.3 flatMap 2.4 glom 2.5 groupBy 2.6 filter 2.7 sample 2.8 distinct 2.9 coalesce 2.10 repartition 2.11 sortBy 2.12 partitionBy 2.13 reduceByKey 2.14 gro…...
什么是跨域? 出现原因及解决方法
目录一、什么是跨域二、为什么有跨域问题?三、解决跨域问题的方案1.Jsonp2.nginx3.CORS3.1 什么是cors3.2 原理四、GateWay网关中实现跨域步骤一、什么是跨域 跨域:浏览器对于javascript的同源策略的限制 。 同源政策的目的,是为了保证用户…...
NotebookLM技能集成:自动化文档问答与RAG应用实践
1. 项目概述:当NotebookLM遇上自定义技能最近在折腾AI工具链的时候,发现了一个挺有意思的项目:jasontsaicc/notebooklm-studio-skill。乍一看这个名字,你可能和我最初的反应一样,有点摸不着头脑。NotebookLM我知道&…...
LunaTranslator完整指南:5步掌握视觉小说实时翻译技巧
LunaTranslator完整指南:5步掌握视觉小说实时翻译技巧 【免费下载链接】LunaTranslator 视觉小说翻译器 / Visual Novel Translator 项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator 想要畅玩日文视觉小说却苦于语言障碍?LunaT…...
跨平台实战:Windows QGC与Linux JMAVSim模拟器的局域网联调
1. 环境准备与基础概念 在开始跨平台联调之前,我们需要先理解几个关键组件的作用。QGroundControl(QGC)是无人机领域最流行的开源地面站软件,相当于无人车的"方向盘";而PX4 JMAVSim则是基于Java开发的轻量级…...
工程定制丙级管道井门 物业机房通用款式
工程定制丙级管道井门,作为高层住宅、商业楼宇、物业机房强弱电井的专用消防配套设施,严格遵循国标消防规范生产,是建筑管井防火分隔、安全防护的核心产品。这款丙级管道井门采用钢制一体成型工艺,结构扎实不易变形,具…...
Wwise音频文件处理终极指南:3步完成游戏音效解包与替换
Wwise音频文件处理终极指南:3步完成游戏音效解包与替换 【免费下载链接】wwiseutil Tools for unpacking and modifying Wwise SoundBank and File Package files. 项目地址: https://gitcode.com/gh_mirrors/ww/wwiseutil 还在为游戏音频文件无法编辑而烦恼…...
GenAIScript:用脚本化AI工作流提升代码生成效率与工程化实践
1. 项目概述:当AI遇上代码生成,GenAIScript带来了什么?如果你最近在关注AI如何改变开发工作流,特别是微软在AI领域的动作,那么microsoft/genaiscript这个项目绝对值得你花时间深入研究。这不仅仅是一个简单的代码生成工…...
数字IC前端学习笔记:从结构到实现,深入剖析Wallace Tree乘法器的性能优势
1. 为什么需要Wallace Tree乘法器 在数字IC设计中,乘法器是最基础也最关键的运算单元之一。传统的阵列乘法器虽然结构简单直观,但随着位宽增加,其关键路径延迟会呈平方级增长。我曾经在设计一个32位乘法器时,发现阵列结构的延迟直…...
3分钟让你的Obsidian代码块告别混乱:专业开发者的笔记美化秘籍
3分钟让你的Obsidian代码块告别混乱:专业开发者的笔记美化秘籍 【免费下载链接】obsidian-better-codeblock Add title, line number to Obsidian code block 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-better-codeblock 还在为Obsidian中密密麻…...
Parabolic视频下载神器:一站式跨平台解决方案的终极指南
Parabolic视频下载神器:一站式跨平台解决方案的终极指南 【免费下载链接】Parabolic Download web video and audio 项目地址: https://gitcode.com/GitHub_Trending/pa/Parabolic Parabolic是一款基于yt-dlp引擎的专业级视频下载工具,为技术爱好…...
基于ReAct范式的链式追踪工具:提升学术研究效率的AI智能体实践
1. 项目概述与核心价值如果你经常需要做文献调研、追踪某个科学概念的源头,或者想搞清楚一个复杂话题背后的证据链,那你一定体会过在搜索引擎和无数个学术网站之间反复横跳的痛苦。传统的搜索方式,比如在Google Scholar里输入一个关键词&…...
