Java之内存分析和String对象

Java中内存分析:
  栈(Stack) : 存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)。
  堆(heap): 存放所有new出来的对象。
  常量池(constant pool):在堆中分配出来的一块存储区域,存放储显式的String常量和基本类型常量(float、int等)。另外,可以存储不经常改变的东西 (public static final)。常量池中的数据可以共享。
  静态存储:存放静态成员(static定义的)。

  

1)

  String a = "abc";①
  String b = "abc";②
  分析:
  ①代码执行后在常量池(constant pool)中创建了一个值为abc的String对象,②执行时,因为常量池中存在"abc"所以就不再创建新的String对象了。
 
2)
  String   c   =   new   String("xyz");①
  String   d   =   new   String("xyz");②
  分析:①Class被加载时,"xyz"被作为常量读入,在常量池(constant pool)里创建了一个共享的值为"xyz"的String对象;然后当调用到new String("xyz")的时候,会在堆(heap)里创建这个new   String("xyz")对象;②由于常量池(constant pool)中存在"xyz"所以不再创建"xyz",然后创建新的new String("xyz")。
3)
  String   s1   =   new   String("xyz");     //创建二个对象(常量池和栈中),一个引用 
  String   s2   =   new   String("xyz");     //创建一个对象(栈中),并且以后每执行一次创建一个对象,一个引用 

  String   s3   =   "xyz";     //创建一个对象(常量池中),一个引用   
  String   s4   =   "xyz";     //不创建对象(共享上次常量池中的数据),只是创建一个新的引用
4)
复制代码
public class TestStr { 
  public static void main(String[] args) { 
    // 以下两条语句创建了1个对象。"凤山"存储在字符串常量池中 
    String str1 = "凤山"; 
    String str2 = "凤山"; 
    System.out.println(str1==str2);//true 
     
    //以下两条语句创建了3个对象。"天峨",存储在字符串常量池中,两个new String()对象存储在堆内存中 
    String str3 = new String("天峨"); 
    String str4 = new String("天峨"); 
    System.out.println(str3==str4);//false 
     
    //以下两条语句创建了1个对象。9是存储在栈内存中 
    int i = 9; 
    int j = 9; 
    System.out.println(i==j);//true 
     
    //由于没有了装箱,以下两条语句创建了2个对象。两个1对象存储在堆内存中 
    Integer l1 = new Integer(1); 
    Integer k1 = new Integer(1); 
    System.out.println(l1==k1);//false 
  //以下两条语句创建了1个对象。1对象存储在栈内存中。自动装箱时对于值从127之间的值,使用一个实例。
    Integer l = 20;//装箱 
    Integer k = 20;//装箱 
    System.out.println(l==k);//true 
//以下两条语句创建了2个对象。i1,i2变量存储在栈内存中,两个256对象存储在堆内存中 
    Integer i1 = 256; 
    Integer i2 = 256; 
    System.out.println(i1==i2);//false 
  } 
} 
### STM32智能厨房设备中的应用 #### 使用STM32实现温度监控系统 为了确保烹饪过程的安全性和效率,可以利用STM32微控制器创建一个精确的温度监测解决方案。该方案能够实时采集炉灶或其他加热装置表面的温度数据,并通过LCD显示屏向用户提供反馈。当检测到异常高温时,系统会自动触发警报机制并切断电源供应以防止火灾发生[^1]。 ```c // 温度传感器读取函数示例 float readTemperature(void){ float temperature; // 模拟ADC转换获取当前环境温度值 ADC_ChannelConfTypeDef sConfig = {0}; HAL_ADC_Start(&hadc); if (HAL_ADC_PollForConversion(&hadc, 10) == HAL_OK){ uint32_t rawValue = HAL_ADC_GetValue(&hadc); temperature = ((rawValue * 3.3f)/4096)*100; // 将ADC数值转化为摄氏度 } HAL_ADC_Stop(&hadc); return temperature; } ``` #### 开发基于STM32的食物保鲜提醒器 另一个有趣的项目是食物保存期限管理工具。此应用程序允许用户输入食品购买日期以及预计过期时间;之后借助内部RTC模块定时唤醒MCU检查是否有即将到期的商品并向手机发送通知消息提示主人及时处理这些物品以免浪费资源。 ```c void setupFoodExpiryReminder(uint8_t dayOffset){ RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef DateToUpdate = {0}; /* 设置RTC的时间 */ sTime.Hours = 0; sTime.Minutes = 0; sTime.Seconds = 0; /* 配置指定天数后的日期作为闹钟触发条件 */ DateToUpdate.WeekDay = __HAL_RTC_GET_WEEKDAY(&hrtc)+dayOffset%7; DateToUpdate.Month = (__HAL_RTC_GET_MONTH(&hrtc)+((__HAL_RTC_GET_DATE(&hrtc)+dayOffset)/30))%12?(__HAL_RTC_GET_MONTH(&hrtc)+((__HAL_RTC_GET_DATE(&hrtc)+dayOffset)/30)):12; DateToUpdate.Date = ((__HAL_RTC_GET_DATE(&hrtc)+dayOffset)%30)?((__HAL_RTC_GET_DATE(&hrtc)+dayOffset)%30):30; } /* 定义中断服务程序用于发出警告音调 */ void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){ Buzzer_ON(); } ``` #### 构建联网型智能烤箱控制系统 对于更高级别的需求来说,则可以通过Wi-Fi模组使传统家用电器具备互联网连接功能——比如一款支持远程控制操作参数设定(如预热温度、烘焙模式选择等)并通过移动APP界面直观展示运行状态信息给用户的智能烤箱产品就是很好的例子之一。这类产品的核心在于良好地集成各种外设接口并与云平台交互完成指令下发与接收工作流程优化。 ```json { "method": "setTargetTemp", "params": { "target_temperature_celsius": 180, "mode": "bake" }, "id": 1 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值