Java常用类

4.字符串相关类练习

4.1StringBuilder练习

package li.normalclass.stringbuilder;

public class TestBuffer {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
mb_operate(a,b);
System.out.println(a+"."+b);
} private static void mb_operate(StringBuffer x, StringBuffer y) {
x.append(y);
y=x;
}
}

问: System.out.println(a+"."+b);的输出结果是?

答:AB.B

原因如下:

当运行main方法时,在栈中开辟了两个内存空间,分别是a和b,指向在堆中创建的两个对象,对象又分别指向了两个字符数组,数组中存储的就是新建对象时传入的参数。

接着运行mb_operate方法,在栈中另外开辟两个内存空间,命名为x和y。其中x指向的是a指向的对象,y指向的是b指向的对象。 x.append(y);就是在a对象指向的数组中追加b对象指向的数组中的值,此时a对象指向的数组值为AB;y=x;就是将x中存储的地址赋值给y,之后y就指向了x指向的对象,即a指向的对象。

System.out.println(a+"."+b);输出a对象和b对象的值,此时a对象中的值为AB,b对象中的值为B,因此输出的内容为AB.B

4.2String和字符数组练习

package li.normalclass.stringbuilder;

public class Example {
String str = new String("good");
char[] ch = {'a','b','c'};
public static void main(String[] args) {
Example ex = new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+"and");
System.out.print(ex.ch);
} public void change(String str,char ch[]){
str = "test ok";
ch[0] = 'g';
}
}

问:

System.out.print(ex.str+"and");

``System.out.print(ex.ch);`

的输出结果是?

答:goodandgbc

原因如下:

首先,当main方法创建ex对象,ex指向的对象中的str会再创建一个String类型对象,str指向这个String对象,然后String对象又指向good字符串的地址。

ex指向的对象中的ch则会创建一个字节数组,该数组中存储了abc三个字符。

当运行change()方法时,又在栈中开辟了两个局部变量空间,分别为str和ch,然后传入参数。将ex.str指向的地址0x2012赋给局部变量str,将ex.ch指向的地址0x4012赋给局部变量ch。在change方法体中,str = "test ok";则是在常量池中新建了一个字符串,将新建字符串的地址赋给了局部变量str,因此此时局部变量str指向的地址为0x5012;而 ch[0] = 'g';,则是将局部变量ch指向的字符数组中的ch[0]数据改变为g。

此时,运行语句System.out.print(ex.str+"and");则输出的是仍ex.str指向的String对象指向的字符串good

运行语句 System.out.print(ex.ch);,输出的是被局部变量改变的数组gbc,因为ex.ch和局部变量ch指向的地址相同。

4.3再次理解String和StringBuilder的不同之处

4.3.1String

package li.normalclass.stringbuilder;

public class TestStringAndBuilder {
public static void main(String[] args) {
String str5 = new String("北京");
str5 = str5.concat("故宫");
str5 = str5.concat("博物院");
System.out.println(str5);//北京故宫博物院
}
}

采用字面值的方式创建一个字符串时,JVM首先会去字符串池中查找是否存在"北京"这个对象,如果不存在,则在字符串池中创建"北京"这个对象,然后将池中"北京"这个对象的引用地址返回给"北京"对象的引用str5。使用concat()方法可以追加子字符串,但是String是不可变长序列,所以是实际上是在常量池重新创建了一个对象,并把追加的字符串连同原字符串一同赋值给新的对象,然后将新对象的引用地址返回给str5,这样str5就指向了一个新的地址空间。每次使用concat()方法追加子串都会经历上述过程,str5的指向不断改变,最终会指向最后一次开辟的对象地址

因此使用concat()追加子串的方法效率无疑是很低的,那么有没有一种办法可以直接在创建的对象里添加子串呢?这就是我们要涉及到的StringBuilder类

4.3.2StringBuilder

package li.normalclass.stringbuilder;

public class TestStringAndBuilder {
public static void main(String[] args) { StringBuilder builder = new StringBuilder("北京");
builder.append("故宫");
builder.append("地址为北京市东城区景山前街4号");
System.out.println(builder.toString());
}
}

StringBuilder对象指向的字符数组是可变的,在创建时的长度为创建时传入的字符长度+16,之后每次增加字符进去,直到要增加的字符长度超过当前字符数组的内存空间容量,就会重新开辟一块地址空间,容量为当前容量的两倍再加上2,然后将StringBuilder对象指向新开辟的内存地址,而在栈内存中的builder存储的地址保持不变,指向StringBuilder对象。

day16--Java常用类04的更多相关文章

  1. Java 常用类总结(SE基础)

    本篇博客对java常用类相关知识进行了归纳总结,比较详细,适用于学习和复习. 1. 字符串相关的类 1.1 String String是一个final类,代表不可变的字符序列.不可被继承. Strin ...

  2. Java常用类的使用

    Java常用类 1. Optional 在我们的开发中,NullPointerException可谓是随时随处可见,为了避免空指针异常,我们常常需要进行 一 些防御式的检查,所以在代码中常常可见if( ...

  3. Java基础 —— Java常用类

    Java常用类: java.lang包: java.lang.Object类: hashcode()方法:返回一段整型的哈希码,代表地址. toString()方法:返回父类名+"@&quo ...

  4. Java常用类之要点总结

    Java常用类之要点总结

  5. Java常用类:包装类,String,日期类,Math,File,枚举类

    Java常用类:包装类,String,日期类,Math,File,枚举类

  6. Java常用类学习笔记总结

    Java常用类 java.lang.String类的使用 1.概述 String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String ...

  7. 第十四章 Java常用类

    14.常用类 14.1 字符串相关的类 1课时 14.2 JDK 8之前时间日期API 1课时 14.3 JDK8中新时间日期API 1课时 14.4 JDK8中的Optional类 1课时 14.5 ...

  8. Java常用类详解

    目录 1. String类 1.1 String的特性 1.2 String字面量赋值的内存理解 1.3 String new方式赋值的内存理解 1.4 String 拼接字面量和变量的方式赋值 1. ...

  9. Java常用类之String类、Stringbuffer和Random类练习

    定义一个StringBuffer类对象, 1)使用append方法向对象中添加26个字母,并倒序遍历输入 2)删除前五个字符 package 第十一章常用类; /** * 定义一个StringBuff ...

  10. java常用类-上

    一,常用类之一包装类 java开发中习惯把八大基本数据类型封装到一个类中,并提供属性和方法,更方便的操作基本数据类型. 包装类的出现并不是用于取代基本数据类型,也取代不了. 包装类位于java.lan ...

随机推荐

  1. C++遴选出特定类型的文件或文件名符合要求的文件

      本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法.   首先,我们来明确一下本文所需实现的需求.现在有一个文件夹,其中包含了很多文件,如下图所示:我们如果想获取其中所 ...

  2. Android 相册

  3. Collectors.toMap的暗坑与避免方式

    使用Java的stream中的Collectors可以很方便地做容器间的转换,可以少写很多代码.但是其中有暗含的坑需要注意和避免,本文探讨Collectors.toMap(JDK8版本). Colle ...

  4. ABC270F 题解

    和博客园一样好的体验 思路 首先看到花最小代价使得所有点连通,果断转换成最小生成树问题. 接下来就要考虑怎么建图,首先陆地就正常连不用说,建机场和港口的代价貌似都是点权,考虑转成边权.因为一个点飞或者 ...

  5. 常用TS总结

    自己常用的 TS 写法总结,应该会一直更新.可使用 TS在线编译 校验 TS 语法. 基本用法 普通 const num: number = 10 const isStop: boolean = fa ...

  6. 线性SVM决策过程的可视化

    线性 SVM 决策过程的可视化 导入模块 from sklearn.datasets import make_blobs from sklearn.svm import SVC import matp ...

  7. NC20115 [HNOI2015]菜肴制作

    题目链接 题目 题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号 ...

  8. 每月免费调用1000次API调用:实现PDF转档、页面编辑、OCR

    每月1000次免费PDF API调用: 使用ComPDFKit API充分发挥您PDF转换的全部潜力 您是否在寻找无需前期投资即可提升软件集成能力的途径?再也不用找了!我们先进的API为您的项目提供所 ...

  9. 3分钟总览微软TPL并行编程库

    有小伙伴问我每天忽悠的TPL是什么?☹️ 这次站位高一点,严肃讲一讲. 引言 俗话说,不想开飞机的程序员不是一名好爸爸:作为微软技术栈的老鸟,一直将代码整洁之道奉为经典, 优秀的程序员将优雅.高性能的 ...

  10. New Questions

    1. C++/Qt 实现一个信号槽 #include <functional> #include <iostream> #include <vector> clas ...