之前面试的时候被问到有没有看过String类的源码,楼主当时就慌了,回来赶紧补一课。

1.构造器(构造方法)

String类提供了很多不同的构造器,分别对应了不同的字符串初始化方法,此处从源码中摘录如下:

其中蓝色的实心三角表示no modifier(没有修饰符,friendly),表示只能被同一个包中的所有类访问,而不同包中的类不能访问。

这里举了一些示例,来说明这些构造器的用法:

         String string = new String();
System.out.println(string.isEmpty());

         String string = new String("hello world");
System.out.println(string);

         char[] arr = {'A','B', 'C', '1', '2', '3'};
String arrString = new String(arr);
System.out.println(arrString);

         char[] arr = {'A','B', 'C', '1', '2', '3'};
String arrString = new String(arr, 1, 4);
System.out.println(arrString);

         int[] codepoints = {101, 97, 98, 99};
String string = new String(codepoints, 0, 3);
System.out.println(string);

        StringBuffer buffer = new StringBuffer("hello");
2        buffer.append(" world");
3        String string = new String(buffer);
4        System.out.println(string);

         StringBuilder builder = new StringBuilder("hello");
builder.append(" world");
String string = new String(builder);
System.out.println(string);

这里提到构造器,笔者想补充一个问题:构造器真的没有返回值吗?既然没有返回值,那么为什么不能用void关键字来修饰?

解析:其实这只是Java语法上的一个规定。实际上,类的构造器是有返回值的,当我们用new关键字来调用构造器时,会返回一个该类的实例对象,并将这个实例对象在堆内存中的地址赋给了一个该类类型的引用变量。因此,构造器的返回值类型总是当前类,所以就无须定义返回值类型。但必须注意的是,不能在构造器里显式地使用return关键字来返回当前类的对象,因为构造器的返回值是隐式的。

2.成员方法

  • charAt(int index)   返回字符串中下标为index的字符,返回值为char型
         String string = new String("hello world");
System.out.println(string.charAt(0));

  • codePointAt(int index)  返回下标为index的字符的unicode码
  • codePointBefore(int index)  返回下标为index-1的字符的unicode码
  • codePointCount(int beginIndex, int endIndex)   返回下标从beginIndex到endIndex的字符数
         String string = "hello world";
System.out.print(string.charAt(4)+" ");
System.out.println(string.codePointAt(4));
System.out.print(string.charAt(4)+" ");
System.out.println(string.codePointBefore(5));
System.out.println(string.codePointCount(0, 6));

  • equals(Object obj)  比较两个字符串是否相同,返回值为true或者false,此外还有equalsIgnoreCase(String anotherString),即忽略大小写的比较

    注意:1.字符串之间的比较时,比较的是字符串的内容而不是地址,并且只能用于比较String类型,因为StringBuffer和StringBuilder都没有equals()方法;

       2.非字符串之间的比较时,比较的是引用的地址而不是内容,可以用于StringBuffer和StringBuilder类型。

         String string = "hello";
System.out.println(string.equals("hello")); //true String s1 = "hello";
System.out.println(string.equals(s1)); //true String s2 = new String("hello");
String s3 = new String("hello");
System.out.println(s2.equals(s3)); //true /* 注意:StringBuffer和StringBuilder都没有equals()方法
所以调用equals()方法时,比较的是引用变量的地址,所以结果均为false*/
StringBuffer s4 = new StringBuffer("hello");
StringBuilder s5 = new StringBuilder("hello");
StringBuffer s6 = new StringBuffer("hello");
StringBuilder s7 = new StringBuilder("hello");
System.out.println(s1.equals(s4)); //false
System.out.println(s2.equals(s5)); //false
System.out.println(s4.equals(s5)); //false
System.out.println(s4.equals(s6)); //false
System.out.println(s5.equals(s7)); //fals
         String string = "hello";
System.out.println(string.equalsIgnoreCase("Hello")); //true
  • toCharArray()  字符串转换为数组,返回值为一个char类型的数组

    注意:字符数组转换为字符串可以用构造器String(char[]) 实现

         String string = "hello world";
char[] charArr = string.toCharArray();
for(char ch: charArr){
System.out.print(ch+" ");
}

  • 此外,String类还有很多成员方法,这里简单列举一些常用的:

startsWith(String prefix)  endsWith(String suffix)  indexOf(int ch)  indexOf(int ch, int fromIndex)  lastIndexOf(int ch)  lastIndexOf(int ch, int fromIndex)  indexOf(String str)  indexOf(String str, int fromIndex)  substring(int beginIndex)  substring(int beginIndex, int endIndex)  replace(char oldChar, char newChar)  matches(String regex)  contains(CharSequence s)    replaceAll(String regex, String replacement)  split(String regex)  toLowerCase()  toUpperCase()  trim()

String类的源码分析的更多相关文章

  1. JDK中String类的源码分析(二)

    1.startsWith(String prefix, int toffset)方法 包括startsWith(*),endsWith(*)方法,都是调用上述一个方法 public boolean s ...

  2. JDK中String类的源码分析(一)

    1.String类是final的,不允许被继承 /** The value is used for character storage. */ private final char value[]; ...

  3. Spring-MongoDB 关键类的源码分析

    本文分析的是 spring-data-mongodb-1.9.2.RELEASE.jar 和 mongodb-driver-core-3.2.2.jar. 一.UML Class Diagram 核心 ...

  4. Set集合架构和常用实现类的源码分析以及实例应用

    说明:Set的实现类都是基于Map来实现的(HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的). (01) Set 是继承于Collection的接口.它是一个不允许 ...

  5. String,StringBuffer,StringBuilder源码分析

    1.类结构 String Diagrams StringBuffer Diagrams StringBuilder Diagrams 通过以上Diagrams可以看出,String,StringBuf ...

  6. Mybatis Mapper接口是如何找到实现类的-源码分析

    KeyWords: Mybatis 原理,源码,Mybatis Mapper 接口实现类,代理模式,动态代理,Java动态代理,Proxy.newProxyInstance,Mapper 映射,Map ...

  7. java类uuid源码分析

    通用唯一识别码(英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准,亦为自由软件基金会组织在分散式计算环境领域的一部份.UUID的目的,是让分散式系统 ...

  8. 【Cocos2d-x 3.x】 动作类Action源码分析

    游戏设计中,动作是不可缺少的,Cocos2d-x中所有的动作都继承自Action类,而Action类继承自Ref和Clonable类,整个动作类继承体系如图: FiniteTimeAction是所有瞬 ...

  9. String、StringBuffer、StringBuilder源码分析

    利用反编译具体看看"+"的过程 1 public class Test 2 { 3 public static void main(String[] args) 4 { 5 int ...

随机推荐

  1. linux允许root远程登录

    在根目录下自己建了一个目录 /software 通过ssh传输文件时遇到问题, 虽然ssh中su 切换用户到root ,但不能传输文件,所以要允许root登录才行 修改ssh配置文件 修改完重启 ss ...

  2. CentOS7下搭建hadoop2.7.3完全分布式

    这里搭建的是3个节点的完全分布式,即1个nameNode,2个dataNode,分别如下: CentOS-master   nameNode   192.168.11.128 CentOS-node1 ...

  3. Java入门(2) —— 变量详解、运算符、定义类和定义方法以及方法的调用

    1.变量 1.定义变量 1.声明的同时直接赋值 数据类型 变量名 = 值; 2.先声明,后赋值 声明: 数据类型 变量名; 赋值: 变量名 = 值; 2.数据类型 基本数据类型:4类8种 整数 --- ...

  4. ionic实战系列(一):ionic的开发环境配置和编译、发布

    我的ionic实战系列是基于<<Ionic实战>>[美]Jeremy Wilken著-这本书的读书笔记,有诸多借鉴,不详细的地方请参考书籍本身的内容. 1.1技术栈模型 Ion ...

  5. java冒泡排序详解

    冒泡排序 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始 ...

  6. 一语惊醒梦中人-《Before I Fall》

    I still remembered  I turned my attention to the title when I browsed in news by cellphone.I saw the ...

  7. 如何在环境变量里配置tomcat

    安装好后,配置环境变量:计算机--右击--属性--高级系统设置设置--环境变量 4 新建系统变量 变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.7.0(这个 ...

  8. jquery 的 each 方法中 return 的坑

    jquery 的 each 方法中 return 的坑 Chapter 0 在项目中使用 jquery 的 each 方法时想在 each 的循环中返回一个布尔类型的值于是掉进一个坑中... Chap ...

  9. linux下使用gcc编译运行C程序

    gcc(GNU Compiler Collection)是Linux下最常用的C语言编译器,是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.  在 ...

  10. 数据绑定技术一:GridView控件

    在网站或应用程序中,要显示数据信息,可用到ASP.NET提供的数据源控件和能够显示数据的控件. 一.数据源控件 数据源控件用于连接数据源.从数据源中读取数据以及把数据写入数据源. 1.数据源控件特点 ...