Java 字符串(一)字符串初始化
一、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 字符串(一)字符串初始化的更多相关文章
- java基础4_字符串
一 字符串 Java字符串关键字是String,是一个类,创建新的字符串即创建一个新的对象. 1.字符串的声明及初始化. String str; //只做声明 String str1="aa ...
- < java.lang >-- String字符串
java中用String类进行描述.对字符串进行了对象的封装.这样的好处是可以对字符串这种常见数据进行方便的操作.对象封装后,可以定义N多属性和行为. 如何定义字符串对象呢?String s = &q ...
- 再回首,Java温故知新(八):Java基础之字符串
字符串是Java中使用频率最高的类,但是它却不属于基本类型,而是预定义了String类来表示.从String类的源码可以看到,String是基于char[]实现的,而且Java中的String是不可变 ...
- 《Java入门第三季》第二章 认识 Java 中的字符串
什么是 Java 中的字符串.1.在Java的世界里,字符串被作为String类型的对象处理. 2.通用的初始化的方式:String s = new String("i love you & ...
- 为什么Java中的字符串是不可变的?
原文链接:https://www.programcreek.com/2013/04/why-string-is-immutable-in-java/ java字符串是不可变的.不可变类只是一个不能修改 ...
- 详解Java中的字符串
字符串常量池详解 在深入学习字符串类之前, 我们先搞懂JVM是怎样处理新生字符串的. 当你知道字符串的初始化细节后, 再去写String s = "hello"或String s ...
- Java编程基础-字符串
在Java语言中,字符串数据实际上由String类所实现的.Java字符串类分为两类:一类是在程序中不会被改变长度的不变字符串:另一类是在程序中会被改变长度的可变字符串.Java环境为了存储和维护这两 ...
- java中String字符串
一.定义String字符串 String字符串和char字符不同,char使用单引号,只能表示一个字符,字符串就是一段文本.String是个类.这个类使用final修饰,所以这个类是不可以继承扩充和修 ...
- Java程序设计——反转字符串 & 找朋友 & 计算int型二进制1的个数 & 情报加密 & 计算日期 & 求近似数 & 输出较小数(练习1)
作为刚刚入门Java的选手,其实C++的功底起到了很大的作用.但是,Java之于C++最大的不同,我个人认为,是其类的多样性.才入门的我,写着老师布置的简单的面对过程的题,如果是C++,可以算是简单了 ...
- js与java正则表达式处理字符串问题
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码.合理使用正则表达式确实会为程序员省去很多字 ...
随机推荐
- 禁用wordpress模板默认样式
我们知道wordpress主题比如twentytwenty都会有样式,如果不想使用它们的默认样式怎么处理呢?其实很简单,随ytkah一起来看看吧.进入2020主题的function.php文件,里面有 ...
- ActiveMQ消息可靠性-事物
事物偏生产者,签收偏消费者 设置为true,需要手动提交 设置为false,自动提交 使用手动提交的好处就是可以回滚,当整个事物提交时,里面的某条失败了,可以事物回滚,于是保证了数据的一致性 ...
- Spring Cloud微服务安全实战_1-1_导学
这两年微服务是一个很火的话题 .在java语言的体系里,现在最火的就是SpringCloud. 本系列文章主要不是讲:怎么使用SpringSpringCloud组件搭建一个微服务的体系,如服务的认证注 ...
- Android 开发基础入门篇: android studio安装教程
下载地址 http://www.android-studio.org/ 注意: 安装主要分两种情况,下载的自带SDK和不带SDK两种 然后又分为安装版,就是.exe和解压版 两种的区别...解压版,, ...
- adb--环境安装
前戏 我们在做Android自动化的时候,adb命令是必不可少的,比如我们要获取一个包名,使用adb往手机上安装软件,获取activity等等,都要用到adb命令.而模拟器在我们没有手机测试的时候,可 ...
- java插入代码块
粘贴1: 当代码写到一定程度之后,就会发现很多代码都被重复地敲了N多遍,甚至毫不夸张地说:闭着眼睛都能敲出来.大量地敲这些重复地代码,除了锻炼敲键盘的速度,基本上没有其他益处,但是长期下来会浪费很多时 ...
- 使Jackson和Mybatis支持JSR310标准
1.首先要确保Jackson和Mybatis正确地整合进项目了 2.添加额外的依赖 <dependency> <groupId>org.mybatis</groupId& ...
- PS 个人常用功能
PS是什么? Adobe Photoshop,简称"PS",是由Adobe Systems开发和发行的图像处理软件. 不是美工,为什么要学PS? 1)写博客时,有些需要的素材图片有 ...
- spring JDBC的应用
原文地址:https://www.iteye.com/blog/chen106106-1574911 1:首先在类路径下面配置访问数据的一些基本信息,包括连接数据库的地址,用户,密码jdbc.prop ...
- CSS3手机端字体不能小于12号的方法
CSS3手机端字体不能小于12号的方法 <pre> .xiaoyu12fontsize{ -webkit-transform-origin: 0% 0%; -webkit-transfor ...
