首页 > 编程语言 >手撕switch处理String底层源码

手撕switch处理String底层源码

时间:2023-06-12 21:33:32浏览次数:48  
标签:hash String System break switch 源码 println out

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

	private final char[] value;
    private int hash; //hash值
    
    public String(String original) {
        this.value = original.value;//['a','b','c']的值赋值过去
        this.hash = original.hash;//['a','b','c']的hash值赋值过去
    }
    
    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
           
            char val[] = value; //['a','b','c']

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];//hash算法
            }
            hash = h;//96354
        }
        return h;
    }
    
}
package com.qf.switch_string;

import java.io.PrintStream;

public class Test01{
    
	public static void main(String args[]){
        
		label0:{
			
			String str = "Aa";
			String s;//临时的字符串
            //本质获取的str的hash值
			switch ((s = str).hashCode()){//2112
                    
			default:
				break;

			case 2112: //Aa和BB的hash值
				if (!s.equals("Aa")){
					if (s.equals("BB")){
						System.out.println("BB");
						break label0;
					}
				} else{
					System.out.println("Aa");
					break label0;
				}
				break;

			case 119193: 
				if (!s.equals("xyz"))
					break;
				System.out.println("xyz");
				break label0;
			}
			System.out.println("默认的");
		}
	}
}
public static void main(String[] args) {
		//注意:两个不同的字符串hash值有可能相同
		System.out.println("Aa".hashCode());//2112
		System.out.println("BB".hashCode());//2112

		String str = "Aa";


		switch (str) {
		case "abc":
			System.out.println("abc");
			break;
		case "def":
			System.out.println("def");
			break;
		case "xyz":
			System.out.println("xyz");
			break;

		default:
			System.out.println("默认的");
			break;
		}

	}

总结:

底层处理逻辑:先判断hash值,再比较字符串的内容(equals) 因为两个字符串的hash值有可能相同,所以需要比较内容

标签:hash,String,System,break,switch,源码,println,out
From: https://blog.51cto.com/u_16154651/6465467

相关文章

  • Object源码阅读
    Object源码阅读native:本地栈方法,使用C语言中实现的方法。packagejava.lang;publicclassObject{ //注册本地方法privatestaticnativevoidregisterNatives();static{registerNatives();}//返回Object对象的classpublicfinalna......
  • ArrayList 底层结构和源码分析
    ArrayList基本介绍ArrayList实现了List接口。它可以存储包括null的任何类型的对象,允许重复元素。ArrayList在内部使用一个数组来存储元素,当元素数量超过数组容量时,ArrayList会自动重新分配更大的内部数组,并且将现有元素复制到新数组中。ArrayList基本等同于Vector,但是ArrayList......
  • 尚医通-day04【EasyExcel详细步骤】(内附源码)
    页面预览数据导出数据导入第01章-AlibabaEasyExcel1、EasyExcel介绍1.1、EasyExcel的作用数据导入:减轻录入工作量数据导出:统计信息归档数据传输:异构系统之间数据传输1.2、EasyExcel的特点快速:快速的读取excel中的数据。简洁:映射excel和实体类,让代码变的更加简......
  • 尚医通-day03【数据字典详细步骤】(内附源码)
    第01章-nacos和gateway的引入1、引入nacos1.1、启动nacos服务资料:资料>数据字典微服务>nacos-server-1.4.2.zip将资料中的nacos压缩包解压到非中文目录下,然后执行以下命令,单机启动nacosstartup.cmd-mstandalone访问:http://localhost:8848/nacos用户名密码:nacos/nacos1.......
  • 尚医通-day05【MongoDB详细步骤】(内附源码)
    第01章-MongoDB1、安装和启动(docker方式)1.1、拉取镜像dockerpullmongo:4.4.81.2、创建和启动容器dockerrun-d--restart=always-p27017:27017--nameatguigu_syt_mongo-v/atguigu/syt/mongo/data/db:/data/dbmongo:4.4.8--auth常见问题:以下IPv4问题会导致无法......
  • 尚医通-day07【医院管理详细步骤】(内附源码)
    页面预览列表页批量导入数据为了方便测试,我们可以将更多的医院信息数据批量导入到系统中。将资料中的json数据和测试用例复制到项目中,然后执行测试用例即可资料:资料>批量导入医院数据第01章-医院列表信息1、医院列表1.1、Controller在service-hosp中创建AdminHospitalCo......
  • 尚医通-day06【医院模拟系统接口详细步骤】(内附源码)
    第01章-医院系统1、业务功能描述资料:资料>医院模拟系统>尚医通API接口文档.docx1.1、平台方参考《尚医通API接口文档.docx》进行业务接口的开发,接收医院方的接口调用,将医院信息、科室信息、排班信息等数据存入MongoDB。1.2、医院方每个医院有自己的业务平台,需参考《尚医通AP......
  • 尚医通-day08【排班管理详细步骤】(内附源码)
    页面预览医院详情排班管理第01章-医院详情1、后端1.1、ControllerAdminHospitalController@ApiOperation(value="获取医院详情")@ApiImplicitParam(name="hoscode",value="医院编码",required=true)@GetMapping("/show/{hoscode}")publicResult......
  • 尚医通day01-【项目环境搭建和医院设置详细步骤】(内附源码)
    第01章-项目介绍1、课程介绍项目名称:尚医通预约挂号统一平台项目原型:https://www.114yygh.com北京市预约挂号统一平台项目技术栈:前后端分离后端技术:SpringBoot+SpringCloud+MyBatisPlus+MySQL+MongoDB+Redis+RabbitMQ+Docker+EasyExcel+API远程接口调......
  • 尚医通-day02【医院设置前端详细步骤】(内附源码)
    页面预览列表页面新增页面编辑页面第01章-项目中的路由1、引入路由1.1、路由模块中定义路由src/router/index.js关键代码importVuefrom'vue'//引入vue模块importRouterfrom'vue-router'//引入路由模块Vue.use(Router)//挂载路由功能到vue框架中exportc......