String类
  (1)字符串:字符串是常量;它们的值在创建之后不能更改,存储在堆中
          如果字符串多次赋值,其实是每次重新赋值的时候程序都先在内存中寻找已开辟的空间是否存在该值;如果找不到,再开辟新的空间存储该对象
 (2)构造方法:
    A:String s = new String();  //空字符序列
    B:String s = new String(char[] chs);  //分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
    C:String s = new String(char[] chs,int index,int length);  //从index到length部分生成字符串
    D:String s = new String(String str);
    E:String s = "hello";

 String strA = "abc";
//等效于:
//char data[] = {'a', 'b', 'c'};
//String strA = new String(data);
String strB = "hello";
System.out.println(strA==strB); //false
strA = "hello";
System.out.println(strA==strB); //true
//说明strA和StrB指向的是同一个空间

(3)字符串的注意事项
   A:字符串一旦被赋值,就不能改变。
     注意:字符串的值不能改变,但是引用变量可以改变。
  B:字符串在作为实参传递给形参时,其实是把地址的值赋给了形参,在形参修改了字符串的内容后,原字符串的内容其实是不变的。

 public static void main(String[] args) {
String s = "hello";  //将"hello"的地址赋值给了s
change(s);
System.out.println(s); //hello
}
//注意这里是无返回值,因为这里的测试是不能修改s的地址值
public static void change(String s) {
s += "java";
}

C:字符串的==和equals

     //String s = new String("hello")和String s = "hello"的区别。
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1==s2); //false 每一个变量new出来的地址都不相同
System.out.println(s1.equals(s2));//true String s3 = new String("hello");
String s4 = "hello";
System.out.println(s3==s4); //false
System.out.println(s3.equals(s4)); //true String s5 = "hello";
String s6 = "hello";
System.out.println(s5==s6); //true
System.out.println(s5.equals(s6)); //true
/*
* String的equals的实现原理:
* 第一步:先判断这两个字符串的地址值是否相同(==实现)
* 相同:返回true
* 不同:
* 第二步:判断这两个字符串的长度是否相同
* 不同:返回false
* 相同:第三步:将字符串变为数组逐个进行比较
* 找到不同:立刻返回false
* 找到最后:返回true
*/

(4)成员方法
    A:判断功能
  boolean equals(Object obj) //判断字符串是否相同,考虑大小写
  boolean equalsIgnoreCase(String str)//判断字符串是否相同,不考虑大小写
  boolean contains(String str) //判断字符串是否包含str
  boolean startsWith(String str) //判断字符串是否以str开头
  boolean endsWith(String str) //判断字符串是否以str结尾
  boolean isEmpty() //判断字符串是否为空
  B:获取功能
    int length() //获取字符串的长度
    char charAt(int index) //获取第index位置的字符
      int indexOf(int ch) //获取字符串中第一次出现ch字符的索引
      int indexOf(String str) //获取字符串中第一次出现str字符串的索引位置
      int indexOf(int ch,int fromIndex) //从某个位置开始获取ch字符第一次出现的索引
      int indexOf(String str,int fromIndex)//从某个位置开始获取str字符串第一次出现的索引
     String substring(int start) //从某个位置开始截取字符串
     String substring(int start,int end) //从某个位置开始到某个位置结束截取字符串
 C:转换功能
    byte[] getBytes() //将字符串转换为byte数组
    char[] toCharArray() //将字符串转换为char数组
    static String copyValueOf(char[] chs)//将字符数组转换成字符串
    static String valueOf(char[] chs) //将字符数组转换成字符串
    static String valueOf(int i) //将一个int数转换成字符串
    String toLowerCase() //转小写
    String toUpperCase() //转大写
    String concat(String str) //拼接字符串

D:其他功能
    a:替换功能
  String replace(char oldChar,char newChar) //将newChar全部替换OldChar,如果OldChar不存在,原字符串直接赋值给替换后字符串
  String replace(String oldString,String newString)

b:切割功能
  String[] split(String regex) //通过regex切割字符串,切割后会产生一个字符串数组
 c:去除两端空格功能
  String trim()
    d:字典顺序比较功能
  int compareTo(String str) //如果str比str1大的话,返回的正数
  字符串的比较原理:
      第一步:将两个字符串转变为char数组
      第二步:逐个比较char数组中的相同元素的大小
    相同:继续比较其他元素
    不同:返回 第一个数组比较元素的字符减去第二个数组中的同位置元素
  注意:若较短的数组长度的最后一位已经比较完了,则返回第一个数组长度减去第二个数组的长度
  int compareToIgnoreCase(String str) //忽略大小写比较

因为String变量的值是不可改变的,所以在频繁操作字符串的时候,就会产生极大的垃圾空间,影响程序的运行。而Java提供了可变的字符串缓冲区StringBuffer和StringBulid解决String带来的问题。

StringBuffer
    (1)线程安全的可变字符序列,字符串可以发生改变的字符串类。字符串缓冲区类。
    (2)构造方法:
  A:StringBuffer() //构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。
  B:StringBuffer(int capacity)//构造一个不带字符,但具有指定初始容量的字符串缓冲区。
  C:StringBuffer(String str) //构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
    (3)成员方法:
  A:添加功能
    public StringBuffer append(anyType varName); //在缓冲区的末尾追加
    StringBuffer insert(int index,String str); //在指定索引位置添加
  B:删除功能
    public StringBuffer delete(int start,int end); //从start开始删除到end结束,不包括end位置的字符
    StringBuffer delete(0,sb.length); //清空缓冲区
    public StringBuffer deleteCharAt(int index); //删除第index位置的字符
   C:替换功能
    public StringBuffer replace(int start,int end, String str);//替换字符串
    void setCharAt(int index ,char); //修改,把指定索引位置的值改成传入的char值
   D:截取功能
   public String substring(int start); //从start位置开始截取字符串
     E:反转功能
  public StringBuffer reverse(); //反转字符串的所有字符
  F:其他常用的功能
  void setLength(int len); //根据传入的len值截取缓冲区的长度
  toString() //转换成String
  int indexOf(str); //查找str在缓冲区第一次出现的位置
  int lastIndexOf(str); //从后向前查找查找str在缓冲区第一次出现的位置

StringBulider
StringBuilder与StringBuffer其实就像是孪生兄弟,使用的方式没有什么太大的区别。但是StringBuild实例不能安全使用多线程。 如果需要同步,那么就使用StringBuffer 。

StringBuilder和StringBuffer
    StringBuilder和StringBuffer都是可变的字符序列,适用于需要经常对字符串修改的操作。两者的方法的使用是一样的,区别在于多线程的安全问题。

StringBuilder和StringBuffer与String的区别
  StringBuilder和StringBuffeer是可变字符序列;String是不变得,一但被初始化,就不能改变
StringBuilder和StringBuffer的区别
StringBuilder是线程不安全的,所以效率比较高;StringBuffer是线程安全的,效率相对较低(可以解决多线程同步问题)

Java基础系列--07_String、StringBuffer和StringBuilder的更多相关文章

  1. Java基础-String、StringBuffer、StringBuilder

    看下面这段代码: public class Main { public static void main(String[] args) { String string = ""; ...

  2. 十四、Java基础---------String、StringBuffer、StringBuilder基本应用

    在前面的博客中曾提及Java的数据类型分为基本数据类型,和引用数据类型,而String便是最常见的应用数据类型,本文将着重介绍这一引用数据类型的用法. String 字符串     String类是对 ...

  3. Java基础知识(JAVA中String、StringBuffer、StringBuilder类的区别)

    java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

  4. Java基础——java中String、StringBuffer、StringBuilder的区别

    (转自:http://www.cnblogs.com/xudong-bupt/p/3961159.html) java中String.StringBuffer.StringBuilder是编程中经常使 ...

  5. 夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!

    目录 目录 string基础 Java String 类 创建字符串 StringDemo.java 文件代码: String基本用法 创建String对象的常用方法 String中常用的方法,用法如 ...

  6. Java基础系列2:深入理解String类

    Java基础系列2:深入理解String类 String是Java中最为常用的数据类型之一,也是面试中比较常被问到的基础知识点,本篇就聊聊Java中的String.主要包括如下的五个内容: Strin ...

  7. java中String、StringBuffer、StringBuilder的区别

    java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

  8. 2015年12月28日 Java基础系列(六)流

    2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流

  9. Java基础系列--static关键字

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8477914.html 一.概述 static关键字是Java诸多关键字中较常使用的一个,从 ...

随机推荐

  1. 记一次DDOS攻击防御实录

    前言     笔者所在单位是一家小型创业公司,目前产品正在成长阶段,日活跃用户只有区区几万人次,并发只有日均 85/QPS,自建机房,带宽 100MB.在这样的背景下,完全没想过一个小产品会招来黑客的 ...

  2. SQL Server 数据库部分常用语句小结(三)

    21.SQL运行Log的读取 .EXEC xp_readerrorlog 0,1,null,null,'开始时间','结束时间' 22. Alwayson 状况及传输情况监控 SELECT ar.re ...

  3. java.lang.ClassNotFoundException: org.I0Itec.zkclient.IZkStateListener异常解决

    在启动Dubbo项目时,出现该异常 java.lang.ClassNotFoundException: org.I0Itec.zkclient.IZkStateListener 解决,引入 <d ...

  4. [Swift]LeetCode1034.边框着色 | Coloring A Border

    Given a 2-dimensional grid of integers, each value in the grid represents the color of the grid squa ...

  5. spring的核心组件及作用(一)

    Spring的核心组件有: Context     Core     Bean. 如果要在这三个核心组件上挑出一个最核心的组件,那就是Bean组件了. Spring的特性功能有:WEB ORM AOP ...

  6. SpringBoot/SpringMVC文件下载方式

    本篇文章引用外网博客代码,共描述SpringMVC下三种文件下载方式,本人测试在SpringBoot(2.0以上版本)正常使用. 引用博客,强烈推荐https://www.boraji.com. pa ...

  7. Node.js微服务实践(一)

    什么是微服务 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完成一件任务并很好地完成该任务.在所有情况下 ...

  8. Capacitor 新一代混合应用“神器” 会代替Cordova吗??

    1.介绍or畅想 Capacitor是由ionic团队最新开发维护的一个跨平台的应用程序容器,可以轻松构建在iOS,Android,Electron 和 Web 上本机运行的Web应用程序.我们称这些 ...

  9. [小技巧]C#中如何为枚举类型添加描述方法

    背景 在我们的日常开发中,我们会经常使用枚举类型.有时我们只需要显示枚举的值或者枚举值对应名称, 但是在某些场景下,我们可能需要将枚举值显示为不同的字符串. 例: 当前我们有如下枚举Level pub ...

  10. DotNetCore跨平台~在appsettings.json里自定义配置项

    回到目录 DotNetCore里一切都是依赖注入的,对于appsettings这个可扩展的配置对象也不例外,它位于项目根目录,一般在startup里去注册它,在类中通过构造方法注入来获取当前的对象,以 ...