一、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. SaaS加速器 III 技术中心:提供SaaS Launchkit,快速定制,一云多端等能力,一云多端将通过小程序云实现

    https://yq.aliyun.com/articles/695746 演讲主题:SaaS加速器 III技术中心:聚合开放 高效强大 技术中心定义:阿里云以聚合开放的姿势,提供一个高效强大的技术开 ...

  2. 模板语言、url

    伪造一个数据库全局变量 (字典无序) USER_LIST 列表变字典(元祖和列表直接循环就好,字典涉及到k_v) UESR_DICT 遍历方法 1. 2. 3. 4. 5. 6.键入链接 通过a标签包 ...

  3. views视图

    1.request.POST.get('.......')    --radio       单选框 get()方法  从HTML中提取发过来的数据 1. 2. 3. 4. 2.request.POS ...

  4. django ORM CRUD

    一.增加数据-Create 1.类名.objects.create(属性=值,属性=值) Myomodel.objects.create(name=) 2.d={"属性":&quo ...

  5. 第03组 Beta冲刺(4/4)

    队名:不等式方程组 组长博客 作业博客 团队项目进度 组员一:张逸杰(组长) 过去两天完成的任务: 文字/口头描述: 制定了初步的项目计划,并开始学习一些推荐.搜索类算法 GitHub签入纪录: 暂无 ...

  6. 【字符串】【P5830】 【模板】失配树

    [字符串][P5830] [模板]失配树 Description 给定一个长度为 \(n\) 的字符串 \(S\),有 \(m\) 次询问,每次询问给定 \(S\) 的两个前缀,求它们的最长公共 bo ...

  7. VQA视觉问答基础知识

    本文记录简单了解VQA的过程,目的是以此学习图像和文本的特征预处理.嵌入以及如何设计分类loss等等. 参考资料: https://zhuanlan.zhihu.com/p/40704719 http ...

  8. ZROI 暑期高端峰会 A班 Day4 树上数据结构

    FBI Warning:本文含有大量人类的本质之一. 你经历过绝望吗? [ZJOI2007]捉迷藏 询问树上最远黑点对. 动态边分治可以比点分治少一个 \(\log\). bzoj3730 咕了. [ ...

  9. TCP/IP协议族体系结构:死也不能忘记的四个层

    1.死也不能忘记的四个层 ①数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介(比如以太网.令牌环等)上的传输.主要的协议ARP和RARP经过数据链路层封装的数据成为帧,有以太网帧.令牌环帧 ...

  10. 安装kafka + zookeeper集群

    系统:centos 7.4 要求:jdk :1.8.x kafka_2.11-1.1.0 1.绑定/etc/hosts 10.10.10.xxx      online-ops-xxx-0110.10 ...