特点

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详解

Java基础—String总结的更多相关文章

  1. Java基础String的方法

    Java基础String的方法 字符串类型写法格式如下: 格式一: String 变量名称; 变量名称=赋值(自定义或传入的变量值); 格式二: String 变量名称=赋值(自定义或传入的变量值); ...

  2. Java基础 String 裸暴力算法- 五个小练习

      之间的博客,承上启下:    Java基础 String/StringBuff 常用操作方法复习/内存分析 Java数组直接选择排序.sort()排序 Java基础 String 算法 - 五个练 ...

  3. Java基础—String构造方法

    Java基础--String构造方法 public String(): 创建一个空表字符串对象,不包含任何内容 public String(char[]chs): 根据字符数组的内容,来创建字符串对象 ...

  4. Java基础——String

    前言 从去年八月末开始工作一年了,有了大半年的java开发经验,自认为比在大学时期编码能力强了很多,但是基础方面概念模糊的地方感觉越来越多了 (:´д`)ゞ 所以,我准备把这些问题以及工作中遇到的问题 ...

  5. java基础-String不可变的好处

    一.java内部String类的实现: java 8: public final class String implements java.io.Serializable, Comparable< ...

  6. Java基础 -- String,StringBuilder,StringBuffer三者的区别

    结论 1-String,StringBuilder,StringBuffer 之间的区别主要是在两个方面,即运行速度和线程安全这两方面: 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:St ...

  7. java基础——String的常用方法

    java中String的常用方法 1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); i nt le ...

  8. java基础 String

    标准格式:数据类型[] 数组名称 = new 数据类型[] {元素1,元素2,...};省略格式:数据类型[] 数组名称 = {元素1,元素2,...}; Scanner类实现的功能,可以实现键盘输入 ...

  9. Java基础 String/StringBuff/StringBuilder 常用操作方法复习/内存分析/三者的效率比较

    附:jdk1.8使用IDEA安装.创建.使用JUnit单元测试 笔记总结: /**String 复习 * 1.像C++这样的char arr[]="..." 的方式无法声明Java ...

随机推荐

  1. Mysql 常用函数集

    1.分类导航 一共分为5类函数 . 字符型函数 . 数值型函数 . 日期型函数 . 统计型函数 . 其它型函数 2.字符型函数[约48个] ascii(str) bin(n) bit_length(s ...

  2. unity, write/read txt file

    在Assets下新建文件夹StreamingAssets.然后下面代码可在其中生成test.txt文件,并读写: using UnityEngine;using System.Collections; ...

  3. Java平台调用.net开发的WebService报错处理

    1.报错:服务器未能识别 HTTP 头 SOAPAction 的值 : 解决办法:.net 开发的WebService文件中(.asmx)增加属性: [SoapDocumentService(Rout ...

  4. script

    实例 链接一个外部脚本文件: <script type="text/javascript" src="myscripts.js"></scri ...

  5. C语言基础(12)-输入和输出

    1. int scanf(const char *format, ...) 说明:scanf用于通过控制台输入字符串. 注意: (1).通过scanf()函数输入的字符串,系统会自动在其后面补一个0, ...

  6. C++程序设计(第4版)读书笔记_指针、数组与引用

    void * 函数指针和指向类成员的指针不能被赋给void * 字符串字面值常量 #include <iostream> using namespace std; void f() { c ...

  7. ajax请求后台返回map类型并如何展示

    前台jsp或者ftl文件接收返回结果: <input type="hidden" name="selectedModelListStr" id=" ...

  8. Git使用技巧(2)-- 基本操作

    常用 Git 命令清单 作者: 阮一峰 编辑更新:shifu204 日期: 2016年9月 1日 我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练 ...

  9. How tomcat works学习笔记

    最近在看Tomcat的源码, 所以找了一本相关的书籍<How tomcat works>. 博客内容多为 学习该书时所记录的笔记.(如有侵权行为,请联系我:eviltomorrow@163 ...

  10. postgresql on centos (sequelize+pg+nodejs):Failed to find PostgresSQL server.Pleast double check your settings

    公司的一个项目,使用的nodejs做服务端,数据库是postgresql,在本地时一切ok,放在centos时,postgresql配置ok,可以远程访问,但是nodejs在centos启动时,就会报 ...