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. 从TF-IDF 到BM25, BM25+,一文彻底理解文本相关度

    相关性描述的是⼀个⽂档和查询语句匹配的程度.我们从搜索引擎召回时,肯定希望召回相关性高的数据,那么如何来量化相关度呢. 首先,我们定义,一个文档doc,由多个词语 term 组成. 最早,通过最简单的 ...

  2. 阿里云数仓Dataworks数据导出到文件step by step

    背景 假设你在阿里云上Dataworks的空间space下有一个表table_A,想要把它的数据导出到文件以供后续使用,但是数据量又很多,从浏览器复制不太现实.阿里云提供了Java和Python版本的 ...

  3. .NET 云原生架构师训练营(模块二 基础巩固 HTTP管道与中间件)--学习笔记

    2.3.2 Web API -- HTTP管道与中间件 管道 中间件 ASP.NET Core 中间件:https://docs.microsoft.com/zh-cn/aspnet/core/fun ...

  4. 扩展说明: 指令微调 Llama 2

    这篇博客是一篇来自 Meta AI,关于指令微调 Llama 2 的扩展说明.旨在聚焦构建指令数据集,有了它,我们则可以使用自己的指令来微调 Llama 2 基础模型. 目标是构建一个能够基于输入内容 ...

  5. 山东职业竞赛wp2023(arm、cpython)

    pwn2 return2libc,白给 from evilblade import * context(os='linux', arch='amd64') context(os='linux', ar ...

  6. Java集合篇之深入解析ArrayList,这六问你答的上来吗?

    写在开头 开年第一篇,先祝各位新的一年身体健康,学业有成,事业有成哈,春节期间就是咔咔乱吃,咔咔乱玩,把学习都抛一边子去了,已经9天没有学习了,深深的懊悔,从今天开始,2024年的学习正式开启,一起给 ...

  7. 使用memoizee缓存函数提升性能,竟引发了indexOf的性能问题

    壹 ❀ 引 公司前端组基本每个月会举行一次前端月会,用于做前端组基础设施以及其它重要信息的同步,会议最后一个环节就会分享本月前端同学在开发中所遇到的奇怪bug,或者一些有趣的问题.在分享的问题中,我发 ...

  8. NC19996 [HAOI2015]树上染色

    题目链接 题目 题目描述 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色. 将所有点染色后,你会获得黑点两两之间的 ...

  9. 多线程系列(三) -synchronized 关键字使用详解

    一.简介 在之前的线程系列文章中,我们介绍了线程创建的几种方式以及常用的方法介绍. 今天我们接着聊聊多线程线程安全的问题,以及解决办法. 实际上,在多线程环境中,难免会出现多个线程对一个对象的实例变量 ...

  10. Python之初级RPG小游戏

    在国外网站上找到一个练习Python的小游戏感觉不错,自己实现了一下. 通过该练习你能学到: 元组 字典 简单定义函数和封装 条件控制语句 游戏说明 以下是3个房间和1个花园: Hall 客厅 有一把 ...