noticed the neat features of ruby symbols here
java有类似的东西吗?会叫什么?
D不认为最后一个字符串会完成所有功能。特别是它存储的方式,它仍然需要一个toString进行比较。
答案 0 :(得分:5)
符号实际上是不可变标识符。它们不能改变,不是垃圾收集,并且比Strings具有性能优势。我假设你已经知道String是什么了。所以答案是:Java没有像Symbols这样的东西。
就像@Idan所说的那样(而且非常聪明)枚举可以用作符号,除非它们没有你可以在上调用的方法。 Ruby中的符号是不不可变的字符串。
如果您想了解他们的核心差异,请参阅 this post 。
答案 1 :(得分:2)
“Java有这个功能吗?”的一般答案是什么?问题是“不!”。但是,enums通常可以解决符号解决的相同问题。
答案 2 :(得分:1)
Ruby符号是一个不可变的字符串对象,它在符号表中被索引以供单个参考重用(因此是非常有创造性的命名法!)。
在Java中,所有 String
对象都是不可变的,并且所有对象都在(创造性命名的)符号表中编入索引以供JVM(只要它们被引用并生效)。
因此,在Java中,String
("my_symbol"
)相当于Ruby符号(:my_symbol
)。
要获得与Ruby 'my string'
(非不可变)等效的东西,您必须转到更复杂的Java类(new StringBuilder("my string")
等)。或者,如果您使用Groovy加载了JVM,它会使用GString覆盖类似的可变概念。
答案 3 :(得分:0)
与Java中的Ruby符号最接近的是在字符串上调用intern()
。
虽然在Java中可以有许多具有相同内容的String对象,但是intern
确保对于相同内容(字符序列)返回相同的对象,因此它返回规范/不同的值。
因此,对于泛型Java字符串,您必须调用equals
方法来检查内容是否相等,对于内联字符串,您只需使用==
运算符即可。
有关更多详细信息,请参见:https://en.wikipedia.org/wiki/String_interning
答案 4 :(得分:-3)
ruby中的符号只是一个不可变的字符串。 java等价物只是一个普通的String
。我真的没有看到太多ruby特有的功能,除了这个内存泄漏一个......