我试图准确理解Java字符串是如何不可变的.我知道这可能是一个简单的概念,但在阅读了几个在线网页后,我仍然不太明白.
我不明白Java Strings是如何"不可变的".我目前有以下代码:
public static void main(String[] args) {
String name = "Jacob Perkins";
System.out.println( name );
name = name + "!";
System.out.println( name );
}
Run Code Online (Sandbox Code Playgroud)
我的输出如下:
Jacob Perkins
Jacob Perkins!
Run Code Online (Sandbox Code Playgroud)
如果字符串应该是不可变的,为什么会发生这种情况呢?为什么我能够为字符串重新赋值?
在给我的问题具体化之前,让我提供一些背景知识:我的主要编程语言是C++和Java.使用C++时,我发现应用const正确性很重要,即声明这样的函数:
A::DoSomething( const B& arg ); // guarantees that arg is not modified
A::DoSomething() const; // guarantees that the object of type A is not modified
A::DoSomething( const B& arg ) const; // both of the above
Run Code Online (Sandbox Code Playgroud)
事实上,我经常希望这const是默认值,并且必须以某种方式标记被修改的对象.
我使用的主要原因const是:
众所周知,Java没有const关键字(你不能做上面的事情final),这个事实在这里已经讨论过,例如参见:Java中的const(C++)的等价物.
通常提出的Java替代方法是使您的类不可变.虽然这不是完全替代,const因为它适用于每个类而不是每个使用类的上下文,但在大多数情况下它对我来说都可以正常工作.
但是不可变类有一个大问题:不可变性并不明显.要知道一个类是否真的是不可变的,据我所知,你基本上必须检查完整的源代码.任何方法都可以有一个后门,通过它可以修改对象.
那么有更简单的方法来检查不变性吗?或者是否有任何最佳实践以某种方式标记一个类是不可变的?
注意:我知道这两种语言都提供了绕过constness或immutability的"邪恶伎俩":C++ const_cast和Java都有反思.但是对于我的问题的背景,我们假设这些都没有被使用.
使用Android内存监视器,特别是其"转储Java堆"功能,我目前正在寻找我的应用程序内存泄漏.在Android Studio的转储/ HPROF视图的左侧,有一个选项可以打开"分析器任务",您可以告诉机器"检测泄漏的活动"和"查找重复的字符串".我对后一种选择感到困惑.它做了什么以及它如何有用?它必须比仅仅帮助我们这些笨拙的开发人员更复杂,他们将相同的字符串两次放入他们的资源文件夹中.这里的文档不是很有帮助(如果我的搜索足够彻底),因为它们只表明它在"目标程序具有重复值的字符串"的情况下有所帮助.情况会是什么时候?
有人可以解释一下在hashmap中使用的关键对象到底是什么吗?有一种方法:"put(Object key,Object value)将指定的值与此映射中的指定键相关联."
那么关键是你想要的任何物体吗?按价值来说,它们意味着另一个对象或属性.因为我很困惑,需要进一步解释!谢谢一堆
我认为它应该是:
Long a = Long.valueOf(0);
Long b = Long.valueOf(1);
Long a = b.clone();
Run Code Online (Sandbox Code Playgroud)
但对象中没有clone方法Long......
也许Long a = Long.valueOf(b.LongValue())会起作用,但看起来很脏.有没有好办法处理这个?
我有2个BigDecimal号码.我想添加它们.我的代码如下:
BigDecimal bd1 = new BigDecimal(10);
BigDecimal bd2 = new BigDecimal(10);
bd1.add(bd2);
Run Code Online (Sandbox Code Playgroud)
在这里,我期待bd1 20的值,但一次又一次显示10.它没有被添加.如果我做错了,请帮忙.
我正在尝试使用以下代码来替换整个字符串:
代码:
String a = "Hello";
String b = a.replaceAll("(?s).*", "US");
输出:
USUS
Run Code Online (Sandbox Code Playgroud)
问题:为什么字符串“US”重复两次?如何使用正则表达式使用replaceAll函数替换整个字符串?
为什么我需要这样做:我需要使用其中给出的值来选择 json 文件中指定的替换模式。在此模型中,我想赋予用户(json 配置程序)独立性来定义一个模式,以便可以替换整个字符串,而无需编写字符串替换的特殊处理代码。
可能重复:
提示java.lang.String.replace问题?
在Java中使用string.replace()
为什么“ /”不替换为“ _”?
public static void main(String[] args) throws IOException {
String file = "A/B";
file.replaceAll("/", "_");
System.out.println(file);
}
Run Code Online (Sandbox Code Playgroud) 我有以下一段代码
import java.io.*;
import java.util.*;
class MainDriver{
public static void main(String aa[]){
Scanner reader = new Scanner (System.in);
String name;
System.out.println("enter your name");
name = reader.nextLine();
name.trim();
System.out.println (name);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在输入中给出空格,我想知道输出
输入
bayant singh
Run Code Online (Sandbox Code Playgroud)
产量
bayant singh
Run Code Online (Sandbox Code Playgroud)
那么为什么name.trim;不在这里工作?因为我猜输出是
bayantsingh //no spaces
Run Code Online (Sandbox Code Playgroud) 我在支付网关公司工作,在分析代码时遇到了 ImmuatbleMap 对象。我想知道有关的所有细节。它是什么?它与地图相比有什么优势?核心 java 是否支持 ImmuatbleMap?
java ×9
immutability ×2
string ×2
android ×1
bigdecimal ×1
collections ×1
dictionary ×1
guava ×1
hashmap ×1
heap-dump ×1
hprof ×1
key ×1
object ×1
oop ×1
regex ×1
replaceall ×1