根据文件
assertEquals()断言两个对象是相等的.
assertSame()断言两个对象引用同一个对象.
所以我期待如果我有一个类似下面的课程
class SomeClass {}
Run Code Online (Sandbox Code Playgroud)
然后
SomeClass someClass1= new SomeClass();
SomeClass someClass2= new SomeClass();
assertSame(someClass1,someClass2); // fail
assertEquals(someClass1,someClass2); // fail
Run Code Online (Sandbox Code Playgroud)
assertEquals应该传递,assertSame应该失败,因为两个类的值相等但它们具有不同的引用位置.
由于我在两种情况下都失败了,那么我的问题是这两者之间有什么区别?
我的多个字符串如下所示
###
some content
that I need to match
and might have some special character in it such as | <> []
###
Run Code Online (Sandbox Code Playgroud)
我试图得到哈希之间的内容.我试过下面的正则表达式,但它不匹配它并返回null.
var regex = /### ((.|\n)*) ###/;
var match= regex.exec(aboveContentAsString);
console.log(match[1]);
Run Code Online (Sandbox Code Playgroud) 我在java中创建了一个二进制搜索树,允许用户将节点添加到树中
这是我在java中的二叉树的实现,它在创建时接受根节点,然后自动确定它应该将子节点添加到树的左侧或右侧.
public class BinarySearchTree {
Node root = null;
public BinarySearchTree(Node root){
this.root =root;
}
public void add(int data){
Node newNode = new Node(data);
if(this.root ==null){
newNode =this.root;
}
if(data>this.root.data){
addRight(root,newNode);
}
if(data<this.root.data){
addLeft(root,newNode);
}
}
public Node getRoot(){
return this.root;
}
private void addLeft(Node root, Node newNode) {
if(root.leftChild == null){
root.leftChild = newNode;
}
else {
this.root = this.root.leftChild;
add(newNode.data);
}
}
private void addRight(Node root,Node newNode) {
if (root.rightChild == null){
root.rightChild = newNode;
}
else …Run Code Online (Sandbox Code Playgroud) 字符串是不可变的,这意味着一旦您修改该值,它就会创建一个新的引用并保留先前的引用值不变。
但是,当有人争论时我不明白:
字符串是线程安全的,因为它们是不可变的
考虑下面的代码:
private String str = "1";
ExecutorService executorService = Executors.newFixedThreadPool(10);
IntStream.range(0, 1000).forEach((i)-> executorService.submit(()-> {
str = str +"1";
}));
executorService.awaitTermination(10, TimeUnit.SECONDS);
System.out.println(str.length());
Run Code Online (Sandbox Code Playgroud)
如果它是线程安全的,那么它应该打印,1001而它总是打印小于预期值。
我知道上面的代码将创建1001不可变的引用,每个引用本身都是线程安全的,但作为开发人员,仍然不能使用不可变的东西并期望它们end-result是线程安全的。
恕我直言,不变性不能保证线程安全。
有人可以向我解释一下字符串如何保证线程安全吗?
更新:
感谢您的回答,我知道每个字符串都可以是线程安全的,但我的观点是,当您在其他方法中使用它们时,线程安全性和不变性之间没有直接关系。
例如,不可变对象可以在有状态对象中使用,并以非线程安全结果结束,可变对象也可以在同步方法中使用,并以线程安全结果结束。