爪哇2博客
爪哇2博客

不变的阶级

不变的阶级
在这篇文章中,我将分享Java面试问题,这些问题通常是在不可变类上提出的。不可变类是重要的主题,因为它涉及线程安全类的创建。
在这里,我为一些重要的不可变类提供答案。

1.什么是不可变类?

答: 不变的对象s are those objects whose state can not be changed once created. Class whose objects possess 这个 characteristic can be termed as immutable 类.
例如:String,Integer。

2.创建不可变类的步骤是什么?

  • 使您的班级最终: 
    如果将您的课程定为最终课程,则没有课程将无法对其进行扩展,因此将无法覆盖此类的方法。
  • 用private和final声明所有实例变量: 
    如果将实例变量设为私有,则没有外部类将能够访问实例变量,如果将它们设为最终变量,则无法对其进行更改。
  • 对设置方法说不:
    唐’不能为任何实例变量创建设置方法,因此将没有明确的方法来更改实例变量的状态。
  • 初始化构造函数中的所有变量:
    您可以在构造函数中初始化变量。使用可变对象时,需要特别注意。如果对象不可变,则需要进行深度复制。
  • 从getter方法返回时,执行可变对象的克隆:
    如果您从getter方法返回对象的克隆,它将赢得’t返回原始对象,因此原始对象将保持不变。
    阅读: 为什么String在Java中是不可变的

3.您能回答以下员工类别是否不变吗?如果不是,您将怎么做使其不可变?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
组织.Arpit.爪哇2blog.;
进口 爪哇.实用程序.数组列表;
 
上市 最后 雇员 {
 
私人的 最后 名称;
私人的 最后 数组列表 地址;
上市 雇员( 名称, 数组列表 地址) {
();
这个.名称 = 名称;
数组列表 临时添加= 数组列表();
对于 (整型 i = 0; i < 地址.尺寸(); i++ ) {
临时添加.(地址.得到(i));
}
这个.地址 = 临时添加;
}
 
上市 得到Name() {
返回 名称;
}
上市 数组列表 得到Addresses() {
返回 地址;
}
}
 

回答: 

雇员类不是一个不变的类,因为您仍然可以执行employee.getAddresses()。add(“New 加ress”),它将被添加到员工中’s 地址 list.
您需要从getAddresses方法返回地址列表的克隆,所以employee.getAddresses()。add(“New 加ress”)  won’t impact employee’s 地址 list.
如果将上面的getAddresses()方法更改为下面的方法,则Employee类将变得不可变。

1
2
3
4
5
 
上市 数组列表 得到Addresses() {
  返回 (数组列表) 地址.克隆();
}
 

4.您能否提供不可变类的示例?

答: 是。我创建了不可变的Country类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
组织.Arpit.爪哇2blog.;
 
进口 爪哇.实用程序.数组列表;
 
上市 最后 国家 {
    //声明的私有最终实例变量
私人的 最后 国家的名字;
//可变对象
私人的 最后 数组列表 listOfStates;
 
上市 国家( 国家的名字, 数组列表 listOfStates) {
  ();
  这个.国家的名字 = 国家的名字;
  //为可变对象创建深层副本
  数组列表 临时列表 = 数组列表();
 
  对于 (整型 i = 0; i < listOfStates.尺寸(); i++ ) {
   临时列表.(listOfStates.得到(i));
  }
  这个.listOfStates = 临时列表;
}
 
上市 得到CountryName() {
     //不需要克隆,因为它是不可变的对象
  返回 国家的名字;
}
 
上市 数组列表 得到ListOfStates() {
     //返回克隆的对象
  返回 (数组列表) listOfStates.克隆();
}
}
 

5.不变类线程安全吗?如果是,那怎么办?

答: 
不可变类是线程安全的,因为您不能更改不可变对象的状态,因此即使两个线程并行访问不可变对象,它也不会’t create any issue.

6.如果使用可变实例变量,需要采取哪些预防措施?

如果您正在使用可变实例变量(上述Employee类中的地址列表),请执行以下操作:

  • 在构造函数中深度复制可变变量。
  • 返回 从实例变量的getter克隆实例变量 而不是实际变量。
您可以在以下位置了解更多信息 如何在Java中创建不可变类.

7.为什么不变对象被认为是HashMap的好键?

答: 不变的对象’s hashcode won’更改,因此可以更快地检索密钥,因为您可以为不同的密钥缓存不同的哈希码。对于可变对象,哈希码可能依赖于可变字段,如果这些字段的任何值发生变化,则哈希码可能会更改,因此您可能无法在HashMap中找到键,因为哈希码现在有所不同。

8.您能举一些不变类的好例子吗?

字符串,整数,长整型,双精度型,字符型,布尔型等等。日期不是一成不变的类。

分享这个

作者

关注作者

相关文章

  • 爪哇面试题
    22 May

    爪哇

    我写了很多Java面试问题,这是所有Java面试问题的索引。我将继续在此帖子中添加更多面试问题。核心Java核心Java面试问题此列表包括前50个核心Java面试问题。无论您是新手还是经验丰富的程序员,此面试问题都将[…]

  • 爪哇中的扎实原则
    11月9日

    爪哇中的SOLID原理

    在这篇文章中,我们将看到Java中的5条SOLID原则。罗伯特·C·马丁(Robert C. Martin)提出了五项面向对象的设计原则,并使用了缩写S.O.L.I.D。该首字母缩写词的每个字母都讨论Java的原理。当您结合使用S.O.L.I.D的所有原理时,对您来说会变得更加容易[…]

  • 爪哇 2年经验
    11月8日

    爪哇 2年经验

    在本文中,我们将看到2到3年的Java面试问题。这些是新生(0-3年的经验)最常被问到的面试问题。这个问题清单将帮助您破解Java面试。在此之前,我已经分享了详细的答案,您可能会发现它也很有帮助。一世 […]

  • 爪哇 5年经验
    11月8日

    爪哇 5年经验

    在这篇文章中,我们将看到5到6年的Java面试问题。当您有5年Java开发人员的经验时,您需要对集合,多线程概念有很好的了解。如果您正在寻找以下查询,那么这篇文章也将为您提供帮助。 爪哇面试题[…]

  • 爪哇棘手
    9月11日

    爪哇技术

    在这篇文章中,我们将看到Core 爪哇访谈中要求的顶级Java技术面试。我涵盖了很多关于Java编程的面试问题。这是您可能会发现有用的其他Java面试问题的列表。核心Java面试题Java 馆藏面试题Java 串面试题OOPs 爪哇中的面试题[…]

  • 春季靴面试问题
    8月06

    春季靴面试的前15个问题

    在这篇文章中,我们将看到15个有关Spring Boot面试的热门问题及其答案。如果您想了解更多有关Spring Boot的信息,可以阅读Spring Boot教程。如果您正在寻找以下查询,那么这篇文章也将为您提供帮助。 春季靴面试问题3年的经验Spring Boot面试[…]

Comments

  1. 嗨Arpit,很棒的文章。您是否还应该将clone()用于arraylist的深层复制?对于此行:
    临时列表.add(listOfStates.get(i))?还是假设该列表是字符串列表?谢谢

    1. 嗨,高兰,
      我假设该列表是字符串列表。由于String在Java中是不可变的,因此您不必’无需对ArrayList使用深层复制。
      谢谢!!

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


成为朋友

©2020 爪哇2博客