java基础之字符串
以下内容摘自《java编程思想》第十三章。
1. 不可变 String
String 对象是不可变对象,String 类中每一个看起来会修改 String 值的方法,实际上都是创建了一个全新的 String 对象,以包含修改后字符串的内容,而最初的 String 对象丝毫未动。看如下的代码:
import static java.lang.System.*;
public class Immutable{
public static String upcase(String s){
return s.toUpperCase();
}
/*
结果为:howdy HOWDY howdy
*/
public static void main(String[] args){
String q = "howdy";
out.println(q);
String qq = upcase(q);
out.println(qq);
out.println(q);
}
}
2. 重载 "+" 与StringBuilder
String 是不可变的,这会带来一定的效率问题。首先看一下这段代码:
public class Concatenation{
String mango = "mango";
String s = "abc"+mango+"def"+47;
System.out.println(s);
// 结果 abcmangodef47
}
可以想象一下,这段代码可能是这样工作的:String 可能有一个 append 方法,它会生成一个新的 String 类,以包含 “abc” 与 mango 连接后的字符串。然后,该对象再与 “def” 相连,生成另一个 String 对象,以此类推。
这种工作方式当然行得通,但是为了生成最终的 String,此方式会产生大量的需要垃圾回收的中间对象,这样运行性能实在是糟糕。那么上面的代码是否真的是这样工作的呢?书中利用了 JDK 内置的工具 javap -c Concatenation 反编译上面的代码,发现,在上面的 "+" 操作中,编译器自作主张的使用了 StringBuilder 类,因为它更高效。每一次 "+" 操作,都调用了 StringBuilder.append 方法,最后使用 toString 方法返回字符串。
上面对于 "+" 操作符工作流程的解释说明编译器会自动地优化性能,但是,它也不能做到完美,比如在循环中,经过循环一次, + 操作符就会产生一个 StringBuilder,所以,在循环中如果要对字符串进行操作,建议使用 StringBuilder 对象。
StringBuilder 是 java SE5 引入的,在这之前 java 用的是 StringBuffer,后者是线程安全的,因此开销也会更大些,所以,在 java SE5/6 中,字符串操作应该会更快一点。
3. 无意识的递归
java 中每个类从根本上都是继承自 Object,标准容器类自然也不例外。因此容器类有 toString 方法,并覆写了该方法。例如 ArrayList.toString() 会遍历容器中所有的对象,并调用对象的 toString 方法。如果我们想要在 toString 方法中打印出对象的内存地址,也许会考虑使用 this 关键字。
import java.util.ArrayList;
import java.util.List;
public class InfiniteRecursion {
public String toString(){
return "InfiiniteRecursion address"+this;
}
public static void main(String[] args){
List<InfiniteRecursion> v = new ArrayList<InfiniteRecursion>();
for(int i=0;i<10;i++){
v.add(new InfiniteRecursion());
}
System.out.println(v);
}
}
但是上面的代码运行会出现 java.lang.StackOverflowError,这是为什么呢?原因出现在 toString 方法中,编译器看到字符串 "InfiiniteRecursion address" 后面跟着一个 "+" ,而再后面的对象不是 String,于是编译器试着将 this 转换为 String 对象,怎么转换呢?这是通过调用 toString 方法,于是就发生了递归调用。如果在上面的例子中想要打印出对象的内存地址,应该调用 super.toString 方法。
以上是我对书中的一些总结,有什么好的看书建议欢迎提出来一起交流分享。
java基础之字符串的更多相关文章
- java基础练习 字符串,控制流,日历,日期等
1,对基本控制流程的一些练习 package org.base.practice3; import org.junit.Test; /** * Created with IntelliJ IDEA. ...
- 再回首,Java温故知新(八):Java基础之字符串
字符串是Java中使用频率最高的类,但是它却不属于基本类型,而是预定义了String类来表示.从String类的源码可以看到,String是基于char[]实现的,而且Java中的String是不可变 ...
- java基础4_字符串
一 字符串 Java字符串关键字是String,是一个类,创建新的字符串即创建一个新的对象. 1.字符串的声明及初始化. String str; //只做声明 String str1="aa ...
- JAVA基础之字符串和面向对象
* [String 类] * 1. String类位于java.lang包中,java.lang是java的语言包,使用时无须导包,自动导入. * * 2.拿到一个字符串对象: * ①字面量声明:St ...
- Java基础 -- 连接字符串时,使用+还是StringBuilder
结论 1-源代码中使用的+连接,实际上都使用的是StringBuilder. 2-用jad工具反编译,好处之一就是可以同时生成字节码和源代码.这样可以进行对照研究. ----------------- ...
- java基础知识—字符串
1.声明字符串的方法: String s ="你好" String s=new String("你好"); 2.字符串的长度: 字符串.length(); 3. ...
- Java基础篇--字符串处理(StringBuffer)
字符串处理 在Java中最常将字符串作为String类型对象来处理.同时String中也提供了很多操作字符串的函数(可自行查阅资料),而本篇将介绍StringBuffer如何操作字符串. String ...
- JAVA基础补漏--字符串
字符串常量池 String a="abc"; String b="abc"; char[] str = {"a","b" ...
- Java基础中字符串与字符的注意点!
在Java中,字符的表达与字符串的表达是不一样的!话不多说,直接上代码!!! String a="a"; char a='a'; 其中他们的引号是不一样的
随机推荐
- Qt_IO系统_文件
主要参考: devbean.net 豆子的博客 参考书:<QtCreator 快速入门>第三版 目录 QFile 如何使用QFile QFile 和QFileInfo Demo 文件操作是 ...
- 集训作业 洛谷P3913 车的攻击
这个题一开始被我想复杂了,但总体差不多. 脑子清醒后我直接看他占领了几条长,几条宽,比如一个长3宽3的地图. 被占领了一条宽,就可以看成一个长3宽2的地图.这个长3宽2的地图就是出去可以被攻击的点剩下 ...
- ClickHouse源码笔记2:聚合流程的实现
上篇笔记讲到了聚合函数的实现并且带大家看了聚合函数是如何注册到ClickHouse之中的并被调用使用的.这篇笔记,笔者会续上上篇的内容,将剖析一把ClickHouse聚合流程的整体实现. 第二篇文章, ...
- IE11 CSS hack
IE11 怎么做 CSS hack ? 很简单. @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { ...
- Captura - 免费好用还开源的录屏软件
首先下载这个软件,国内下载很慢这里提供一个国内下载UCloud-OSS 软件打开后默认英文,现在我们切换到中午模式 在录制屏幕的同时获取声音
- PyQt5模型视图委托
Model-View-Delegate 模型视图委托(MVD)是PyQt中特有的设计模式,类似MVC设计模式,将MVC设计模式中的Controller当做MVD中的Delegate,两者的概念基本相同 ...
- xss原理绕过防御个人总结
xss原理 xss产生的原因是将恶意的html脚本代码插入web页面,底层原理和sql注入一样,都是因为js和php等都是解释性语言,会将输入的当做命令执行,所以可以注入恶意代码执行我们想要的内容 x ...
- python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)
python基础--面向对象 (1)面向过程VS面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. ...
- Label 组件基本写法
1.width,height 指定区域大小 文本 汉字 2 个字节 2.font 指定字体和字体大小 font(font_name,size) 3.image 显示在 Label 上的图像 支持 gi ...
- 自制廉价的LED+LCD型投影仪
文档标识符:PROJECTOR_T-D-P6 作者:DLHC 最后修改日期:2020.7.30 本文链接:https://www.cnblogs.com/DLHC-TECH/p/PROJECTOR_T ...