数据类型和类型检测

Data Type And Type Checking

1.编程语言中的数据类型

类型和变量

  • 一个类型是一系列值的集合,这些集合可以抽象出一个相同的特点,并且可以相互实现计算

    • 例如:
      • 布尔类型:true or false
      • 整形:1,2,3…
      • 浮点数类型:1.2,2.4,5.55…
      • 字符串类型:“hello”,“world”
  • 变量:一个被命名的地址,存储了某种类型的值

JAVA中变量指向的地址不一定存储的就是我们想要的值,也有可能是值的“遥控器”

Java中的数据类型

Java是一个纯粹的面向对象的编程语言,因此在Java中几乎所有变量都是一个对象,但是为了高效性,可移植性和轻便性,Java也有一些基本数据类型

  • 基本数据类型:int,double,boolean,char…
    • 基本数据类型存储在栈上
    • 每个基本数据类型都有对应的包装类
    • 包装类和基本数据类型直接可以自动装包和拆包
  • 对象数据类型:String,BigInteger,BigDecimal…
    • 对象数据类型存储在堆上
    • 定义的对象变量应该是一个引用,也就是上文说到的"遥控板"
    • 引用是存储在栈上的
    • 对象数据类型在Java中是单继承的,并且有一个最终父类:Object
    • 继承关系的层次结构如图1
      图1

虽然在栈上开辟空间存储数据以及销毁数据要快于在堆上,不过在现代结构的优化下,在堆上和栈上存储的代价几乎相同

2.动态 Vs. 静态数据类型检测

类型转换

int a = 2;
double a = 2;
int a = (int)18.7
double a = (double)2/3;

int a = 18.7;
String a = 1;

结果:以上代码中1-4显示编译通过,6-7编译错误

向大的类型中存储小的值,会发生自动类型转换,不会发生问题;但是向小的类型中存储大的值,就会发生精度丢失,因此会报错,需要显示的指定,是否要丢失这部分精度

静态检测和动态检测

  • 静态检测:在代码运行之前发现bug
  • 动态检测:在代码运行时发现bug
  • 无检测:语言不帮助你检测,自己找bug

三种检测方式的效率:静态>>动态>>无检查

静态检测

在编译阶段发现错误,避免将错误带入到运行阶段,可提高程序正确性与健壮性

运行阶段发现bug会带来更多的时间代价

检测内容:

  • 语法错误,例如:多了一个逗号或奇怪的单词
  • 类名/方法名错误,例如:Math.abd(-1)
  • 参数数目错误,例如:Math.abs(20, -10)
  • 参数类型错误,例如:Math.abs("hello")
  • 返回类型错误,实际的返回类型和方法要求的不能隐式转换
动态检测

在运行阶段发现错误

检测内容:

  • 非法的参数值,实参类型不能隐式转换为形参类型
  • 非法的返回值,返回类型和变量类型不能隐式转换
  • 越界:遍历数组、集合的时候索引超出了它们的容量
  • 空指针:对象的引用指向null

动态与静态的区别:静态检查只考虑编译阶段能确定的“值”;动态检查关心运行阶段能确定的“值”

3.可变性与不可变性

什么是赋值?

赋值是指,在内存空间中开辟一个空间,写入特定值,并且把变量和这块空间相关联

基本数据类型 Vs. 对象数据类型

  • 基本数据类型:在栈上开辟空间,只与栈相关联
  • 对象数据类型:在栈上开辟空间存储引用,在堆上开辟空间存储对象

引用就像一个遥控板,而对象则是电视机,可以在任何地方使用遥控板控制电视机,而不需要背着电视到处移动

变与不变

int a = 10;
a = 20;

String s = "hello";
s = "world";

改变的方式有两种:改变变量和改变值

  • 改变变量:改变变量的指向,让它指向另一块空间
  • 改变值:改变变量指向的内存空间中的值,而不改变其指向

在编程中应该更多的使用immutable的数据,这样能大大提高程序的安全性

什么时候是哪种改变?
  • 改变值:基本数据类型都是改变值,可变对象数据类型访问其堆上的空间改变其中的值
  • 改变变量:对象数据类型改变其引用的值

还可以使用final关键字修饰变量,被修饰的变量其本身不可变。

对于基本数据类型,其本身就是值,因此值不可变

对于对象数据类型,其本身实际上是"遥控板"即引用,因此引用本身不可变

不变对象 Vs. 可变对象
  • 不变对象:引用指向的值不可变
  • 可变对象:拥有方法可以修改堆上数据

String类型就是一个不可变类型,不能对字符串本身进行增删的操作

StringBuilder则是一个可变类型,可以对其指向的数据进行增加删除的操作

可变类型的优势
  1. 可变类型可以最少化拷贝以提高效率
  2. 可以获得更好的性能
  3. 适用于多个模块之间共享数据
不可变类型的优势
  • 不可变类型更"安全"

4. 防御式拷贝

  • 试想以下场景:向一个方法中传入一个可变对象,这是一件相当危险的事。不同于基本数据类型和不可变数据类型,传入一个可变对象,相当于把堆上数据的权柄全部交给了这个方法,客户端的数据可以随意被远端程序员更改,虽然社会是充满真善美的,但是我们还是喜欢由自己掌握自己的命运。

  • 再试想以下场景:我重生成为了一个后端程序员,每天勤勤恳恳写代码,有一天我一如既往的打开电脑准备开启码代码的一天,发现我的数据被改了,在小小的电脑里挖呀挖呀挖,焦头烂额找不出错误,最后把代码发给了gpt,少不了一番自嘲。原来是你的一个方法里,向客户端返回了一个可变对象,客户端拿着这个对象到处霍霍,把值给霍霍乱了。

以上两个场景都是可变对象可能带来的安全隐患,贸然将数据权柄交给它人是一件相当莽撞的事情。为了解决这个问题,最好的方式就是使用不可变对象。还有一种方式就是采用所谓的防御式拷贝,简单来说就是创建一个新的可变类型对象,并且把原始对象的数据拷贝到新的堆内存上,然后将新的对象返回或传入。

  • 大部分时候这个拷贝不会被客户端修改,可能造成大量的内存浪费
  • 直接使用不可变对象,节省了频繁拷贝的代价
  • 使用可变类型最好的方法:一个堆内存只有与一个引用相关联。

5.复杂数据类型:数组和集合

数组

  • 数组是一个连续的组,其中存储相同数据类型的变量

  • Java中数组和c++中的不一样,Java中数组的数据也存储在堆上

  • 数组名也是一个引用

  • 数组中的元素通过索引访问

集合

List

List和数组很像,不同的是List的容量可以变化

List还可以对对其中的数据进行增删查改

Set

无索引,无法通过索引访问元素

Set集合中不存在相同值的元素

Map

Map中存放的是一对又一对的键值对,通过key寻找value

Map中的元素也不能通过索引访问

Map中只能每个键值只能存在一个

迭代器

迭代器是一个可以逐步遍历结合的对象

通过迭代器不能改变集合中对象的值

如果集合发生了增加或删除元素,那么之前的迭代器会失效

6.总结

  • 类型检查
    • 类型检查可以帮助提升程序的健壮性,可以帮助找出程序的错误
    • 类型检查是简单易懂的
    • 类型检查帮助你更好的维护代码
  • 可变性与不可变性
    • 可变数据具有高效性
    • 不可变数据具有安全性
    • 如何在效率和安全中选择一个合适的尺度,需要通过具体的要求进行分析
    • 关键的设计准则在于,使用尽量多的不可变对象和不可变引用

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

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

相关文章

OM6650AM支持蓝牙5.1协议栈与2.4GHz私有协议的双模无线连接SoC芯片

OM6650AM是一款超低功耗、同时支持蓝牙5.1协议栈与2.4GHz私有协议的双模无线连接SoC芯片,采用4.0 mm x 4.0 mm QFN32封装,具有丰富的资源,极低的功耗,优异的射频性能,可广泛应用于车载数字钥匙模组、胎压检测、PKE钥匙…

【教程】Flutter 应用混淆

在移动应用开发中,保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具,帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆,并提供了相关的操作步骤和注意事项。 📝 摘要 本…

YOLOv9改进策略 :主干优化 | 无需TokenMixer也能达成SOTA性能的极简ViT架构 | CVPR2023 RIFormer

💡💡💡本文改进内容: token mixer被验证能够大幅度提升性能,但典型的token mixer为自注意力机制,推理耗时长,计算代价大,而RIFormers是无需TokenMixer也能达成SOTA性能的极简ViT架构 ,在保证性能的同时足够轻量化。 💡💡💡RIFormerBlock引入到YOLOv9,多个数…

C语言第三十八弹---编译和链接

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 编译和链接 1、翻译环境和运行环境 2、翻译环境 2.1、预处理(预编译) 2.2、编译 2.2.1、词法分析 2.2.2、语法分析 2.2.3、语义分…

【Linux】自定义协议+序列化+反序列化

自定义协议序列化反序列化 1.再谈 "协议"2.Cal TCP服务端2.Cal TCP客户端4.Json 喜欢的点赞,收藏,关注一下把! 1.再谈 “协议” 协议是一种 “约定”。在前面我们说过父亲和儿子约定打电话的例子,不过这是感性的认识&a…

YoloV8改进策略:BackBone改进|GCNet(独家原创)|附结构图

摘要 本文使用GCNet注意力改进YoloV8,在YoloV8的主干中加入GCNet实现涨点。改进方法简单易用,欢迎大家使用! 论文:《GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond》 非局部网络(NLNet)通过为每个查…

大模型日报20240401

大模型实时打《街霸》捉对PK,GPT-4居然不敌3.5,新型Benchmark火了 链接:https://news.miracleplus.com/share_link/22340 让大模型直接操纵格斗游戏《街霸》里的角色,捉对PK,谁更能打?GitHub上一种你没有见…

隧道烘箱在线粒子监测系统解决方案

关于隧道烘箱定义 隧道烘箱是一种采用长箱体热风循环以及远红外干燥方式进行干燥的设备。它主要是为了满足产量高、效率要求高的烘干干燥需求而设计的。在计算机系统的监控下,物品随输送带的输送依次进入隧道烘箱的预热区、高温灭菌区(温度≥5min&#x…

C++ | Leetcode C++题解之第1题两数之和

题目&#xff1a; C 题解&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hashtable;for (int i 0; i < nums.size(); i) {auto it hashtable.find(target - nums[i]);if (it …

4.机器学习-十大算法之一线性回归算法(LinearRegression)案例讲解

机器学习-十大算法之一线性回归算法案例讲解 一摘要二个人简介三什么是线性回归四LinearRegression使用方法五糖尿病数据线性回归预测1.数据说明2.导包3.导入数据4.脱敏处理5.抽取训练数据和预测数据6.创建模型7.预测8.线性回归评估指标9.研究每个特征和标记结果之间的关系.来分…

Java接口与继承实践:Ether通信系统的构建(day16)

创建一个接口Icontroller, 再创建一个接口IReceiver, 创建一个子类实现IReceiver&#xff0c; 创建一个子类实现IContrller&#xff0c; 创建一个类Ether 创建一个Signal类 创建一个类Radiosignal继承Signal 创建一个用户User 最后创建一个Main类 今日总结&#xff1a…

FreeRTOS 多任务系统

在最早接触嵌入式的时候&#xff0c;我们编写的代码都是在一个while循环里处理所有的事务。 int main() {while(1){do_something();do_something1();do_something2();} } 这三个事务轮流执行。逻辑简单。但会带来一个问题&#xff1a; 事务1在执行的时候&#xff0c;事务2得…

LabVIEW齿轮箱噪声监测系统

LabVIEW齿轮箱噪声监测系统 齿轮箱作为机械设备的“心脏”&#xff0c;其健康状态对设备的性能有着重要的影响。传统的齿轮箱监测方法依赖于直接的振动信号分析&#xff0c;但这种方法不仅成本高昂&#xff0c;而且在安装和拆卸过程中可能对设备造成损害。针对这些问题&#x…

激光雷达的量产车方案

文章目录 现在的量产方案共同点与差异技术方案应用场景未来发展趋势 现在的量产方案 在量产车领域&#xff0c;半固态激光雷达技术的发展和应用是实现高级自动驾驶功能的关键技术之一。半固态激光雷达&#xff0c;与传统的固态激光雷达相比&#xff0c;其最大特点是在内部采用…

基于java+springboot+vue实现的垃圾分类回收系统(文末源码+Lw)23-213

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统垃圾分类回收系统信息管理难度大&#xff0c;容错率低&a…

HarmonyOS 应用开发之featureAbility接口切换particleAbility接口切换

featureAbility接口切换 FA模型接口Stage模型接口对应d.ts文件Stage模型对应接口getWant(callback: AsyncCallback<Want>): void; getWant(): Promise<Want>;ohos.app.ability.UIAbility.d.tslaunchWant: Want;startAbility(parameter: StartAbilityParameter, c…

【性能类】—JS运行机制

console.log(1) setTimeout(function(){console.log(2) },0) console.log(3)问&#xff1a;这道题打印顺序&#xff1f; 1 → 3 → 2 一、JS是单线程 JS是单线程的&#xff0c;同一时间只能做一件事&#xff0c;运行栈只执行一个任务 二、任务队列 任务队列&#xff1a;同步…

EasyDarwin 、ffmpeg 音视频推流拉流;OBS视频推理软件、obs-rtspserver服务器;python读取rtsp流

参考&#xff1a;https://blog.csdn.net/N71FS1/article/details/130019563 一、EasyDarwin ffmpeg ffmpeg 推送音视频流到rtsp流服务器 EasyDarwin 作为rtsp流服务器 &#xff08;下载&#xff1a;https://www.easydarwin.org/p/easydarwin.html&#xff09;OBS 直播音视频录…

为什么都说”一入Java深似海“?

引言 在当今数字化时代&#xff0c;编程已经成为一项至关重要的技能。而在众多编程语言中&#xff0c;Java以其广泛的应用领域和强大的功能特性&#xff0c;吸引了无数开发者的目光。无论是Web开发、移动应用还是大数据处理&#xff0c;Java都发挥着举足轻重的作用。然而&…

AI预测福彩3D第24弹【2024年4月2日预测--第6套算法开始计算第1次测试】

今天&#xff0c;咱们进行第6套算法测试&#xff0c;本套算法将结合012路直选共27种组合&#xff0c;同时考虑了对012路的和值进行统计分析。今天为第1次测试&#xff0c;好了&#xff0c;废话不多说了。直接上结果~ 仍旧是分为两个方案&#xff0c;1大1小。 经过人工神经网络计…