记录Java关于Integer的一个坑

在Java中,我们都知道对象判断使用==来进行地址判断,使用String的equals方法或者其它判断方法来进行内容的判断。虽然网络上关于这个坑的文章已经有很多了,但还是忍不住想在知乎上面分享一下,那么今天就来揭露以下Java中的int装箱类型Integer的一个坑人之处。

首先我们做个简单的测试,如下图,各位猜一下输出结果是什么样的。
在这里插入图片描述
结果如下图:
在这里插入图片描述
后面三个为true看起来都很正常,但为什么前两个Integer对象比对就是false呢,是不是两者的对象地址不同了?这里需要我们深一步探究这个问题。

首先我们知道,Integer在字面量进行赋值的时候使用到了这个类里的一个valueOf方法(具体原因使用Java反编译可得知),而这个方法上面有一段文档注释,这里我们翻译一下得到如下内容:

返回表示指定int值的整数实例。如果不需要新的整数实例,通常应优先使用该方法而不是构造函数整数(int),因为通过缓存频繁请求的值,该方法可能会产生显著更好的空间和时间性能。此方法将始终缓存-128到127(含)范围内的值,并且可能缓存此范围之外的其他值。

这个翻译内容里面提到了缓存,那么这个缓存是何方神圣呢,这里我们再往底层代码看一下。
在这里插入图片描述
看到上图红圈的代码得知,我们定义的数值如果在一个范围内的话,那么我们得到的Integer对象来源不一样了就。而这个IntegerCache类是个什么?这里我们点进去看一下。
在这里插入图片描述
关于这个内部类的代码就这么点,从上图我们可以得知这个范围是在-128和127之间,而在这个变量low和high下面还有一个数组的定义,这个数组的内容从上图下方的cache = new Integer[(high - low) + 1];往下看。不难看出这个数组会将上述范围内的数值全部存起来,而我们根据上上图的红圈内容的if判断可以得知如果我们给Integer赋值范围在这个IntegerCache范围之内的话那么会获取这个缓存里已经定义好的其中一个Integer对象返回给你,所以这个范围内的Integer使用==比较的话就是true,否则为false。官方如此做法是为文章上面所说的,在项目加载之初就事先定义好这些数值对象,而后需要用的话就可以节省一定的性能开销了。

该文章仅供参考,如有错误或缺漏欢迎各位指点迷津。

<think>嗯,用户需要基于Spring Boot的养老院系统开发指导,还特别提到要代码示例。从引用内容看,用户应该是个开发者,可能正在做毕业设计或实际项目,需要快速搭建系统框架。 用户提供的四个引用其实很有价值:引用[2]提到Spring Boot整合MySQL、Redis、Spring Security的技术栈;引用[3]提到Vue.js前端方案;引用[4]提到IDEA开发工具的使用经验。不过用户似乎被那些奇怪的文献编号(比如7s3x54kb)干扰了,我得过滤掉这些噪音。 核心需要拆解成三块:后端API开发、数据库设计、前端集成。Spring Boot的强项在后端,所以重点给Controller和Service层示例。考虑到养老院系统的特殊性,要突出住户管理和健康监护模块——这在引用[1][2]都强调过。 安全模块必须包含,因为引用[4]提到过Spring Security。代码示例用JWT认证是最实用的,但要注意提醒用户根据实际权限设计调整角色验证部分。数据库字段示例给了10个基础字段,但实际项目可能需要扩展医疗记录字段,这点在注意事项里补充。 用户可能遇到的:一是MyBatis的XML配置(新手容易命名空间写错),二是Vue.js的axios跨域问题。在开发注意事项里专门列出这两个点,还加了本地缓存这个优化项——引用[3]提到过前端框架选择,这个优化能提升实际体验。 相关问题设计成进阶路线:1是架构拓展(应对高并发),2是部署方案(用户可能要上云),3是微服务改造(引用[4]暗示过系统复杂度)。这样既覆盖当前需求,又预留了提升空间。 </think>以下是基于Spring Boot开发养老院管理系统的实现方法及核心代码示例,结合了引用中提到的技术要点: --- ### 一、系统架构设计 ```mermaid graph LR A[前端Vue.js/Uniapp] --> B[Spring Boot后端] B --> C[MySQL数据库] B --> D[Redis缓存] B --> E[Spring Security] ``` --- ### 二、核心模块实现 #### 1. 基础依赖配置(pom.xml) ```xml <dependencies> <!-- Spring Boot核心 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 数据层 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- 安全控制 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> </dependencies> ``` #### 2. 住户管理模块代码示例 ##### 实体类(Entity) ```java @Entity @Table(name = "resident") public class Resident { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String name; // 姓名 @Column(nullable = false) private Integer age; // 年龄 @Column(name = "health_status") private String healthStatus; // 健康状况 // 省略getter/setter } ``` ##### 数据访问层(Repository) ```java public interface ResidentRepository extends JpaRepository<Resident, Long> { List<Resident> findByHealthStatus(String status); // 按健康状况查询 } ``` ##### 服务层(Service) ```java @Service public class ResidentService { @Autowired private ResidentRepository residentRepository; @Transactional public Resident addResident(Resident resident) { return residentRepository.save(resident); } public List<Resident> getResidentsByHealth(String status) { return residentRepository.findByHealthStatus(status); } } ``` ##### 控制器(Controller) ```java @RestController @RequestMapping("/api/residents") public class ResidentController { @Autowired private ResidentService residentService; @PostMapping public ResponseEntity<Resident> createResident(@RequestBody Resident resident) { Resident saved = residentService.addResident(resident); return new ResponseEntity<>(saved, HttpStatus.CREATED); } @GetMapping("/health/{status}") public List<Resident> getByHealth(@PathVariable String status) { return residentService.getResidentsByHealth(status); } } ``` --- ### 三、关键功能实现 #### 1. Spring Security 配置(JWT认证) ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/auth/**").permitAll() .anyRequest().authenticated() .and() .addFilter(new JwtAuthenticationFilter(authenticationManager())); } } ``` #### 2. Redis缓存健康数据 ```java @Service public class HealthCacheService { @Autowired private RedisTemplate<String, Object> redisTemplate; public void cacheCriticalResidents(List<Resident> residents) { redisTemplate.opsForValue().set("critical_residents", residents, 10, TimeUnit.MINUTES); } public List<Resident> getCachedCriticalResidents() { return (List<Resident>) redisTemplate.opsForValue().get("critical_residents"); } } ``` --- ### 四、开发注意事项 1. **数据库优化** - 为高频查询字段添加索引(如`health_status`) - 使用连接池配置(如HikariCP) 2. **安全规范** - 密码使用BCrypt加密:`new BCryptPasswordEncoder().encode(rawPassword)` - 敏感接口添加权限注解:`@PreAuthorize("hasRole('ADMIN')")` 3. **API文档** 集成Swagger生成接口文档: ```java @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.nursinghome")) .build(); } ``` --- ### 五、源码获取与测试建议 1. **源码参考** 可访问开源项目参考完整实现: ```markdown [GitHub - NursingHome-Management](https://github.com/example/nursing-home) ``` 2. **测试要点** - 使用`MockMvc`模拟API请求 ```java mockMvc.perform(get("/api/residents/health/CRITICAL")) .andExpect(status().isOk()) .andExpect(jsonPath("$[0].name").value("张三")); ``` - 使用JMeter进行并发压力测试 - 使用Selenium进行前端功能测试 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值