java字符串比较原理解析

public static void main(String[] args) {
		String str1 = "Hello";
		String str2 = "Liulei";
		String str3 = str1 + str2;
		String str4 = "Hello" + "Liulei";
		String str5 = "HelloLiulei";
		String str6 = new String("HelloLiulei");
		
		System.out.println(str3 == str4);                 //false
		System.out.println(str3 == str5); 		     //false
		System.out.println(str3 == str6);                 //false
		System.out.println(str4 == str5);                 //true
		System.out.println(str4 == str6);                 //false
		System.out.println(str5 == str6);                 //false
		
		System.out.println(str3.equals(str4));            //true
		System.out.println(str3.equals(str5));            //true
		System.out.println(str3.equals(str6));            //true
		System.out.println(str4.equals(str5));            //true
		System.out.println(str4.equals(str6));            //true
		System.out.println(str5.equals(str6));            //true
		
	}
*注释为运行结果

 ==原理分析:

java分为编译时和运行时两种状态

字符串直接赋值是在编译时赋值,并将值存储到字符串常量池(位于jvm存储的方法区中)中.如代码中的str1 str2

在创建str4时,首先java会从常量池中寻找是否存在"Hello"和"Liulei",如果存在,则将这两个字符串拼接(+运算符),如果不存在则新建并将其存储在常量池中

在创建str5时.同str4,同样存储在字符串常量池中,并将该地址指向返回给str5,可知,str4和str5指向同一内存区域

在创建str3时,由于str3赋值右边存在变量,java编译时无法确认变量的准确值(多态),所以str3赋值是在java运行时创建的,并将其存储到堆中(相当于新建一个对象)

在创建str6时,使用new方法直接新建一个string对象,同样保存在堆内存中,并且与str3指向的地址不同


*堆内字符串赋值首先会从字符串常量池查找是否有重复的,如果有,则将将值复制到堆,并返回堆内存储地址

equals分析:

equsla方法是java提供的一个可重写的方法,string重写equals方法源码如下:
public boolean equals(Object anObject){

	if(this==anObject){

		return true;          //判定传入的对象和当前对象是否为同一个对象,如果是就直接返回true.

	}

	if(anObject instanceof String){    //判定传入的类型值是否为String,若不是则返回false;

		String anotherString =(String)anObject;

		int n=value.length;

		if(n==anotherString.value.length){

			char v1[]=value;

			char v2[]=anotherString .value;

			int i=0;

			while(n-- !=0){

				if(v1[i] !=v2[i])

				return false;      //循环对比两个字符串的char[]数组,逐个对比字符是否一致,若存在不一致的情况,则直接返回false;

				i++

			}

			return true;   //循环结束都没有找到不匹配的,所以最后返回true;

		}

	}

return false;     //判定传入的String与当前的String的床都是否一致,若不一致就返回false;

}


通过阅读源码理解程序运行结果





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java解析复杂的JSON字符串可以使用一些第三方库,比如Jackson、Gson或者JsonSimple。这些库提供了方便的API来解析和操作JSON数据。 下面是使用Jackson库解析复杂JSON字符串的示例代码: ```java import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public class JsonParser { public static void main(String[] args) { String jsonString = "{\"name\":\"John\",\"age\":30,\"address\":{\"city\":\"New York\",\"zipcode\":\"10001\"},\"phoneNumbers\":[\"1234567890\",\"0987654321\"]}"; try { ObjectMapper objectMapper = new ObjectMapper(); // 解析JSON字符串为JsonNode对象 JsonNode jsonNode = objectMapper.readTree(jsonString); // 获取字段值 String name = jsonNode.get("name").asText(); int age = jsonNode.get("age").asInt(); // 获取嵌套字段值 String city = jsonNode.get("address").get("city").asText(); String zipcode = jsonNode.get("address").get("zipcode").asText(); // 获取数组字段值 JsonNode phoneNumbersNode = jsonNode.get("phoneNumbers"); for (JsonNode phoneNumberNode : phoneNumbersNode) { String phoneNumber = phoneNumberNode.asText(); System.out.println("Phone number: " + phoneNumber); } System.out.println("Name: " + name); System.out.println("Age: " + age); System.out.println("City: " + city); System.out.println("Zipcode: " + zipcode); } catch (Exception e) { e.printStackTrace(); } } } ``` 注意,上述示例中使用了Jackson库来解析JSON字符串,首先创建一个ObjectMapper对象,然后使用它的`readTree`方法将JSON字符串解析为JsonNode对象。接着可以通过JsonNode对象获取字段值,嵌套字段值或者数组字段值。 当然,你也可以使用其他的库来解析复杂JSON字符串,具体的使用方式可能会有所不同,但基本的原理是相同的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值