一、String类概述

  1、概述

    java.lang.String 代表字符串。Java程序中所有的字符串文字(例如 "abc" )都可以被看作是实现此类的实例。String 是引用数据类型,不是基本数据类型。

    String 中包括用于检查各个字符串的方法,比如用于比较字符串,搜索字符串,提取子字符串以及创建具有翻译为大写或小写的所有字符的字符串的副本。

  2、特点【重要】

    a、字符串不变:字符串的值在创建后不能被更改。【非常重要】 

    Demo:

String s1 = "abc";
s1 += "def";
System.out.println(s1); // s1 = "abcdef"

      分析:内存中有"abc","abcdef"两个对象,s1从指向 "abc",改变指向,指向了"abcdef" ,字符串本身并没有改变,而是改变了指向。

     扩展:String对象怎么就不可变?

底层char[]数组有final修饰,意味着这个数组不能扩容等,来达到存更多的字符

char[]数组是私有的,程序员无法直接操作这个char[]数组,而且String没有提供这样的方法,来修改char[]数组的元素的值。

String提供的所有的方法,对字符串的修改都是给你返回一个新的字符串对象。    

   b、因为String对象是不可变的,可以把一些字符串存到常量池中,字符串在常量池中,可以被共享。

    Demo:

String str1 = "abc";
String str2 = "abc";

      分析:内存中只有一个 "abc" 对象被创建,同时被 s1 和 s2 共享。

   c、字符串对象底层的存储:

      JDK1.9之前:底层是用 char[ ] 存储

      JDK1.9之后:底层选用 byte[ ] 存储 

    Demo:

String str = "abc";
相当于
char datas[] = {'a', 'b', 'c'};
String str = new String(datas);

    d、String 类型不能被继承,因为 String 是由 final 修饰的。

二、String类使用步骤

  1、导包

    String 这个类 是 java.lang.String 包内的,不需要手动导入。

    扩展:常用的如 基本数据类型,String,还有一些工具类,只要是 lang 包下面的,就不必写 import 导包语句。

  2、创建字符串

    创建字符串的常见3+1种方式。(三种构造方法,一种直接创建)

     a、构造方法创建

public String() :            初始化新创建的 String对象,以使其表示空字符序列
public String(char[] value) :通过当前参数中的字符数组来构造新的String。
public String(byte[] bytes) :通过使用平台的默认字符集解码当前参数中的字节数组来构造新的String。

      Demo:

// 无参构造
String str = new String();
// 通过字符数组构造
char chars[] = {'a', 'b', 'c'};
String str2 = new String(chars);
// 通过字节数组构造
byte bytes[] = { 97, 98, 99 };
String str3 = new String(bytes);

          b、直接创建

String str = "字符串内容"; // 右边直接用双引号

     分析:这里面虽然没有 new 关键字,但同时创建了一个 String 对象。

三、String 对象的创建

String str = “hello”;

String  s1 = new String();   //  本质上  this.value = new char[0];

String  s2 = new String(String original);  //this.value = original.value;

String  s3 = new String(char[] a);  //this.value = Arrays.copyOf(value, value.length);

String  s4 = new String(char[] a,int startIndex,int count)

.......

  图解:

  

  面试题:

(1)String str = new String("hello"); 涉及几个对象?—— 两个

(2)String str1 = new String("hello");

    String str2 = new String("hello");涉及几个对象?—— 三个  

四、字符串是如何存储的

  字符串常量存储在字符串常量池,目的是共享。

   字符串非常量对象存储在堆中。

  

   

  字符串常量池:

  1、当直接创建一个字符串时,变量会到字符串常量池中去寻找该字符串,如果找到了,该变量指向该字符串;如果没有找到,会用 byte[ ]拼接成所需的字符串,然后放入常量池中并指向它。

   2、使用 new 关键字创建字符串,会在堆区创建一个 String 对象,而且底层是用 byte[ ] 数组拼接的,这个 String 对象并没有放入字符串常量池中,而是在堆中,该变量指向该对象的地址。

  扩展: 字符串常量池在哪里?(Oracle官方虚拟机HotSpot)

(1)JDK1.6以及之前:方法区中

(2)JDK1.7:挪到堆中,即在堆中单独划分了一块字符串常量

(3)JDK1.8:从堆中挪出,挪到一个 “元空间meta space”,即类似于方法区

五、字符串的拼接

结论

  (1)因为只有常量池中才是共享,==比较才为 true;

  (2)常量与常量的拼接结果在常量池中;

  (3)只要其中有一个是变量,结果就在堆中;

  (4)如果拼接的结果调用 intern() 方法,就在常量池中;

六、空字符串

  1、表现方式

(1)String str = "";

(2)String str2 = new String();

(3)String str3 = new String("");

  2、判断是否为空

(1)if(str != null && str.length() == 0)

(2)if(str != null && str.equals(""))

(3)if("".equals(str))  推荐

(4)if(str!=null && str.isEmpty())

Java 字符串(一)字符串初始化的更多相关文章

  1. java基础4_字符串

    一 字符串 Java字符串关键字是String,是一个类,创建新的字符串即创建一个新的对象. 1.字符串的声明及初始化. String str; //只做声明 String str1="aa ...

  2. < java.lang >-- String字符串

    java中用String类进行描述.对字符串进行了对象的封装.这样的好处是可以对字符串这种常见数据进行方便的操作.对象封装后,可以定义N多属性和行为. 如何定义字符串对象呢?String s = &q ...

  3. 再回首,Java温故知新(八):Java基础之字符串

    字符串是Java中使用频率最高的类,但是它却不属于基本类型,而是预定义了String类来表示.从String类的源码可以看到,String是基于char[]实现的,而且Java中的String是不可变 ...

  4. 《Java入门第三季》第二章 认识 Java 中的字符串

    什么是 Java 中的字符串.1.在Java的世界里,字符串被作为String类型的对象处理. 2.通用的初始化的方式:String s = new String("i love you & ...

  5. 为什么Java中的字符串是不可变的?

    原文链接:https://www.programcreek.com/2013/04/why-string-is-immutable-in-java/ java字符串是不可变的.不可变类只是一个不能修改 ...

  6. 详解Java中的字符串

    字符串常量池详解 在深入学习字符串类之前, 我们先搞懂JVM是怎样处理新生字符串的. 当你知道字符串的初始化细节后, 再去写String s = "hello"或String s ...

  7. Java编程基础-字符串

    在Java语言中,字符串数据实际上由String类所实现的.Java字符串类分为两类:一类是在程序中不会被改变长度的不变字符串:另一类是在程序中会被改变长度的可变字符串.Java环境为了存储和维护这两 ...

  8. java中String字符串

    一.定义String字符串 String字符串和char字符不同,char使用单引号,只能表示一个字符,字符串就是一段文本.String是个类.这个类使用final修饰,所以这个类是不可以继承扩充和修 ...

  9. Java程序设计——反转字符串 & 找朋友 & 计算int型二进制1的个数 & 情报加密 & 计算日期 & 求近似数 & 输出较小数(练习1)

    作为刚刚入门Java的选手,其实C++的功底起到了很大的作用.但是,Java之于C++最大的不同,我个人认为,是其类的多样性.才入门的我,写着老师布置的简单的面对过程的题,如果是C++,可以算是简单了 ...

  10. js与java正则表达式处理字符串问题

    在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码.合理使用正则表达式确实会为程序员省去很多字 ...

随机推荐

  1. 05-numpy-笔记-fliplr

    翻转矩阵的左右. 至少需要是2维矩阵. 例子: >>> A = np.diag([1.,2.,3.]) >>> A array([[ 1., 0., 0.], [ ...

  2. HDU6223 && 2017沈阳ICPC: G. Infinite Fraction Path——特殊图&&暴力

    题意 给定一个数字串,每个位子都能向(i*i+1)%n的位子转移,输出在路径上.字典序最大的.长度为n的串($n \leq 150000$). 分析 先考虑一个暴力的方法,考虑暴力每个x,然后O(n) ...

  3. R语言学习(基本知识)

    0)查看帮助 library(help="ballgown") #查看包帮助 getwd() #查看当前工作目录 setwd('C:/Users/djx/Desktop/信号肽系统 ...

  4. ESA2GJK1DH1K升级篇: 升级STM32 预热: 单片机每隔一定时间 使用 http 获取天气

    前言: 实现功能概要: STM32使用AT指令控制Wi-Fi以TCP方式连接服务器(YY天气Web服务器),然后使用http的get协议获取今天的天气数据 单片机提取今天的温度和湿度数据,把温湿度数据 ...

  5. fork()和vfork()的区别(转载)

    fork和vfork 转载 http://coolshell.cn/articles/12103.html 在知乎上,有个人问了这样的一个问题--为什么vfork的子进程里用return,整个程序会挂 ...

  6. 【CF848B】 Rooter's Song

    题目链接 \(solution\) 类似于蚂蚁那道题的做法 弹性碰撞相当于交换位置并继续前进,考虑一个起点\((x,0)\),时间为\(t\)出发的\(dancer\),相当于从\((x,-t)\)的 ...

  7. 什么是SQL Server2019大数据群集?

    从SQL Server 2019(15.x)开始,SQL Server大数据群集允许您部署在Kubernetes上运行的SQL Server,Spark和HDFS容器的可伸缩群集.这些组件并排运行,使 ...

  8. asp.net core api 跨域配置

    项目前后端分离,前端请求接口例如使用axios发送请求时浏览器会提示跨域错误,需要后端配置允许接口跨域 配置步骤: 1.通过NuGet安装Microsoft.AspNetCore.Cors.dll类库 ...

  9. 自定义Ribbon的负载均衡策略

    自定义负载均衡策略 官方文档指出:自定义的负载均衡配置类不能放在 @componentScan 所扫描的当前包下及其子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们 ...

  10. python中进程、线程、协程简述

    进程 python中使用multiprocessing模块对进程进行操作管理 进程同步(锁.信号量.事件) 锁 —— multiprocessing.Lock 只要用到了锁 锁之间的代码就会变成同步的 ...