1.推荐使用String直接赋值
public static void main(String[] args) { String str1 = "abc"; String str2 = "abc"; String str3 = new String("abc"); System.out.println(str1 == str2); // 输出结果为true System.out.println(str1 == str3); // 输出结果为false }
java当中为了避免系统大量的产生String对象,于是就设计出一个字符串常量池。当创建一个String时,首先会在常量池当中检查是否存在这个常量,若不存在,则创建,若不存在,则将内存地址指向此常量地址。而new String的情况下,Java不会去常量池寻找,而是直接在堆中建立对象,所以使用str1==str3自然不成立。通过上面的介绍,由于常量池是由JVM本身进行维护的,所以JVM本身已对常量池进行了大量优化,所以使用直接赋值的方式会比使用new String的方式效率更高,更节省内存空间。
2.注意正则表达式引发的问题
public static void main(String[] args) { // 1 String str1 = "AHelloA"; str1 = str1.replaceAll("A", ""); System.out.println(str1.equals("Hello")); // 输出为true // 2 String str2 = "$Hello$"; str2 = str2.replaceAll("$", ""); System.out.println(str2.equals("Hello")); // 输出为false // 3 String str3 = "$Hello$"; str3 = str3.replaceAll("\\$", ""); System.out.println(str3.equals("Hello")); // 输出为true // 4 String str4 = "$Hello$"; str4 = str4.replace("$", ""); // 更改了replace方法 System.out.println(str4.equals("Hello")); // 输出为true }
这是因为replaceAll的方法其实是接受一个正则表达式,而$符号刚好是正则表达式的结束符号,所以出现了//2的情况。
3.注意String的不变性
public static void main(String[] args) { // 1 String str1 = "Hello"; str1 += " World"; System.out.println(str1); // 输出Hello World // 2 str1.replace("World", ""); System.out.println(str1); // 输出Hello World }
在上面的代码当中,//1中一共创建了3个String,第一为Hello,第二为World,第三为Hello World。String类中提供的修改字符串的方法,包括substring,replace,concat等都是返回一个新的字符串,这是因为字符串的不变性造成的,所以在调用这些方法时需要用另一个或本调用的string去进行接收。
4.注意字符串的位置
public static void main(String[] args) { String str1 = 1 + 2 + "Hello"; System.out.println(str1); // 输出3Hello String str2 = "Hello" + 1 + 2; System.out.println(str2); // 输出Hello12 }
String是一个霸道的类型,任何与String类型进行+号操作的其他类型,都会自动升格为String类型。第一个例子中首先执行1+2的操作,再偶遇到String的Hello,再进行了自动升格;而第二个例子中,在还没进行整形的加法运算时,就首先偶遇到了String,已经自动提升为String,所以就等于Hello1+2的操作,自然等于Hello12。
5.正确使用String,StringBuffer,StringBuilder
在上文当中,曾经提到过String的不变性,在String原因下,就产生出了StringBuffer和StringBuilder,后2者为可变的字符串,亦可以称为缓冲字符串,主要原理其实很简单,就是缓冲字符串中的字符串形式是char数组,以下来分析StringBuffer和String的几点不同:
- 在频繁的字符串运算,例如拼接,删除,增加,替换,解释XML,进行SQL拼接的时候,请优先考虑使用StringBuffer、StringBuilder;
- 在性能考虑方面,由于StringBuffer带有缓冲区,而且最终使用toString() 方法转换成1个字符串,我们试想,StringBuffer无论里面的信息是多么的复杂,但最终是生成了1个字符串对象,效率会比用+号拼接不停生成字符串的效率要高 ;
- 想使用更多功能时,例如字符串翻转reverse,字符串插入insert,这些都是 String所不提供的,而StringBuffer却支持,所以想增加某些功能时,使用 StringBuffer;
- StringBuffer和StringBuilder区别?StringBuffer是线程安全的,在多线程的环境底下应该使用StringBuffer,而StringBuilder线程是不安全的,由于现在流行的SSH框架,而struts2中Action是线程安全的,所以 请大胆的使用StringBuilder 。
6.使用字符串解决编码问题
public static void main(String[] args) throws UnsupportedEncodingException { String str1 = "你好"; // 第一种方法,此种方法需要知道来源字符串的编码 byte[] byte1 = str1.getBytes("GBK"); String str2 = new String(byte1); // 第二种方法,此种方法需要知道转变为什么格式的字符串,推荐使用 String str3 = new String(str1.getBytes(), "UTF-8"); }
7.对字符串排序持宽容心态
例如创建了一个字符串数组,使用Arrays.sort()进行自然排序,注意是自然排序,就会出现排序混乱的情况,为什么呢?因为我们Java对字符串排序时是根据了UNICODE编码来进行排序,是UNICODE编码对汉字的顺序并不是连贯连续的,所以若然要对字符串进行精确排序,可以选择使用pingyin4j转换成拼音后再首字母排序。
相关推荐
内容全部由java编码的最佳实践组成,从语法、程序设计和架构、工具和框架、编码风格和编程思想等五大方面,对java程序员遇到的各种棘手的疑难问题给出了经验性的解决方案,为java程序员如何编写高质量的java代码提出...
**JAVA8 API 中文官方文档概述** JAVA8 API 是Java开发者的重要参考资料,它详细阐述了Java 8平台的核心类库,包括各种接口、类...通过学习和应用这些知识,开发者可以编写出更加高效、简洁的Java代码,提升软件质量。
为了改善这种情况,开发者通常会将硬编码的字符串抽出来,放入资源文件(strings.xml)中进行统一管理,这有助于实现国际化(i18n)和提高代码的可读性。 标题"layout目录下布局文件字符串硬编码抽出替换java脚本"所...
1. 字符串常量池:Java 11优化了字符串常量池的实现,提高了字符串操作的效率。 2. 动态编译:JIT(Just-In-Time)编译器在Java 11中进一步优化,能够更早地识别并编译热点代码,提高程序运行速度。 3. 模块系统:...
性能优化:** 针对循环、字符串操作等性能瓶颈进行优化,比如使用`StringBuilder`替代`String`拼接。 **7. 日志记录:** 合理使用日志记录,既不过度也不缺失,确保在调试和监控时有足够的信息。 **8. 异常处理:...
### 编写高质量代码:改善...以上总结了《编写高质量代码:改善Java程序的151个建议》中的一些关键知识点,涵盖了命名规范、基本类型处理、类与对象管理等多个方面,旨在帮助开发者编写更加健壮、易于维护的Java代码。
以上只是部分知识点,"编写高质量代码++改善Java程序的151个建议.pdf"这本书中应该包含了更多深入的细节和实践案例。通过深入学习和实践,开发者可以不断提升自己的Java编程技能,编写出更高性能的代码。
在Java编程中,时间空间性能优化是提升程序效率的关键步骤,尤其对于大型系统而言,良好的性能优化能够显著提高用户体验并减少...对于任何开发人员来说,理解和掌握这些技巧都是提升代码质量,实现高效运行的重要途径。
Java 8是Oracle公司发布的一个重大更新版本,它引入了许多创新特性,极大地提升了开发效率...以上就是Java 8的主要新特性,它们极大地改善了开发体验,提高了代码质量。熟练掌握这些特性,将使你在Java开发中如鱼得水。
实验内容被精心设计为九种类型,涵盖了从基本语法到高级主题的广泛范围,如数组与字符串处理、面向对象编程、异常处理、多线程编程等。 #### 二、实验指导1 JAVA语言概述 **知识点笔记:** - **Java语言简介**:...
总的来说,Java Class Utf8 Translator 是Java开发中的一个重要辅助工具,它使开发者能够更方便地管理和翻译类文件中的UTF-8编码字符串,提升了开发效率和软件本地化的质量。结合自定义词典,用户可以根据项目特性...
- **改进的字符串处理**:新增`String#lines()`,`String#repeat()`等方法。 - **更好的文件系统访问**:`Path`类新增了一些便利方法。 - **私有接口方法**:接口中可以定义私有方法和默认方法,增强了设计灵活性...
内容全部由java编码的最佳实践组成,从语法、程序设计和架构、工具和框架、编码风格和编程思想等五大方面,对java程序员遇到的各种棘手的疑难问题给出了经验性的解决方案,为java程序员如何编写高质量的java代码提出...
开发者可以利用Java的JSON库,如Jackson或Gson,将Java对象转换成JSON字符串,然后发送到前端,反之亦然,接收前端发送的JSON数据并解析成Java对象,便于业务处理。 其次,AJAX(Asynchronous JavaScript and XML)...
Java 13 引入了文本块,用于方便地编写多行字符串,减少了转义字符的使用和字符串拼接的繁琐。 12. **封禁类(Sealed Classes)**: Java 15 引入的封禁类限制了子类的继承,有助于更好地控制类的扩展性,防止不...
- `toString()`: 返回对象的字符串表示形式。 - 实现 `Cloneable` 接口时应正确重写 `clone()` 方法。 - 实现 `Serializable` 接口,确保对象可以被序列化。 #### 4. 主方法与程序入口 - 每个可执行的Java程序应该...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传递数据。它以易于人阅读和编写的方式,同时...在实际开发中,合理利用这类工具和技巧,可以显著改善代码质量和用户体验。
假设有一个名为`foundMiscreant`的函数,它的作用是在一个字符串数组中查找特定的名字,并发送警报。原始代码如下: ```java Boolean foundMiscreant(String[] people){ Boolean found = false; for (int i = 0; ...
- 尽管字符串计算器相对简单,但可以引入设计模式来提升代码质量。例如,使用工厂模式创建不同类型的计算器,或者使用策略模式处理不同的计算逻辑。 8. **扩展功能**: - 进阶练习可以包括支持更大的数字(可能...