JAVA值类型和引用类型的区别
您好:Java中参数的传递方式有两种:传值和传引用。按值传递(call by value)表示方法接受的是调用者提供的值;按引用调用(call by reference)表示方法接受的是调用者提供的变量地址。传值,参数为基本类型时,是采用传值的方式,示例如下:传引用,一般参数为对象类型,示例如下:以上,供参考,希望对你有帮助!
Java里什么是引用类型?
最简答来说除了8中基本类型以外剩下的都是引用类型
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
原始类型封装类
boolean -->Boolean
char --->Character
byte -->Byte
short -->Short
int -->Integer
long -->Long
float -->Float
double -->Double
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。同时为了面向对象操作的一致性,这些基本类型都有相应的封装类型:Integer、Short、Long、Byte、Float、Double、Character等。
因为封装类型是对象,所以可以进行相应的很多对象能力函数操作,这样就可以提供很多基本类型难以完成的工作的完成和实现。
你可以通过以下方式来声明该类型。
int a,a为int类型的变量
char a,a为char类型的
String对象
1. 首先String不属于8种基本数据类型,String是一个对象。
因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。
2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;
3. String str=”punkll”;
String str=new String (“punkll”);的区别:
在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
看例1:
String s0=”punkll”;
String s1=”punkll”;
String s2=”punk” + “ll”;
System.out.println( s0==s1 );
System.out.println( s0==s2 );
结果为:
true
true
首先,我们要知结果为道Java会确保一个字符串常量只有一个拷贝。
因为例子中的s0和s1中的”punkll”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;而”punk”和”ll”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”punkll”的一个引用。
所以我们得出s0==s1==s2;
用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。
看例2:
String s0=”punkll”;
String s1=new String(”punkll”);
String s2=”punk” + new String(“ll”);
System.out.println( s0==s1 );
System.out.println( s0==s2 );
System.out.println( s1==s2 );
结果为:
false
false
false
例2中s0还是常量池中”punkll”的应用,s1因为无法在编译期确定,所以是运行时创建的新对象”punkll”的引用,s2因为有后半部分new String(“ll”)所以也无法在编译期确定,所以也是一个新创建对象”punkll”的应用;明白了这些也就知道为何得出此结果了。
Glide-缓存基础(caching-basics)
前几篇传送门: 原文传送门: 正文: 在了解完图片的加载、显示、处理之后,接下来继续研究优化。成功、高效加载图片的基本特性之一就是利用缓存。在本文,我们将会了解Glide的缓存机制的基础部分。 在设计一款Android应用的时候,一个好用的图片加载框架应该尝试最小化网路请求的次数。Glide也一样,Glide默认通过内存和磁盘缓存来避免不必要的网络请求。在后续的文章中我们会具体看看其实现细节。如果你已经迫不及待,随时可以查看这个 官方文档 : 对于现在,重要的是,所有的图片请求都会在内存和磁盘上建立缓存。缓存通常都是非常有用的,然而在某些情况下又不希望它这么做。在下一节,我们将学习如何在一次请求中改变Glide的缓存策略。 如果你使用过Glide,你注意到根本不需要为开启缓存做额外的事,它自然而然就实现了。然而,如果你知道某张图片改变非常快,那么你应该要避免某些缓存。 Glide提供了一些方法来调整内存和磁盘缓存策略,让我们先来看看内存缓存。 我们假设一种非常简单的情形:从网络上加载一张图片到ImageView上: 你已经注意到我们这里使用 .skipMemoryCache( true ) 来特地告诉Glide,让它跳过内存缓存。这意味着Glide不会将它放入到内存缓存当中。需要注意的是,这只是影响了内存缓存,Glide依然会使用磁盘缓存来避免额外的网络请求。 很容易理解的是,Glide是默认将所有的图片资源都加入到内存缓存中的。因此,没有必要专门去调用 .skipMemoryCache( false ) 这个方法。 提示:要注意的是,对于同一个图片链接,如果你初次请求的时候没有调用 .skipMemoryCache( true ) ,后面又调用了这个方法,那么它会被加入到内存缓存当中。当你想调整缓存策略的时候,确保你在请求同一个图片的时候保持策略统一。 基于你已经学习完上面的章节,你知道即使让 内存缓存 失效,图片请求依然会将图片存储在设备的磁盘上。如果你有一张图片,它指向同一个链接上,但是它改变得很快,那么你可能也不想让它存储在磁盘上。 你可以通过 .diskCacheStrategy() 方法改变Glide的 磁盘缓存策略 。与 .skipMemoryCache() 不同的是,它需要传入不同的枚举值,而不仅仅是布尔值。如果你想让磁盘缓存 失效 ,将 DiskCacheStrategy.NONE 作为参入传入即可: 这样的话,这张图片的一点磁盘缓存都不会有。然而,它默认会使用 内存缓存 。为了让两个缓存都失效,把它俩组合一下就好: 我们前面已经提到了,对于磁盘缓存,Glide不止一个选项。在知道有哪些选项之前,你要明白磁盘缓存是相当复杂的东西。例如,Picasso只是缓存完整图片。然而,Glide的缓存不仅缓存原图、完整的图片还有额外一些缩小的图片。 例如,如果你请求一张图片是1000 x 1000像素,然后你的ImageView是500 x 500像素,那么Glide会将这两个尺寸图片都缓存起来。 现在你应该明白磁盘缓存策略 diskCacheStrategy() 中,不同的枚举参数之间的区别了: 作为最后一个例子,如果你有一张图片,你知道会经常修改它并且会有各种不同的版本,那么把它指定为仅缓存原图是很有意义的。因此,我们可以使用 DiskCacheStrategy.SOURCE 来告诉Glide仅缓存原图即可: 由于Glide对于同一张图片可以采取不一样的的缓存方式,想要简单的清除某张图片的缓存不是一件容易的事。你需要找到这张图片所有的变体,然后针对性地让那个缓存失效。 这是一个相当繁琐的步骤, 官方文档 里讲解得非常清楚。 在本文,你学习了Glide缓存图片的基础知识,并且知道如何调整缓存策略。基于你的需求,在后续的博文里,我们将回到这个话题讲解更多高级的优化。然而,这篇文章已经提供了非常有效的方法让你可以好好地利用Glide的缓存了。 下周,我们将看看 良好的用户体验的另一个关键点:优先图片请求!
Java中的几种引用方式
Java中有几种不同的引用方式,它们分别是:强引用、软引用、弱引用和虚引用。下面,我们首先详细地了解下这几种引用方式的意义。强引用在此之前我们介绍的内容中所使用的引用都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。软引用(SoftReference)SoftReference 类的一个典型用途就是用于内存敏感的高速缓存。SoftReference 的原理是:在保持对对象的引用时保证在 JVM 报告内存不足情况之前将清除所有的软引用。关键之处在于,垃圾收集器在运行时可能会(也可能不会)释放软可及对象。对象是否被释放取决于垃圾收集器的算法 以及垃圾收集器运行时可用的内存数量。弱引用(WeakReference)WeakReference 类的一个典型用途就是规范化映射(canonicalized mapping)。另外,对于那些生存期相对较长而且重新创建的开销也不高的对象来说,弱引用也比较有用。关键之处在于,垃圾收集器运行时如果碰到了弱可及对象,将释放 WeakReference 引用的对象。然而,请注意,垃圾收集器可能要运行多次才能找到并释放弱可及对象。虚引用(PhantomReference)PhantomReference 类只能用于跟踪对被引用对象即将进行的收集。同样,它还能用于执行 pre-mortem 清除操作。PhantomReference 必须与 ReferenceQueue 类一起使用。需要 ReferenceQueue 是因为它能够充当通知机制。当垃圾收集器确定了某个对象是虚可及对象时,PhantomReference 对象就被放在它的 ReferenceQueue 上。将 PhantomReference 对象放在 ReferenceQueue 上也就是一个通知,表明 PhantomReference 对象引用的对象已经结束,可供收集了。这使您能够刚好在对象占用的内存被回收之前采取行动。Reference与ReferenceQueue的配合使用。GC、Reference与ReferenceQueue的交互A、 GC无法删除存在强引用的对象的内存。B、 GC发现一个只有软引用的对象内存,那么:① SoftReference对象的referent 域被设置为null,从而使该对象不再引用heap对象。② SoftReference引用过的heap对象被声明为finalizable。③ 当heap 对象的 finalize() 方法被运行而且该对象占用的内存被释放,SoftReference 对象就被添加到它的 ReferenceQueue(如果后者存在的话)。C、 GC发现一个只有弱引用的对象内存,那么:① WeakReference对象的referent域被设置为null,从而使该对象不再引用heap对象。② WeakReference引用过的heap对象被声明为finalizable。③ 当heap对象的finalize()方法被运行而且该对象占用的内存被释放时,WeakReference对象就被添加到它的ReferenceQueue(如果后者存在的话)。D、 GC发现一个只有虚引用的对象内存,那么:① PhantomReference引用过的heap对象被声明为finalizable。② PhantomReference在堆对象被释放之前就被添加到它的ReferenceQueue。值得注意的地方有以下几点:1、GC在一般情况下不会发现软引用的内存对象,只有在内存明显不足的时候才会发现并释放软引用对象的内存。2、GC对弱引用的发现和释放也不是立即的,有时需要重复几次GC,才会发现并释放弱引用的内存对象。3、软引用和弱引用在添加到ReferenceQueue的时候,其指向真实内存的引用已经被置为空了,相关的内存也已经被释放掉了。而虚引用在添加到ReferenceQueue的时候,内存还没有释放,仍然可以对其进行访问。
java中引用是什么??
关于java中的引用 我觉得在"think in java"这本书里面讲得很好 在那本书里 他们把引用叫做"句柄"(Handle)
java中就是用"句柄"来操纵对象的
在java中 任何东西都可以看作是对象 因此,我们可采用一种统一的语法,任何地方均可照搬不误。但要注意,尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“句柄”(Handle)。在其他Java参考书里,还可看到有的人将其称作一个“引用”,甚至一个“指针”。可将这一情形想象成用遥控板(句柄)操纵电视机(对象)。只要握住这个遥控板,就相当于掌握了与电视机连接的通道。但一旦需要“换频道”或者“关小声音”,我们实际操纵的是遥控板(句柄),再由遥控板自己操纵电视机(对象)。如果要在房间里四处走走,并想保持对电视机的控制,那么手上拿着的是遥控板,而非电视机。
此外,即使没有电视机,遥控板亦可独立存在。也就是说,只是由于拥有一个句柄,并不表示必须有一个对象同它连接。