java记录一下字符串比较以及引申的设计模式缓冲区内容

本文主要是介绍java记录一下字符串比较以及引申的设计模式缓冲区内容,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

java简单记录一下字符串比较的相关

本文在 内容空("")和 引用空(null)以及 双等号(==)和 equals 方法上进行记录

1.内容空和引用空

① 顾名思义,内容空即为String本身地址中没有存放任何东西,即没有内容,但是String是实例化的,是有地址的

例如:String str=new String(""); 其中str是真正指向一个存放String的地址的,只不过这个地址存放的String是空的

② 很好理解,与之对应的就是引用空,即String声明的引用只是声明了,并没有实例化,也就是没有指向任何地址

例如:String str;这时候的str就是引用空,只是声明了一个引用,他并没有指向实际的一个地

 

2.双等号和equals

理解了上述的一个简单的前提,再来说明最基础的字符串判断

先来看一个例子:

        String str1=new String("abc");String str2=new String("abc");System.out.println(str1==str2);System.out.println(str1.equals(str2));

以上声明并实例化了两个String字符串,并使其内容均为"abc",然后对比两种比较的输出结果

很明显,结果说明了一切(这里浪漫小白也想对大家说,有什么问题弄不懂,直接上代码跑一下结果,然后分析)

①双等号判断返回值false,也就是两者不等,原因很简单,双等号判断的是地址是否一致(顺带着也就判断了内容,哈哈。滑稽,地址都一样,内容能不一样?),而两个实例化的str1和str2显然是分配的两个不同的地址空间来存放abc字符串

②这就简单的说明了,equals判断的其实才是抛开地址后的字符串内容的比较,也就是地址不同,但内容相同的匹配

所以在判断字符串是否内容匹配的时候要用equals

这里需要说明的是:此处的equals只是针对string类来说的,为什么呢?

原因很简单,equals本身是Object的方法,而其在object的方法定义中,其逻辑就是双等号,有兴趣可以直接找源码看一下。

所以说,默认的equals其实也是和双等号一样的逻辑判断,但是我们经常使用到的jdk所提供的类库中的大部分都是重写了equals的逻辑判断,将其改为了内容判断,比如上述中的string类。这也说明了我们经常直接使用java所提供的类库中的equals大部分都是对equals进行过重写的!

理解了上述,这里多记录一种情况,也很好理解

就是,当一个字符串引用为空的时候,即String str=null的时候,是不能够用equals的,这个细节每个人都懂,因为没有实例化不能使用非静态方法,但是,作者周围的朋友却经常会遇到这一类问题,就是实际编程过程中,在判断字符串是否为空的时候,经常就直接用str.equals(""),要知道你的str不一定是声明的时候就创建的,很可能来源于其他任何可以使用字符串引用的地方!这时候要留意一下你的str是否是空指针

以上的说明,很简单,很基础,却很频繁,然后说明一下设计模式缓冲区问题

java本身的关于字符串初始化时候缓冲区相关的解释说明

还是看例子,

public class Test {public static void main(String a[]){//String str1=new String("abc");//String str2=new String("abc");String str1="abc";String str2="abc";System.out.println(str1==str2);System.out.println(str1.equals(str2));}
}

然后看结果,

哎,这一看就看出了关键,这时候Str1 == Str2 返回值是 true,用我们刚才理解的双等号判断的含义,就知道了,此时str1和str2

的指针指向是一致的,就是说这两个引用的实际地址是一样的

那这本质的原因是什么呢?其实就是一种缓存区的设计模式。

java中直接声明的实际字符串"abc"是存在在常量池位置的,并且是唯一的,像例子中的一样,str1=“abc”的时候,这时候abc其实本身就是一个直接使用的字面量,只不过又让str1这个引用指向了他(这个字符串放在了常量区)。str2又等于“abc”的时候,其实也是指向的刚才的那个常量池中abc的位置!

换句话说,就类似于现在有了一个实际的String类型的str3,然后新声明String str1=str3,String str2=str3,那么str1和str2当然都是指向了一个地址(str3)了!但是所谓的不同就是,这里的str3 是实例化的String,他的地址就是String应该在的地址,而我们例子中直接使用的“abc”字符串是放在常量池中的。

而对比之前的例子String str=new String();这样的方式,就没有这个问题了,因为new关键字,就实例化了一个真正的String,有自己的地址空间(在堆中),然后把abc这个内容放进这个地址空间中。

总结来说,就是直接使用(字面量)的字符串形式是存放在一种缓冲区的模式(常量池)中的,且相同内容的存放是唯一的。

 

 

 

这篇关于java记录一下字符串比较以及引申的设计模式缓冲区内容的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/202159

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听