前言

Java 中的字符串属于对象,那么Java 中提供了 String 类来创建和操作字符串,即是使用对象;因为String类修饰的字符一旦被创建就不可改变,所以当对字符串进行修改的时候,需要使用到StringBufferStringBuilder 类。


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==str4false

那么这两种创建方式有何不同,对于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的区别

StringBuilderjava.lang类,是一个可变的字符序列,提供了与StringBuffer兼容的APIStringBufferStringBuilder方法是一模一样的。

StringBuilder不同步,不安全。如果同时append(),delete(),insert(),会导致出错,多线程访问不安全,添加修饰synchronized即可。在jdk1.5版本后,推出StringBuilder被用作一个StringBuffer的简易替换,用在字符串缓冲区被单个线程使用的时候。

使用StringBuilder的出现,是为了提高效率,是非同步的,是对单线程访问效率高,对于StringBuffer是同步的,对多线程的访问是安全的。这些是不同点,相同的是功能一模一样的哦。

结语

  • 点赞

第二十节:详细讲解String和StringBuffer和StringBuilder的使用的更多相关文章

  1. 风炫安全WEB安全学习第二十节课 反射型XSS讲解

    风炫安全WEB安全学习第二十节课 反射型XSS讲解 反射性xss演示 原理讲解 如果一个应用程序使用动态页面向用户显示错误消息,就会造成一种常见的XSS漏洞.通常,该页面会使用一个包含消息文本的参数, ...

  2. 大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5)

                                                        大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5) 上一节中,我们讲 ...

  3. centos LAMP第二部分apache配置 下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转 配置apache的访问日志 配置静态文件缓存 配置防盗链 访问控制 apache rewrite 配置开机启动apache tcpdump 第二十节课

    centos    LAMP第二部分apache配置  下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转  配置apache的访问日志  配置静态文件缓存  配置防盗链 ...

  4. 深度学习String、StringBuffer、StringBuilder

    相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它 ...

  5. 深入理解String、StringBuffer、StringBuilder(转)

    文章系转载,非原创,原地址: http://www.cnblogs.com/dolphin0520/p/3778589.html 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公 ...

  6. 浅谈String、StringBuffer与StringBuilder

    浅谈String.StringBuffer与StringBuilder   先详细介绍一下String.StringBuffer与StringBuilder String: 官方对String的说明: ...

  7. 面试常备,字符串三剑客 String、StringBuffer、StringBuilder

    尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 「CS-Wiki」Gitee ...

  8. String、StringBuffer与StringBuilder之间区别

    关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 1.三者在执行速度方面的比较:StringBuilder >  String ...

  9. (转)String、StringBuffer与StringBuilder之间区别

    原文地址: http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html 关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺 ...

随机推荐

  1. MYSQL性能优化(2)

    Insert语句优化 1.  多行并为一个语句  insert into table values (行1),(行2),........... 2. 使用中间内存队列, 逻辑是立马执行插入,其他数据放 ...

  2. linux查看文件夹大小du命令

    查看1级(--max-depth=1)目录的大小,并排序 参考 -h或–human-readable 以K,M,G为单位,提高信息的可读性. –max-depth= 超过指定层数的目录后,予以忽略 d ...

  3. jscript DOM操作

    \n 换行符 \b 空格 \r 回车 && 与 || 或 ! 非(取反) classList属性 classList 属性返回元素的类名,作为 DOMTokenList 对象. 该属性 ...

  4. Unity中的点击,长按,划动

    public void GetClickType() { if(Input.GetMouseButtonDown(0)) { if(isGetBeginPos) { beginPosition = I ...

  5. 使用::befor和::after伪元素在网站中添加图标

    css3为了区分伪类和伪元素,伪元素采用双冒号写法. 常见伪类——:hover,:link,:active,:target,:not(),:focus. 常见伪元素——::first-letter,: ...

  6. 在ASP.NET中使用KindEditor富文本编辑器

    以前一直用百度的UEditor.这次客户提了一个需求要在编辑器中插入Flash动画,但是不知道怎么用UEditor实现,于是选用了KindEditor. 更重要的一点是,客户的网站使用Framewor ...

  7. Java学习笔记(二十二):打包程序

    加入一个程序测试完毕,我们就可以将它打包,就可以放到服务器上运行了 找到左下角的终端 点击 输入命令: mvnw clean package -DskipTests=true clean:清除以前生成 ...

  8. 微信小程序记账本进度一

    一,1.注册微信公众号 2.点击“立即注册”后,点击“”小程序“” 3.填写邮箱等信息.完成并激活.

  9. java得到当前日期的前一天或后一天

    public String getNextDay(String startdate) throws ParseException{ Date date = (new SimpleDateFormat( ...

  10. Selenium 学习汇总

    Commands (命令) Action 对当前状态进行操作 失败时,停止测试 Assertion 校验是否有产生正确的值 Element Locators 指定HTML中的某元素 Patterns ...