String类的常用方法以及知识点总结
一,String的简介:
- 查阅API中的String类的描述,发现String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
- 一旦这个字符串确定了,那么就会在内存区域中就生成了这个字符串。字符串本身不能改变,但str变量中记录的地址值是可以改变的。
- 字符串的本质是一个字符的数组(String类一旦被创建,就不能被改变)。
1.1,String常量池
- 字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价。JVM为了提高性能和减少内存开销,
- 在实例化字符串常量的时候进行了一些优化。为 了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,
- 每当代码创建字符串常量时,JVM会首先检查字符串常量池。如果字符串已经存在池中, 就返回池中的实例引用。
- 如果字符串不在池中,就会实例化一个字符串并放到池中。Java能够进行这样的优化是因为字符串是不可变的,可以不用担心数据冲突
- 进行共享。
public class Program
{
public static void main(String[] args)
{
String str1 = "Hello";
String str2 = "Hello";
System.out.print(str1 == str2); //结果为true
}
}
Note:String s = "aaa";
这里,jvm创建一个变量引用s,在堆中创建一个对象aaa,将aaa放进常量池。s指向aaa。
然后就到了change方法里,常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括字符串常量。
1.2,String s = "aaa";与String s = new String("aaa");的区别:
- String s = "aaa"; 对象只是一个引用,内存中如果有"aaa"的话,s就指向它;如果没有,才创建它;
- 如果你以后还用到"aaa"这个字符串的话并且是这样用:
- String ss = "aaa"; String sss = "aaa"; 这三个变量都共享"aaa"。
- 而String s = new String("aaa");是根据"aaa"这个String对象再次构造一个String对象,将新构造出来的String对象的引用赋给aaa
1.3,String字符串的方法:
- public int length():返回此字符串的长度。
- public String():空构造
- public String(byte[] bytes):把字节数组转成字符串
- public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串
- public String(char[] value):把字符数组转成字符串
- public String(char[] value,int index,int count):把字符数组的一部分转成字符串
- public String(String original):把字符串常量值转成字符串
1.4,String类的判断功能:
- boolean equals(Object obj):比较字符串的内容是否相同,区分大小写a A
- boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写 a A
- boolean contains(String str):判断大字符串中是否包含小字符串
- boolean startsWith(String str):判断字符串是否以某个指定的字符串开头
- boolean endsWith(String str):判断字符串是否以某个指定的字符串结尾
- boolean isEmpty():判断字符串是否为空。
1.5,String类的获取功能:
- int length():获取字符串的长度。
- char charAt(int index):获取指定索引位置的字符
- int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
- int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
- int indexOf(String str,int fromIndex):返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
- String substring(int start):从指定位置开始截取字符串,默认到末尾。
- String substring(int start,int end):从指定位置开始到指定位置结束截取字符串。
1.6,String的转换功能:
- byte[] getBytes():把字符串转换为字节数组。
- char[] toCharArray():把字符串转换为字符数组。
- static String valueOf(char[] chs):把字符数组转成字符串。
- static String valueOf(int i):把int类型的数据转成字符串。
- 注意:String类的valueOf方法可以把任意类型的数据转成字符串。
- String toLowerCase():把字符串转成小写。
- String toUpperCase():把字符串转成大写。
- String concat(String str):把字符串拼接。
1.7,String类的其他方法:
1.String rerplace(char old,char new);
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
2.String replace(String old,String new);
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
3.String trim();
去掉字符串两端的空格
1.8,字符串的" "与null的区别:
""是字符串常量.同时也是一个String类的对象,既然是对象当然可以调用String类中的方法;
Null是空常量,不能调用任何的方法,否则会出现空指针异常,null常量可以给任意的引用数据类型赋值
二,创建字符串对象的两种方式的区别:
2.1直接赋值创建对象:
String str = "hello world"; //直接赋值
直接赋值的方式创建的对象在方法的常量池中
2.2,通过new关键字进行创建对象:
String str=new String("hello");//实例化的方式
通过构造方法创建字符串对象是在堆内存
2.3,两种实例化方式的比较:
1)编写代码比较
public static void main(String[] args) {
String str = "hello";
String strl = new String("hello");
String strll = strl; // 引用传递,str3直接指向st2的堆内存地址
String strlll = "hello";
/**
* ==: 基本数据类型:比较的是基本数据类型的值是否相同 引用数据类型:比较的是引用数据类型的地址值是否相同
* 所以在这里的话:String类对象==比较,比较的是地址,而不是内容
*/
System.out.println(str == strl); //結果:false 因为一个在常量池 一个在堆中所以地址不一样
System.out.println(str == strll); //結果:false 因为strll 引用了strl的地址
System.out.println(strll == strl); //結果:true 地址值相等,引用类型比较的是地址值
System.out.println(str == strlll); //結果:true 因为他们俩都引用了hello的常量所以相等
}
2)内存图分析

4)总结:两种实例化方式的区别
1)直接赋值(String str = "hello"):只开辟一块堆内存空间,并且会自动入池,不会产生垃圾。
2)构造方法(String str= new String("hello");):会开辟两块堆内存空间,其中一块堆内存会变成垃圾被系统回收,
而且不能够自动入池,需要通过public String intern();方法进行手工入池。
在开发的过程中不会采用构造方法进行字符串的实例化。
三,关于String的面试题:
2.4.1,String,StringBuffer和Stringbuilder有什么区别:
String是字符串常量,一旦创建就不能修改;StringBuffer和StringBuilder是字符串可变量,可以修改,但是StringBuffer是线程安全的,StringBuilder是线程不安全的。
2.4.2,下面的代码将创建几个字符串对象。
public static void main(String[] args) {
String s1 = new String("Hello");
String s2 = new String("Hello");
//答案是3个对象.
//第一,行1 字符串池中的“hello”对象。
//第二,行1,在堆内存中带有值“hello”的新字符串。
//第三,行2,在堆内存中带有“hello”的新字符串。这里“hello”字符串池中的字符串被重用。
}
2.4.3代码中有几个字符串被创建;
String str = new String("Cat");
答:上面一行代码将会创建1或2个字符串。如果在字符串常量池中已经有一个字符串“Cat”,那么就创建一个“Cat”字符串。
如果字符串常量池中没有“Cat”,那么首先会在字符串池中创建,然后才在堆内存中创建,这种情况就会创建2个对象了。
String类的常用方法以及知识点总结的更多相关文章
- Java String类的常用方法
String(byte[ ] bytes):通过byte数组构造字符串对象. String(char[ ] value):通过char数组构造字符串对象. String(Sting original) ...
- Java修炼——String类_常用方法_常量池
String类的定义:String 是不可变字符序列 String 类的常用方法(全部都是不能改变String本身的值,都是在常量池里输出,没有改变其值) String string="ab ...
- String 类的常用方法都有那些?(未完成)
String 类的常用方法都有那些?(未完成)
- Java问题解读系列之String相关---String类的常用方法?
今天的题目是:String类的常用方法? 首先,我们在eclipse中定义一个字符串,然后使用alt+/就会出现String类的所有方法,如下图所示: 下面我就挑选一些常用的方法进行介绍: 首先定义两 ...
- 总结String类的常用方法
总结String类的常用方法 1. 获取字符串长度 public int length() 2. 获取字符串某一位置的字符 public char charAt(int index) 注意:字符串中第 ...
- IT第九天 - 包、访问修饰符、变量的内存分配、String类中常用方法
IT第九天 上午 包 1.包的命名规则:域名.项目名称.模块名 2.如:Wfei.com.windows.login 访问限制符 1.四种访问限制符分别对应为: (1)default:默认的,默认为p ...
- java 中String类的常用方法总结,带你玩转String类。
String类: String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.String类对象创建后不能修改,StringBuffer & St ...
- String类的常用方法总结
一.String类String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.java把String类声明的final类,不能有类.String类对象创建 ...
- JAVA的String类的常用方法(转载)
Java-String类的常用方法总结 一.String类String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.java把String类声明的f ...
随机推荐
- 002.MVC开发方法和步骤--用一个简单的加法程序来演示
MVC的工作原理: 注:ASP.NET MVC中的url 特殊:构成 http//....../控制器名/方法名 默认: 1.Url请求直接来到Controller中 2.Controller从Mod ...
- 牛客练习赛48 E 小w的矩阵前k大元素
E 思路: 优先队列,将迭代器变量作为结构体的变量. 迭代器走的时候只能像一个方向走,另外一个方向只有最开始才走.如下图所示: 如果两个方向同时走,同一个值会被遍历多次,像上图那样就能保证每个位置都走 ...
- Appium&Java自动化实现移动端几种典型动作
一.Appium4.0 Pinch&Zoom /* * @FileName Pinch_Zoom: Pinch_Zoom * @author davieyang * @create 2018- ...
- udp单播,广播,多播实现(ReceiveFromAsync,SendToAsync)
注意:客户端和服务器实现基本一致,本地host和port和多播的host和port可以一样 (1)多播 1.将本地host加入多播组中,只有加入多播组的成员才能接受同组的节点发送的多播 Multica ...
- fonts/font-awesome-woff2 404问题
报错环境: vue 开发的项目 npm 引入的font-awesome, 页面正常显示,就是控制台会报这个错误 产生原因:因为服务器IIS不认SVG,WOFF/WOFF2 这几个文件类型,只要在IIS ...
- JS中BOM和DOM之间的关系
一.Javascript组成JavaScript的实现包括以下3个部分:1.核心(ECMAScript):描述了JS的语法和基本对象.2.文档对象模型 (DOM):处理网页内容的方法和接口.3.浏览器 ...
- Java笔记(基础第四篇)
Java集合类 集合类概述 Java 语言的java.util包中提供了一些集合类,这些集合类又被称为容器.常用的集合有List集合.Set集合.Map集合,其中List与Set实现了Collecti ...
- 洛谷P1006 传纸条【dp】
题目:https://www.luogu.org/problemnew/show/P1006 题意: 给定一个m*n的矩阵,从(1,1)向下或向右走到(m,n)之后向上或向左走回(1,1),要求路径中 ...
- iterm2 "agnoster"主题设置中的一些踩坑 2018.8
主线教程:https://www.cnblogs.com/xishuai/p/mac-iterm2.html (1)在链接的“3.配置oh My zsh”中,编辑vim~/.zshrc后两下回车,然后 ...
- Kafka中的消息是否会丢失和重复消费(转)
在之前的基础上,基本搞清楚了Kafka的机制及如何运用.这里思考一下:Kafka中的消息会不会丢失或重复消费呢?为什么呢? 要确定Kafka的消息是否丢失或重复,从两个方面分析入手:消息发送和消息消费 ...