首页
学习
活动
专区
圈层
工具
发布

String类和常量池内存分析例子以及8种基本类型

如果不是用双引号声明的 String 对象,可以使用 String 提供的 intern 方法。...根据《java虚拟机规范 Java SE 8版》记录,如果某String实例所包含的Unicode码点序列与CONSTANT——String_info结构所给出的序列相同,而之前又曾在该实例上面调用过String.intern...(结论是常量池有equals相同的串或者引用指向equals相同的串就不再缓存) 第六句,str3.intern(); 去检查一下常量池到底有没有”str01″呢?...检查发现常量池有个引用指向堆中的”str01″,JVM认为常量池是有”str01″的,那么直接返回指向堆中的”str01″地址,很可惜,没有变量去接收,这一句在这里没有什么用。...、Double,其他基本类型的包装类都有对应的对象常量池缓存(就是cache数组缓存-128~127),Float、Double不管自动还是手动装箱,一定不相等,里面都是调用构造new出来的,比较2块堆内存

40720

第9条 覆盖equals时总要覆盖hashCode

(即equals相等,那么hashCode一定相等,需要注意的是,反过来不一定成立,即hashCode相等不代表equals相等) 如果两个对象根据equals方法比较是不相等的,那么调用这两个对象中任意一个对象的...正如之前提到的,hashCode其实主要用于跟基于散列的集合合作 如HashMap会把相同的hashCode的对象放在同一个散列桶(hash bucket)中,那么即使equals相同而hashCode...不相等,那么跟HashMap一起使用,则会得到与预期不相同的结果....相同,即equals会为true System.out.println(className); } className的值为多少呢?...那么问题来了,如何去重写hashCode呢?返回一个固定值?比如1?NO!!! So,how? EJ给出的解决办法: 把某个非零的常数值,比如17,保存在一个名为result的int类型的变量中。

1.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    《Java从入门到失业》第五章:继承与多态(5.8-5.10):多态与Object类

    这里需要注意一个问题,就是构造方法是不能被重写的,因为构造方法不能被继承。另外子类的方法不能低于超类方法的可见性。       ...这种在运行时能够自动选择调用哪个方法的现象称为动态绑定(dynamic binding)。 5.8.3多态有什么用        我们了解了方法重写和动态绑定,那么多态有什么用处呢?...例如对于String类来说,如果仅仅判断对象引用是否相等,那么“Java大失叔”和“Java大失叔”很有可能将不相等。更有意义的判断可能是两个对象的状态完全一致(即所有属性值都一致)。...检测otherObj是否为null,如果是直接返回false。 比较this和otherObj是否属于同一个类;这里要仔细思考一下是使用getClass方法还是instanceof。...如果对象x和y是不同的对象,那么x.hashCode()和y.hashCode()基本是不相同的。

    63840

    C++条件判断与循环(一)(算法竞赛)

    if…else… 语句语法: if(表达式) 语句1; else 语句2; 将上面的题目改一下,如果不是奇数,那么便是偶数。...很多初学者,上来以判断 a 是 0,不等于1,那就执行 else 子句,打印 haha 。 但是当你去运行代码,输出的结果是:啥都不输出 为什么呢?...函数原型如下: double fabs (double x); float fabs (float x); long double fabs (long double x); 相关的函数还有abs,是求整数的绝对值的...有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。 if (x = 3) ... 这里是赋值语句,不是比较,始终会走到if条件里。...exp2 : exp3 条件操作符的计算逻辑是:如果 exp1 为真,exp2 计算,exp2 计算的结果是整个表达式的结果;如果 exp1 为假,exp3 计算,exp3 计算的结果是整个表达式的结果

    27010

    Java基础中的面试题(一),你能接几招(附答案(不带答案的面试题都是耍流氓))

    byte(1字节) , short(2字节) ,int(4字节), long(8字节),float(4字节) , double(8字节), boolean(1字节), char(2字节) 给出下列程序的输出结果...小数的默认类型是double, 所以像18.5 和 12.3其实都是double类型的, 把double类型赋值给float 是有问题的,因为有可能装不下。 所以第一种写法错误,第二种写法正确。...如果没有重写equals方法,那么调用的时候相当于都是在调用父类Object中的equals方法, Object类中的equals就是使用 == 实现的。==在连接基本数据类型的时候,比较的是值。...equals: 判断对象是不是同一个对象。默认的equals是== 也就是比较地址值。我们可以重写equals方法。 两个方法都可以用来比较对象是否相同。...所以一般我们比较的时候,一般先比较hashCode是否相等,如果hashCode不相等,说明肯定不是同一个对象,如果hashCode相等,也不能代表是同一个对象,因为上面说了存在一些极端情况,所以在使用

    33510

    详解:Java的重载方法与示例

    方法重载是一项功能,如果一个类的参数列表不同,则它允许一个类拥有多个具有相同名称的方法。它类似于Java中的构造函数重载,它允许一个类具有多个具有不同参数列表的构造函数。...例如: add(int, float) add(float, int) 方法重载的无效情况: 当我说参数列表时,我不是在说方法的返回类型,例如,如果两个方法具有相同的名称,相同的参数并且具有不同的返回类型...,那么这不是有效的方法重载示例。...第一种方法的参数列表为(char,int),第二种方法的参数为(int,char)。由于顺序不同,因此该方法可以重载而不会出现任何问题。...有效的重载情况。这里的参数数量是不同的。

    89510

    程序员C语言快速上手——基础篇(二)

    以上表中,long类型有两种情况,使用32位编译器编译,则long为4字节,占32位,如果使用64位编译器,则long为8字节,占64位二进制。当然这个也不是绝对的,仍然与系统环境有关。...基本数据类型的打印 在第一个示例中,我们已经使用printf函数打印了hello world,这里print是打印的意思,那么f是什么意思呢?其实这里的f是缩写,是format的意思,代表格式化打印。...前面已经说过,在不同的硬键平台上,不同的编译器下,这些类型的实际长度可能都有出入,那么如何才能确切的指定当前某个数据类型的实际长度到底是多少呢?...size = %d\n",sizeof(float)); 9 printf("double size = %d\n",sizeof(double)); 10 } 输出: 1 int size...常量 C语言中使用const关键字修饰的就是常量,常量是不能修改的。

    1.3K30

    数字的陷阱

    1、浮点数运算 先来看一个对浮点数作运算的例子,请问会输出什么: System.out.println(4.015*100); 结果可能会让你大跌眼镜,不是401.5,而是401.49999999999994...,这就要涉及到浮点数的一些知识点,Java中,浮点类型是依据IEEE754标准,IEEE754定义了32位和64位双精度两种浮点二进制小数标准,而采用二进制表示double,float浮点数是不准确的(...这个构造器BigDecimal(double val)的结果是不可预知的,这里,0.1无法准确地表示为 double类型(一个有限长度的二进制小数),传入到构造方法的参数值并不完全等于 0.1。...,如果你研究过java中RoundingMode,你就会猜到它默认使用的是RoundingMode.HALF_EVEN,即如果舍弃部分左边的数字为奇数,则舍入行为同 RoundingMode.HALF_UP..."); } //a与b不相等 由于a,b指向的是不同的实例,最后比较结果是不相等,这和我们期望的比较结果往往是不同的,如果把赋值为null,程序便会报错。

    1K80

    Integer 128 == 128,true?

    如果不了解Integer的特性,或许会认为输出结果为:ture,然而实际上输出结果是:false。 第2题....Java是一种面向对象的语言,Java中的数据基本都是以对象的形式存在的,但是为了方便,Java提供了八种基本数据类型,它们分别是:int、byte、short、long、float、double、boolean...、char,这八种基本数据类型的数据不是以对象的形式存在的,基本数据类型的变量都是直接存储的值而不是对象的引用。...为了符合Java是一种面向对象的语言,Java分别为这八种数据类型提供了对应的包装类型,分别为:Integer、Byte、Short、Long、Float、Double、Boolean、Char。...而第1题中,由于128不在-127~127之间,因而,a和b各自指向了new出的新对象,那么a和b的地址当然不相等了。有一点需要了解的是,通过new关键字实例化的对象,对象的地址一定是不同的!

    1.3K20

    打破你的认知,java,除以0一定会崩溃吗?

    System.out.println("1/0=" + 1/0); 大叔的灵魂拷问: 上面的代码会崩溃吗?如果不会,会输出什么呢? 上面的代码会崩溃吗?如果不会,会输出什么呢? 上面的代码会崩溃吗?...如果不会,会输出什么呢? 会崩溃吗?如果不会,会输出什么呢? 会崩溃吗?如果不会,会输出什么呢? 输出日志: ? 为什么浮点数除以0不会崩溃?...我们先说结论: 因为java的float和double使用了 IEEE 754 标准。 这个标准规定:浮点数除以0等于正无穷或负无穷。 Double类的定义 于是我们打开Double这个类来看看。...注意关键词1: IEEE 754 java的单精浮点数float和双精浮点数double,符合IEEE 754标准。...如果我们的认知是错误的,任何数除以0都会崩溃,那么我们的分析将会直接绕过真相去推理。于是得出结论,怎么可能有bug,不可能的。 于是浪费了很多时间,去收集线索,去推翻我们固有的认知,才能找到真相。

    1.8K10

    完全合并C++面试题

    此时*p能够改动,而p不能改动。 (4)const char * const p 这样的是地址及指向对象都不能改动。...从名称上也能够看出,c++比c多了+,说明c++是c的超集;那为什么不叫c+而叫c++呢,是由于c++比 c来说扩充的东西太多了,所以就在c后面放上两个+。...于是就成了c++ C语言是结构化编程语言,C++是面向对象编程语言。 C++側重于对象而不是过程,側重于类的设计而不是逻辑的设计。...參数为其它。 以下举例说明。 int func(char s[5]); { cout这里将输出4。本来s为一个数组。...答: 101个先取出2堆, 33,33 第一次称,假设不相等,说明有一堆重或轻 那么把重的那堆拿下来,再放另外35个中的33 假设相等,说明假的重,假设不相等,新放上去的还是重的话,说明假的轻(不可能新放上去的轻

    55820

    002. java.lang.NumberFormatException: Infinite or NaN,怎么破?

    那么关键点来了:什么情况下一个double类型的值会和POSITIVE_INFINITY/NEGATIVE_INFINITY常量相等呢?...); System.out.println(Double.isNaN(d)); } 运行后的输出结果为: false false -> d==d这个是false哟 true 惊不惊喜,意不意外:...总结一下:浮点数除法计算,分母为0且分子为0,结果就是NaN。并且:每次计算的NaN都永不相等。...Tips:NaN代表不是数字,因此“不是数字”和“不是数字”不相等,从逻辑上好像也说得通嘛 针对此异常的补充说明 围绕POSITIVE_INFINITY、NEGATIVE_INFINITY、NaN三个常量进行一些补充说明吧...Float里的这三个常量和Double一样吗? 弱弱问一句:2023年了在实际业务开发中,不会真有人使用Float吧?吧?吧? 灵魂拷问:如果你使用了Float,收益是什么?是否真的值得?

    1.6K41

    C语言数据类型和变量(下)

    这里我们不包含头文件就会出现这样的错误。点击否,点击下方错误列表,错误内容看的更直观。 这里有人就要问了,主播主播,这个getchar()在这里是干什么用的呢,为什么要写它呢?...//int %e:使用科学计数法的浮点数,指数部分的e为小写。 %E:使用科学计数法的浮点数,指数部分的E为大写。 %i:整数,基本等同于%d. %f:小数(包含float类型和double类型)。...//float-%f double-%lf(其实这里无论float和double都可以用%f,但是为了便于区分两者的区别,还是建议分开写。 %g:6个有效数字的浮点数。...1.1.4.3 限定小数位数 输出小数时,有时希望限定小数的位数,举例来说,希望小数点后面只保留两位,占位符可以写成%.2f。 那么能不能总宽度限制和小数点后面的位数限制结合使用呢?...因为scanf_s函数是vs202自己提供的,不是C语言标准提供的 如果你在代码中使用了scanf_s,那么这个代码只有vs2022能编译。

    16510

    【C语言】操作符还能这样?

    ,先来分析一波: 此时,我们已经知道的补码,如果编译器是算术移位的话,将会打印出-1如果是逻辑移位的话,将会打印出1,结果会是什么呢?...1才为1,其他为0 | 按位或——有1就是1 ^ 按位异或 ——相同为0,不同为1 注:操作数必须是整数。...这里的位:指的是二进制位,根据原、反、补码进行运算。 这些操作符有什么用呢?...测试一下就行了: 结果是一样的,与顺序无关。 好了,到了这里,我们在重新看一看刚开始的题目:交换两个数,这时候是不是就更加理解了!...long double double float unsigned long int long int unsigned int int 如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算

    99930

    【CC++教学】浅谈指针函数和函数指针

    其函数原型为:类型* 函数名(形式参数表) 如求两个值中的最大值并返回其地址 ? 输出结果为: 000000000065FE48 000000000065FE48 为什么两个地址值是一样的?...那么有了函数指针的概念后,我们对函数的调用除了用名字的调用方式后,是不是还有别的方式呢? ? 运行结果: just test! just test! just test!...如int test1(int*,double )和int test2(int*,double)是同一个类型的函数,float test3(int , int)与test1和test2就不是相同类型的函数...接下来我们介绍函数指针的表示方式: 返回值类型 (*指针变量名)(形式参数类型) 因为函数指针是指向某一类函数的指针变量,所以也可以这么表示: 函数类型 *指针类型名 那么对于多个类型相同的函数指针,...我们说了一大串,到底函数指针有什么用呢?笼统的讲有两点 1.用函数指针调用函数 2.函数指针像普通指针一样作函数的形式参数 千言万语不如一个例子实在。

    58720

    #Android单元测试学习总结「建议收藏」

    (String message, Object expected, Object actual) 断言两个对象相等,如果不相等则抛出异常携带指定的message信息 assertEquals(float...,如果不相等则抛出异常携带指定的message信息 assertEquals(double expected, double actual, double delta) 断言两个 double 类型 expect...,如果不相等则抛出异常携带指定的message信息 fail() 直接让测试失败 fail(String message) 直接让测试失败并给出message错误信息 assertThat(T actual...那如果想做一些事而不是doNothing呢,跟Mockito一样,采用doAnswer: @Test public void testStaticVoid() throws Exception...,这里需要注意的是如果你使用PowerMockito来mock系统静态final类,则gradle依赖中不能再添加单纯Mockito的依赖库,否则这里将不能mock成功,会提示Mockito can not

    6.2K20

    Java 中的 ==, equals 与 hashCode 的区别与联系

    要注意的是,浮点型和整型都是有符号类型的(最高位仅用于表示正负,不参与计算【以 byte 为例,其范围为 -2^7 ~ 2^7 - 1,-0即-128】),而char是无符号类型的(所有位均参与计算,所以...那么我们能不能综合两者的特性,做出一种寻址容易,插入和删除也容易的数据结构?...如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法 不要求 一定生成不同的整数结果。...但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。   ...那么, 这里就有一个比较严重的问题:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢? 这就是 Object.equals 方法了。

    1.8K22

    ​第3章 对于所有对象都通用的方法

    使用instanceof操作符检查”参数是否为正确的类型” 如果不是,则返回false。 把参数装换成正确的类型。...(即equals相等,那么hashCode一定相等,需要注意的是,反过来不一定成立,即hashCode相等不代表equals相等) 如果两个对象根据equals方法比较是不相等的,那么调用这两个对象中任意一个对象的...equals相同而hashCode不相等,那么跟HashMap一起使用,则会得到与预期不相同的结果....相同,即equals会为true System.out.println(className); } className的值为多少呢?...s) 如果是double,则计算Double.doubleToLongBits(f),再按long类型计算一遍 如果是f是个对象引用,并且该类的equals方法通过递归地调用equals的方式来比较这个域

    78020

    小闫陪你入门 Java (四)

    ; } } } 首先定义了一个人的月收入为 5000~7000,那么根据上述程序会输出什么呢?看看吧: 哥们儿你的生活美滋滋~ 借此我们来看一下语句是如何运行的。...然后这个变量会挨个与 case 后方的值进行比较,直到相等(变量类型需相同,而且必须是常量或者字面常量) 字母常量是类型为简单类型、String类型和空类型的值在源程序中的表现。...如果都不相等,那么会输出 default 中的语句。在每个 case 语句中如果遇到 break 会终止执行,否则继续比较,但是 default 分支是不需要 break 语句的。...官方封装这两个类并不是吃饱了撑的,而是考虑到实际开发过程中,经常需要对象,所以为内置数据类型提供其包装类。它们有 Integer、Long、Byte、Double、Float 以及 Short。...它可以如同内置数据类型直接用来声明变量: Integer num = 10; 那么 Math 类呢? Math 类顾名思义,包含大量的数学运算的方法以及属性等。常见的对数、三角函数等都有。

    50530
    领券