首页 > 试题广场 >

以下类型为Final类型的为()

[不定项选择题]
以下类型为Final类型的为()
  • HashMap
  • StringBuffer
  • String
  • Hashtable
通过阅读源码可以知道,string与stringbuffer都是通过字符数组实现的。
其中string的字符数组是final修饰的,所以字符数组不可以修改。
stringbuffer的字符数组没有final修饰,所以字符数组可以修改。
string与stringbuffer都是final修饰,只是限制他们所存储的引用地址不可修改。
至于地址所指内容能不能修改,则需要看字符数组可不可以修改。


发表于 2020-03-08 22:27:02 回复(27)
关于为什么StringBuffer是final值却可以改变这个,想起之前做过的笔记:final修饰的成员变量为基本数据类型时,赋值后无法改变。当final修饰的为引用变量时,在赋值后其指向地址无法改变,但对象内容可以改变。感觉应该有一定关系 另外,对于该题,final修饰类只是限定类不可被继承,而非限定了其对象是否可变
发表于 2019-09-23 15:58:09 回复(15)
StringBuilder , StringBuffer ,String 都是 final 的,但是为什么StringBuilder , StringBuffer可以进行修改呢,因为不可变包括的是,引用不可变以及对象不可变,而这三个都是属于引用不可变,(也就是地址不要变,里面的内容随心所欲),而StringBuilder , StringBuffer 中都包含右append方法,可对对象中的内容进行增加。
而String a="123"+new String("456");实际上底层是用了一个StringBuffer 进行append;
发表于 2019-09-29 15:50:42 回复(7)
StringBuilder , StringBuffer ,String 都是 final 的
发表于 2019-07-26 09:32:17 回复(0)
嗯,大坑,咋一想springbuffer可能不是final的,毕竟是可变的,其实不是 ,字符串的类都是基于字符数组的.
但是这个也有个问题,为啥String,StringBuffer,StringBuild都是final的,有的可变,有的就不可变?
变量定义为final,一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。

同时final修饰的类,不能被继承,可以继承类

源码:



原因在这里:
String里定义的是final类型的字符数组,所以不可变啦,
StringBuffer里面定义的普通的数组,(图上那个不是,在他的抽象类里)所以要改变的话可以随便一个new个新数组的把地址给它了.

发表于 2020-02-21 22:17:36 回复(0)
记住了,String,StringBuilder,StringBuffer都是final修饰的
发表于 2019-09-01 16:09:06 回复(0)
final修饰类只是表示这个类不能被继承,它的对象变还是可以变得,不要搞混了,
String不可变的原因是底层的char[]数组是用final修饰的,这次才是它不可变的原因。
发表于 2020-10-13 11:52:36 回复(0)
public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, Comparable<StringBuffer>, CharSequence
{

发表于 2019-07-17 22:28:48 回复(0)
StringBuilder和StringBuffer中的final都是修饰类,代表该类无法被继承是个最终类
String虽然也通过final修饰了类,但是通过源码可以得知,String的底层是通过char数组来实现的,而这个char数组被final修饰了,所以他不仅是引用不可变而且也有值不可变
发表于 2020-12-13 16:19:33 回复(1)
stringbuffer不是final吧?
发表于 2019-03-21 19:40:40 回复(7)
完全不知道评论区那些高赞说啥,final修饰类表示不可继承,因为String是常用工具类,不希望被修改。

将方法或类声明为final主要目的是:确保它们不会再子类中改变语义。String类是final类,这意味着不允许任何人定义String的子类。换言之,如果有一个String的引用,它引用的一定是一个String对象,而不可能是其他类的对象。

——《Java核心技术 卷I》

发表于 2022-02-01 16:18:45 回复(0)
通过阅读源码可以知道,string与stringbuffer都是通过字符数组实现的。 其中string的字符数组是final修饰的,所以字符数组不可以修改。 stringbuffer的字符数组没有final修饰,所以字符数组可以修改。 string与stringbuffer都是final修饰,只是限制他们所存储的引用地址不可修改。 至于地址所指内容能不能修改,则需要看字符数组可不可以修改。
发表于 2021-08-29 11:05:21 回复(0)
被final修饰的类,其引用地址不能改变,但是里面的内容可以修改
发表于 2022-04-07 20:42:14 回复(2)
打开源码发现StringBuffer类真的有final修饰,我开始还以为是单选🤔
发表于 2019-07-19 20:28:06 回复(0)
String StringBuffer StringBuilder的底层其实都是char数组,但是String的char数组是被final修饰过的,而StringBuffer和StringBuilder都是继承于AbstractStringBuilder类的,AbstractStringBuilder中的char数组没有被final修饰,所以是可变的。至于线程安全,String的char数组已经被final修饰了,不可更改,线程自然是安全的。而StringBuffer和StringBuffer的方法几乎是一样的,但是StringBuffer的方法前面都加上了synchronized修饰,所以StringBuffer是线程安全的,而StringBuilder线程不安全
发表于 2021-08-12 16:46:37 回复(1)
SVN头像 SVN
评论区把我给整不会了,差点被绕进去
总之对于final,简而言之就是:
1.final修饰基本类型变量不能改变
2.final修饰对象的引用不能改,也就是指向不能变(数组也是对象)
3.final修饰类不能被继承(对于本题而言就是String和StirngBuffer不能被继承,但指向是可以改变的,不然我平时的代码白打的吗,看着评论区整懵了都)
编辑于 2021-07-30 22:55:05 回复(0)

菜鸟问一下为什么stringbuffer是final修饰还可以改变值


发表于 2019-09-03 20:56:59 回复(3)
看了一下源码,说一下我自己的见解,StringBuffer修饰为final,但是内容可变的原因是,修改的对象不是StringBuffer,而是父类的value数组变量,因此看起来StringBuffer是可变的,但是其实StringBuffer没有变过,只是重写了toString()返回值而已
发表于 2021-03-09 08:55:49 回复(0)
发表于 2022-09-07 11:17:55 回复(0)
string是final,字符数组是final,所以不能修改字符串 stringbuffer是final,字符数组是不是final,所以可以更改
发表于 2024-02-12 16:42:41 回复(0)