当前位置:首页 » 硬盘大全 » java缓存实例的不可变类
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

java缓存实例的不可变类

发布时间: 2022-05-06 02:11:18

❶ JAVA中不可变类的应用

其实所谓的不变类只不过是在有更改值到操作时new一个新的实例并返回而已。
你的表述很不清楚,看程序字面,我估计你要的是这3个类。

/**TestClass.java**/
public interface TestClass {
public TestClass plus(int i);
public int getValue();
}

/**MutableClass.java**/
public class MutableClass implements TestClass {
int value;
public MutableClass(int i){
value=i;
}
public int getValue() {
return value;
}
public MutableClass plus(int i) {
value+=i;
return this;
}
}

/**ImmutableClass.java**/
public final class ImmutableClass implements TestClass{
int value;
public ImmutableClass(int i){
value=i;
}
public int getValue() {
return value;
}
public ImmutableClass plus(int i) {
ImmutableClass newtable=new ImmutableClass(value+i);
return newtable;
}
}

❷ java编程 这个类是不可变类吗如果不是,给出修改代码(审题)

A是可变类
不可变类特征:
1:所有成员都是 private final 标识
2:不提供对成员的改变方法
3:确保所有的方法不会被重载
4:如果某一个类成员不是基本类型(primitive type)或不可变类,必须通过在成员初始化(in)或者getter方法(out)时通过深度拷贝(即复制一个该类的新实例而非引用)方法,来确保类的不可变。

❸ 学习java se注重的只是点是哪些,最难学的知识点有哪些呢

1. 基本数据类型
整形:
byte 1 个字节
short 2 个字节
int 4个字节
long 8个字节
字符:
char 2个字节
浮点数:
float 4个字节
double 8个字节
布尔:
boolean 1个字节
2.java 7 新增二进制整数
以0b或者0B开头
3.java中字符时16位的Unicode编码方式,格式是'\uXXXX',其中xxxx代表一个十六进制整数
4.java中规定了正无穷大、负无穷大和零
正无穷大= 一个正数除以0
负无穷大= 一个负数除以零
0.0 除以0.0 或者 对一个负数开方 得到一个非数
5. 在java中布尔类型只能是true和false
6. 在java中没有多维数组
看似像c语言中的多维数组不是真正的数组,比如 a[3][4] , a[0] a[1] a[2] 是真实存在的,装的是地址,和c语言中动态分配为的数组一样
int [][] b = new int[3][4]
7. Java中带包的编译方法
javac -d . Hello.java 会在当前目录下生成目录树
运行 java 包名字.类名字
8. Java多态中的对象的filed 不具有多态性,如 父类 对象 = new 子类(), 对象.field 是调用的父类的,即使子类中覆盖了该字段。
9. instanceof 运算符
格式: 引用变量名 instanceof 类名(或者接口) 他用于判断前面的对象是否是后面对象的类,子类、实现类的实例,是返回true,否者返回false
10. Java 中基本数据类型和对应封装类之间的转化
int a = 1;
Integer A = new Integer(a);
a = A.intValue();
其他的类型也是这样的。
11.单例(singleton)类 例子
复制代码 代码如下:

class Singleton
{
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance()
{
if(instance == null)
{
instance = new Singleton();
}
return instance;
}

public static void main(String[] args)
{
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);
}
}

12.final修饰的成员变量初始化问题

类Field: 必须在静态初始块中或声明该FIeld时指定初始值
实例Field:必须在非静态初始块中或声明该FIeld时指定初始值或构造器中声明
13.Final 变量必须显式初始化,系统不会对final变量进行隐式初始化
14.java会使用常量池来管理曾经用过的字符串直接常量,例如:String a = "java"; ,系统把常量字符串“java”存在常量池,当再次执行 String b = "java"; a == b 是true
15.final 方法不可以重写,final类不能被继承
如果用private 方法 和 final private 是一样的
若果是用final修饰的方法在子类中出现,那是子类新定义的,与父类没有关系
16.不可变类:创建后该类的Field是不可改变的。java提供了8个基本变量的包装类和string都是不可改变类。
17.缓存实例的不可改变类
复制代码 代码如下:

class CacheImmutale
{
private static int MAX_SIZE = 10;
private static CacheImmutale[] cache = new CacheImmutale[MAX_SIZE];
private static int pos = 0;
private final String name;
private CacheImmutale(String name)
{
this. name = name;
}
public String getName()
{
return name;
}
public static CacheImmutale valueOf(String name)
{
for(int i = 0; i < MAX_SIZE; ++i)
{
if(cache[i] != null && cache[i].getName().equals(name))
return cache[i];
}
if(pos == MAX_SIZE)
{
cache[0] = new CacheImmutale(name);
pos = 1;
}
else
{
cache[pos++] = new CacheImmutale(name);
}
return cache[pos -1];
}

public boolean equals(Object obj)
{
if(this == obj)
return true;
if(obj != null && obj.getClass() == CacheImmutale.class)
{
CacheImmutale ci = (CacheImmutale)obj;
return name.equals(ci.getName());
}
return false;
}
public int hashCode()
{
return name.hashCode();
}
}
public class CacheImmuteTest
{
public static void main(String[] args)
{
CacheImmutale c1 = CacheImmutale.valueOf("Hello");
CacheImmutale c2 = CacheImmutale.valueOf("Hello");
System.out.println(c1 == c2);
}
}

用缓存实例要看某个对象的使用频率,若重复使用那就利大于弊,若不经常使用那弊就大于利

还有java提供的java.lang.Integer 创建数值在-128-127之间的数采用缓存机制的
Integer in2 = Integer.valueOf(6);
Integer in3= Integer.valueOf(6);
in2 == in3 is true;
18. static 和 abstract 不能同时修饰一个方法,没有类抽象方法
19.一个类可以又一个父类,实现多个接口,接口中Filed是public 、static、final的,方法是public abstract的
20.非静态内部类的方法访问某个变量,搜索顺序为:先内部类中方法内-> 内部类 -> 外部类中如果都找不到则出现编译错误
复制代码 代码如下:

import java.util.*;

public class DiscernVariable
{
private String prop = "外部类的实例变量";
private class InClass
{
private String prop = "内部类的实例变量";
public void info()
{
String prop = "局部变量";
System.out.println("外部类的field值:" + DiscernVariable.this.prop);
System.out.println("内部类的field值:" + this.prop);
System.out.println("局部变量的值:" + prop);
}
}
public void test()
{
InClass in = new InClass();
in.info();
}
public static void main(String[] args)
{
new DiscernVariable().test();
}
}

21.非静态内部类不能有静态方法、静态Field、静态初始化块

22.在外部类之外访问内部类

访问非静态内部类:outclass.Inclass varname = new outclass().new InClass();
访问静态内部类: outclass.Inclass varname = new outclass.Inclass();

复制代码 代码如下:

import java.util.*;

class Out
{
class In
{
public In()
{
System.out.println("非静态内部类构造器");
}
}
}
public class CreatInnerInstance
{
public static void main(String[] args)
{
Out.In in = new Out().new In();
/*
以上的代码可分开写为:
Out.In in;
Out out = new Out();
in = out.new In();
*/
}
}
class SubClass extends Out.In
{
//显示定义SubClass的构造器
public SubClass(Out out)
{
//通过转入的Out对象显示调用In的构造器
out.super();
}
}

复制代码 代码如下:

import java.util.*;

class StaticOut
{
static class StaticIn
{
public StaticIn()
{
System.out.println("静态内部类构造器");
}
}
}
public class CreatStaticInnerInstance
{
public static void main(String[] args)
{
StaticOut.StaticIn in = new StaticOut.StaticIn();
/*
以上的代码可分开写为:
StaticOut.StaticIn in;
in = new StaticOut.StaticIn();
*/
}
}
class SubClass extends StaticOut.StaticIn
{
//无须创建内部类实例
}

❹ Java缓存实例中的不可变类

max_size 是定义一个常量,这里是数组的最大长度
当pos达到最大长度之后,仍没有找到, 则新建这个实例,放在0位置上,pos赋值为1,,
pos对应的数据,在数组中偏移为1 (pos++导致),返回的时候需要减1,
判断两个实例相等部分,如果类型相同并且名称也相同,则认定这两个对象相等。

❺ 如何创建不可变的Java类或对象

immutable Objects就是那些一旦被创建,它们的状态就不能被改变的Objects,每次对他们的改变都是产生了新的immutable的对象,而mutable Objects就是那些创建后,状态可以被改变的Objects.
举个例子:String和StringBuilder,String是immutable的,每次对于String对象的修改都将产生一个新的String对象,而原来的对象保持不变,而StringBuilder是mutable,因为每次对于它的对象的修改都作用于该对象本身,并没有产生新的对象。
但有的时候String的immutable特性也会引起安全问题,这就是密码应该存放在字符数组中而不是String中的原因!

immutable objects 比传统的mutable对象在多线程应用中更具有优势,它不仅能够保证对象的状态不被改变,而且还可以不使用锁机制就能被其他线程共享。

实际上JDK本身就自带了一些immutable类,比如String,Integer以及其他包装类。为什么说String是immutable的呢?比如:java.lang.String 的trim,uppercase,substring等方法,它们返回的都是新的String对象,而并不是直接修改原来的对象。

如何在Java中写出Immutable的类?

要写出这样的类,需要遵循以下几个原则:

1)immutable对象的状态在创建之后就不能发生改变,任何对它的改变都应该产生一个新的对象。

2)Immutable类的所有的属性都应该是final的。

3)对象必须被正确的创建,比如:对象引用在对象创建过程中不能泄露(leak)。

4)对象应该是final的,以此来限制子类继承父类,以避免子类改变了父类的immutable特性。

5)如果类中包含mutable类对象,那么返回给客户端的时候,返回该对象的一个拷贝,而不是该对象本身(该条可以归为第一条中的一个特例)

当然不完全遵守上面的原则也能够创建immutable的类,比如String的hashcode就不是final的,但它能保证每次调用它的值都是一致的,无论你多少次计算这个值,它都是一致的,因为这些值的是通过计算final的属性得来的!

❻ java中,什么叫不可更改的类(immutable class)

从字面意思来理解就是不会发生变化的类,那么是什么不会发生变化呢,其实就是类的状态,也就是不变类的实例一旦被创建,其状态就不会发生变化,举个例子:如果人是一个class,那么我们中的每一个都是人这个类的具体的instance,如果人这个类只有一个状态就是生身父母,那么它就是一个不变类,因为每一个人在出生的那一刹那,生身父母就已经被设置了值,而且终生都不会发生变化。
不变类有什么好处呢?

1) 不变类是线程安全的,由于不变类的状态在创建以后不再发生变化,所以它可以在线程之间共享,而不需要同步。

2) 不变类的instance可以被reuse

创建类的实例需要耗费CPU的时间,当这个实例不再被引用时,将会被垃圾回收掉,这时候,又需要耗费CPU的时间。对于不变类而言,一个好处就是可以将常用的实例进行缓存,从而减少了对象的创建。举个例子,对于布尔型,最常用的便是true and false。JDK中的Boolean类就是一个不变类,并且对这两个实例进行了缓冲。

public final class Boolean implements java.io.Serializable{

/**

* The <code>Boolean</code> object corresponding to the primitive

* value <code>true</code>.

*/

public static final Boolean TRUE = new Boolean(true);

/**

* The <code>Boolean</code> object corresponding to the primitive

* value <code>false</code>.

*/

public static final Boolean FALSE = new Boolean(false);

// 这个方法不会创建新的对象,而是重用已经创建好的instance

public static Boolean valueOf(boolean b) {

return (b ? TRUE : FALSE);

}

}

3) 不变类的某些方法可以缓存计算的结果

hashCode这个方法来自于Object这个类,这个方法用来返回对象的hashCode,主要用于将对象放置到hashtable中时,来确定这个对象的存储位置。对于一个不变类的实例,它的hashCode也是不变的,所以就可以缓存这个计算的结果,来提高性能,避免不必要的运算,JDK中的String类就是一个例子。

public final class String{

/** Cache the hash code for the string */

private int hash; // Default to 0

public int hashCode() {

int h = hash;

if (h == 0) {

// compute the value

hash = h; // cache the value

}

return h;

}

}

在JDK中, String, the primitive wrapper classes, and BigInteger and BigDecimal都是不变类。

如果一个类是不变类,这个类是不是就不能有改变状态的方法呢?

答案当然是否定的,String是一个不变类,仍然有replace,replaceAll这样的方法,而String仍然是一个不变类,那是因为在这些改变状态的方法中,每次都是新创建一个String对象。

如果大家理解了不变类,那也就不难理解为什么在做String的concatenate时,应当用StringBuffer而不是用+的操作符。

如何正确使用String呢?

1) 不要用new去创建String对象。

如果使用new去创建String,那么每次都会创建一个新对象。

public static void main(String[] args) {

String A1 = "A";

String A2 = "A"; // It won't create a new object

checkInstance(A1, A2); // Result: They are same instances

String B1 = new String("A"); // create a new object

String B2 = new String("A"); // creat a new object

checkInstance(B1, B2); // Result: They are different instances

}

private static void checkInstance(String a1, String a2) {

if (a1 == a2) {

System.out.println("They are same instances");

} else {

System.out.println("They are different instances");

}

}

2) 应当用StringBuffer来做连接操作

因为String是一个不变类,那么在做连接操作时,就会创建临时对象来保存中间的运算结果,而StringBuffer是一个mutable class,这样就不需要创建临时的对象来保存结果,从而提高了性能。

我抄来的自己也学到东西了,以前这个都没接触过的说。

❼ java中一个类是不可变类的条件是什么求详细解答。

不可变类的唯一判断条件是:
“ 不可变类的实例在实例的整个生命周期中永远保持初始化的状态”

比如一个类里面有个属性是private List list,然后只提供了getList()方法,但是你还是可以通过getList().add(XXX)来修改list的内容。即是,它没有保持“初始化”状态,它是个可变类。

来自网络:

可变类和不可变类(Mutable and Immutable Objects)的初步定义:
可变类:当你获得这个类的一个实例引用时,你可以改变这个实例的内容。
不可变类:当你获得这个类的一个实例引用时,你不可以改变这个实例的内容。不可变类的实例一但创建,其内在成员变量的值就不能被修改。
如何创建一个自己的不可变类:
.所有成员都是private
.不提供对成员的改变方法,例如:setXXXX
.确保所有的方法不会被重载。手段有两种:使用final Class(强不可变类),或者将所有类方法加上final(弱不可变类)。
.如果某一个类成员不是原始变量(primitive)或者不可变类,必须通过在成员初始化(in)或者get方法(out)时通过深度clone方法,来确保类的不可变。

❽ 为什么 java 中的 string 是不可变的

个人理解:因为string在java的编程当中比较普遍,以下的回答比较全面一些:
Java中String为什么是不可变的
1、在Java中,String类是不可变类,一个不可变类是一个简单的类,并且这个的实例也不能被修改,
这个类的实例创建的时候初始化所有的信息,并且这些信息不能够被修改
2、字符串常量池
字符串常量池是方法区中一块特殊的存储区域,当创建一个字符串常量的时候,判断该字符串字在符串字符串常量池中是否已经存在
如果存在,返回已经存在的字符串的引用;如果不存在,则创建一个新的字符串常量,并返回其引用
String string1 = "abcd";
String string2 = "abcd";
变量string1,string2指向常量池中的同一个字符串常量对象;如果String是可变的,给一个变量重新赋值一个引用,将会指向错误的值
3、缓存哈希值
在Java中字符串的哈希值会经常被使用到。例如在HashMap中,String的不可变总能保证哈希值总是相等的,并且缓存起来,不用担心会改变,
那意味着不需要每次都计算哈希值,这样会提高效率。在String类中有以下的代码:
private int hash; //用来缓存哈希值
3、促进其他对象的使用
HahSet<String> set = new HashSet<String>();
set.add(new String("a"));
set.add(new String("b"));
set.add(new String("c"));

❾ java不可变类有哪些

java不可变类是fina的,常用的有以下几种:

String

,Comparable<String>,CharSequence

Integer (以及其它基本类型的包装类)

<Integer>

❿ JAVASE不可变类

fianl修饰类 则这个类的是最终类,不可被继承
final修饰成员方法,则子类不能重写(覆盖)父类的这个方法
final修饰成员变量,则子类不能改变这个变量的值

你这个程序没用到继承,当然看不出不同了。
如果一个大的工程,团队合作来完成的,而且子类很多,并且不想子类改变这个值,就很有必要用final限制了。