第二十节:详细讲解String和StringBuffer和StringBuilder的使用

前言
在 Java 中的字符串属于对象,那么Java 中提供了 String 类来创建和操作字符串,即是使用对象;因为String类修饰的字符一旦被创建就不可改变,所以当对字符串进行修改的时候,需要使用到StringBuffer 和 StringBuilder 类。
String类
接下来开始使用对象了,什么是String类呢?
是用来修饰字符串的,字符串是一种特殊的对象,一旦初始化就不可被改变,用String修饰的字符串变量是不可以被改变的。
例子:
//定义一个字符串
String str = "hello world";
String str = new String("hello world");
在Java中,我们经常用到字符串,所以需要学习如何操作字符串。对于String类,存在java.lang.String中,String类代表字符串,如何实现字符串的字面值,就是用此类来实例的。
那么字符串是?
字符串是作为常量,被双引号包着的为常用,被初始化即不可被更改。那么接下来举个例子效果。
String i = "123";
System.out.println("i="+i);
//结果为
i=123
如果添加以下
String i = "123";
i = "12"
System.out.println("i="+i);
//结果为
i=12
看到这个效果,你会认为不是改了吗?其实不是的,而是新创建了一个对象而已。
在String中,对象是不可变的,但可以共享的。那么怎么理解是共享的呢?这里引出常量池的概念,如下:
//多个引用指向同一个字符串
String str1 = "dashu"
String str2 = "dashu";
System.out.println(str1==str2);
//结果
true
为true代表它们同时指向一个字符串,即为对象。创建了一个str1对象,字符串常理为"dashu",那么再次创建一个对象时,常理名相同,在常量池中发现有相同的"dashu",那么就同时指向一个值。
常量池是用来放置一堆常量的,如果其中有相同的值,那么就不用再次创建对象,这是为了节约内存空间,如果再次创建,就会浪费内存空间,第一个创建的字符串放在常量池中,如果要用的时候,就拿来用。

//内容相同,但是创建方式不同的情况
String str3 = "abc"
String str4 = new String ("abc");
System.out.println(str3==str4);//false
System.out.println(str3.equals(str4));//true
//结果
false
true
其实str3==str4,比较的是对象,而str3.equals(str4),比较的是内容。在代码中只要有new,表示在内存中开辟了一个新空间,所以地址不相同,即str3==str4为false。
那么这两种创建方式有何不同,对于str3来说,在内存中只创建了一个对象,而str4就不同了,而是在内存中有两个对象。那么怎么理解呢?
str3就不用说了,可以知道就创建一个对象,在str4中,因为有个new,在内存中有new即为创建了一个对象,new String()为构造函数,那么它接收的是一个字符串对象,那么接收的值是由常量池来的,常量池中的字符串本身就是一个对象。
一般不会像str4中那样创建,因为浪费内存了,但常用来存储数组,字符数组和字节数组。new Stirng(),所以字符和字节可以转换为字符串。
String方法
为什么我们要学习String呢?
是因为我们需要使用对象,使用String类中的一堆方法。如果要知道有哪些方法,可以查一下API,要使用时不知道用哪些方法,那么就可以去查,用到就查,也不用每个都记住。
记住字符串是一个对象,是不可被更改的,它的一切方法都是围绕着对象的数据而定的。String类为不可变对象,一旦被创建,就不能修改它的数值。
对于上方代码中的例子所示,已存在的String对象,对其修改都是重新创建一个新的对象,然后把新的值保存进去而已。
所以不要理解错了下方的代码:
String i = "123";
i = "12"
System.out.println("i="+i);
//结果为
i=12
对于方法可以自行查找API试试效果即可,查找百度JavaAPI文档即可下载使用。
StringBuffer
对于字符串是常量,它的值在创建后时不可以改变的,但字符串缓冲区支持可变的字符串。
StringBuffer类为java.lang中,StringBuffer为字符串缓冲,StringBuffer为线程安全的可变字符序列,类似String的字符串缓冲区,缓冲区不能改,但里面可以改,通过某方法可以改变序列的长度和内容。
StringBuffer提供了主要的两种方法,一,append(),二,inset()。
StringBuffer为一个字符串缓冲区,相对于一个容器,长度是可变的,可以存储任意类型数据,是将任意数据转变为字符串进行存储,StringBuffer提供了对数据的很多的操作功能。
例子:
StringBuffer sb = new StringBuffer();
sb.append("da");
sb.append("shu");
System.out.println(sb);
//sb.append("da").append("shu");
如果要操作数据,要转换为字符串。StringBuffer所有存储的元素都被转成字符串才可使用。
String str = sb.append("da").append("shu").toString();
在指定位置插入元素
sb.insert(2,"hehe");//插入
StringBuffer和StringBuilder的区别
StringBuilder为java.lang类,是一个可变的字符序列,提供了与StringBuffer兼容的API,StringBuffer和StringBuilder方法是一模一样的。
StringBuilder不同步,不安全。如果同时append(),delete(),insert(),会导致出错,多线程访问不安全,添加修饰synchronized即可。在jdk1.5版本后,推出StringBuilder被用作一个StringBuffer的简易替换,用在字符串缓冲区被单个线程使用的时候。
使用StringBuilder的出现,是为了提高效率,是非同步的,是对单线程访问效率高,对于StringBuffer是同步的,对多线程的访问是安全的。这些是不同点,相同的是功能一模一样的哦。
结语
- 点赞
第二十节:详细讲解String和StringBuffer和StringBuilder的使用的更多相关文章
- 风炫安全WEB安全学习第二十节课 反射型XSS讲解
风炫安全WEB安全学习第二十节课 反射型XSS讲解 反射性xss演示 原理讲解 如果一个应用程序使用动态页面向用户显示错误消息,就会造成一种常见的XSS漏洞.通常,该页面会使用一个包含消息文本的参数, ...
- 大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5)
大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5) 上一节中,我们讲 ...
- centos LAMP第二部分apache配置 下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转 配置apache的访问日志 配置静态文件缓存 配置防盗链 访问控制 apache rewrite 配置开机启动apache tcpdump 第二十节课
centos LAMP第二部分apache配置 下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转 配置apache的访问日志 配置静态文件缓存 配置防盗链 ...
- 深度学习String、StringBuffer、StringBuilder
相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它 ...
- 深入理解String、StringBuffer、StringBuilder(转)
文章系转载,非原创,原地址: http://www.cnblogs.com/dolphin0520/p/3778589.html 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公 ...
- 浅谈String、StringBuffer与StringBuilder
浅谈String.StringBuffer与StringBuilder 先详细介绍一下String.StringBuffer与StringBuilder String: 官方对String的说明: ...
- 面试常备,字符串三剑客 String、StringBuffer、StringBuilder
尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 「CS-Wiki」Gitee ...
- String、StringBuffer与StringBuilder之间区别
关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 1.三者在执行速度方面的比较:StringBuilder > String ...
- (转)String、StringBuffer与StringBuilder之间区别
原文地址: http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html 关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺 ...
随机推荐
- VMware虚拟机配置嵌套虚拟化
VMware虚拟机下创建kvm-sever,server下继续创建kvm虚拟机(嵌套虚拟化),返回libvirt错误解决办法:SSH连接VMwarevi /etc/vmware/config增加一行设 ...
- 即时通信 选择UDP还是TCP协议
之前做过局域网的聊天软件,现在要做运行在广域网的聊天软件.开始接触网络编程,首先是接触到TCP和UDP协议 在网上查资料,都是这样描述 TCP面向连接,可靠,数据流 .UDP无连接,不可靠,数据报.但 ...
- python 网络内容: 初识socket
一 C\S架构,客户端服务端架构 客户端(client) : 享受服务端提供的服务 服务端(server) : 给客户端提供服务 B\S 浏览器和服务端 B(browser) 二 网络通信的整个流程( ...
- 《CSAPP》页表、页命中、缺页
页表 虚拟存储器系统需要某种方法来判定一个虚拟页是否在DRAM的某个地方. 这些功能由操作系统.存储器管理单元(MMU)中的地址翻译硬件和一个存放在物理存储器中的页表数据结构联合提供. 功能 将虚拟页 ...
- 题目--oil Deposits(油田) 基础DFS(深度搜索)
上一次基本了解了下BFS,这次又找了个基本的DFS题目来试试水,DFS举个例子来说就是 一种从树的最左端开始一直搜索到最底端,然后回到原端再搜索另一个位置到最底端,也就是称为深度搜索的DFS--dep ...
- 34 【kubernetes】安装手册
全文参考了两篇中文文档: 1,https://www.cnblogs.com/RainingNight/p/using-kubeadm-to-create-a-cluster.html 2,http: ...
- thinkphp 视图(三)系统变量——原生标签
查看系统变量 dump($_SERVER); 在view中获取服务器变量 <p>{$Think.server.HTTP_HOST}</p> 获取env变量 status=dev ...
- [原]CentOS7.2部署KVM虚拟机
前段时间学习了关于PostGis.OSM数据以及Mapnik相关内容,接下来将利用假期重点学习PostgreSQL-XL和瓦片服务器集群技术,因此先把环境搭好.计划采用KVM来充分利用家里不太宽裕的“ ...
- 利用Sharding-Jdbc实现分表[z]
[z]https://www.cnblogs.com/codestory/p/5591651.html 你们团队使用SpringMVC+Spring+JPA框架,快速开发了一个NB的系统,上线后客户订 ...
- CentOS_mini下安装docker 之 yum mount
--->linux 终端输出太多前面看不到的解决办法:shift+page up --->mount命令[-参数] [设备名称] [挂载点] mkdir /mnt/CentOS mount ...