-
2019-06-29 09:45:37
关于String为值类型还是引用类型的讨论一直没有平息,最近一直在研究性能方面的问题,今天再次将此问题进行一次明确。希望能给大家带来点帮助。 如果有错误请指出。
来看下面例子:
复制代码
复制代码
//值类型
int a = 1;
int b = a;
a = 2;
Console.WriteLine(“a is {0},b is {1}”, a, b);//字符串
string str1 = “ab”;
string str2 = str1;
str1 = “abc”;
Console.WriteLine(“str1 is {0},str2 is {1}”, str1, str2);
Console.Read();
复制代码
复制代码
根据上面的例子:你觉得输出结果应该是什么?输出结果:
//结果:
//a is 2,b is 1
//str1 is abc,str2 is ab
str2依然是ab,并没有随str1的改变而改变。如果string是引用类型,按理Str1和Str指针都指向同一内存地址,如果Str的内容发生改变,Str1应该也会相应变化。
此例子,看着string更像是值类型。
但是MSDN却说String是引用类型,
引用类型包括:
String所有数组,即使其元素是值类型
类类型,如 Form
委托
查看具体引用是否相同
如果Net能够查看内存地址就容易了,但不允许,只能通过间接方法来实现,看下面:
复制代码
复制代码
static void TestRefAddress()
{
String str1 = “abc”;
String str2 = “abc”;
int a = 1;
int b = 1;
StringBuilder strb1 = new StringBuilder(“abc”);
StringBuilder strb2 = new StringBuilder(“abc”);
Console.WriteLine("Reference equal for string: " + Object.ReferenceEquals(str1, str2)); //结果true
Console.WriteLine("Reference equal for int: " + Object.ReferenceEquals(a, b)); //结果false
Console.WriteLine("Reference equal for StringBuilder: " + Object.ReferenceEquals(strb1, strb2)); //结果false
Console.WriteLine("Value equal for string: " + str1.Equals(str2)); //结果true,类似于值类型
Console.Read();
}
复制代码
复制代码
结果为何出现如此情况,分析如下:复制代码
Console.WriteLine("Reference equal for string: " + Object.ReferenceEquals(str1, str2)); //结果true,不同对象,但引用地址相同
Console.WriteLine("Reference equal for int: " + Object.ReferenceEquals(a, b)); //结果false,值类型装箱操作造成
Console.WriteLine("Reference equal for StringBuilder: " + Object.ReferenceEquals(strb1, strb2)); //结果false,不同对象,引用地址不同
Console.WriteLine("Value equal for string: " + str1.Equals(str2)); //结果true,类似于值类型
复制代码
由第一条结果,可以判定不同的String的,相同的值,其引用地址相同,再由第四条结果,str1.Equals(str2),两者结合,可得出结论,两个String,如果赋值为同一个值,在内存中只有一个字符串存在,两个引用的地址相同。由此引出String的不变性。String的不变性
string最为显著的一个特点就是它具有恒定不变性:我们一旦创建了一个string,在managed heap 上为他分配了一块连续的内存空间,我们将不能以任何方式对这个string进行修改使之变长、变短、改变格式。所有对这个string进行各项操作(比如调用ToUpper获得大写格式的string)而返回的string,实际上另一个重新创建的string,其本身并不会产生任何变化。
string 对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。有的时候看来似乎修改了,实际是string经过了特殊处理,每次改变值时都会建立一个新的string对象,变量会指向这个新的对象,而原来的还是指向原来的对象,所以不会改变。这也是string效率低下的原因。String的不变,并非说string不能改变,而是其值不能改变。
在例子中str1=“ab”,这时在内存中就将“ab”存下来,如果再创建字符串对象,其值也等于“ab”,str2=“ab”,则并非再重新分配内存空间,而是将之前保存的“ab”的地址赋给str2的引用,这就能印证例子2中的结果。而当str1="abc"其值发生改变时,这时检查内存,发现不存在此字符串,则重新分配内存空间,存储“abc”,并将其地址赋给str1,而str2依然指向“ab”的地址。可以印证例子1中的结果。
结论:
String是引用类型,只是编译器对其做了特殊处理(使其和基本数据类型一样)。
更多相关内容 -
理解Java自定义类作为数据类型——引用数据类型
2020-01-11 20:01:48前言:Java的数据类型按照类型可分为基本数据类型(byte、short、int、long、double、float、char、boolean)和引用数据类型(类(class)、接口(interface)、数组(array)),8种基本数据类型相信只要接触过Java就...目录
-
说在前面的话
前言:Java的数据类型按照类型可分为基本数据类型(byte、short、int、long、double、float、char、boolean)和引用数据类型(类(class)、接口(interface)、数组(array)),8种基本数据类型相信只要接触过Java就比较熟悉。而对于引用数据类型相对来说比较陌生,下边会对引用数据类型中的类(class)做一个比较浅显的介绍,这也是由于我自己在学习的过程中碰见了问题,难以理解之后查阅了相关资料稍微理解了一点儿,希望能学习过程中不理解这块的同道中人提供一些可借鉴的地方!!!
-
复现问题
下面是我写的两个类,描述问题:可以看到类B的第二个属性被定义为private A a;显然是用了第一个自定义的类 作为数据类型,当我看到这一步我有点儿懵了,经过网上阅读博客借鉴加上自身理解,故有此篇博文!
public class A { private int age; private String name; …… }
public class B { private int score; private A a; …… }
-
引用数据类型的理解
引用类型指向一个对象,不是原始值,指向对象的变量是引用变量,那么引用数据类型相较于基本数据类型,与基本数据类型有哪些区别或是特性?我们不妨可以通过一个客户存钱与取钱的例子进行解释:
Accout类:定义了账号、余额私有属性,定义构造方法对属性进行赋值的同时提供了对应的get/set方法。此外提供取款withdraw()方法以及存款deposit()方法进行相关操作。
public class Account { private int id;//账号 private double balance;//余额 public Account(int id, double balance) {//构造方法 this.id = id; this.balance = balance; } public int getId() { return id; } public void setId(int id) { this.id = id; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } public void withdraw(double amount) {//取款 if (balance >= amount) { balance -= amount; System.out.println("取款成功:" + amount + "元," + "账户余额为:" + this.getBalance() + "元"); } else { System.out.println("取款失败"); } } public void deposit(double amount) {//存款 if(amount > 0) { balance += amount; System.out.println("存款成功:" + amount + "元," + "账户余额为:" + this.getBalance() + "元"); } else { System.out.println("存款失败"); } } }
Customer类:定义了name私有属性,使用Java自定义类Account作为属性数据类型(重复上文提到的:引用类型指向一个对象,不是原始值,指向对象的变量是引用变量),是否可以理解为Customer类中属性是包含Account类的,private Account account是否可以说是定义了Account类的一个对象,正如灯管和灯泡,灯管中必定是包含着灯泡的。
public class Customer { private String name;//姓名 private Account account;//账单,引用数据类型,与String类型进行比较,String[] string = new String[10]; public Customer(String name) {//构造方法 this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Account getAccount() { return account; } public void setAccount(Account account) { this.account = account; } }
CustomerTest类:测试类,我们先定义了Customer类的一个对象并通过构造方法赋值,接着定义了Account类的一个对象并赋值,比较重要的一步是如何将账户信息与客户之间建立联系,我们在Customer类中提供了account属性的set方法,可以将我们定义的Account类的对象作为参数调用Customer类对象的setAccoount()方法,这样我们就使得客户有了自己的账户信息,这也就是类作为引用数据类型的一个作用。
public class CustomerTest { public static void main(String[] args) { Customer customer = new Customer("haitao");//创建用户对象customer Account account = new Account(1000, 2020);//创建账单对象 customer.setAccount(account);//实现客户与账单的联系 System.out.println("当前客户ID:" + account.getId() + ",账户余额为:"+ account.getBalance() + "元"); System.out.println("**********************************"); customer.getAccount().deposit(100);//存款 customer.getAccount().withdraw(960);//取款 } }
在eclipse中运行程序,我们将会看到以下的结果:
-
总结
我们可以看到Java自定义类作为数据类型的一个作用,可以使得两个类之间能够建立起联系,博文只是简单的从表面上进行了类作为引用数据类型的一些介绍,并没有进行更加深入细致的详解,毕竟我本人也就是一个初学者,自己的理解也没有大牛那么深刻,可能在一些细节的表述有出入不恰当,欢迎大家指正共同进步,希望对大家有所帮助!
-
-
基本数据类型和引用数据类型的区别
2020-11-15 11:30:26基本数据类型和引用数据类型的区别 Java中的数据类型分为两大类,基本数据类型和引用数据类型。 一、基本数据类型 基本数据类型只有8种,可按照如下分类 ①整数类型:long、int、short、byte ②浮点类型:float、...基本数据类型和引用数据类型的区别
Java中的数据类型分为两大类,基本数据类型和引用数据类型。
一、基本数据类型
基本数据类型只有8种,可按照如下分类
①整数类型:long、int、short、byte
②浮点类型:float、double
③字符类型:char
④布尔类型:boolean2、引用数据类型
引用数据类型非常多,大致包括:
类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型
例如,String类型就是引用类型。
简单来说,所有的非基本数据类型都是引用数据类型。
1. 基本数据类型的值是不可变的
任何方法都无法改变一个基本类型的值,比如一个字符串:var name = "change"; name.substr(1);//hange console.log(name);//change var s = "hello"; s.toUpperCase()//HELLO; console.log(s)//hello
通过这两个例子,我们会发现原先定义的变量name的值始终没有发生改变,而调用substr()和toUpperCase()方法后返回的是一个新的字符串,跟原先定义的变量name并没有关系
或许有人会有以下的疑问,看代码:
var name = "change"; name = "change1"; console.log(name)//change1
这样看起来name的值“改变了”
其实,var name = “change”,这里的基础类型是string,也就是"change",这里的"change"是不可以改变的,name只是指向"change"的一个指针,指针的指向可以改变,所以你可以name = “change1”.此时name指向了"change1",同理,这里的"change1"同样不可以改变也就是说这里你认为的改变只是“指针的指向改变”
这里的基础类型指的是"change",而不是name,要区分清楚
2. 基本数据类型不可以添加属性和方法var p = "change"; p.age = 29; p.method = function(){console.log(name)}; console.log(p.age)//undefined console.log(p.method)//undefined
通过上面的代码,我们知道不能给基本类型添加属性和方法,也再次说明基本类型是不可变的
3. 基本数据类型的赋值是简单赋值
如果从一个变量向另一个变量赋值基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上var a = 10; var b = a; a++; console.log(a)//11 console.log(b)//10
上面的代码中,a中保存的值是10.当使用a的值来初始化b时,b中也保存了值10.但b中的10和a中的10是完全独立的.b中的值知识a中值的一个副本.所以这两个变量可以参与任何操作而不会相互影响.如下图:
4. 基本数据类型的比较是值的比较
var person1 = '{}'; var person2 = '{}'; console.log(person1 == person2); // true
5. 基本数据类型是存放在栈区的
假如有以下几个基本类型的变量:var name = "jozo"; var city = "guangzhou"; var age = 22;
那么它的存储结构如下图:
栈区包括了变量的标识符和变量的值
**js引用类型:
**
js中除了上面的基本类型之外就是引用类型了,也可以说就是对象了,比如:Object,Array,Function,Data等1. 引用类型的值是可以改变的
var o = {x:1}; o.x = 2;//通过修改对象属性值更改对象 o.y = 3;再次更改对象,给它增加一个属性 var a = [1,2,3]; a[0] = 0;//更改数组的一个元素 a[3] = 4;//给数组增加一个元素
2. 引用类型可以添加属性和方法
var person = {}; person.name = "change"; person.say = function(){alert("hello");} console.log(person.name)//change console.log(person.say)//function(){alert("hello");}
3. 引用类型的赋值是对象引用
var a = {}; var b= a; a.name = "change"; console.log(a.name)//change; console.log(b.name)//change b.age = 29; console.log(a.age)//29 console.log(b.age)//29
当从一个变量向另一个变量赋值引用类型的值时,同样也会将储存在变量中的对象的值复制一份放到为新变量分配的空间中.引用类型保存在变量中的是对象在堆内存中的地址,所以,与基本数据类型的简单赋值不同,这个值的副本实际上是一个指针,而这个指针指向存储在堆内存的一个对象.那么赋值操作后,两个变量都保存了同一个对象地址,而这两个地址指向了同一个对象.因此,改变其中任何一个变量,都会互相影响
他们的关系如下图
因此,引用类型的赋值其实是对象保存在栈区地址指针的赋值,所以两个变量指向同一个对象,任何的操作都会互相影响.
4. 引用类型的比较是引用的比较
var person1 = {}; var person2 = {}; console.log(person1 == person2)//false
为什么两个对象看起来一摸一样,但是却不相等呢?
因为引用类型的比较是引用的比较,换句话说,就是比较两个对象保存在栈区的指向堆内存的地址是否相同,此时,虽然p1和p2看起来都是一个"{}",但是他们保存在栈区中的指向堆内存的地址却是不同的,所以两个对象不相等
基本数据类型和引用类型的区别详解
javascript
发布于 2017-02-24
前两天看到kraaas大神的关于基本数据类型和引用类型的区别的文章觉得写得非常不错,就想着在其基础上加上自己平时看到的一些知识点和理解,所以就有了以下的文章js基本数据类型:
js基本数据类型包括:undefined,null,number,boolean,string.基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值- 基本数据类型的值是不可变的
任何方法都无法改变一个基本类型的值,比如一个字符串:
var name = “change”;
name.substr(1);//hange
console.log(name);//changevar s = “hello”;
s.toUpperCase()//HELLO;
console.log(s)//hello
通过这两个例子,我们会发现原先定义的变量name的值始终没有发生改变,而调用substr()和toUpperCase()方法后返回的是一个新的字符串,跟原先定义的变量name并没有关系或许有人会有以下的疑问,看代码:
var name = “change”;
name = “change1”;
console.log(name)//change1
这样看起来name的值“改变了”
其实,var name = “change”,这里的基础类型是string,也就是"change",这里的"change"是不可以改变的,name只是指向"change"的一个指针,指针的指向可以改变,所以你可以name = “change1”.此时name指向了"change1",同理,这里的"change1"同样不可以改变也就是说这里你认为的改变只是“指针的指向改变”
这里的基础类型指的是"change",而不是name,要区分清楚
-
基本数据类型不可以添加属性和方法
var p = “change”;
p.age = 29;
p.method = function(){console.log(name)};
console.log(p.age)//undefined
console.log(p.method)//undefined
通过上面的代码,我们知道不能给基本类型添加属性和方法,也再次说明基本类型是不可变的 -
基本数据类型的赋值是简单赋值
如果从一个变量向另一个变量赋值基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上
var a = 10;
var b = a;
a++;
console.log(a)//11
console.log(b)//10
上面的代码中,a中保存的值是10.当使用a的值来初始化b时,b中也保存了值10.但b中的10和a中的10是完全独立的.b中的值知识a中值的一个副本.所以这两个变量可以参与任何操作而不会相互影响.如下图:图片描述
- 基本数据类型的比较是值的比较
var person1 = ‘{}’;
var person2 = ‘{}’;
console.log(person1 == person2); // true - 基本数据类型是存放在栈区的
假如有以下几个基本类型的变量:
var name = “jozo”;
var city = “guangzhou”;
var age = 22;
那么它的存储结构如下图:图片描述
栈区包括了变量的标识符和变量的值
js引用类型:
js中除了上面的基本类型之外就是引用类型了,也可以说就是对象了,比如:Object,Array,Function,Data等- 引用类型的值是可以改变的
var o = {x:1};
o.x = 2;//通过修改对象属性值更改对象
o.y = 3;再次更改对象,给它增加一个属性
var a = [1,2,3];
a[0] = 0;//更改数组的一个元素
a[3] = 4;//给数组增加一个元素
2. 引用类型可以添加属性和方法
var person = {};
person.name = “change”;
person.say = function(){alert(“hello”);}
console.log(person.name)//change
console.log(person.say)//function(){alert(“hello”);}
3. 引用类型的赋值是对象引用
先看以下代码:var a = {}; var b= a; a.name = "change"; console.log(a.name)//change; console.log(b.name)//change b.age = 29; console.log(a.age)//29 console.log(b.age)//29
当从一个变量向另一个变量赋值引用类型的值时,同样也会将储存在变量中的对象的值复制一份放到为新变量分配的空间中.引用类型保存在变量中的是对象在堆内存中的地址,所以,与基本数据类型的简单赋值不同,这个值的副本实际上是一个指针,而这个指针指向存储在堆内存的一个对象.那么赋值操作后,两个变量都保存了同一个对象地址,而这两个地址指向了同一个对象.因此,改变其中任何一个变量,都会互相影响
他们的关系如下图:
图片描述因此,引用类型的赋值其实是对象保存在栈区地址指针的赋值,所以两个变量指向同一个对象,任何的操作都会互相影响.
- 引用类型的比较是引用的比较
var person1 = {}; var person2 = {};
console.log(person1 == person2)//false
为什么两个对象看起来一摸一样,但是却不相等呢?因为引用类型的比较是引用的比较,换句话说,就是比较两个对象保存在栈区的指向堆内存的地址是否相同,此时,虽然p1和p2看起来都是一个"{}",但是他们保存在栈区中的指向堆内存的地址却是不同的,所以两个对象不相等
图片描述5. 引用类型是同时保存在栈区和堆区中的
引用类型的存储需要在内存的栈区和堆区共同完成,栈区保存变量标识符和指向堆内存的地址假如有以下几个对象:
基本包装类型(包装对象):
先看下以下代码:var s1 = "helloworld"; var s2 = s1.substr(4);
上面我们说到字符串是基本数据类型,不应该有方法,那为什么这里s1可以调用substr()呢?
通过翻阅js权威指南第3.6章节和高级程序设计第5.6章节我们得知,ECMAScript还提供了三个特殊的引用类型Boolean,String,Number.我们称这三个特殊的引用类型为基本包装类型,也叫包装对象.
也就是说当读取string,boolean和number这三个基本数据类型的时候,后台就会创建一个对应的基本包装类型对象,从而让我们能够调用一些方法来操作这些数据.
所以当第二行代码访问s1的时候,后台会自动完成下列操作:
创建String类型的一个实例;// var s1 = new String(“helloworld”);
在实例上调用指定方法;// var s2 = s1.substr(4);
销毁这个实例;// s1 = null;
正因为有第三步这个销毁的动作,所以你应该能够明白为什么基本数据类型不可以添加属性和方法,这也正是基本装包类型和引用类型主要区别:对象的生存期.使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都是一直保存在内存中.而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。 - 基本数据类型的值是不可变的
-
java中引用数据类型有哪些?
2016-07-18 09:45:37Java中有俩种数据类型,其中主要有8中基本数据类型和引用数据类型,除了8中基本数据类型以外都是引用数据类型,8中基本数据类型分别是byte,short,int,long,char,boolean,float,double,具体如下:1、boolean:数据值...Java中有俩种数据类型,其中主要有8中基本数据类型和引用数据类型,除了8中基本数据类型以外都是引用数据类型,8中基本数据类型分别是byte,short,int,long,char,boolean,float,double,具体如下:
1、boolean:数据值只有true或false,适用于逻辑计算。
2、char:char型(字符型)数据在内存中占用2个字节。char型数据用来表示通常意义上的字符,每个字符占2个字节,Java字符采用Unicode编码,它的前128字节编码与ASCII兼容字符的存储范围在\u0000~\uFFFF,在定义字符型的数据时候要注意加' ',比如 '1'表示字符'1'而不是数值1,
3、byte:byte型(字节型)数据在内存中占用1个字节,表示的存储数据范围为:-128~127。
4、short:short型(短整型)数据在内存中占用2个字节。
5、int:int型(整型)数据在内存中占用4个字节。
6、long:long型(长整型)数据在内存中占用8个字节。
7、float:float型(单精度浮点型)数据在内存中占用4个字节。(float精度为7-8位)
8、double:double型(双精度浮点型)数据在内存中占用8个字节。
下面说说java中引用数据类型:
引用数据类型分3种:类,接口,数组;
一、类Class引用
可以是我们创建的,这里我不多讲,主要是讲解几个java库中的类
Object :Object是一个很重要的类,Object是类层次结构的根类,每个类都使用Object作为超类,所有对象(包括数组)都实现这个类的方法。用Object可以定义所有的类
如:
Object object= new Integer(1); 来定义一个Interger类
Integer i=(Integer) object; 在来把这个Object强制转换成Interger类
String :String类代表字符串,Java 程序中的所有字符串字面值(如"abc")都作为此类的实例来实现。检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本、在该副本中、所有的字符都被转换为大写或小写形式。
Date :Date表示特定的瞬间,精确到毫秒。Date的类一般现在都被Calendar 和GregorianCalendar所有代替
Void :Void 类是一个不可实例化的占位符类,它保持一个对代表 Java 关键字 void 的 Class 对象的引用。
同时也有对应的Class如:Integer Long Boolean Byte Character Double Float Short二、接口interface引用
可以是我们创建的,这里我不多讲,主要是讲解几个java库中的接口interface
List<E>:列表 ,此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引 (在列表中的位置)访问元素,并搜索列表中的元素。List 接口提供了两种搜索指定对象的方法。从性能的观点来看,应该小心使用这些方法。在很多实现中,它们将执行高开销的线性搜索。 List 接口提供了两 种在列表的任意位置高效插入和移除多个元素的方法。
add() : 在列表的插入指定元素。
remove():移除列表中指定位置的元素。
get(int index):返回列表中指定位置的元素。
Map<K,V>:
K - 此映射所维护的键的类型
V - 映射值的类型 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
put(K key,V value):将指定的值与此映射中的指定键关联(可选操作)。如果此映射以前包含一个该键的映射关系,则用指定值替换旧值(当且仅当,返回 true 时,才能说映射 m 包含键 k 的映射关系)。 remove(Object key)如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。更确切地讲,如果此 映射包含从满足(key==null ? k==null :key.equals(k))的键 k 到值 v 的映射关系,则移除该映射关系。(该映射最多只能包含一个这样的映射关系.) get(Object key):返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
这里我们主要是用String List Map Object 是最常用Number ArrayList<E> Arrays等三、数组引用
数组:存储在一个连续的内存块中的相同数据类型(引用数据类型)的元素集合。
数组中的每一个数据称之为数组元素,数组中的元素以索引来表示其存放的位置,索引(下标)从0开始。
数组的定义
第一种方式:类型[] 数组名; 如 int[] nums;
第二种方式:类型数组名[]; 如 int nums[];
大多数Java程序员喜欢使用第一种风格,因为它把数据类型int[],和变量名num分开了.
数组的初始化
Java中数组必先初始化后才能使用.
初始化就是给数组元素分配内存,并为每个元素赋初始值。
初始化数组的两种方式:
- 静态初始化:
语法格式:类型[] 数组名 = new 数组类型[]{元素1,元素2,元素3,...元素n};
简化语法:类型[] 数组名 = {元素1,元素2,元素3...元素n};
- 动态初始化:
如果我们事先不知道数组里存储哪些数据,只知道需要存储数据的个数,此时可以使用动态初始化方式。
动态初始化:初始化时由我们指定数组的长度,系统自动为数组元素分配初始值。
格式:类型[] 数组名 = new 数组类型[数组长度];
注意:无论,以哪种方式初始化数组,一旦初始化完成,数组的长度就固定了,不能改变,除非重新初始化。也就是说数组是定长的。为什么Java里有基本数据类型和引用数据类型?
引用类型在堆里,基本类型在栈里。
栈空间小且连续,往往会被放在缓存。引用类型cache miss率高且要多一次解引用。
对象还要再多储存一个对象头,对基本数据类型来说空间浪费率太高
-
Java基本数据类型和引用类型的区别
2020-08-27 23:30:52新语言Kotlin已经抛弃了Java里的基本数据类型,而是采用引用类型去声明一个变量,那么怎么区分基本数据类型和引用类型呢? 文字概念 基本数据类型:byte、short、int、long、float、double、char、boolean引用类型:... -
JavaScript中基本数据类型和引用数据类型的区别
2018-01-06 11:09:531、基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型。 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象。 当我们把变量赋值给一个变量时... -
Java数据类型之引用型数据类型
2018-06-26 23:33:29我们接着来说数据类型,上一次我们提到了java中的八种数据类型,没有涉及到引用类型,而java的引用类型只有三种,分别是类(class)、接口(interface)、数组。如下图所示 Java把内存分成两种,一种叫做栈内存,一种... -
Java 数据类型(基本数据类型、引用数据类型)
2013-12-11 23:40:11Java 数据类型(基本数据类型、引用数据类型) 简单的介绍 -
数据类型(基本数据类型、引用数据类型)以及堆和栈的区别
2018-07-26 12:55:41js数据类型:基本数据类型和引用数据类型(文章最下面会介绍各类型的基础以及注意事项) 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象 当我们把变量赋值给一个变量时,解析器首先要确认... -
(面试)基本数据类型与引用数据类型的区别
2019-07-19 10:00:57声明引用数据类型(数组或对象),会将实际的数据存放在堆内存中,同时,在栈内存中声明一个数组名或对象名, 存放着在堆内存中的首地址; 所以,当使用数组名赋值时,传递的是地址。总的来说,引用数据类型传的是... -
五、引用数据类型——数组的使用
2018-04-17 21:24:51在之前的学习我们知道八大基本数据类,而我们现在学习的引用数据类型,这里大家先记住引用数据类型,稍后补充。举个例子,我们现在有个需求,想统计每个班级同学的成绩,一个年级有5个班级,每个班级40人,这时候... -
c语言引用数组元素时其数组下标的允许的数据类型是什么
2021-05-20 06:25:32c语言引用数组元素时其数组下标的允许的数据类型是什么发布时间:2020-07-30 11:56:52来源:亿速云阅读:621作者:Leahc语言引用数组元素时其数组下标的允许的数据类型是什么?很多新手对此不是很清楚,为了帮助大家... -
JS基本数据类型和引用数据类型的区别
2015-10-20 13:03:58基本类型和引用类型 ECMAScript包含两个不同类型的值:基本类型值和引用类型值。...常见的五种基本数据类型是: Undifined、Null、Boolean、Number和String。这五种基本数据类型可以直接操作保存在变量中的实际值。 -
java基本数据类型传递与引用传递区别详解
2016-04-19 17:12:57java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题,首先我们必须认识到这个问题一般是相对函数而言的,也就是java中的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给... -
JAVA中的基本数据类型和引用基本类型区别
2018-03-28 14:14:18说明: 1:好记性,不如写博客 2:静下心来丢掉手机不做低头族 3:开始学习以及复习Android第一节课 4:本章资料取决于Java编程思想(第4版)第一阶段:JAVA面向对象编程 JAVA基本数据类型和引用数据类型 基本数据... -
Java的四种引用类型有哪些?
2021-02-12 11:01:54学过Java的人们都知道,Java的类型一般有两种,一种是基本数据类型,另一种是引用数据类型。其中,基本数据类型的值通常储存与栈内存,用于对该类型的对象进行存储;而引用数据类型则在存储堆中对需要引用的对象进行... -
JavaScript数据类型 - Null类型
2020-08-28 11:50:17Null 类型是第二个只有一个值的数据类型,这个特殊的值就是null。从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof检测null值时返回object的原因,如下所示: var car = null; console.log(typeof... -
Java 数据类型及其判断
2021-03-05 17:34:31一、Java中的数据类型,可分为两类:1....2.引用数据类型:JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较变量(栈)内存中存放的对象的(堆... -
java中引用类型的数据传递的是内存地址
2018-03-25 22:27:26java中引用类型的数据,传递的是内存地址,像类,数组,接口,String等等都是引用类型!看下面的代码和截图!public class Test2 { // java中引用类型的数据传递的是内存地址 private Map<String, Student&... -
Java的引用数据类型及应用
2016-04-15 10:59:17Java的数据类型基本数据类型和引用数据类型的区别和联系:一、从概念方面来说基本数据类型:变量名指向具体的数值 引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值二、从内存构建方面来说基本数据... -
JS数据类型之基本数据类型
2019-06-28 16:46:431.JavaScript(以下简称js)的数据类型分为两种:原始类型(即基本数据类型)和对象类型(即引用数据类型); 2.js常用的基本数据类型包括undefined、null、number、boolean、string; 3.js的引用数据类型也就是... -
Java数据类型总结:基本类型、引用类型
2017-03-03 17:26:24java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为变量的初始化。 1. Java的简单类型及其封装器类 Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值... -
基本数据类型引用传递参数和引用类型传递参数的区别
2018-08-03 11:51:48java中数据类型分两种:基本数据类型和引用数据类型 基本数据类型有:整型类型的数据(byte、short 、int 、long )浮点型、字符型、布尔型 byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值... -
java基础之----基本数据类型和引用数据类型的参数传递过程(一)
2016-07-04 18:57:25Java中没有指针,没有引用传递了,仅仅有值传递。但是可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能。 值传递:方法调用时,实际参数把它的值传递给对应的... -
java中的基本数据类型和引用类型在JVM中存储在哪?
2018-09-29 22:45:14基本数据类型是放在栈中还是放在堆中,这取决于基本类型在何处声明,下面对数据类型在内存中的存储问题来解释一下: 一:在方法中声明的变量,即该变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个... -
python的可变与不可变数据类型
2020-12-08 20:22:47用一句话来概括上述过程就是:“python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来... -
Java中的四种引用类型是哪些?
2020-07-01 23:10:51从一开始学习Java我们就知道Java的数据类型一般有两种,一种是基本数据类型,另一种是引用数据类型。其中,基本数据类型的值通常储存在栈内存中,用于对该类型的对象进行存储;而引用数据类型则在存储堆中对需要引用... -
为什么集合中不能放入基本数据类型?
2019-09-29 19:19:25集合中使用泛型,所以只能放如引用数据类型,不能放入基本数据类型 使用ava泛型应该注意如下几点: ①在定义一个泛型类时,在“<>”之间定义形式类型参数,例如:“class TestGen<K,V>”,其中“K”,...