java 字符串 面试_java字符串面试(一) | 学步园

1. String对象是不可变的,String类中每一个看起来修改String值的方法,实际上都是创建了全新的String对象。

package com.lyj.string;

/*

* String是不可变的

*/

public class StringDemo {

public static void main(String[] args) {

String s1 = "lyj";

System.out.println(s1);

String s2 = upcase(s1);

System.out.println(s2);

System.out.println(s1);

}

public static String upcase(String s) {

return s.toUpperCase();

}

输出结果是lyj, LYJ, lyj。s.toUpperCase(String s)会创建一个新的String对象,返回时返回指向这个对象的引用。 如果s1不指向新的对象,则它指向的值始终是lyj。

2. String对象是不可变的,可以给String对象加任意多的别名,因为String对象具有只读性,所以指向它的任何引用都不能改变它的值。

package com.lyj.test;

public class Test {

/**

* @param args

*/

public static void main(String[] args) {

String s1 = "lyj";

String s2 = "zky" + s1 + "age";

System.out.println(s2);

}

}

这个例子中,编译器会创建一个StringBuilder对象,用于构造最终的String,并且为每个字符串调用一次StringBuilder的append方法,总计4次。最后调用toString生成结果,并保存为s2.

StringBuilder是java SE5引入的,在这之前java用的StringBuffer.后者是线程安全的,因此开销会大一点,所以在引入StringBuilder操作字符串会更快一点。

3.

public static void main(String[] args) {

String hello = "hello";

String hel = "hel";

String lo = "lo";

/*

* 输出true

* 在"+"两边都是常量字符串,则将两个字符串合并并且在String Pool中查找"hello",然后返回他的内存地址

*/

System.out.println(hello == "hel" + "lo");

/*

* 输出false

* "编译器为了对"hel" + lo语句进行优化,其实会创建一个StringBuilder对象,然后依次调用它的append方法,

* 最后调用toString方法返回一个String对象的引用。

*/

System.out.println(hello == "hel" + lo);

}

4.

public static void main(String[] args) {

/*

* 虽然两个语句都是返回一个String对象的引用,但是jvm对两者的处理方式是不一样的。对于第一种,jvm会马上在heap中创建一个String对象,

* 然后将该对象的引用返回给用户。对于第二种,jvm首先会在内部维护的strings pool中通过String的 equels 方法查找是对象池中是否存放有

* 该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,

* jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至strings pool中。

* 注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到strings pool里面的,除非程序调用 String的intern方法。

*/

String s1 = new String("abc");

String s2 = "abc";

String s3 = new String("abc");

System.out.println(s1 == s2);//false

System.out.println(s1 == s3);//false

System.out.println(s2 == s3);//false

// 程序显式将s1放到strings pool中,intern运行过程是这样的:首先查看strings pool

// 有没“abc”对象的引用,没有,则在堆中新建一个对象,然后将新对象的引用加入至

// strings pool中。执行完该语句后,str1原来指向的String对象已经成为垃圾对象了,随时会

// 被GC收集。s1.intern()是在String Pool中的“abc"的引用,s1是在heap中新建“abc”对象的引用。

//分析这类题最好画图,这样比较好理解

System.out.println(s1 == s1.intern());//false

System.out.println(s2 == s1.intern());//true

System.out.println(s2 == s2.intern());//true

System.out.println(s1.intern() == s3.intern());//true

}

分析图如下:

0_131674648474Wt.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值