关于Java的三个小题目(很容易错!)

第一题 char运算后的数据类型

在这里插入图片描述
最后输出的是什么类型?

答案:int

char与byte的联系和区别

  1. char是无符号型的,能够表示一个整数,不能表示负数(0~65535);而byte是有符号型的,能够表示-128—127 的数;
  2. char、byte、int对于英文字符,能够相互转化
public static void main(String[] args) {
        char a = 'a';
        int aa = 97;
        System.out.println(a == aa);

        byte bb = 'b';
        int cc = 'c';
        char b = (char)98;
        char c = (char)99;
        System.out.println("bb:"+bb);
        System.out.println("cc:"+cc);
        System.out.println("b:"+b);
        System.out.println("c:"+c);
    }

在这里插入图片描述

  1. char可以表示中文字符,byte不可以。(一个字占2个字节)
    在这里插入图片描述

题目解释

char类型的数据参与运算的时候,已经变成了byte,所以最后打印的一定是一个数字,但是为什么会变成int呢?

要理解这一点,我们需要两个前置小知识

前置小知识1

高级语言不管有多少数据类型,最终运行都要转换为C的6种数据类型
在这里插入图片描述
Java代码最终会变成C代码运行,而C中是没有Java的boolean类型和byte类型的

所以这两种类型,实际在CPU中运行的时候会变成其他类型

那具体会变成什么类型呢?int,原因请看前置知识2

前置知识2

CPU当中高速缓存的基本存储单位是缓存行,一个缓存行64Byte

缓存行通过导线和CPU相连,与CPU交互时要使用高低电压传输0101的bit信号
在这里插入图片描述

因为使用电压传输,电压是一种电势能,就不能同时传输(电势能叠加会抵消),只能排队

所以当一个缓存行中的数据数量越多,读写的时候排队的概率越大排队等待的时间越长

反之,数据数量越少,则拥塞程度越小读写的时候排队的概率越小排队等待的时间越短

所以,小存储的数据类型少用,大存储的数据类型多用,就可以降低排队时间,提高读写速度

Java底层就采用了转化机制,去提高读写速度

Java底层的boolean和byte都使用int类型表示,而不用short或者byte,就是为了提高缓存行的读写速度,所以是4字节

这里用到了一种思想:用空间换时间,操作系统很多时候都用了这种思想

结论

byte参与运算的时候,类型就会变成int

在这里插入图片描述

第二题 位运算

    public static void main(String[] args) {
        int a = -4;
        int b = 5;
        System.out.println(a & b);
        System.out.println(a | b);
        System.out.println(a ^ b);
        System.out.println(a << 2);
        System.out.println(a >> 2);
        System.out.println(a >>> 2);
    }

各自输出多少?

答案:
4
-3
-7
-16
-1
1073741823

讲解

计算机底层,数据的存储+运算都是用补码完成的

正数的原码,反码,补码相同

负数的补码 = 反码(符号位不变,其余位按位取反)+1;

在这里插入图片描述

在这里插入图片描述

&运算

只要不是全1(全是true),那么就是0(false)

在这里插入图片描述

|运算

只要有一个是1,就是1;全是0才是0
在这里插入图片描述
算出来是一个负数,我们刚才说了,计算机底层,数据的存储+运算都是用补码完成的

既然是负数,我们需要求它的原码

负数的原码 = (补码-1)+除符号位按位取反

在这里插入图片描述

^运算

异或运算,只要不一样就是1,一样才是0
在这里插入图片描述

算出来依然是一个负数,我们操作同上

在这里插入图片描述

<<运算

逻辑左移,不需要画图运算,因为是低位补零,所以一定是乘以2^n

左移两位,就是乘4,所以结果是-16

>>运算

逻辑右移运算,高位补符号位,也不需要我们画图,一定是除以2^n

右移两位,就是除以4,结果是-1

>>>运算

无符号右移,高位补0,低位舍弃,符号位参与运算,需要画图

>>>运算符将int和long视为32位和64位无符号整数类型,这是Java语言所缺少的。

在这里插入图片描述

将它右移2位,高位补零,就会变成正数
在这里插入图片描述

所以最后的结果是2^30-1 = 1073741823

第三题:字符串常量池

    public static void main(String[] args) {
        String str1 = "hello"; // 字符串常量池
        String str2 = "he" + new String("llo");// 修改llo的内存空间为hello
        System.out.println(str1 == str2);
    }

输出结果是?

答案:false

讲解

str1,由于不是new出来的,所以存储在字符串常量池当中;
str2中的llo是new出来的,所以存在在堆当中

Java中的字符串相加,两个字符串只要有一个存储在堆中,拼接之后的最终结果也存储在堆中

在这里插入图片描述
通过关键字new定义:
1. 编译程序先在字符串常量池查找,是否存在"hello"常量。如果不存在,则在字符串常量池开辟一个内存空间,存放"hello";如果存在,则不另外开辟空间,保证字符串常量区只有一个"hello",节省空间。
2. 然后在堆区,开辟一个空间,存放new出来的String对象,并在栈区开辟空间,存放变量名称str1,str1指向堆区new出来的String对象。

直接定义:
1.在字符串常量区查找是否存在"hello"常量,如果不存在,则在字符串常量区开辟一个内存空间,存放"hello";
2.如果存在,则不另外开辟空间;在栈区开辟空间,存放变量名称str2,str2指向字符串常量池"hello"的内存地址。

参考文章:

java的字符串存储在堆中还是常量池中
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/568805.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

elasticsearch-8.1.0安装记录

目录 零、版本说明一、安装二、使用客户端访问 零、版本说明 centos [rootnode1 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)elasticsearch elasticsearch-8.1.0-linux-x86_64一、安装 systemctl stop firewalld.servicesystemctl disable firewal…

笔记本电脑耗电和发热比较厉害怎么处理

工作中会遇到有同事反馈笔记本电脑耗电和发热比较厉害&#xff0c;主要检查以下几个地方 1、CPU频率 很多人觉得是cpu使用率高就代表电脑跑得快&#xff0c;发热量就大&#xff0c;其实不是的&#xff0c;主要是看的cpu频率&#xff0c;频率越高&#xff0c;电脑发热量越大。如…

Laravel 6 - 第十一章 中间件

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

如何在 Flutter 中制作多种颜色的 TextField

TextField widget 本身并不施加任何样式。相反&#xff0c;它会要求 TextEditingController 生成一个样式化的 TextSpan 对象&#xff0c;即一段带有样式的文本。 TextField 将其样式传递给 TextEditingController &#xff0c;默认实现只是将其放入 TextSpan 对象中&#xff0…

C#通过Qt使用VTK

需求&#xff1a; 一个项目&#xff0c;界面是C# 开发的&#xff0c;但是业务上有三维可视化的需求&#xff0c;VTK基于C#的绑定版本需要收费&#xff0c;并且资料很少。因此将VTK嵌入到Qt里&#xff0c;并封装成一个dll&#xff0c;通过接口提供给C#访问。 实现&#xff1a;…

HTTP慢连接攻击的原理和防范措施

随着互联网的快速发展&#xff0c;网络安全问题日益凸显&#xff0c;网络攻击事件频繁发生。其中&#xff0c;HTTP慢速攻击作为一种隐蔽且高效的攻击方式&#xff0c;近年来逐渐出现的越来越多。 为了防范这些网络攻击&#xff0c;我们需要先了解这些攻击情况&#xff0c;这样…

贪吃蛇(C语言版)

在我们学习完C语言 和单链表知识点后 我们开始写个贪吃蛇的代码 目标&#xff1a;使用C语言在Windows环境的控制台模拟实现经典小游戏贪吃蛇 贪吃蛇代码实现的基本功能&#xff1a; 地图的绘制 蛇、食物的创建 蛇的状态&#xff08;正常 撞墙 撞到自己 正常退出&#xf…

vscode将本地服务转发到外网地址访问

示例中将本地的5500端口&#xff0c;用vscode进行端口转发&#xff0c;在外网地址访问服务 要转发的端口 转发端口 点击转发端口 输入要转发的端口&#xff0c;按下回车 Enter 点击允许&#xff0c;弹出确认界面后点击打开 转发端口已经成功配置上&#xff0c;右键可见性…

Git和Github绑定

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

爬虫中怎么判断一个网页是否包含ajax请求

1、前言 在用爬虫抓取数据的时候&#xff0c;如果一个网页包含ajax请求&#xff0c;由于数据时动态加载的&#xff0c;直接根据网址是不能获取到想要的数据。因此&#xff0c;在爬虫需要首先判断一个网页是否包含ajax请求数据。 2、ajax请求 2.1 什么是ajax请求 AJAX Asynch…

20240424codeforces刷题题解

240424刷题题解 Walk on Matrix CodeForces - 1332D 思路 构造题&#xff0c;每个 d p i , j dp_{i,j} dpi,j​​​都是由其左上方向中的按位与最大值决定的。 我们需要从使得贪心解与正确解的差值为 k k k。 为了方便获得 k k k&#xff0c;可以考虑构造一个贪心解为 0…

社交媒体数据恢复:Facebook

在使用Facebook的过程中&#xff0c;可能会出现数据丢失的情况&#xff0c;如误删了重要的帖子、照片或其他文件。在这种情况下&#xff0c;你可以尝试以下方法来恢复Facebook的数据。 首先&#xff0c;确保你备份了Facebook的数据。如果你定期备份数据&#xff0c;那么恢复起…

第26天:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全

第二十六天 一、PHP新闻显示-数据库操作读取显示 1.新闻列表 数据库创建新闻存储代码连接数据库读取页面进行自定义显示 二、PHP模版引用-自写模版&Smarty渲染 1.自写模版引用 页面显示样式编排显示数据插入页面引用模版调用触发 2.Smarty模版引用 1.下载&#xff1a…

【C语言回顾】操作符详解

前言1. 操作符分类2. 二进制和进制转换2.1 二进制2.2 进制转换2.2.1 二进制转十进制2.2.2 二进制转八进制2.2.3 二进制转十六进制 3. 原码、反码、补码4. 移位操作符4.1 左移操作符4.2 右移操作符 5. 位操作符6. 单目操作符7. 逗号表达式8. 下标引用操作符9. 函数调用操作符10.…

Linux:进程与计划任务

文章目录 Linux&#xff1a;进程与计划任务一、进程1、进程是什么2、进程状态 二、列出进程命令1、查看静态的进程统计信息——“ps”Play1&#xff1a;“ps aux”Play2:ps -elf 2、查看静态的进程统计信息——“top”段首解析进程信息区解释 三、运行与终止进程3.1、运行进程3…

一致性hash

一、什么是一致性hash 普通的hash算法 (hashcode % size )&#xff0c;如果size发生变化&#xff0c;几乎所有的历史数据都需要重hash、移动&#xff0c;代价非常大&#xff0c;常见的java中的hashmap就是如此。 那如果在hash表扩容或者收缩的时候size能够保持不变&#xff0…

React-editor-js not showing up in a function component

React-editor-js not showing up in a function component react-editor-js 在react 函数组件中显示不出来 真的&#xff0c;我马上就想放弃它了。但是看它周下载量还挺多&#xff0c;我不信别人没遇到过。于是我继续在网络上挖呀挖。只是我一开始的方向错了。我一直以为我的写…

学习Rust第14天:HashMaps

今天我们来看看Rust中的hashmaps&#xff0c;在 std::collections crate中可用&#xff0c;是存储键值对的有效数据结构。本文介绍了创建、插入、访问、更新和迭代散列表等基本操作。通过一个计算单词出现次数的实际例子&#xff0c;我们展示了它们在现实世界中的实用性。Hashm…

安居水站:四大学习法:成为学霸的有效途径

摘要&#xff1a; 本文详细探讨了全球公认的四种高效学习方法——费曼学习法、西蒙学习法、思维导图法和SQ3R阅读法&#xff0c;通过引入相关数据、名人名言以及名人故事&#xff0c;深入分析了这些方法的核心理念、实施步骤及其在学习过程中的关键作用。 一、引言 学习是人…

《QT实用小工具·三十八》QT炫酷的菜单控件

1、概述 源码放在文章末尾 非常飘逸的 Qt 菜单控件&#xff0c;带有各种动画效果&#xff0c;用起来也十分方便。 无限层级&#xff0c;响应键盘、鼠标单独操作&#xff0c;支持单快捷键。 允许添加自定义 widget、layout&#xff0c;当做特殊的 QDialog 使用。 项目demo演示…