`

String和StringBuffer在字符串拼接上的性能辨析

 
阅读更多

    String和StringBuffer在字符串拼接性能上的比较是Java技术面试的常见问题,在很多书籍和文章中只是简单的说:“String是不可变类型,StringBuffer是可变类型;所以在字符串拼接时StringBuffer的效率要远高于String。”事实真的是这样吗?

 

1. 在只有字符串常量参与拼接的情况下,String的效率要远高于StringBuffer

    

package test;

public class StringTest {

	public static void main(String[] args) {
		long time1 = System.nanoTime();
		String hql = " select ui.real_name borrowerName,u.mobile mobile, u.email email,u.id borrowerId, " +
					 " l.loan_title loanTitle,l.open_amount openAmount,l.contact_amount contactAmount," +
					 " l.interest interest,l.loan_months loanMonths,p.name productName,l.loan_status loanStatus," +
					 " l.borrow_type borrowType, l.repayment_type repaymentType,l.id id,due.leaveAmount leaveAmount," +
					 " due.leaveNum leaveNum,c.channel_zn_name channelName" +
					 " from loan l left join user_info ui on l.borrower_id=ui.user_id" +
					 " left join user u on l.borrower_id=u.id" +
					 " left join product p on l.product_id=p.id" +
					 " left join channel c on c.channel_en_name=u.utm_source" +
					 " right join (select brr.loan_id loanId, sum(brr.repay_principal_interest) leaveAmount,count(id) leaveNum " +
					 " from borrow_repay_record brr where brr.status=:status or DATE_FORMAT(brr.repay_date,'%y-%m-%d') >= DATE_FORMAT(:leave_now,'%y-%m-%d')   " +
					 " GROUP BY brr.loan_id ) due on due.loanId=l.id " +
					 " where l.loan_status=:loan_status ";
		
		long time2 = System.nanoTime();
		
		StringBuffer sb = new StringBuffer();
		sb.append("select ui.real_name borrowerName,u.mobile mobile, u.email email,u.id borrowerId,")
		  .append("l.loan_title loanTitle,l.open_amount openAmount,l.contact_amount contactAmount," )
		  .append("l.interest interest,l.loan_months loanMonths,p.name productName,l.loan_status loanStatus," )
		  .append("l.borrow_type borrowType, l.repayment_type repaymentType,l.id id,due.leaveAmount leaveAmount," )
		  .append("due.leaveNum leaveNum,c.channel_zn_name channelName" )
		  .append("from loan l left join user_info ui on l.borrower_id=ui.user_id" )
		  .append("left join user u on l.borrower_id=u.id" )
		  .append("left join product p on l.product_id=p.id" )
		  .append("left join channel c on c.channel_en_name=u.utm_source" )
		  .append("right join (select brr.loan_id loanId, sum(brr.repay_principal_interest) leaveAmount,count(id) leaveNum")
		  .append("from borrow_repay_record brr where brr.status=:status or DATE_FORMAT(brr.repay_date,'%y-%m-%d') >= DATE_FORMAT(:leave_now,'%y-%m-%d')  ")
		  .append("GROUP BY brr.loan_id ) due on due.loanId=l.id")
		  .append("where l.loan_status=:loan_status");
		
		long time3 = System.nanoTime();
		
		System.out.println(time2-time1);
		System.out.println(time3-time2);
	}

}

 运行结果

 

8397
56915

 为什么会出现String的效率远高于StringBuffer的情况?这不是和书上说的相反了吗?

实际上这里是因为Java在编译java文件到class文件时,进行了优化,查看class文件:

// Compiled from StringTest.java (version 1.6 : 50.0, super bit)
public class test.StringTest {
  
  // Method descriptor #6 ()V
  // Stack: 1, Locals: 1
  public StringTest();
    0  aload_0 [this]
    1  invokespecial java.lang.Object() [8]
    4  return
      Line numbers:
        [pc: 0, line: 3]
      Local variable table:
        [pc: 0, pc: 5] local: this index: 0 type: test.StringTest
  
  // Method descriptor #15 ([Ljava/lang/String;)V
  // Stack: 5, Locals: 9
  public static void main(java.lang.String[] args);
      0  invokestatic java.lang.System.nanoTime() : long [16]
      3  lstore_1 [time1]
      4  ldc <String " select ui.real_name borrowerName,u.mobile mobile, u.email email,u.id borrowerId,  l.loan_title loanTitle,l.open_amount openAmount,l.contact_amount contactAmount, l.interest interest,l.loan_months loanMonths,p.name productName,l.loan_status loanStatus, l.borrow_type borrowType, l.repayment_type repaymentType,l.id id,due.leaveAmount leaveAmount, due.leaveNum leaveNum,c.channel_zn_name channelName from loan l left join user_info ui on l.borrower_id=ui.user_id left join user u on l.borrower_id=u.id left join product p on l.product_id=p.id left join channel c on c.channel_en_name=u.utm_source right join (select brr.loan_id loanId, sum(brr.repay_principal_interest) leaveAmount,count(id) leaveNum  from borrow_repay_record brr where brr.status=:status or DATE_FORMAT(brr.repay_date,'%y-%m-%d') >= DATE_FORMAT(:leave_now,'%y-%m-%d')    GROUP BY brr.loan_id ) due on due.loanId=l.id  where l.loan_status=:loan_status "> [22]
      6  astore_3 [hql]
      7  invokestatic java.lang.System.nanoTime() : long [16]
     10  lstore 4 [time2]
     12  new java.lang.StringBuffer [24]
     15  dup
     16  invokespecial java.lang.StringBuffer() [26]
     19  astore 6 [sb]
     21  aload 6 [sb]
     23  ldc <String "select ui.real_name borrowerName,u.mobile mobile, u.email email,u.id borrowerId,"> [27]
     25  invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [29]
     28  ldc <String "l.loan_title loanTitle,l.open_amount openAmount,l.contact_amount contactAmount,"> [33]
     30  invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [29]
     33  ldc <String "l.interest interest,l.loan_months loanMonths,p.name productName,l.loan_status loanStatus,"> [35]
     35  invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [29]
     38  ldc <String "l.borrow_type borrowType, l.repayment_type repaymentType,l.id id,due.leaveAmount leaveAmount,"> [37]
     40  invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [29]
     43  ldc <String "due.leaveNum leaveNum,c.channel_zn_name channelName"> [39]
     45  invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [29]
     48  ldc <String "from loan l left join user_info ui on l.borrower_id=ui.user_id"> [41]
     50  invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [29]
     53  ldc <String "left join user u on l.borrower_id=u.id"> [43]
     55  invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [29]
     58  ldc <String "left join product p on l.product_id=p.id"> [45]
     60  invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [29]
     63  ldc <String "left join channel c on c.channel_en_name=u.utm_source"> [47]
     65  invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [29]
     68  ldc <String "right join (select brr.loan_id loanId, sum(brr.repay_principal_interest) leaveAmount,count(id) leaveNum"> [49]
     70  invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [29]
     73  ldc <String "from borrow_repay_record brr where brr.status=:status or DATE_FORMAT(brr.repay_date,'%y-%m-%d') >= DATE_FORMAT(:leave_now,'%y-%m-%d')  "> [51]
     75  invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [29]
     78  ldc <String "GROUP BY brr.loan_id ) due on due.loanId=l.id"> [53]
     80  invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [29]
     83  ldc <String "where l.loan_status=:loan_status"> [55]
     85  invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [29]
     88  pop
     89  invokestatic java.lang.System.nanoTime() : long [16]
     92  lstore 7 [time3]
     94  getstatic java.lang.System.out : java.io.PrintStream [57]
     97  lload 4 [time2]
     99  lload_1 [time1]
    100  lsub
    101  invokevirtual java.io.PrintStream.println(long) : void [61]
    104  getstatic java.lang.System.out : java.io.PrintStream [57]
    107  lload 7 [time3]
    109  lload 4 [time2]
    111  lsub
    112  invokevirtual java.io.PrintStream.println(long) : void [61]
    115  return
      Line numbers:
        [pc: 0, line: 6]
        [pc: 4, line: 7]
        [pc: 7, line: 21]
        [pc: 12, line: 23]
        [pc: 21, line: 24]
        [pc: 28, line: 25]
        [pc: 33, line: 26]
        [pc: 38, line: 27]
        [pc: 43, line: 28]
        [pc: 48, line: 29]
        [pc: 53, line: 30]
        [pc: 58, line: 31]
        [pc: 63, line: 32]
        [pc: 68, line: 33]
        [pc: 73, line: 34]
        [pc: 78, line: 35]
        [pc: 83, line: 36]
        [pc: 89, line: 38]
        [pc: 94, line: 40]
        [pc: 104, line: 41]
        [pc: 115, line: 42]
      Local variable table:
        [pc: 0, pc: 116] local: args index: 0 type: java.lang.String[]
        [pc: 4, pc: 116] local: time1 index: 1 type: long
        [pc: 7, pc: 116] local: hql index: 3 type: java.lang.String
        [pc: 12, pc: 116] local: time2 index: 4 type: long
        [pc: 21, pc: 116] local: sb index: 6 type: java.lang.StringBuffer
        [pc: 94, pc: 116] local: time3 index: 7 type: long
}

 在main方法的第四行很容易看出,编译时Java把多个字符串常量拼接成了一个长字符串,效率自然比使用StringBuffer高得多。

2. 有变量参与字符串拼接时,StringBuffer的效率要高于String

3. 对于有大量字符串常量参与拼接时可以将大段的字符串常量先用String的+进行拼接,再和其他部分使用StringBuffer进行拼接。

    

package test;

public class StringTest2 {

	public static void main(String[] args) {
		long time1 = System.nanoTime();
		String sql = " SELECT llr.id,llr.finance_plan_subpoint_id as financePlanSubPointId," +
			         " llr.loan_Id as loanId,llr.lend_amount as lendAmount,l.interest" + 
			         " FROM loan_lender_record llr JOIN loan l ON llr.loan_id = l.id " +
			         " WHERE llr.finance_plan_subpoint_id IN( SELECT id " +
			         "                                        FROM finance_plan_subpoint fps " +
			         "                                        WHERE fps.finance_plan_id = " + 
			         System.nanoTime() + 
			         ")";
		
		long time2 = System.nanoTime();
		
		StringBuffer sb = new StringBuffer();
		sb.append(" SELECT llr.id,llr.finance_plan_subpoint_id as financePlanSubPointId,")
		  .append(" llr.loan_Id as loanId,llr.lend_amount as lendAmount,l.interest" )
		  .append(" FROM loan_lender_record llr JOIN loan l ON llr.loan_id = l.id " )
		  .append(" WHERE llr.finance_plan_subpoint_id IN( SELECT id " )
		  .append("                                        FROM finance_plan_subpoint fps " )
		  .append("                                        WHERE fps.finance_plan_id = " )
		  .append(System.nanoTime())
		  .append(")");
		
		long time3 = System.nanoTime();

		String tempSql = " SELECT llr.id,llr.finance_plan_subpoint_id as financePlanSubPointId," +
			         " llr.loan_Id as loanId,llr.lend_amount as lendAmount,l.interest" + 
			         " FROM loan_lender_record llr JOIN loan l ON llr.loan_id = l.id " +
			         " WHERE llr.finance_plan_subpoint_id IN( SELECT id " +
			         "                                        FROM finance_plan_subpoint fps " +
			         "                                        WHERE fps.finance_plan_id = ";
 	    StringBuffer sb1 = new StringBuffer(tempSql); 
		sb1.append(System.nanoTime()).append(")");
		
		long time4 = System.nanoTime();
		
		System.out.println(time2-time1);
		System.out.println(time3-time2);
		System.out.println(time4-time3);
	}

}

 

    运行结果:

52249
41520
8397

 

4. 使用StringBuffer拼接字符串时,适当的直接初始化大小可以提升效率

    StringBuffer的底层是char数组,默认长度是16;当长度不足时按照“新长度=(原长度+1)*2” 来增大。

    // StringBuffer增大长度的实现
    void expandCapacity(int minimumCapacity) {
	int newCapacity = (value.length + 1) * 2;
        if (newCapacity < 0) {
            newCapacity = Integer.MAX_VALUE;
        } else if (minimumCapacity > newCapacity) {
	    newCapacity = minimumCapacity;
	}
        value = Arrays.copyOf(value, newCapacity);
    }

     如果字符串拼接的结果比较大,在使用StringBuffer时就会多次调用此函数,影响效率。所以可以直接在初始化时,设置好StringBuffer的长度。

 

 

字符串拼接的编码原则:

1. 全部由字符串常量组成的字符串进行拼接, 直接使用String的+操作即可。

2. 当有字符串变量参与拼接时,应当使用StringBuffer进行拼接操作。

3. 对于既有很多字符串常量也有字符串变量参与拼接,可以将大段的字符串常量先用String的+进行拼接,再和其他部分使用StringBuffer进行拼接。

4. 使用StringBuffer时,如果可以预估出结果长度,应该设置StringBuffer的初始化长度。

 

分享到:
评论

相关推荐

    辨析Java中的String与StringBuffer及StringBuilder字符串类

    - **操作**:所有三个类都支持字符串的拼接、插入和删除等操作,但String的操作会创建新的对象,而StringBuffer和StringBuilder在原对象上进行修改。 5. **使用场景**: - 如果字符串操作是在单线程中,推荐使用...

    毕设单片机实战项目基于esp8266的高考倒计时.zip

    【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    毕设工坊:专注于计算机毕业设计项目的交流与资源共享平台,涵盖各类技术文档、代码示例及实战经验分享,助力学子顺利完成学业挑战

    毕设工坊:专注于计算机毕业设计项目的交流与资源共享平台,涵盖各类技术文档、代码示例及实战经验分享,助力学子顺利完成学业挑战。

    【window 可视化nvm管理node版本 nvm-desktop】

    【window 可视化nvm管理node版本 nvm-desktop】

    《基于YOLOv8的玉器识别系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    (源码)基于microbit编程语言的mymicrobit扩展插件项目.zip

    # 基于microbit编程语言的mymicrobit扩展插件项目 ## 项目简介 这是一个基于microbit编程语言的mymicrobit扩展插件项目。该项目旨在提供额外的功能和特性,以扩展microbit编程环境。通过此插件,用户可以轻松地在MakeCode环境中进行编程,实现对micro:bit设备的更多控制和功能实现。 ## 项目的主要特性和功能 1. 扩展性提供了丰富的积木块和代码库,允许用户轻松实现复杂的编程逻辑和功能扩展。 2. 图形化编程支持通过积木块形式的图形化编程,降低编程门槛,方便初学者快速上手。 3. 实时预览提供了积木块的实时预览功能,方便用户直观地了解代码块的逻辑和功能。 4. 与MakeCode无缝集成可以直接在MakeCode环境中导入和使用,无需额外的配置和安装。 ## 安装使用步骤

    毕设单片机实战项目基于ESP8266的局域网图片刷新显示系统.zip

    【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    《基于YOLOv8的印章分析系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    p111基于django的企业员工管理系统.zip

    项目资源包含:可运行源码+sql文件 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 项目具有较高的学习借鉴价值,也可拿来修改、二次开发。 有任何使用上的问题,欢迎随时与博主沟通,博主看到后会第一时间及时解答。 开发语言:Python 框架:django Python版本:python3.8 数据库:mysql 5.7 数据库工具:Navicat 开发软件:PyCharm 浏览器:谷歌浏览器

    第三章-局域网-思维导图

    第三章-局域网-思维导图

    机械工程PT300机械故障仿真测试台:高校教学与科研用精密振动分析及故障诊断实验系统了您提供的规范

    内容概要:PT300机械故障综合模拟实验台由瓦仑尼安教学设备有限公司生产,旨在帮助用户深入了解振动特征知识及复杂转子振动频谱分析,实现精密振动分析和精准故障诊断。该实验台能模拟轴承故障、不平衡、不对中、设备松动、转子摩擦等多种机械故障现象,可进行不同转速下的轴承故障频率识别、转子静动平衡模拟试验、设备启停机测试等实验。设备采用高效节能ABB三相交流电动机,配备高精度转速控制和测量模块,确保运行稳定。此外,实验台还设有透明防震安全罩和互锁开关,保障实验安全。; 适合人群:高校师生、科研人员等需要学习或研究机械故障诊断相关理论知识和实践技能的人群。; 使用场景及目标:①用于高校等教育机构的教学,辅助学生理解机械故障诊断的理论知识和实践技能;②满足科研人员进行机械故障诊断算法验证、故障特征分析等科研需求。; 其他说明:PT300机械故障综合模拟实验台的每个部件均经过高精度加工,确保在不同振动状态下稳定运行。用户可根据期望分析特定部件的故障特征。设备尺寸为735mm(长)×310mm(宽)×350mm(高),保修一年,且提供免费操作指导服务。

    Android毕设实战项目基于Android+Django+sqlit3开发.zip

    【项目资源】: 适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    【光子晶体模拟】基于COMSOL弱形式PDE的三维光子晶体能带结构计算与优化:电磁场切向连续性处理及带隙分析系统设计使用COMSOL

    内容概要:本文详细介绍了使用COMSOL Multiphysics的弱形式接口对三维光子晶体进行数值模拟的方法和技巧。文章通过具体的代码示例,解释了如何构建光子晶体的介电常数分布、设置弱形式PDE、处理电磁场切向连续性、应用Floquet周期边界条件以及特征值求解等关键步骤。特别强调了弱形式接口相比传统物理场接口的优势,如灵活性和对复杂边界的处理能力。文中还分享了一些实用的经验和注意事项,如布洛赫边界条件的实现、特征值求解器参数的优化配置以及网格划分的技巧。 适合人群:具备一定电磁学和数值模拟基础的研究人员或工程师,尤其是对光子晶体仿真感兴趣的读者。 使用场景及目标:①理解并掌握COMSOL弱形式接口在光子晶体仿真中的应用;②学习如何通过弱形式设置处理复杂的电磁场问题;③提高对光子晶体能带结构和带隙特性的认识;④掌握特征值求解和网格划分的最佳实践。 阅读建议:由于本文涉及较多的具体代码和物理概念,建议读者在阅读过程中结合COMSOL软件进行实际操作,同时查阅相关电磁理论书籍以加深理解。此外,对于文中提到的一些具体参数设置和技巧,可以通过尝试不同的配置来巩固所学知识。

    (源码)基于Arduino平台的INSPTComputacion2项目.zip

    # 基于Arduino平台的INSPTComputacion2项目 ## 项目简介 INSPTComputacion2是一个基于Arduino平台的开发项目。该项目旨在通过Arduino的硬件和软件能力,实现一系列计算和交互功能。通过此项目,用户可以体验到Arduino在嵌入式系统、物联网和微控制器等领域的强大功能。 ## 项目的主要特性和功能 该项目的主要特性和功能包括但不限于以下几点 1. 嵌入式系统开发利用Arduino的硬件资源,开发嵌入式系统应用。 2. 物联网应用实现Arduino与物联网技术的结合,进行数据采集、传输和控制。 3. 交互设计通过Arduino实现人机交互,如按钮控制、LED显示等。 4. 数据处理利用Arduino进行数据处理和分析,如温度、湿度等环境数据的采集和处理。 ## 安装使用步骤 以下是在已下载本项目源码文件后的安装使用步骤 1. 确保已安装Arduino IDE软件。

    毕业设计物联网实战项目基于云且连接 Internet 的新式应用程序。 可用于建立Web应用、 IoT物联网、移动后端等。.zip

    【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    毕业设计物联网实战项目基于touchgfx,调度基于freertos.zip

    【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    Python数据结构-学习笔记

    Python数据结构-学习笔记

    电影在线购票系统(springboot+ssm+vue+mysql)含万字系统详细说明文档

    该系统展示了一个电影在线购票系统的结构图,系统分为前台和后台两部分。前台包括首页、影院信息、电影信息、电影资讯和个人中心等模块,主要面向普通用户,提供电影浏览、选座购票、个人账户管理等功能。后台部分由管理员通过后台模块进行操作,包括系统首页、用户管理、场次管理、时间段管理、影院信息管理、电影分类管理、电影信息管理、订单管理和个人中心等模块,用于系统的维护和管理,如用户信息维护、电影和影院信息更新、订单处理等。整个系统旨在为用户提供便捷的在线购票体验,同时确保后台管理的高效和有序。

    5G NR射频基本指标一致性自测用例

    5G NR射频一致性自测用例 由于NR射频测试场景太多,全指标自动化跑测用时太久,本表格选取了主要场景的关键指标,以便于射频工程师对产品的NR射频指标进行初步摸底。 表格每一页概况: 1、NR TDD摸底指标N77/78/79/41 2、NR FDD摸底指标N1/3//5/8/28 附录1、各频段带宽所支持的SCS 附录2、各带宽SCS的RB配置 附录3、灵敏度测试的RB配置 附录4、摸底测试信道查询 附录5、各频段频率范围

    毕业设计物联网实战项目基于STM32、ESP8266、EMQX和Android的智能家居系统.zip

    【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

Global site tag (gtag.js) - Google Analytics