相关疑难解决方法(0)

Java字符串如何工作

我试图准确理解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)

如果字符串应该是不可变的,为什么会发生这种情况呢?为什么我能够为字符串重新赋值?

java string immutability

12
推荐指数
2
解决办法
655
查看次数

如何确定一个类是否是不可变的

在给我的问题具体化之前,让我提供一些背景知识:我的主要编程语言是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都有反思.但是对于我的问题的背景,我们假设这些都没有被使用.

java oop immutability

11
推荐指数
1
解决办法
4269
查看次数

为什么我要在HPROF Viewer和Analyzer中找到"Duplicate Strings"?

使用Android内存监视器,特别是其"转储Java堆"功能,我目前正在寻找我的应用程序内存泄漏.在Android Studio的转储/ HPROF视图的左侧,有一个选项可以打开"分析器任务",您可以告诉机器"检测泄漏的活动"和"查找重复的字符串".我对后一种选择感到困惑.它做了什么以及它如何有用?它必须比仅仅帮助我们这些笨拙的开发人员更复杂,他们将相同的字符串两次放入他们的资源文件夹中.这里的文档不是很有帮助(如果我的搜索足够彻底),因为它们只表明它在"目标程序具有重复值的字符串"的情况下有所帮助.情况会是什么时候?

android hprof heap-dump android-studio

8
推荐指数
1
解决办法
1512
查看次数

什么是关键对象(在hashmap中使用)?

有人可以解释一下在hashmap中使用的关键对象到底是什么吗?有一种方法:"put(Object key,Object value)将指定的值与此映射中的指定键相关联."

那么关键是你想要的任何物体吗?按价值来说,它们意味着另一个对象或属性.因为我很困惑,需要进一步解释!谢谢一堆

java key object hashmap

5
推荐指数
1
解决办法
1万
查看次数

使用Java复制Long对象

我认为它应该是:

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())会起作用,但看起来很脏.有没有好办法处理这个?

java

5
推荐指数
2
解决办法
3204
查看次数

BigDecimal没有做添加操作

我有2个BigDecimal号码.我想添加它们.我的代码如下:

BigDecimal bd1 = new BigDecimal(10);
BigDecimal bd2 = new BigDecimal(10);

bd1.add(bd2);
Run Code Online (Sandbox Code Playgroud)

在这里,我期待bd1 20的值,但一次又一次显示10.它没有被添加.如果我做错了,请帮忙.

java bigdecimal

4
推荐指数
1
解决办法
222
查看次数

使用Java的replaceAll替换整个字符串

我正在尝试使用以下代码来替换整个字符串:

代码: String a = "Hello"; String b = a.replaceAll("(?s).*", "US"); 输出:

USUS
Run Code Online (Sandbox Code Playgroud)

问题:为什么字符串“US”重复两次?如何使用正则表达式使用replaceAll函数替换整个字符串?

为什么我需要这样做:我需要使用其中给出的值来选择 json 文件中指定的替换模式。在此模型中,我想赋予用户(json 配置程序)独立性来定义一个模式,以便可以替换整个字符串,而无需编写字符串替换的特殊处理代码。

java regex replaceall

4
推荐指数
1
解决办法
1798
查看次数

如何用下划线替换斜杠

可能重复:
提示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)

java

2
推荐指数
1
解决办法
4713
查看次数

如何在java中修剪运行时变量的空格?

我有以下一段代码

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)

java string

2
推荐指数
1
解决办法
1244
查看次数

map 和 ImmutableMap 的区别

我在支付网关公司工作,在分析代码时遇到了 ImmuatbleMap 对象。我想知道有关的所有细节。它是什么?它与地图相比有什么优势?核心 java 是否支持 ImmuatbleMap?

java collections dictionary guava

2
推荐指数
1
解决办法
6848
查看次数