装箱问题

Integer判断相等,到底该用==还是equals

匆匆过客 提交于 2020-02-24 05:07:53
在项目中涉及到整数判断的时候一直都是使用"=="进行判断的,但是用的时候心里老是在犯嘀咕,是不是应该使用equals呀?今天来看下这个问题! 在Object类中,equals方法的定义是这样的, public boolean equals(Object obj) { return (this == obj); } 可见在Object类中中,equals()和"=="是等价的,但是在大部分的包装类中,都重写了equals()方法,所以两者还是有区别的。总的来说"=="是一个关系运算符,如果比较的两端都为原生数据类型,则表示判断两者的值是否相等,如果比较的两端都为引用类型,则比较两者所指向 对象的地址 是否相同;对于equals()方法,如果这个对象所在的类重写了equals方法,则按照重写的方法进行比较,如果没有,则比较两者所指向对象的地址是否相同,其实就是使用"=="进行比较。 下面就对上面的论述进行测试。 1 public class Test { 2 public static void main(String[] args) { 3 Integer a = new Integer(200); 4 Integer b = new Integer(200); 5 Integer c = 200; 6 Integer e = 200; 7 int d = 200; 8 9

c#中的引用类型和值类型

*爱你&永不变心* 提交于 2020-02-24 00:09:07
一,c#中的值类型和引用类型 众所周知在c#中有两种基本类型,它们分别是值类型和引用类型;而每种类型都可以细分为如下类型: 什么是值类型和引用类型 什么是值类型: 进一步研究文档,你会发现所有的结构都是抽象类型System.ValueType的直接派生类,而System.ValueType本身又是直接从System.Object派生的。根据定义所知,所有的值类型都必须从System.ValueType派生,所有的枚举都从System.Enum抽象类派生,而后者又从System.ValueType派生。 所有的值类型都是隐式密封的(sealed),目的是防止其他任何类型从值类型进行派生。 什么是引用类型: 在c#中所有的类都是引用类型,包括接口。 区别和性能 区别: 值类型通常被人们称为轻量级的类型,因为在大多数情况下,值类型的的实例都分配在线程栈中,因此它不受垃圾回收的控制,缓解了托管堆中的压力,减少了应用程序的垃圾回收的次数,提高性能。 所有的引用类型的实例都分配在托管堆上,c#中new操作符会返回一个内存地址指向当前的对象。所以当你在创建个一个引用类型实例的时候,你必须要考虑以下问题: 内存是在托管堆上分配的 在分配每一个对象时都会包含一些额外的成员(类型对象指针,同步块索引),这些成员必须初始化 对象中的其他字节总是设为零 在分配对象时,可能会进行一次垃圾回收操作

C# 知识回顾 - 装箱与拆箱

耗尽温柔 提交于 2020-02-17 23:24:06
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 读者见解 生活中的装箱与拆箱    我们习惯了在网上购物,这次你想买本编程书 -- 《C 语言从入门到放弃》 ,下单成功后,卖家会帮你将这本入坑指南打好包装,我们可以称之为装箱;经过快递员的快马加鞭,风雨无阻,包裹就直接送到你手上了。你一定会以迅雷不及掩耳盗铃儿响叮当之势拆开包装,这个过程我们可以称之为拆箱,这时,入坑指南就顺利的送到你手上。 C# 的装箱与拆箱   装箱:将值类型(如 int ,或自定义的值类型等)转换成 object 或者接口类型的一个过程。当 CLR 对值类型进行装箱时,会将该值包装为 System.Object 类型,再将包装后的对象存储在堆上。 拆箱就是从对象中提取对应的值类型的一个过程。   装箱是隐式的;拆箱必定是显式的。   相对于简单的赋值而言,装箱和拆箱都需要进行大量的数据计算。对值类型进行装箱时,CLR 必须重新分配一个新的对象。拆箱所需的强制转换也需要进行大量的计算,只是相比,程度不高,并且也可能会出现类型转换的异常情形。如果你的操作正处于循环的中心,通过测试(如:Stopwatch),你会很明显的感觉到性能问题。   .NET 2.0 引入的泛型其实在很大的程度上解决了装拆箱产生的类型转换问题,也减少了类型转换所引起的运行时的异常,从而提高了性能。

java P1049 装箱问题

牧云@^-^@ 提交于 2020-02-17 14:24:01
题目描述 有一个箱子容量为VV(正整数,0≤V≤20000),同时有nn个物品(0<n≤30,每个物品有一个体积(正整数)。 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。 输入格式 1个整数,表示箱子容量 1个整数,表示有n个物品 接下来n行,分别表示这n个物品的各自体积 输出格式 1个整数,表示箱子剩余空间。 输入输出样例 输入 #1 24 6 8 3 12 7 9 7 输出 #1 0 import java . util . * ; public class Main { public static void main ( String [ ] args ) { new Main ( ) . bfs ( ) ; } int t = 0 , m = 0 ; static int [ ] a = new int [ 100005 ] ; static int [ ] b = new int [ 100005 ] ; static int [ ] c = new int [ 100005 ] ; public void bfs ( ) { Scanner in = new Scanner ( System . in ) ; if ( in . hasNext ( ) ) { t = in . nextInt ( ) ; m = in . nextInt ( ) ; }

C# 装箱和拆箱

左心房为你撑大大i 提交于 2020-02-06 11:27:27
1、 装箱和拆箱是一个抽象的概念 2、 装箱是将 值类型 转换为 引用类型 ;拆箱是将 引用类型 转换为 值类型 利用装箱和拆箱功能,可通过允许 值类型 的任何值与 Object 类型 的值相互转换,将值类型与引用类型链接起来 例如: int val = 100; object obj = val; Console.WriteLine (“对象的值 = {0}", obj); 这是一个装箱的过程,是将 值类型 转换为 引用类型 的过程 int val = 100; object obj = val; int num = (int) obj; Console.WriteLine ("num: {0}", num); 这是一个拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程 注:被装过箱的对象才能被拆箱 3、 .NET中,数据类型划分为 值类型 和 引用 (不等同于C++的指针) 类型 ,与此对应,内存分配被分成了两种方式,一为栈,二为堆,注意:是托管堆。 值类型只会在栈中分配。 引用类型分配内存与托管堆。 托管堆对应于垃圾回收。 4:装箱/拆箱是什么? 装箱:用于在垃圾回收堆中存储值类型。装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。 拆箱:从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。 5:为何需要装箱

回溯算法3——装箱问题

主宰稳场 提交于 2020-02-04 04:36:58
有n个集装箱要装到两艘船上,每艘船的容载量分别为cl, c2,第i个集装箱的重量为w[i], 同时满足: w[]+w[2)+.+w[n]<=c1+c2; 确定一个最佳的方案把这些集装箱装入这两艘船上。 【分析】 最佳方案的方法:首先将第一艘船尽量装满,再把剩下的装在第二艘船上。第一艘船尽量装满,等价于从n个集装箱选取一一个子集,使得该子集的问题解空间: (x1, x2, x3, . xn),其中,xi为0表示不装在第一艘船上,为1表示在第一艘船上; 约束条件: (1)可行性约束条件: w1xx1+w2x2...ixi.+..+wn * xn<=c1。 (2)最优解约束条件: remain+cw>bestw (remain 表示剩余集装箱重量,cw表示当前已装上的集装箱的重量,bestw 表示当前的最优装载量)。 例如,集装箱的个数为4,重量分别是10、20、35、40,第一艘船的最大装载量是50,则最优装载是将重量为10和40的集装箱装入。首先从第一个集装箱开始,将重量为10的集装箱装入第一艘船, 然后将重量为20的集装箱装入,此时有10+20< -50,然后试探将重量为35的集装箱装入,但是10+20+35>50,所以不能装入35,紧接着试探装入重量为40的集装箱,因为10+20+40>50,所以也不能装入。因此30成为当前的最优装载量。取出重量为20的集装箱(回溯

Leader:这样的 Bug 你也写的出来???

做~自己de王妃 提交于 2020-01-28 15:42:16
Hello~各位读者新年好!不知道大家春节假期是否已延长,小黑哥刚接到通知,假期延长到 2 月 2 号,另外回去之后需要在家办公,自行隔离两周。还没试过在家办公,小黑哥就怕到时候生物钟还没调整过来,一觉睡醒已经是下午了。。。 前言 春节假期,还躺在床上小黑哥,收到对账系统的一条预警短信,提示当前系统资金核对存在问题。关于资金的问题,都是大问题,小黑哥连忙拔出电脑,连上 VPN,登录生产环境的查看相关日志。 通过日志,很快小黑哥定位到相关代码。 有的同学可能一下子就能看出这里的问题, Long 对象采用 != 进行比较,这真是一个低级 Bug 。幸好 Leader 还不知道,赶紧悄悄修复一下。 现在回想小黑哥当初写这段代码的时候,误以为两个 Long 对象比较将会进行自动拆箱,转变为两个基本数值类型比较。 下面开始复习一下 Java 自动装箱与拆箱机制。 自动装箱与拆箱机制 自动装箱(Autoboxing),是 JDK5 新增的一种语法糖,将会在代码编译时自动将原始类型转换为其对应的对象包装器类。例如将 int 转换为 Integer , double 转换为 Double 。如果转换结果相反,我们就将其称为拆箱。 下面是一个自动装箱的例子: 上面代码 li.add(i) 就发生自动装箱,将基本数据类型 long 转换为其包装类 Long 。 查看这段代码对应的字节码。

NOIP2001(或之前)装箱问题

泄露秘密 提交于 2020-01-28 08:34:58
装箱问题 题目描述 有一个箱子容量为VV(正整数,0 \le V \le 200000≤V≤20000),同时有nn个物品(0<n \le 300<n≤30,每个物品有一个体积(正整数)。 要求nn个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。 输入格式 11个整数,表示箱子容量 11个整数,表示有nn个物品 接下来nn行,分别表示这nn个物品的各自体积 输出格式 11个整数,表示箱子剩余空间。 输入输出样例 输入 #1 24 6 8 3 12 7 9 7 输出 #1 0 说明/提示 NOIp2001普及组 第4题 这题很明显每个物品只能选一次,明显的01背包…套模板就可以了… 唯一的区别就是最后不是输出 f[k] 而是输出剩余的空间 k-f[k] 就可以了 参考: 【模板】01背包 # include <iostream> using namespace std ; int a [ 35 ] , k , f [ 20001 ] , n ; int main ( ) { ios :: sync_with_stdio ( false ) ; cin >> k >> n ; for ( int i = 1 ; i <= n ; i ++ ) cin >> a [ i ] ; for ( int i = 1 ; i <= n ; i ++ ) for ( int j = k ;

堆栈和托管堆以及装箱和拆箱的理解

一个人想着一个人 提交于 2020-01-28 07:16:56
C#中的类型都来源于system.object类型,分为值类型和引用类型,分别存在内存的堆栈和托管堆中,值类型一般都是简单类型如int float double等,他们保存在堆栈中,是按后进先出(LIFO)原则存储数据项的一种数据结构。在计算机系统中,栈特指处理器支持的一块内存区域,其中保存着局部变量。工作方式是先分配内存的变量后释放(先进后出原则),所以一旦出了作用域就会被释放,所以在整个项目中无法使用,这个时候就想到了托管堆。 堆(托管堆)存储引用类型。此堆非彼堆,.NET中的堆由垃圾收集器自动管理。与堆栈不同,堆是从下往上分配,所以自由的空间都在已用空间的上面。现在来举个例子看看在内存中是如何通过堆栈和托管堆保存数据的。 Int a=100; 那么在堆堆栈中就会分出一块空间用来保存a,值为100,现在有一个方法 Int GetNum(int b) { b=500; Return b; } 这个时候把a的值作为参数传给这个方法,那么此时a的值会不会变成500呢,这个就是我们重点讨论的问题,方式就是一个临时的,用完就会被释放,其实我们只是复制了一个a的到方法里了,所有a的值不会改变 Student stu=new Student(); 我们知道上面的是一个引用类型的变量,它在内部的进程是 首先在堆栈中分出一块空间用来放Student stu的引用,然后将new Student(

Integer 与 int -- 自动装箱(autoboxing)与自动拆箱(unboxing)

坚强是说给别人听的谎言 提交于 2020-01-28 03:56:56
转载于 http://www.ticmy.com/?p=110 jdk1.5引入了自动装箱(autoboxing)与自动拆箱(unboxing),这方便了集合类以及一些方法的调用,同时也使初学者对其感到非常之困惑。在此,我们来揭开其神秘的面纱。 首先,需要厘清一些概念: 1、Integer是一个类,用Integer声明一个变量其是一个对象类型(或者说引用类型);int是基本类型,用int声明的变量是非对象类型,即不能在其上调用方法。 2、“==”作用于对象上的时候,其比较的是对象的引用本身的值(或者说对象的地址更容易理解),而作用于基本类型的时候比较的就是基本类型的值。 接下来看一段代码: public class Test { public static void main(String[] args) { Integer i1 = 2 ; int i2 = 2 ; System.out.println(i1 == i2); } } 在这段代码中有两个令人困惑的问题,首先是将一个基本类型的值赋值给对象的引用,即Integer i1 =2;其次是拿一个对象类型和一个基本类型比较。按理说这两种做法肯定都是有问题的,在jdk1.4(若使用的jdk版本是1.5或之后的版本中,可以使用javac -source 1.4 Test. Java 来编译)上,确实如此,第一个问题在编译时会报