前言

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


String类

接下来开始使用对象了,什么是String类呢?

是用来修饰字符串的,字符串是一种特殊的对象,一旦初始化就不可被改变,用String修饰的字符串变量是不可以被改变的。

例子:

  1. //定义一个字符串
  2. String str = "hello world";
  3. String str = new String("hello world");

Java中,我们经常用到字符串,所以需要学习如何操作字符串。对于String类,存在java.lang.String中,String类代表字符串,如何实现字符串的字面值,就是用此类来实例的。

那么字符串是?

字符串是作为常量,被双引号包着的为常用,被初始化即不可被更改。那么接下来举个例子效果。

  1. String i = "123";
  2. System.out.println("i="+i);
  3. //结果为
  4. i=123
  5. 如果添加以下
  6. String i = "123";
  7. i = "12"
  8. System.out.println("i="+i);
  9. //结果为
  10. i=12

看到这个效果,你会认为不是改了吗?其实不是的,而是新创建了一个对象而已。

String中,对象是不可变的,但可以共享的。那么怎么理解是共享的呢?这里引出常量池的概念,如下:

  1. //多个引用指向同一个字符串
  2. String str1 = "dashu"
  3. String str2 = "dashu";
  4. System.out.println(str1==str2);
  5. //结果
  6. true

true代表它们同时指向一个字符串,即为对象。创建了一个str1对象,字符串常理为"dashu",那么再次创建一个对象时,常理名相同,在常量池中发现有相同的"dashu",那么就同时指向一个值。

常量池是用来放置一堆常量的,如果其中有相同的值,那么就不用再次创建对象,这是为了节约内存空间,如果再次创建,就会浪费内存空间,第一个创建的字符串放在常量池中,如果要用的时候,就拿来用。

  1. //内容相同,但是创建方式不同的情况
  2. String str3 = "abc"
  3. String str4 = new String ("abc");
  4. System.out.println(str3==str4);//false
  5. System.out.println(str3.equals(str4));//true
  6. //结果
  7. false
  8. 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对象,对其修改都是重新创建一个新的对象,然后把新的值保存进去而已。

所以不要理解错了下方的代码:

  1. String i = "123";
  2. i = "12"
  3. System.out.println("i="+i);
  4. //结果为
  5. i=12

对于方法可以自行查找API试试效果即可,查找百度JavaAPI文档即可下载使用。


StringBuffer

对于字符串是常量,它的值在创建后时不可以改变的,但字符串缓冲区支持可变的字符串。

StringBuffer类为java.lang中,StringBuffer为字符串缓冲,StringBuffer为线程安全的可变字符序列,类似String的字符串缓冲区,缓冲区不能改,但里面可以改,通过某方法可以改变序列的长度和内容。

StringBuffer提供了主要的两种方法,一,append(),二,inset()

StringBuffer为一个字符串缓冲区,相对于一个容器,长度是可变的,可以存储任意类型数据,是将任意数据转变为字符串进行存储,StringBuffer提供了对数据的很多的操作功能。

例子:

  1. StringBuffer sb = new StringBuffer();
  2. sb.append("da");
  3. sb.append("shu");
  4. System.out.println(sb);
  5. //sb.append("da").append("shu");

如果要操作数据,要转换为字符串。StringBuffer所有存储的元素都被转成字符串才可使用。

  1. String str = sb.append("da").append("shu").toString();

在指定位置插入元素

  1. 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. pip install 提示代理连接失败原因及解决办法

    # pip install 提示代理连接失败原因及解决办法 1. 错误提示 在公司电脑上安装Python的虚拟环境时输入命令: pip install virtualenv 系统提示以下异常信息: R ...

  2. 百度分享不支持Https的解决方案--本地化

    站点自从开启 https 之后 ,百度分享就不能用了!但是又寻找不到类似百度分享的替代品.. 怎么办呢?要如何解决 百度分享不支持https的问题呢, 跟着博主动动手,让你百度分享仍然能在https下 ...

  3. TypeError: Fetch argument None has invalid type <type 'NoneType'>

    (fetch, type(fetch)))TypeError: Fetch argument None has invalid type <type 'NoneType'> 我的解决方案是 ...

  4. 打开控制台F12弹出弹窗

    window.onload=function(){                 document.onkeydown=function(){                     var e=w ...

  5. C#使用 params object[] 将参数个数不一样的方法 集成一个

    getChange("1"); getChange("1","2"); public string getChange(params obj ...

  6. C#删除文件夹以及删除文件

    public static void DelectDir(string srcPath) { try { DirectoryInfo dir = new DirectoryInfo(srcPath); ...

  7. 题目--oil Deposits(油田) 基础DFS(深度搜索)

    上一次基本了解了下BFS,这次又找了个基本的DFS题目来试试水,DFS举个例子来说就是 一种从树的最左端开始一直搜索到最底端,然后回到原端再搜索另一个位置到最底端,也就是称为深度搜索的DFS--dep ...

  8. node.js中 express + multer 处理文件上传

    multer中间件,可以很方便的结合express处理用户表单上传的文件. 一.安装multer npm install multer 二.处理单个文件上传 const express = requi ...

  9. Hadoop格式化namenode 出错 Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/security/authorize/Refr

    一般是修改配置文件:etc/hadoop/hadoop-env.sh的时候出现的错误 export JAVA_HOME=/usr/jdk export HADOOP_COMMON_HOME=~/had ...

  10. Connection lost: The server closed the connection

    想必很多初学者都会遇到这个问题 其实很简单.mysql有个机制,就是8小时无通信,myslq就会自动关闭数据; 解决方案(2选1): 或者: 1.定时去做一个查询,就是 select * from X ...