java语言基础比较学习
ztj100 2025-05-23 21:36 13 浏览 0 评论
用了这么久的java,却从未深入的学习过基础原理。以前总觉得会用就行,经过不断开发和学习发现,如果没有深入理解原理,也就很难真正精通一门技术。今年来到实验室后,开始深入的学习了自己掌握的一些技术和工具的原理,在此决定一一记录在博客里,算是对学习的一个总结吧。今天,首先总结java语言的基础,下面通过对比来阐述一些java基础原理。
一、变量与包装类的区别
变量是利用声明的方式将内存的某个内存块保留下来以供程序使用。包装类是直接将简单类型的变量封装成一个类,所以也可以叫封装类,目前共有八种,分别为Boolean、Character、Integer、Long、Float、Double、Byte、Short,分别对应boolean、char、int、long、float、double、byte、short。
变量和包装类虽然有着对应关系,但是两者之间还是有区别的。列如 int i = 6; Integer j = 6; 这里i与j显然是相等的,但是i是一个变量,而j却是一个对象,它拥有很多方法,例如j.toString、j.equals等,可以看出这里只是i和j对象的内容相等。变量和包装类最本质的区别就是,变量是在jvm的栈内存中分配的,只存在栈内存中,而包装类由于是一个类,所以它的引用变量j存在于栈内存中,而对象6存在堆内存中。
二、a=a+1与a+=1的区别
一般情况下a=a+1与a+=1都默认是等价的,即a+=1可以转换为a=a+1,但是其实这两者之间不是完全等价的,例如 short a=10;a+=1等价于a=(short)a+1,而a=a+1等价于a=(int)a+1,所以这里a+=1可以得到结果值11,而a=a+1会在IDE里直接报错,无法编译。
三、equals与==的区别
equals与==首先在直观上就可以看出两者之间的区别,equals是对象的一个方法,而==是一个运算符。其中==既可以用来比较类型相同的两个基本变量的值又可以比较类型相同两个的包装类的值,还可以比较类型相同的基本变量和对应的包装类的值以及两个字符串的值,例如:对于int a = 1; int b =1 ; Integer c =1; Integer d =1;String s1 = "s"; String s2 = "s" 这些变量下面的输出语句都可以顺利通过编译并输出结果值。
System.out.println(a==b);
System.out.println(a==c);
System.out.println(c==d);
System.out.println(s1==s2);
而equals用于比较相同类型的两个包装类的值、类型相同的包装类与基本类型的值和两个字符串的值,以下三个输出语句均可正常编译并输出结果值。
System.out.println(c.equals(a));
System.out.println(c.equals(d));
System.out.println(s1.equals(s2));
==和equals在比较两个类(String是一个类)的值时,实际比较的内容是不一样的,其中==比较的是引用变量,即栈内存中存放的对象的地址,而equals比较的是对象内容,即堆内存中对象的值,例如下面两个输出方法,方法1输出false、方法2输出true。
System.out.println(s1==s2);//输出方法1
System.out.println(s1.equals(s2));//输出方法2
四、包装类(也适用String类)直接赋值与new赋值的区别
对一个包装类的两种赋值方式,都赋一个相同的值,表面上看是相等的,但是实际上是有差别的,例如:
Integer i = 5;
Integer k = 5; Integer j = new Integer(5);
System.out.println(i==k);//输出方法1
System.out.println(i.equals(k));//输出方法2
System.out.println(i==j);//输出方法3
System.out.println(i.equals(j));//输出方法4
方法1到4分别输出true、true、false、true,由此可以看出两种赋方式是有差别的,原因是类的对象内容都是保存在堆内存中的,采用直接赋值的方法赋相同的值时,即将堆内存中的同一内容的地址赋给了两个引用变量如i和k,即i和k指向的是堆内存中的同一内容,而采用new赋值时,每new一次,就会在堆内存中开辟一个新的空间来存放内容,所以i和j的内容虽然是一样的,但是放在了不同的空间中,而==比较的是引用变量的值,即比较的是对象内容的地址,所以输出方法3是false。
五、&&与&、||与|的区别
“&&”与”&“都是与操作,“||”和“|“都是或操作,但是它们之间是有区别的。其中”&&“为短路与,如果使用它,第一个条件为false,则后面的条件将不会再判断;”&“为非短路与,如果使用它,不管第一个条件是真是假,后面的条件都会判断。“||”为短路或,如果使用它,如果第一个条件为true,则后面的条件就不需要再判断;“|”为非短路或,如果使用它,不管第一个条件是真是假,后面的条件都会判断。基于上述与或的特征,就可以明白为什么代码中看到的基本是“&&”和“||”逻辑操作符而非“&”和“|”逻辑操作符了。
六、continue、break、return的区别
continue(继续),顾名思义,它不是跳出循环,而是结束本次过程,接下来继续循环操作;break(中止),是直接结束当前的循环,从当前的循环的上一层继续执行;return(返回),表示中止当前函数的运行,即包含当前循环的方法彻底结束,不管外面还有没有其它的循环,也不管后面还有没有未执行的语句。
七、for each与for循环的区别
for循环是java中常用的一个循环语句,相较与while和do···while,它明确了循环次数,for each是jdk5新增的一个特性,它在操作数组和List集合是比for循环更加的方便和简洁。
八、“”与null的区别
“”和null都被称为空,但是两者之间有着明显的区别,“”是一个对象,是有内存空间的,而null不是对象,或者是一个未被实例化的对象,是没有内存空间的。而且在判断值时,null用==,而“”用equals。
九、单引号与双引号的区别
java中单引号中的值为char类型,而双引号中的值为String类型,例如‘a'代表字符a,"a"代表字符串a,下面两个输出语句的结果分别为98(因为字符a对应ASCII吗为97)和a1,另外’a,b‘在IDE中会报错无法编译,而”a,b"可以编译通过,这些都可以验证用单引号引起来的值是字符,而双引号内的是字符串。
System.out.println('a'+1);//输出方法1
System.out.println("a"+1);//输出方法2
相关推荐
- 拒绝躺平,如何使用AOP的环绕通知实现分布式锁
-
如何在分布式环境下,像用synchronized关键字那样使用分布式锁。比如开发一个注解,叫@DistributionLock,作用于一个方法函数上,每次调方法前加锁,调完之后自动释放锁。可以利用Sp...
- 「解锁新姿势」 兄dei,你代码需要优化了
-
前言在我们平常开发过程中,由于项目时间紧张,代码可以用就好,往往会忽视代码的质量问题。甚至有些复制粘贴过来,不加以整理规范。往往导致项目后期难以维护,更别说后续接手项目的人。所以啊,我们要编写出优雅的...
- 消息队列核心面试点讲解(消息队列面试题)
-
Rocketmq消息不丢失一、前言RocketMQ可以理解成一个特殊的存储系统,这个存储系统特殊之处数据是一般只会被使用一次,这种情况下,如何保证这个被消费一次的消息不丢失是非常重要的。本文将分析Ro...
- 秒杀系统—4.第二版升级优化的技术文档二
-
大纲7.秒杀系统的秒杀活动服务实现...
- SpringBoot JPA动态查询与Specification详解:从基础到高级实战
-
一、JPA动态查询概述1.1什么是动态查询动态查询是指根据运行时条件构建的查询,与静态查询(如@Query注解或命名查询)相对。在业务系统中,80%的查询需求都是动态的,例如电商系统中的商品筛选、订...
- Java常用工具类技术文档(java常用工具类技术文档有哪些)
-
一、概述Java工具类(UtilityClasses)是封装了通用功能的静态方法集合,能够简化代码、提高开发效率。本文整理Java原生及常用第三方库(如ApacheCommons、GoogleG...
- Guava 之Joiner 拼接字符串和Map(字符串拼接join的用法)
-
Guave是一个强大的的工具集合,今天给大家介绍一下,常用的拼接字符串的方法,当然JDK也有方便的拼接字符串的方式,本文主要介绍guava的,可以对比使用基本的拼接的话可以如下操作...
- SpringBoot怎么整合Redis,监听Key过期事件?
-
一、修改Redis配置文件1、在Redis的安装目录2、找到redis.windows.conf文件,搜索“notify-keyspace-events”...
- 如何使用Python将多个excel文件数据快速汇总?
-
在数据分析和处理的过程中,Excel文件是我们经常会遇到的数据格式之一。本文将通过一个具体的示例,展示如何使用Python和Pandas库来读取、合并和处理多个Excel文件的数据,并最终生成一个包含...
- 利用Pandas高效处理百万级数据集,速度提升10倍的秘密武器
-
处理大规模数据集,尤其是百万级别的数据量,对效率的要求非常高。使用Pandas时,可以通过一些策略和技巧显著提高数据处理的速度。以下是一些关键的方法,帮助你使用Pandas高效地处理大型数据集,从而实...
- Python进阶-Day 25: 数据分析基础
-
目标:掌握Pandas和NumPy的基本操作,学习如何分析CSV数据集并生成报告。课程内容...
- Pandas 入门教程 - 第五课: 高级数据操作
-
在前几节课中,我们学习了如何使用Pandas进行数据操作和可视化。在这一课中,我们将进一步探索一些高级的数据操作技巧,包括数据透视、分组聚合、时间序列处理以及高级索引和切片。高级索引和切片...
- 原来这才是Pandas!(原来这才是薯片真正的吃法)
-
听到一些人说,Pandas语法太乱、太杂了,根本记不住。...
- python(pandas + numpy)数据分析的基础
-
数据NaN值排查,统计,排序...
- 利用Python进行数据分组/数据透视表
-
1.数据分组源数据表如下所示:1.1分组键是列名分组键是列名时直接将某一列或多列的列名传给groupby()方法,groupby()方法就会按照这一列或多列进行分组。按照一列进行分组...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)