字符串列表字典是否相等
- 前言
- Python
- 字符串or数字
- 列表
- 字典
- 总结
- Java
- 字符串
- 数组
- Map
- 总结
- JS
- 字符串
- 数组
- 对象
- 总结
前言
作为一枚测开工程师,需要的技能是全栈的,项目中,经常需要切换语言进行开发,语言用多了,难免会经常用混淆,故趁有空整理下这系列笔记“Python同Java同Js语言语法区别‘,希望对大家有用。
Python
字符串or数字
使用== 比较或者is进行比较
str1 = "@testxiaosheng"
str4= "@test"+"xiaosheng"
str5= "@testxiaosheng"
str2 = "@test"
str3 = str2 + "xiaosheng"
# if str1 is str3: #判断是否同个对象
if str1 == str3:
print("一致")
else:
print("不一致")
if str1 is str4:
print("一致")
else:
print("不一致")
if str1 is str5:
print("一致")
else:
print("不一致")
思考下:为啥1跟5是一样的,但是1跟4却是不一样的
注意:“==” 比较的是值,is比较的是字符串的内存id。如果比较值的话,建议使用 “ == ”比较,而且不同的版本is判断还有区别。
比如在不同的版本下执行会有不同的结果。
str1 = "@testxiaosheng"
str3 ="@test"+"xiaosheng"
if str1 is str3:
print("一致")
else:
print("不一致")
问题解答:python中,字符串是不可变对象,拼接代表着重新创建一个新的字符串对象。但是如果只是申明同样的变量值,python会自动优化,所以申明同样的字符串变量值,对象的地址也是一样得。
额外注意的是python已经创建好了小整数对象池,[-5~256],都是固定的地址。如果数据超过这个范围就是不同的地址。比如两个遍历都赋值个257.结果这两个变量id就不同。
参考资料:
列表
python 判断列表需要考虑列表中顺序不一样的问题。所以一般都需要排序后在进行比较,使用==或者eq函数都可以
list1 = ['b', 'dd', 'a', 'c']
list2 = ['a', 'b', 'c', 'dd']
#list2 = None
list3 = ['a', 'b', 'c', 'dd',['a','b']]
list4 = ['a', 'b', 'c', 'dd',['a','b']]
# 方法一:循环判断两个列表中的元素是否一样
# def a(list1,list2):
# list1.sort()
# list2.sort()
# if len(list1) == len(list2):
# for i in range(0, len(list1)):
# if list1[i] != list2[i]:
# return False
# return True
# else:
# return False
# print( a(list1,list2))
# 方法二:直接使用operator工具eq函数或者==
from operator import *
def b(list1,list2):
list1.sort()
list2.sort()
return eq(list1, list2)
# return list1==list2
print( b(list1,list2))
# 多维数据同样可以使用eq或者==判断,不过不能使用sort排序,需要自己实现排序,此处请读者自己实现多维排序
def c(list1,list2):
return eq(list1, list2)
print( c(list3,list4))
字典
字典使用==或者eq函数都可以判断,不过不需要像列表一样排序
dict1 = {"a":"2","c":"3"}
dict2 = {"c":"3","a":"2"}
def d(dict1,dict2):
print(id(dict1))
print(id(dict2))
return eq(dict1, dict1)
# return dict1 == dict2
print( d(dict1,dict2))
注意如果是字典嵌套了字典,这个时候请使用"=="判断,eq判断不准
dict1 = {"a":"2","c":"3","bb":{"aa":3,"dd":111}}
dict2 = {"c":"3","a":"2","bb":{"aa":3,"dd":11}}
def d(dict1,dict2):
print(id(dict1))
print(id(dict2))
#return eq(dict1, dict1)
return dict1 == dict2
print( d(dict1,dict2))
总结
python3中可以使用判断字符串,数字、列表(需排序)、字典(不需要排序)是否相等,且None对象也可以比对。“” 比较的是值,is比较的是字符串的内存id
Java
java判断是否相等,要注意空指针问题,null值不能放在最前面
字符串
可以使用equals判断,也可以使用commons工具类的StringUtils.isEquals 判断,建议使用isEquals ,不需要考虑空指针问题
安装commons工具类
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
<scope>test</scope>
</dependency>
import org.apache.commons.lang3.StringUtils;
public class Test {
public static void main(String[] args) {
String str1="fefe";
String str2="fefe";
String str3=null;
System.out.println("str1 是否与 str2 相等?:" + str1.equals(str2));
System.out.println("str1 是否与 str3 相等?:" + str1.equals(str3));
System.out.println("str1 是否与 str2 相等?:" + StringUtils.equals(str1,str2));
}
}
数组
可以使用equals判断,也可以使用commons工具类的ArrayUtils.isEquals 判断,但后者isEquals 已被官方弃用.
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.ArrayUtils;
public class Test {
public static void main(String[] args) {
List<String> arry =new ArrayList();
arry.add("testxiaosheng");
List<String> arry1 =new ArrayList();
arry1.add("testxiaosheng");
List<String> arry2 =new ArrayList();
arry2.add("testxiaosheng");
int[] array3 = { 1, 3, 5, 7, 9 };
String aa="fefe";
List arry5 = null;
System.out.println("数组arr是否与数组arr1相等?:" + arry.equals(arry1));
System.out.println("数组arr是否与数组arr1相等?:" + ArrayUtils.isEquals(arry,arry1));
System.out.println("数组arr是否与数组arr2相等?:" + arry.equals(arry2));
System.out.println("数组arr是否与数组arr3相等?:" + arry.equals(array3));
System.out.println("数组arr是否与数组arr4相等?:" + arry.equals(aa));
//System.out.println("数组arr是否与数组arr5相等?:" + arry5.equals(arry));空指针异常
}
}
但equals只针对顺序一致的数组,如果数据不一致,得先排序然后再比对。可以直接使用集合工具类isEqualCollection,自动帮你排好序比较
List<String> arry =new ArrayList();
arry.add("12");
arry.add("testxiaosheng");
List<String> arry1 =new ArrayList();
arry1.add("testxiaosheng");
arry1.add("12");
// arry.sort(Comparator.reverseOrder()); 升序
// arry1.sort(Comparator.reverseOrder());
System.out.println("数组arr是否与数组arr1相等?:" + arry.equals(arry1));
System.out.println("arry是否与arry1相等?:" + CollectionUtils.isEqualCollection(arry,arry1));
Map
直接使用equals判断
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<String,String> m1= new HashMap<String,String>();
m1.put("aa","123");
m1.put("testxiaosheng","666");
Map<String,String> m2= new HashMap<String,String>();
m2.put("testxiaosheng","666");
m2.put("aa","123");
System.out.println("m1是否与m2相等?:" + m1.equals(m2));
}
}
总结
java中不管是字符串还是数组还是map都可以使用equal关键字判断,不同类型也可以 判断,除了null空指针,注意null必须放在判断最右边 ,要不然会报错。equals 判断数组需要排序,map不需要,使用工具类 CollectionUtils判断,则不需要排序。
请注意equals 与” == “的区别,equals重写后判断的是值内容,equals不能判断基本类型,Java中”==“基本类型使用判断的值,引用类型判断的是内存地址,而python中是判断的内容。python none对象可以放在左边,而java不可以。这两类语法写多了也是很容易混淆的
JS
字符串
JS中判断字符相等一般使用===严格等于,会先判断类型,在判断值,==会自动转换类型比较
var str1 = 123456 ; // 整型
var str2 = "123456" ; // 字符串
console.log(str1==str2);
console.log(str1===str2);
数组
JS中判断数组不能使用===判断,也没有内置得方法可以判断,需要自己写
使用tostrig判断,这种方法有坑,就是数组中含有字符串数字,会认为是一样的
var a = ['1', '3', '2'];
var b = ['3', '1', 2];
var c = a.length === b.length && a.sort().toString() === b.sort().toString();
console.log(c); // true
同样要排好序才能 比价
var arrayEquals = function(array1,array2) {
array1.sort();
array2sort();
return array1.length==array2.length && array1.every(function(v,i) { return v === array2[i]});
}
console.log(arrayEquals(a,b))
对象
同样不能用===判断,判断起来也是非常麻烦,此处是网友写的代码,仅供参考
let obj1 = {
a: 1,
b: {c: 2}
}
let obj2 = {
b: {c: 3},
a: 1
}
function isObjectValueEqual(a, b) {
// 判断两个对象是否指向同一内存,指向同一内存返回 true
if (a === b) return true // 获取两个对象键值数组
let aProps = Object.getOwnPropertyNames(a)
let bProps = Object.getOwnPropertyNames(b)
// 判断两个对象键值数组长度是否一致,不一致返回 false
if (aProps.length !== bProps.length) return false // 遍历对象的键值
for (let prop in a) {
// 判断 a 的键值,在 b 中是否存在,不存在,返回 false
if (b.hasOwnProperty(prop)) {
// 判断 a 的键值是否为对象,是则递归,不是对象直接判断键值是否相等,不相等返回 false
if (typeof a[prop] === 'object') {
if (!isObjectValueEqual(a[prop], b[prop])) return false
} else if (a[prop] !== b[prop]) {
return false
}
} else {
return false
}
}
return true
}
console.log(isObjectValueEqual(obj1, obj2)) // false
总结
JS判断数组以及对象,都比较麻烦,所以这些逻辑尽量后端能做就后端做。