zoukankan      html  css  js  c++  java
  • Java基础—String总结

    特点

    String不属于8种基本数据类型,String是一个对象。 因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。

    String实际上是使用字符数组来存储的数据的。从源码可以清晰看到定义的字符数组。

    String在java/lang包下面,java默认导入lang包,所以使用String类时不用导入。

    创建方式

    创建字符串有下面两种方式:

    1. String ok1=new String(“ok”);
    2. String ok2=“ok”;
    这两个字符串的内存示意图:


    String ok1=new String(“ok”)
    这种方式首先会在堆内存申请一块内存存储字符串ok,ok1指向其内存块对象。同时还会检查字符串常量池中是否含有ok字符串,若没有则添加ok到字符串常量池中。
    所以 new String()至少在堆中创建一个对象,有可能会在常量池创建一个对象。
    String ok2=“ok”。
    先检查字符串常量池中是否含有ok字符串,如果有则直接指向,没有则在字符串常量池添加ok字符串并指向它。
    所以这种方法最多在常量池创建一个对象。
    上面的例子中:
    String ok1=new String(“ok”);//创建了两个对象
    String ok2=“ok”;//没有创建对象

    equals和“==”

    在比较两个字符串的时候,equals()是看数值是否相等,而==是看是否属于同一个对象。

    看几个例子:

    String a = "abc";
    String b = "abc";
    System.out.print(a == b); //true

    a和b都指向字符串常量池中的对象,所以为true。

    String a = "Hello";
    String b = new String("Hello");
    System.out.println(a == b);  //false
    System.out.println(a.equals(b)); //true

    a指向字符串常量池中的对象,b指向堆中的字符串对象,所以==结果为false,equals结果为true。

    即使字符串内容相同,字符串常量池中的字符串与通过new String(..)等方式创建的字符串对象之间没有直接的关系,但是,可以通过字符串的intern()方法找到此种关联。

    intern()方法返回字符串对象在字符串常量池中的对象引用,若字符串常量池中尚未有此字符串,则创建一新的字符串常量放置于池中。

    String a = "Hello";
    System.out.println(a == a.intern()); //true
    
    String b = new String("corn");
    String c = b.intern();
    
    System.out.println(b == c); //false
    
    String d = "corn";
    
    System.out.println(c == d); //true

    常用方法

    int length(); // 返回String长度,亦即value[]数组长度;

    char charAt(int index); // 返回指定位置字符;

    int indexOf(int ch, int fromIndex); //从fromIndex位置开始,查找ch字符在字符串中首次出现的位置。fromIndex默认为0,ch直接传入字符即可。如'C',区分大小写,未查找到返回-1;

    char[] toCharArray() ;   // 将字符串转换成一个新的字符数组

    boolean contains(String str); //是否包含某个字符串,实际上 contains内部实现也是调用的indexOf,然后将其结果与-1相比较。

    boolean startsWith(String str); // 判断字符串是否以str开头

    boolean endsWith(String str); //判断字符串是否以str结尾

    String replace(CharSequence target, CharSequence replacement) ;  // 替换

    String substring(int beginIndex,  int endIndex);  //字符串截取,不传第二个参数则表示直接截取到字符串末尾

    String[] split(String regex);  // 字符串分割

     

    String/StringBuilder/StringBuffer区别

    1.三者在执行速度方面的比较:StringBuilder < StringBuffer < String

    String:字符串常量
    StringBuffer:字符串变量
    StringBuilder:字符串变量

    2.StringBuilder:线程非安全的,StringBuffer:线程安全的
    对于三者使用的总结: 

    • 如果要操作少量的数据用 = String
    • 单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
    • 多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

    JAVA字符串格式化-String.format()的使用

    JAVA字符串格式化-String.format()的使用

    参考:

    Java总结篇系列:Java String

    Java的String详解

  • 相关阅读:
    python虚拟环境--virtualenv
    求导法则和高阶导数
    restful规范
    python协程--yield和yield from
    打印质数
    更改docker的存储位置
    同台ECS安装多个mysql
    jenkins + gitlab + harbor + k8s 部署项目
    jenkins 配置maven
    gitlab + jenkins 持续集成
  • 原文地址:https://www.cnblogs.com/Jason-Xiang/p/7422930.html
Copyright © 2011-2022 走看看