中国互联网站建设中心,重庆观音桥网站建设,wordpress 内容分页,wordpress修改侧边栏文章目录 自动装箱与拆箱基本数据类型与包装类的区别#xff08;int 和 Integer 有什么区别#xff09;应用场景的区别#xff1a; 堆和栈的区别重点来说一下堆和栈#xff1a;那么堆和栈是怎么联系起来的呢? 堆与栈的区别 很明显#xff1a;延伸#xff1a;关于Integer… 文章目录 自动装箱与拆箱基本数据类型与包装类的区别int 和 Integer 有什么区别应用场景的区别 堆和栈的区别重点来说一下堆和栈那么堆和栈是怎么联系起来的呢? 堆与栈的区别 很明显延伸关于Integer和int的比较Java 为每个原始类型提供了包装类型 Double和double的区别面向对象和面向过程的区别 今天来简单了解一下java基础的内容 自动装箱与拆箱
装箱将基本类型用它们对应的引用类型包装起来
拆箱将包装类型转换为基本数据类型
基本数据类型与包装类的区别int 和 Integer 有什么区别
1、Integer是int的包装类int则是java的一种基本数据类型 2、Integer变量必须实例化后才能使用而int变量不需要 3、Integer实际是对象的引用当new一个Integer时实际上是生成一个指针指向此对象而int则是直接存储数据值 4、Integer的默认值是nullint的默认值是0
应用场景的区别
比如要体现出 考试成绩为0和缺考的区别的时候 用Integer可以 int不行
比如用容器的时候 ArrayList等职能放对象不能放基本数据类型。 将基本数据类型封装成对象的好处是
1、在对象中可以定义更多的功能方法操作该数据。例如基本数据类型和字符串直接的转换。 2、编码过程中只接收对象的情况例如List中只存入对象不能存入基本数据类型。
3、使用场景 大部分的情况下这两种类型没有太大得区别。根据以上两点的分析基本类型的存取速度会更快对象中有更多功能方法来操作数据要根据实际需要定义属性。
借鉴网上学生成绩的例子没来考试成绩是0还是null如果你觉得是0就用int如果你认为是null就用Integer。
堆和栈的区别
那数据存放在堆中和栈中有什么区别呢
堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的或者说是可以动态变化的但是在栈中一个对象只对应了一个4btye的引用堆栈分离的好处。
为什么不把基本类型放堆中呢因为其占用的空间一般是1~8个字节——需要空间比较少而且因为是基本类型所以不会出现动态增长的情况——长度固定因此栈中存储就够了如果把他存在堆中是没有什么意义的还会浪费空间后面说明。可以这么说基本类型和对象的引用都是存放在栈中而且都是几个字节的一个数因此在程序运行时他们的处理方式是统一的。但是基本类型、对象引用和对象本身就有所区别了因为一个是栈中的数据一个是堆中的数据。最常见的一个问题就是Java中参数传递时的问题。
栈
1栈的存取速度比堆快仅次于直接位于CPU的寄存器。
2栈中的数据的大小和生存周期是确定的。
3栈中的数据可以共享。
堆
1堆可以动态的分配内存大小生存期也不必告诉编译器。
2堆在运行时动态分配内存存取速度慢。
综上所述可以简单的理解为为了高效可以把一些数值小简单的变量存放在栈中。堆和栈
堆Heap与栈Stack是开发人员必须面对的两个概念在理解这两个概念时需要放到具体的场景下因为不同场景下堆与栈代表不同的含义。一般情况下有两层含义 1程序内存布局场景下堆与栈表示两种内存管理方式 2数据结构场景下堆与栈表示两种常用的数据结构。
在说堆和栈之前我们先说一下JVM虚拟机内存的划分
Java程序在运行时都要开辟空间任何软件在运行时都要在内存中开辟空间Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区域启动时在自己的内存区域中进行更细致的划分因为虚拟机中每一片内存处理的方式都不同所以要单独进行管理。
JVM内存的划分有五片 1. 寄存器2. 本地方法区3. 方法区4. 栈内存5. 堆内存。重点来说一下堆和栈
栈内存:栈内存首先是一片内存区域存储的都是局部变量凡是定义在方法中的都是局部变量方法外的是全局变量for循环内部定义的也是局部变量是先加载函数才能进行局部变量的定义所以方法先进栈然后再定义变量变量有自己的作用域一旦离开作用域变量就会被释放。栈内存的更新速度很快因为局部变量的生命周期都很短。
堆内存:存储的是数组和对象其实数组就是对象凡是new建立的都是在堆中堆中存放的都是实体对象实体用于封装数据而且是封装多个实体的多个属性如果一个数据消失这个实体也没有消失还可以用所以堆是不会随时释放的但是栈不一样栈里存放的都是单个变量变量被释放了那就没有了。堆里的实体虽然不会被释放但是会被当成垃圾Java有垃圾回收机制不定时的收取。
下面我们通过一个图例详细讲一下堆和栈
比如主函数里的语句 int [] arrnew int [3];在内存中是怎么被定义的
主函数先进栈在栈中定义一个变量arr,接下来为arr赋值但是右边不是一个具体值是一个实体。实体创建在堆里在堆里首先通过new关键字开辟一个空间内存在存储数据的时候都是通过地址来体现的地址是一块连续的二进制然后给这个实体分配一个内存地址。数组都是有一个索引数组这个实体在堆内存中产生之后每一个空间都会进行默认的初始化这是堆内存的特点未初始化的数据是不能用的但在堆里是可以用的因为初始化过了但是在栈里没有不同的类型初始化的值不一样。所以堆和栈里就创建了变量和实体 那么堆和栈是怎么联系起来的呢?
我们刚刚说过给堆分配了一个地址把堆的地址赋给arrarr就通过地址指向了数组。所以arr想操纵数组时就通过地址而不是直接把实体都赋给它。这种我们不再叫他基本数据类型而叫引用数据类型。称为arr引用了堆内存当中的实体。可以理解为c或c的指针Java成长自c和c很像优化了c 如果当int [] arrnull;
arr不做任何指向null的作用就是取消引用数据类型的指向。
当一个实体没有引用数据类型指向的时候它在堆内存中不会被释放而被当做一个垃圾在不定时的时间内自动回收因为Java有一个自动回收机制而c没有需要程序员手动回收如果不回收就越堆越多直到撑满内存溢出所以Java在内存管理上优于c。自动回收机制程序自动监测堆里是否有垃圾如果有就会自动的做垃圾回收的动作但是什么时候收不一定。
堆与栈的区别 很明显
1.栈内存存储的是局部变量而堆内存存储的是实体
2.栈内存的更新速度要快于堆内存因为局部变量的生命周期很短
3.栈内存存放的变量生命周期一旦结束就会被释放而堆内存存放的实体会被垃圾回收机制不定时的回收。
延伸关于Integer和int的比较
1、由于Integer变量实际上是对一个Integer对象的引用所以两个通过new生成的Integer变量永远是不相等的因为new生成的是两个对象其内存地址不同。
Integer i new Integer(100);
Integer j new Integer(100);
System.out.print(i j); //false2、Integer变量和int变量比较时只要两个变量的值是向等的则结果为true因为包装类Integer和基本数据类型int比较时java会自动拆包装为int然后进行比较实际上就变为两个int变量的比较
Integer i new Integer(100);
int j 100
System.out.print(i j); //true3、非new生成的Integer变量和new Integer()生成的变量比较时结果为false。因为非new生成的Integer变量指向的是java常量池中的对象而new Integer()生成的变量指向堆中新建的对象两者在内存中的地址不同
Integer i new Integer(100);
Integer j 100;
System.out.print(i j); //false4、对于两个非new生成的Integer对象进行比较时如果两个变量的值在区间-128到127之间则比较结果为true如果两个变量的值不在此区间则比较结果为false
Integer i 100;
Integer j 100;
System.out.print(i j); //true
Integer i 128;
Integer j 128;
System.out.print(i j); //false对于第4条的原因 java在编译Integer i 100 ;时会翻译成为Integer i Integer.valueOf(100)而java API中对Integer类型的valueOf的定义如下
public static Integer valueOf(int i){
assert IntegerCache.high 127;
if (i IntegerCache.low i IntegerCache.high){
return IntegerCache.cache[i (-IntegerCache.low)];}
return new Integer(i);
}java对于-128到127之间的数会进行缓存Integer i 127时会将127进行缓存下次再写Integer j 127时就会直接从缓存中取就不会new了
Java 是一个近乎纯洁的面向对象编程语言但是为了编程的方便还是引入了基本数据类型但是为了能够将这些基本数据类型当成对象操作Java 为每一个基本数据类型都引入了对应的包装类型wrapper classint 的包装类就是 Integer从 Java 5 开始引入了自动装箱/拆箱机制使得二者可以相互转换。
Java 为每个原始类型提供了包装类型
原始类型: booleancharbyteshortintlongfloatdouble
包装类型BooleanCharacterByteShortIntegerLongFloatDouble
Integer a 127 与 Integer b 127相等吗 对于对象引用类型比较的是对象的内存地址。 对于基本数据类型比较的是值。
如果整型字面量的值在-128到127之间那么自动装箱时不会new新的Integer对象而是直接引用常量池中的Integer对象超过范围 a1b1的结果是false
Double和double的区别
1、Double是java定义的类而double是预定义数据类型8种中的一种 2、Double就好比是对double类型的封装内置很多方法可以实现String到double的转换以及获取各种double类型的属性值MAX_VALUE、SIZE等等
基于上述两点如果你在普通的定义一个浮点类型的数据两者都可以但是Double是类所以其对象是可以为NULL的而double定义的不能为NULL如果你要将一些数字字符串那么就应该使用Double类型了其内部帮你实现了强转。
面向对象和面向过程的区别
面向过程
优点性能比面向对象高因为类调用时需要实例化开销比较大比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发性能是最重要的因素。
缺点没有面向对象易维护、易复用、易扩展
面向对象
优点易维护、易复用、易扩展由于面向对象有封装、继承、多态性的特性可以设计出低耦合的系统使系统更加灵活、更加易于维护
缺点性能比面向过程低