String==汇总

本文深入探讨了Java中String对象的创建方式,包括直接赋值与使用new关键字的区别,以及intern方法如何影响String对象在常量池中的存储。通过具体代码示例,解析了不同场景下String对象的内存分配与引用指向,为理解Java内存管理和优化提供了关键洞见。

String==汇总(jdk1.7及以上版本)

点击这里直接通往测试代码地址

String s1 = "abc";//直接去常量池里查找是否有‘abc’,如果没有就创建一个,然后s1指向常量池对应字符
String s2 = new String("abc");//在堆里创建String对象,然后去常量池里检查存放‘abc’
String s1 = new String("ab") + new String("c");
//在堆里创建‘ab’和‘c’对象,然后常量池里检查存放‘ab’和‘c’,最后在堆里创建一个“abc”对象,直接指向s1;
//(这时并没有向常量池放入‘abc’,需要s1.intern()才会去常量池里检查存放‘abc’,
//如果常量池里没有,在常量池新增一个’abc‘,并且s1引用直接指向这个常量;
//如果常量池里有,则s1引用不会发生变化)
//代码示例1
		String s1 = new String("ab") + new String("c");
		s1.intern();
		String s2="abc";
		System.out.println(s1==s2);//返回true。这时的s1指向的是常量池里的’abc‘(推测,待证实)
//************************************************************************************
//代码示例2
		String s1 = new String("ab") + new String("c");		
		String s2="abc";
		s1.intern();
		System.out.println(s1==s2);//返回false。由于s1.intern()没有起作用,这时的s1引用指向没有变化
String s1 = "a" + "b";//这个会在编译的时候直接变成 String s1 = "ab";
final String s1 = "a";//如果final修饰的字符串(不包含new String),会在编译的时候直接替换
final String s2 = "b";
String s3 = s1 + s2;
String s4 = "ab";
System.out.println(s3 == s4);
//编译后的代码
        String s1 = "a";
        String s2 = "b";
        String s3 = "ab";
        String s4 = "ab";
        System.out.println(s3 == s4);

在这里插入图片描述

<think> 我们有三幅独立的图,现在需要将它们合并成一个包含三个子图的大图。 原来的代码分别绘制了三个图,每个图都有相似的格式:红色星号表示真实类别,蓝色圆圈表示预测类别,并包含图例、网格、标题(包含准确率)和坐标轴标签。 我们可以使用subplot函数来创建3个子图,并分别绘制每个图。 注意:原来的代码中,三个图都是使用相同的x坐标(1:length(y_test_1))。但是,我们注意到三个测试集可能不同,但是这里使用了相同的x变量(都是1到相同长度),所以没有问题。但为了通用性,我们假设三个测试集的长度可能不同,但实际上原代码中x都是1:length(y_test_1),所以这里我们保持每个子图分别用各自的数据长度。 步骤: 1. 创建一个新的figure(4)(或者我们可以重新指定一个图窗,但原要求是汇总成子图,所以我们可以用一个新图窗,比如figure(5)来避免覆盖) 2. 使用subplot(3,1,1)创建第一个子图,然后绘制第一个分类结果图。 3. 类似地,使用subplot(3,1,2)和subplot(3,1,3)创建第二和第三个子图。 但是注意,原来的每个图都使用了hold on,因为每个图都有两条曲线(真实类别和预测类别)。在子图中我们同样需要hold on。 另外,原代码中每个图都有自己的title,xlabel,ylabel和legend。在子图中我们也需要分别设置。 由于我们要在一个图窗中显示三个子图,为了避免重叠,我们可以使用subplot的间距调整,或者使用subtightplot函数(需要下载),但这里我们使用基本的subplot,并在最后使用linkaxes(可选)来链接x轴,使它们缩放一致(如果需要)。 然而,由于每个子图的x轴范围可能不同(因为测试集样本数量不同),所以我们不链接坐标轴。 我们按照以下步骤重写代码: 注意:原代码中每个图的标题字符串使用了多行,这里我们同样保留。 修改后的代码: 我们将三个独立的图绘制在一个图窗的三个子图中。 由于原代码中每个图都使用了相同的x变量定义方式,但是针对不同的测试集,所以我们需要分别用各自的测试集长度来定义x。 但是,原代码中第一个图的x使用了y_test_1的长度,而后两个图也是用x(但x已经定义过了,且长度和y_test_1相同),所以实际上如果三个测试集长度不同,原来的代码会有问题。因此,我们改为每个子图使用各自的数据长度。 假设三个测试集的变量分别为: y_test_1, y_pred_1 -> 第一个子图 y_test_2, y_pred_2 -> 第二个子图 y_test_3, y_pred_3 -> 第三个子图 我们分别用: x1 = 1:length(y_test_1); x2 = 1:length(y_test_2); x3 = 1:length(y_test_3); 然后分别绘制。 但是注意,原代码中三个图都是绘制在同一个图窗(figure(4))中,但是是覆盖绘制(使用了hold on)。现在我们要分别绘制在三个子图中。 另外,原代码中每个图后面都有grid on, legend, title等,我们分别在每个子图中设置。 为了避免在绘制第二个和第三个图时覆盖第一个图,我们现在使用子图。 具体代码如下: </think> 要将三幅图汇总成子图,可以使用 MATLAB 的 `subplot` 函数在同一图窗中创建三个垂直排列的子图。以下是修改后的代码: ```matlab figure(4); % 创建主图窗 % 子图1:SVM 分类结果 subplot(3,1,1); % 创建3行1列的第1个子图 x1 = 1:length(y_test_1); plot(x1, y_test_1, 'r*'); hold on; plot(x1, y_pred_1, 'bo'); grid on; legend('真实类别', '预测类别', 'Location', 'best'); % 添加图例 xlabel('测试集样本1编号'); ylabel('类别'); title({['SVM 分类结果对比']; ['准确率 = ' num2str(accuracy_1(1)*100) '%']}); % 子图2:LSSVM 分类结果 subplot(3,1,2); % 创建第2个子图 x2 = 1:length(y_test_2); plot(x2, y_test_2, 'r*'); hold on; plot(x2, y_pred_2, 'bo'); grid on; legend('真实类别', '预测类别', 'Location', 'best'); xlabel('测试集样本2编号'); ylabel('类别'); title({['LSSVM 分类结果对比']; ['准确率 = ' num2str(accuracy_2(1)*100) '%']}); % 子图3:PSO-LSSVM 分类结果 subplot(3,1,3); % 创建第3个子图 x3 = 1:length(y_test_3); plot(x3, y_test_3, 'r*'); hold on; plot(x3, y_pred_3, 'bo'); grid on; legend('真实类别', '预测类别', 'Location', 'best'); xlabel('测试集样本3编号'); ylabel('类别'); title({['PSO-LSSVM 分类结果对比']; ['准确率 = ' num2str(accuracy_3(1)*100) '%']}); % 调整子图间距 set(gcf, 'Position', [100, 100, 800, 900]); % 设置图窗大小 ``` ### 解释: 1. **`subplot(3,1,N)`**: - 创建 3 行 1 列的子图布局(垂直排列) - 参数 `N` 指定当前操作的子图位置(1=顶部,2=中部,3=底部) 2. **独立坐标轴**: - 每个子图有独立的 `xlabel`/`ylabel`/`title` - 使用独立的 `x1`/`x2`/`x3` 变量适配不同长度的测试集 3. **图例优化**: - `'Location','best'` 自动选择最佳图例位置避免遮挡数据点 - 每个子图需单独调用 `legend`(作用域限于当前子图) 4. **布局优化**: - `set(gcf,'Position',...)` 调整图窗尺寸确保子图有足够显示空间 - 标题使用元胞数组 `{ }` 实现多行显示(原 `string` 变量语法等效) 5. **保持原有元素**: - 保留原始的颜色标记(`'r*'` 红星真实值,`'bo'` 蓝圈预测值) - 保留网格线(`grid on`)和准确率显示格式 ### 注意事项: - 需要确保 `y_test_*` 和 `y_pred_*` 已存在于工作区 - 如果测试集长度不同,独立定义 `x1`/`x2`/`x3` 可避免潜在错误 - 可通过修改 `subplot(3,1,N)` 为 `subplot(1,3,N)` 改为水平排列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值