当前位置: 首页 > news >正文

Java编程问题top100---基础语法系列(一)

Java编程问题top100---基础语法系列一

  • 一、Java += 操作符实质
  • 二、将InputStream转换为String
      • 使用IOUtils
      • 自己写轮子
  • 三、将数组转换为List
  • 四、如何遍历map对象
      • 使用For-Each迭代entries(方法一)
      • 使用For-Each迭代keys和values(方法二)
      • 使用Iterator迭代(方法三)
        • 使用泛型
        • 不使用泛型
      • 迭代keys并搜索values(低效的)(方法四)
      • 总结
  • 五、public,protected,private,不加修饰符。有什么区别呢?
  • Java编程问题top100---基础语法系列导航

记得这个是当时刚入学那会尝试去看的一个github上的优秀内容,当时很多东西看得云里雾里,不太懂。
现在正好有空了,再来一次,会稍作修改再加上代码实践,有问题可以留言。
重温的同时,希望对你能有所帮助。
以下系列将会是对stackoverflow上Java相关、投票数TOP100的问答(精修版)。

一、Java += 操作符实质

问题:我之前以为:
i += j 等同于 i = i + j;
但假设有:
int i = 5; long j = 8;
这时 i = i + j 不能编译,但 i += j 却可以编译。这说明两者还是有差别的
这是否意味着,i += j,实际是等同于 i= (type of i) (i + j)呢?

// Java += 操作符实质
public class test01 {public static void main(String[] args) {int i = 5;long j = 8;// i = i + j;// 编译报错,需要的类型int,提供了longi += j; // 这行没有问题i = i + (int) j; // 这行也没问题}
}

回答
复合赋值表达式E1 op= E2来说, (诸如 i += j i -= j i*=j i/=j等等),其实是等同于 E1 = (T)((E1) op (E2))
其中,E1和E2表示两个操作数,T是E1这个元素的类型
举例来说,如下的代码
int i = 5;long j = 8;
i += j;等同于i = (int)(i + j); 也就是(i + j)先执行,然后(i + j)的结果强制类型转换为int类型
新人注意:表达式i = (int)(i + j); (i + j)这个是带括号的。
它也等价于i = i + (int) j;

二、将InputStream转换为String

首先项目名字那按右键选Add Framework Support或者选添加框架支持,然后选Maven,在pom.xml里写入下面这个

    <dependencies><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency></dependencies>

使用IOUtils

最靠谱的方法,用Apache commons IOUtils
文档test02.txt

ABC a b ABc b
你好
//将InputStream转换为String
public class test02 {public static void main(String[] args) throws Exception {FileInputStream inputStream = new FileInputStream("D:\test02.txt");String encoding = "UTF-8";StringWriter writer = new StringWriter();IOUtils.copy(inputStream, writer, encoding);String theString = writer.toString();// String theString = IOUtils.toString(inputStream, encoding);// 这个方法其实封装了上面的方法,减少了一个参数}
}

或者

String theString = IOUtils.toString(inputStream, encoding);
//这个方法其实封装了上面的方法,减少了一个参数 

自己写轮子

如果不想引入Apache库,也可以这样做

//将InputStream转换为String
public class test02 {static String convertStreamToString(InputStream is) {Scanner s = new Scanner(is).useDelimiter("你好");//读取到你好这个词就会停止输入return s.hasNext() ? s.next() : "";}public static void main(String[] args) throws FileNotFoundException {FileInputStream fileInputStream = new FileInputStream("test.txt");System.out.println(convertStreamToString(fileInputStream));}
}

三、将数组转换为List

1、最简单的for循环遍历挨个赋值给List。
2、Arrays.asList(array);

// 将数组转换为List
public class test03 {public static void main(String[] args) {Integer[] array = {1, 2, 3, 4};List<Integer> arrayLists = Arrays.asList(array);// 这里System.out.println(arrayLists);}
}

但这样做会有坑:

  1. 生成的list,是固定长度的。也就是说,如果调用它的add()方法或者remove()方法,都会抛异常UnsupportedOperationException。
  2. 如果修改数组的值list中的对应值也会改变

因为Arrays.asList() 返回的是Arrays里的内部静态类,而不是Java.util.ArrayList这个类。
这个java.util.Arrays.ArrayList有set(),get(),contains()方法,但是没有任何add() 方法,所以它是固定大小的.

建议用这个
Collections.addAll(arrayLists, array);

// 将数组转换为List
public class test03 {public static void main(String[] args) {Integer[] array = {1, 2, 3, 4};List<Integer> arrayLists = new ArrayList<>();Collections.addAll(arrayLists, array);// 这里}
}

四、如何遍历map对象

在Java中有多种遍历HashMap的方法。
让我们回顾一下最常见的方法和它们各自的优缺点。
由于所有的Map都实现了Map接口,所以接下来方法适用于所有Map(如:HaspMap,TreeMap,LinkedMap,HashTable,ConcurrentHashMAp,……)

使用For-Each迭代entries(方法一)

这是最常见的方法,并在大多数情况下更可取的。当你在循环中需要使用Map的键和值时,就可以使用这个方法

public class test04 {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();// map = null;map.put("a", 1);testOne(map);}public static void testOne(Map<String, Integer> map) {if (map != null && !map.isEmpty()) {for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue());}}else {System.out.println(map);}}
}

注意:遍历之前你应该判断是否为空引用。如果遍历的map是null的话,For-Each循环会抛出NullPointerException异常。

使用For-Each迭代keys和values(方法二)

如果你只需要用到map的keys或values时,你可以遍历KeySet或者values代替entrySet

    public static void testTwo(Map<String, Integer> map) {if (map != null && !map.isEmpty()) {for (String key : map.keySet()) {System.out.println("Key = " + key);}for (Integer value : map.values()) {System.out.println("Value = " + value);}}}

这个方法比entrySet迭代具有轻微的性能优势(大约快10%)并且代码更简洁

使用Iterator迭代(方法三)

使用泛型

    public static void testThree(Map<String, Integer> map) {Iterator<Map.Entry<String, Integer>> entries = map.entrySet().iterator();while (entries.hasNext()) {Map.Entry<String, Integer> entry = entries.next();System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());}}

不使用泛型

public static void testFour(Map<String, Integer> map) {if (map != null && !map.isEmpty()) {Iterator entries = map.entrySet().iterator();while (entries.hasNext()) {Map.Entry entry = (Map.Entry) entries.next();String key = (String) entry.getKey();Integer value = (Integer) entry.getValue();System.out.println("Key = " + key + ", Value = " + value);}} else {System.out.println(map);}}

你可以使用同样的技术迭代keyset或者values
首先,它是遍历java 5 以前版本的map的唯一方法。
第二是可以让你在迭代的时候从map中删除entries的(通过调用iterator.remover())唯一方法。
如果你试图在For-Each迭代的时候删除entries,你将会得到unpredictable resultes 异常。
从性能方面看,这个方法等价于使用For-Each迭代(方法二)

迭代keys并搜索values(低效的)(方法四)

    public static void testFive(Map<String, Integer> map) {if (map != null && !map.isEmpty()) {for (String key : map.keySet()) {Integer value = map.get(key);System.out.println("Key = " + key + ", Value = " + value);}} else {System.out.println(map);}}

比方法一更简洁,但是实际更慢更低效,通过key得到value值更耗时

总结

如果你只需要使用key或者value使用方法二使用For-Each迭代keys和values,如果你使用java 5 以前的版本或者打算在迭代的时候移除entries,使用方法三使用Iterator迭代其他情况请使用方法一For-Each迭代entries方法。避免使用迭代keys并搜索values(低效的)方法。

五、public,protected,private,不加修饰符。有什么区别呢?

如下表所示,Y表示能访问(可见性),N表示不能访问,例如第一行的第3个Y,表示类的变量/方法如果是用public修饰,它的子类能访问这个变量/方法

修饰符类内部同个包(package)子类其他范围
publicYYYY
protectedYYYN
无修饰符YYN or Y(见说明)N
privateYNNN

说明:
需要特别说明“无修饰符”这个情况,子类能否访问父类中无修饰符的变量/方法,取决于子类是否在同一个包中。如果子类和父类在同一个包中,那么子类可以访问父类中的无修饰符的变量/方法,否则不行。

Java编程问题top100—基础语法系列导航

Java编程问题top100—基础语法系列(一)
Java编程问题top100—基础语法系列(二) 待更新
Java编程问题top100—基础语法系列(三) 待更新

如有错误,还请多多指教!
转载或者引用本文内容请注明来源及原作者:橘足轻重;

相关文章:

Java编程问题top100---基础语法系列(一)

Java编程问题top100---基础语法系列一一、Java 操作符实质二、将InputStream转换为String使用IOUtils自己写轮子三、将数组转换为List四、如何遍历map对象使用For-Each迭代entries&#xff08;方法一&#xff09;使用For-Each迭代keys和values&#xff08;方法二&#xff09;使…...

【C#基础】C# 异常处理操作

序号系列文章6【C#基础】C# 常用语句讲解7【C#基础】C# 常用数据结构8【C#基础】C# 面向对象编程文章目录前言1&#xff0c;异常的概念2&#xff0c;处理异常3&#xff0c;自定义异常4&#xff0c;编译器异常结语前言 &#x1f337;大家好&#xff0c;我是writer桑&#xff0c;…...

系统分析师---操作系统思维导图

进程管理&#xff08;5星&#xff09; 进程与线程&#xff1a;共享&#xff1a;内存地址空间、代码、数据、文件等不能共享&#xff1a;独立的cpu运行上下文和栈指针、寄存器 信号量与PV操作&#xff1a;信号量&#xff0c;一种特殊的变量分为&#xff1a;信号量可以表示资源数…...

Linux | Ubuntu20.04系统使用命令从移动硬盘/U盘拷贝文件到服务器上

*确认自己移动硬盘、U盘的格式&#xff0c;本文为exfat格式STEP1&#xff1a;把移动硬盘插到Ubuntu系统的主机上查看disk默认位置#查看移动硬盘/U盘在哪个位置命令 fdisk -l #查询后出现了包含电脑系统的所有硬盘查看最后的位置&#xff0c;我的显示为Device, 位置为 /dev/sdb1…...

【经验总结】10年的嵌入式开发老手,到底是如何快速学习和使用RT-Thread的?

【经验总结】一位近10年的嵌入式开发老手&#xff0c;到底是如何快速学习和使用RT-Thread的&#xff1f; RT-Thread绝对可以称得上国内优秀且排名靠前的操作系统&#xff0c;在嵌入式IoT领域一直享有盛名。近些年&#xff0c;物联网产业的大热&#xff0c;更是直接将RT-Thread这…...

一起Talk Android吧(第五百零九回:约束布局中的组功能一)

文章目录功能介绍使用方法GroupLayer对比总结各位看官们大家好&#xff0c;上一回中咱们说的例子是"多层布局功能",这一回中咱们说的例子是"约束布局中的组功能"。闲话休提&#xff0c;言归正转&#xff0c; 让我们一起Talk Android吧&#xff01; 功能介…...

2023安徽省“中银杯”职业技能大赛“网络安全” 项目比赛任务书

2023安徽省“中银杯”职业技能大赛“网络安全” 项目比赛任务书2023安徽省“中银杯”职业技能大赛“网络安全” 项目比赛任务书A模块基础设施设置/安全加固&#xff08;200分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows, Linux&#xff09;A-2&#xff1a;Ngi…...

观测云产品更新|新增用户访问监测自动化追踪;新增 CDN 质量分析;新增自定义查看器导航菜单等

观测云更新 用户访问监测优化 新增用户访问监测自动化追踪 用户访问监测新增自动化追踪&#xff0c;通过“浏览器插件”的实现方式&#xff0c;使用浏览器记录用户访问行为&#xff0c;创建无代码的端到端测试。更多详情可参考文档【 自动化追踪 】https://docs.guance.com/…...

大数据技术生态全景一览

大数据技术生态全景一览大数据平台ETL数据接入大数据平台海量数据存储大数据平台通用计算大数据平台各场景的分析运算分布式协调服务任务流调度引擎大数据平台ETL数据接入 大数据有很多的产品&#xff0c;琳琅满目。从架构图上就能看出产品很多。这些产品它们各自的功能是什么…...

CI/CD | 深入研究Jenkins后,我挖掘出了找到了摆脱低效率低下的方法

在本系列的第一篇文章中&#xff0c;您已经了解了一些关于如何管理Jenkins的内容&#xff0c;主要是为无序的人带来秩序。在这篇文章中&#xff0c;我将更深入地探讨我效率低下的问题&#xff0c;提出我们工作流中一些安全性、治理和合规性的挑战。这不仅仅是你在网站上或展览横…...

刷LeetCode

文章目录滑动窗口算法1 涉及知识点 &#xff1a;unordered_set 容器2 参数详情3 例题滑动窗口算法 滑动的窗口&#xff0c;每次记录下窗口的状态&#xff0c;再找出符合条件的窗口使用滑动窗口减少时间复杂度 1 涉及知识点 &#xff1a;unordered_set 容器 说明&#xff1a;…...

Spring 大白话系列:工厂

Spring 大白话系列&#xff1a;工厂 “工厂模式&#xff0c;大家都很熟悉了。说到底&#xff0c;就是解除创建对象和使用对象之间的耦合。这东西没啥啊。” 教室里&#xff0c;老师傅听到小明在嘀嘀咕咕的。老师走过去问&#xff1a; “有什么问题呢小明同学&#xff1f;” 小…...

喜讯!华秋电子荣获第六届“蓝点奖”十佳分销商奖

2 月 25 日&#xff0c;由深圳市电子商会主办的2023 中国电子信息产业创新发展交流大会暨第六届蓝点奖颁奖盛典在深圳隆重举行。 图&#xff1a;华秋商城渠道总监杨阳&#xff08;右三&#xff09; 深圳市电子商会连续六年举办“蓝点奖”评选活动&#xff0c;旨在表彰对电子信…...

Linux概述

1&#xff1a;Linux概述1.1&#xff1a;操作系统常见操作系统有&#xff1a;Windows、MacOS、Linux。名称描述Windows微软公司研发的收费操作系统。分为两类&#xff1a;用户操作系统、Server操作系统。用户操作系统&#xff1a;win 95、win 98、win NT、win Me、win xp、vista…...

中级嵌入式系统设计师2015下半年上午试题及答案解析

中级嵌入式系统设计师2015下半年上午试题 单项选择题 1、CPU是在______结束时响应DMA请求的。 A.一条指令执行 B.一段程序 C.一个时钟周期 D.一个总线周期 2、虚拟存储体系由______两级存储器构成。 A.主存-辅存 B.寄存器-Cache C.寄存器-主存...

华为OD机试模拟题 用 C++ 实现 - 删除指定目录(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明删除指定目录题目输入输出示例一输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为…...

【正点原子FPGA连载】第二十章AXI4接口之DDR读写实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十章AXI4接口…...

超出认知的数据压缩 用1-bit数据来表示32-bit的梯度 语音识别分布式机器学习 梯度压缩 论文精读

说明 介绍1−bit1-bit1−bit论文内容。 原文链接&#xff1a;1-bit stochastic gradient descent and its application to data-parallel distributed training of speech DNNs | Semantic Scholar ABS 实验证明在分布式机器学习的过程中能够通过将同步所传递的梯度进行量化…...

深度剖析指针(上)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是指针噢&#xff0c;在学习C语言的过程中&#xff0c;指针算是一个比较重要的内容&#xff0c;当然&#xff0c;难度也是比较大的&#xff0c;那么现在就让小雅兰来带大家进入指针的世界吧 字符指针 数组指针…...

学习 Python 之 Pygame 开发魂斗罗(六)

学习 Python 之 Pygame 开发魂斗罗&#xff08;六&#xff09;继续编写魂斗罗1. 创建碰撞类2. 给地图添加碰撞体3. 让人物可以掉下去4. 实现人物向下跳跃5. 完整的代码继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗&#xff08;五&#xff09;中&#xff0c;我…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...