java复合数据类型则可以再分成基本数据类型java中的数据类型

== 号判断,为什么基本数据类型就是比较内容,而对象则是比较地址?
比如String 的 == 就是比较地址,Object的equals方法是利用 == String类重写了equals方法,才使得变成了比较内容,其实我想问的是JVM怎么实现这两种不同的机制的?不都是== 么?
按投票排序
基础类型通过JVM初始化时生成其装箱对象的缓存,然后所有基本类型都被映射到这些缓存对象上,所以做出==相等的假象,因为实际上的确是同一个缓存对象,地址相同。但超过特定值就会失效,超过特定值的基本类型装箱对象是在堆生成,每次都会变动,这样==地址不相同。equals方法才是较准确的等值对比判断,因为涉及转型问题的话,equals一样也不保证相等(类型不等)。-----有缓存机制,查源码(SunJDK 1.7),Integer、Long、Byte、Character都有一个内部类命名为&类名&cache,然后有一个静态块用来初始化一个内部数组(使用了final和static修饰,所以这部分被固定到栈里面)和填充一批包装类对象。编译器会对这些基础类型使用valueOf方法自动装箱,而valueOf会先从这些cache找出对应的装箱对象代替,如果不存在才每次new出新的装箱对象(存放在堆中),所以缓存机制保证了在指定范围了基础类型==内容相等,是因为装箱时将其映射到同内容的类型值映射到相同的装箱对象中,地址统一相等。但超过范围的话,装箱时每次都生成一个新的装箱对象,这样每个内容相等的装箱对象实际上地址不等,==无效。某种程度上,基础类型==相等是一个Hack方法。关于装箱处理,引用这个评论吧 我做实验用javap看的话,只有接受类型是类才会装箱,如果接受类型是int根本不会装箱。我的看法是“如无必要,不会装箱”。
因为基本类型都是存在栈里面的,Int a=3;当你int b=3的时候,jvm会干嘛呢?首先,它会去栈里面找是不是已经有一个数据为3了。如果不是的话新建一个地址,是的话,就把b指向这个地址,所以对于基本类型来说,当值相同的时候,地址也是相同的,所以当你对基本类型==的时候,内容相同的肯定返回的是true。。因为实质上,他们的地址也是相同的但是对于其他类型,都是存在堆里面的动态分配内存,所以每一次新建一个数据都会动态分配一个内存地址,所以==的时候,当然内存地址是不一样的。要记住,==永远是用来比较内存中的地址的,基本类型感觉上是在比较内容,实际上还是在比较地址!
==是比较虚拟机栈中的值,而equals比较的是栈中引用指向的堆中的对象。
为什么基本数据类型就是比较内容,而对象则是比较地址?这个问题可以参考享元模式,这个设计是为了避免大量拥有相同内容对象的内存开销。比如下面这个例子
Integer i1 = 20;
Integer i2 = 20 ;
System.out.println(i1 == i2);
Integer i3 = 200;
Integer i4 = 200 ;
System.out.println(i3 == i4);
看了看,貌似没人回答题主的问题那么准首先两种不同的肯定是需要的,因为同一个内存地址,和不同内存地址的值是否相等是有区别的举个例子比如说克隆,当你克隆出来一个东西之后,你只想对克隆出来的进行修改,原来的不需要修改,当你无法确定哪个是克隆出来的时候,你就需要使用内存地址比对
双等号就是比较的栈里面的内容,原始数据类型和地址都是放在栈里面的。如果所示:而equals则是根据地址拿到堆里面的内容进行比较。而equals则是根据地址拿到堆里面的内容进行比较。为了美观,我图片还加了边框哟!
对于基本类型而言,直接用==就可以判断它们相等;对于一个对象而言,重写equals,对他的所有对象字段都递归调用equals,基本类型字段用==。如果对象的所有字段全都相等,不就是等值了么
听说基本数据类型在做的时候整咧了, 正常应该也弄个对象的。
你说的“对象”是引用类型,==是比较引用,equals是比较实际的对象。多个引用可以指向同一个实际对象。
学点c++就清楚了,栈上堆上没有关系,按对象比较或者按照指针比较随意,指针也可以指向栈上内容,对象也可以在堆上的。java只是多做了很多限定
已有帐号?
无法登录?
社交帐号登录java是八种基本数据类型还是九种(void)
[问题点数:40分,结帖人fyhju1]
java是八种基本数据类型还是九种(void)
[问题点数:40分,结帖人fyhju1]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。 一、前言
  concurrentHashMap与ConcurrentSkipListMap性能测试
  在4线程1.6万数据的条件下,ConcurrentHashMap 存取速度是ConcurrentSkipListMap 的4倍左右。
  但ConcurrentSkipListMap有几个ConcurrentHashMap 不能比拟的优点:
  1、ConcurrentSkipListMap 的key是有序的。
  2、ConcurrentSkipListMap 支持更高的并发。ConcurrentSkipListMap 的存取时间是log(N),和线程数几乎无关。也就是说在数据量一定的情况下,并发的线程越多,ConcurrentSkipListMap越能体现出他的优势。
  二、使用建议
  在非多线程的情况下,应当尽量使用TreeMap.此外对于并发性相对较低的并行程序可以使用Collections.synchronizedSortedMap将TreeMap进行包装,也可以提供较好的效率。对于高并发程序,应当使用ConcurrentSkipListMap,能够提供更高的并发度。
  所以在多线程程序中,如果需要对Map的键值进行排序时,请尽量使用ConcurrentSkipListMap,可能得到更好的并发度。
  注意,调用ConcurrentSkipListMap的size时,由于多个线程可以同时对映射表进行操作,所以映射表需要遍历整个链表才能返回元素个数,这个操作是个O(log(n))的操作。
  二、什么是SkipList
  Skip list(跳表)是一种可以代替平衡树的数据结构,默认是按照Key值升序的。Skip list让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过"空间来换取时间"的一个算法,在每个节点中增加了向前的指针,在插入、删除、查找时可以忽略一些不可能涉及到的结点,从而提高了效率。
  从概率上保持数据结构的平衡比显示的保持数据结构平衡要简单的多。对于大多数应用,用Skip list要比用树算法相对简单。由于Skip list比较简单,实现起来会比较容易,虽然和平衡树有着相同的时间复杂度(O(logn)),但是skip list的常数项会相对小很多。Skip list在空间上也比较节省。一个节点平均只需要1.333个指针(甚至更少)。
  图1-1 Skip list结构图(以7,14,21,32,37,71,85序列为例)
  Skip list的性质
  (1) 由很多层结构组成,level是通过一定的概率随机产生的。
  (2) 每一层都是一个有序的链表,默认是升序,也可以根据创建映射时所提供的Comparator进行排序,具体取决于使用的构造方法。
  (3) 最底层(Level 1)的链表包含所有元素。
  (4) 如果一个元素出现在Level i 的链表中,则它在Level i 之下的链表也都会出现。
  (5) 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。
  三、什么是ConcurrentSkipListMap
  ConcurrentSkipListMap提供了一种线程安全的并发访问的排序映射表。内部是SkipList(跳表)结构实现,在理论上能够在O(log(n))时间内完成查找、插入、删除操作。
  注意,调用ConcurrentSkipListMap的size时,由于多个线程可以同时对映射表进行操作,所以映射表需要遍历整个链表才能返回元素个数,这个操作是个O(log(n))的操作。
  ConcurrentSkipListMap存储结构
&&&  ConcurrentSkipListMap存储结构图
  跳跃表(SkipList):(如上图所示)
  1.多条链构成,是关键字升序排列的数据结构;
  2.包含多个级别,一个head引用指向最高的级别,最低(底部)的级别,包含所有的
  3.每一个级别都是其更低级别的子集,并且是有序的;
  4.如果关键字 key在 级别level=i中出现,则,level&=i的链表中都会包含该关键字
  同简单数据类型的定义一样,Java虚拟机(JVM)还定义了索引(reference)这种数据类型。索引类型可以“引用”变量,由于Java没有明确地定义指针类型,所以索引类型可以被认为就是指向实际值或者指向变量所代表的实际值的指针。一个对象可以被多于一个以上的索引所“指”。JVM从不直接对对象寻址而是操作对象的索引。
  索引类型分成三种,它们是:类(class)、接口(interface)和数组(array)。索引类型可以引用动态创建的类实例、普通实例和数组。索引还可以包含特殊的值,这就是null 索引。null 索引在运行时上并没有对应的类型,但它可以被转换为任何类型。索引类型的默认值就是null。
  类(Class)指的是定义方法和数据的数据类型。从内部来看,JVM通常把class类型对象实现为指向方法和数据的一套指针。定义class类型的变量只能引用类的实例或者null ,如以下代码所示:
  MyObject anObject = new MyObject(); // 合法
  MyObject anotherObject = // 合法
  MyObject stillAnotherObject = 0; // 非法
  接口(interface)好比一种模版,这种模版定义了对象必须实现的方法,其目的就是让这些方法可以作为接口实例被引用。接口不能被实例化。类可以实现多个接口并且通过这些实现的接口被索引。接口变量只能索引实现该接口的类的实例。比方说,假设我们定义了一个接口,名字是Comparable ,同时还定义了一个类SortItem,这个类实现了接口Comparable,那么我们可以编写以下的定义代码:
  Comparable c = new SortItem();
  假如Comparable 接口定义了一个方法: public void compare(Comparable item), 那么SortItem 类就必须提供compare 方法的实现,如以下代码所示:
  public class SortItem implements Comparable
  public void compare(Comparable item)
  ...method implementation here
  Java数组(array)是动态创建的索引对象,这一点和类非常相似,此外,同类一样,数组只能索引数组的实例或者null ,如以下代码所示:
  int[] myIntArray = new int[5];
  int[] anotherIntArray =
  数组是Object类的继承,这样,Object类的所有方法都可以被数组调用。数组对象由元素组成。元素的数目也可以为0,在这种情况下称做数组为空。所有的数组都是从0开始对元素编号的,这意味着数组内的第1个元素的索引编号是数字0。所有对数组元素的访问都会在运行时上接受检查,如果试图使用编号小于0或者大于数组长度来索引元素就会产生ArrayIndexOutOfBoundsException异常并被扔出。
  数组的元素按整型值索引,如以下代码所示:
  int[] myIntArray = { 9, 5, 6 };
  int int1 = myIntArray[0];
  int int2 = myIntArray[1];
  int int3 = myIntArray[2];
  数组对象的长度是不变的。为了改变数组变量的长度,你必须创建另一个数组并赋给变量,如以下代码所示:
  int[] myIntArray = { 9, 5, 6 };
  System.out.println("myIntArray length = " +myIntArray.length); // 输出结果是3
  myIntArray = new int[] { 3, 6, 4, 2, 8 };
  System.out.println("myIntArray length = " +myIntArray.length); // 输出结果是5
  复合数据类型
  Java语言不支持结构(struct)或联合(union)数据类型。它的复合数据类型是通过类或者接口来构造的,类提供了捆绑数据和方法的方式,同时可以限制对类的私有数据的访问。比如说,如果用C语言,那么汽车(car)就可以如下代码所示用结构来定义:
  struct Car
  Engine*
  Tire**
  以上的示范代码还隐含采用了先前定义的引擎(Engine)、车身(Body)和轮胎(Tire)结构。而采用Java语言,汽车的定义如清单A所示。
  以上的示例还假设我们以前都已经定义过CarModels和Carmakes接口以及Engine、Body、Tire、DurangoEngine、DurangoBody和GoodyearTire类。
  复合数据类型的初始化
  复合数据类型由构造器内定义的代码实现初始化,构造器在类的创建函数(比如“new”之类)应用到类变量的时候被调用。构造器被调用之前,类的各个成员被初始化为各自的默认值或者显式赋予的初值。清单B 中的程序代码对以上过程进行了解释。
  在清单B的代码中,当myClass 的实例用new 运算符创建时,构造器public MyClass()即被调用促使类对自身初始化。初始化的过程如下所示:
  声明“int myI”给myInt赋默认值0。
  声明“AnotherClass anotherC”给anotherClass分配默认值null。
  构造器内的声明“myint = 2;”给myInt赋值为2。
  预定义复合数据类型
  Java语言包含了大量的预定义复合数据类型。其中之一的String 类属于java.lang 包。String 类提供的方法执行常用的字符串操作,比如length()、 substring(int beginIndex)、toUpperCase()、toLowerCase()、equals() 等等。另一种常用的Java复合数据类型是Vector 类,它属于java.util 包。Vector 类定义的方法执行可扩展对象数组的常用操作。比如add(int index, Object element)、elementAt(int index)、isEmpty()和remove(int index)等。这些就是一小部分预定义复合数据类型的代表示例。在以后的文章里我们还会进一步对预定义复合数据类型进行讨论。
  除了简单数据类型之外,Java语言中还定义了本文所讨论三种索引数据类型。Java还运行开发人员自己用简单和索引数据类型组合起来创建复合数据类型。用户定义的组合数据类型和Java预定义复合数据类型一道为程序员提供了强大的面向对象工具包。在接下来的文章里,我们会进一步详细地讨论大多数常用的复杂数据类型及其可用操作。我们会首先从Java所特有的集合框架讲起。
【】【】【】【】
  《全国专业技术人员计算机应用能力考试标准教程―word&2003中文字处理》严格根据..
定价:¥39.50
优惠价:¥39.50
&&本书适合报考全国专业技术人员计算机应用能力考试“中文windows&xp操作系统”科目的..
定价:¥39.50
优惠价:¥39.50
????????????
????????????
         Copyright ©
() All Rights ReservedJava入门第一季
第1章 Java初体验
第2章 变量和常量
第3章 常用的运算符
第4章 流程控制语句
第5章 阶段练习
第6章 数组
第7章 方法
第8章 编程挑战
通常情况下,为了方便物品的存储,我们会规定每个盒子可以存放的物品种类,就好比在&放臭袜子的盒子&里我们是不会放&面包&的!同理,变量的存储也讲究&分门别类&!
Java 语言是一种强类型语言。通俗点说就是,在 Java 中存储的数据都是有类型的,而且必须在编译时就确定其类型。 Java 中有两类数据类型:
在 Java 的领域里,基本数据类型变量存的是数据本身,而引用类型变量存的是保存数据的空间地址。说白了,基本数据类型变量里存储的是直接放在抽屉里的东西,而引用数据类型变量里存储的是这个抽屉的钥匙,钥匙和抽屉一一对应。
常用的基本数据类型有:
你可能已经注意到了:
注:关于 float 型和 double 型的区别,以及 char 型和 String 型的不同,在 wiki 中有相关的总结,小伙伴们可以去查看哦~~
String&是一种常见的引用数据类型,用来表示字符串。在程序开发中,很多操作都要使用字符串来完成,例如系统中的用户名、密码、电子邮箱等。
PS:关于引用类型的其他小伙伴们,在后面课程中会详细讲到滴。
试试手气吧~!
下面的数据该使用哪种类型的变量进行保存呢?
姓名:爱慕课
中奖数字:18
价格:120.5
确认要关闭程序吗:true
请在编辑器中,指定第&3、4、5、6、7&行中变量的类型
?不会了怎么办
参考实现:
1、姓名为多个字符,可以使用 String 类型
2、性别为单个字符,可以使用 char 类型
3、中奖数字为整数,可以使用 int 类型
4、价格带有小数,可以使用 double 类型
5、&确定要关闭程序吗&的值为是或否,表示逻辑上的真或假,所以使用 boolean 类型
public class HelloWorld{
public static void main(String[] args) {
name=&爱慕课&;
sex='男';
price=120.5;
System.out.println(name);
System.out.println(sex);
System.out.println(num);
System.out.println(price);
System.out.println(isOK);
你发的评论可能会是问题?是否将他发到问答中
Copyright (C)
All Rights Reserved | 京ICP备 号-2
本次提问将花费2个积分
你的积分不足,无法发表
本次提问将花费2个积分
继续发表请点击 "确定"java复合数据类型则可以再分成基本数据类型的数据_百度知道
java复合数据类型则可以再分成基本数据类型的数据
我有更好的答案
全是对象,如果取得的是基本类型,对象取值,则分为了基本类型;如果仍是复合类型,再取值复合数据类型中最终肯定时基本数据类型呀~除了byet short int long float double char boolean之外,都是复合类型
除了byet short int long float double char boolean之外,都是复合类型。byet short int long float double char boolean这些基本类型可以和复合类型相互转换。别的复合类型都是貌似不可以,也没有必要啊!
Integer=&intDouble=&double你是想问这种能在复合类型和基本类型之间转化的吗
那String类型可以再分吗,可以分成什么类型的数据呢?
String 可以看成是很多char类型的数据组成的,但他们不是一回事的比如“abcd”可以看成是['a’,'b','c','d']
java数据类型就分为基本数据类型和复合型数据变量都不能再分了
其他类似问题
为您推荐:
数据类型的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 java中的数据类型 的文章

 

随机推荐