栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

Java学习分享 --- 【String类】字符串常量池、方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java学习分享 --- 【String类】字符串常量池、方法

String类 一、简单了解: 
  • String类代表字符串。 Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。

    字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享。

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

  • Java语言为字符串连接运算符(+)提供特殊支持,并为其他对象转换为字符串。 字符串连接是通过StringBuilder (或StringBuffer )类及其append方法实现的。 字符串转换是通过方法来实现toString ,由下式定义Object和继承由在Java中的所有类。

  • 除非另有说明,否则传递null参数到此类中的构造函数或方法将导致抛出NullPointerException 。

二、简单了解常量池
  • 前提 :什么是常量池??
  • 池是一种常见的提高效率的方式,常量池是池的一种,还有内存池、线程池.....
  • 经常使用的字面类型比如 1,2,3,“hello”.....,为了是程序的运行速度更快,更节省内存,Java 8为8中基本数据类型和String都提供了常量池。
  • 首先对象的分配要付出时间和空间上的开销,字符串可以说是和 8 个基本类型一样常用的类型,甚至比 8 个基本类型更加常用,故而频繁的创建字符串对象,对性能的影响是非常大的,所以,用常量池的方式可以很大程度上降低对象创建、分配的次数,从而提升性能。
  • 在 JDK 1.7 之后 (包括 1.7),字符串常量池已经从方法区移到了堆中。
2.1关于字符串常量池的一些示例: 2.1.1字面量赋值:

String str1 = "江江江浪";

这种情况下会直接将字符串放到字符串常量池中,然后返回给变量。

String str2 = "江江江浪";

如果再声明一个内容相同的字符串,会发现字符串常量池中已经存在了,那直接指向常量池中的地址即可。

str1 == str2 //true

2.1.2 new String () 方式

与之对应的是用 new String () 的方式,基本不这么用

String str1 = "江江";

String str2 = new String(str1 + "江浪");

使用这种方式声明字符串变量的时候,会有两种情况发生。

前情:

//栈在左 放的是对象的引用

//堆在右,放的是对象 和字符串常量池 

//字符串常量池中放的是 字面量赋值的字符串

第一种情况:

 字符串常量池之前已经存在相同字符串 "江江江浪"

首先会在堆中创建一个对象引用为 str2 的对象,然后将此对象指向字符串常量池中已经存在的常量 "江江江浪",但是

第二种情况:

 字符串常量池之前没有 "江江江浪" 该字符串

之前没有任何地方用到了这个字符串,第一次声明这个字符串就用的是 new String () 的方式,这种情况下会直接在堆中创建一个字符串对象然后返回给变量(对象引用)。

基于new String() 的这种特性,可以得出:

String str1 = "江江江浪";
String s = "江江";
String str2 = new String(s + "江浪");
String str3 = new String(s + "江浪");
System.out.println(str1 == str2); // false
System.out.println(str1 == str2);  // false 
//因为 new String () 不管常量池中有没有该字符串,
//都会在堆中新建一个对象,新建出来的对象,和其他对象地址不相等。
// == 比较的是地址

//引出 equals方法,先比较地址,再比较内容,才确定两字符串是否相等
2.1.3 intern () 池化

池化就是,将新创建的字符串 对象 地址 指向字符串常量池中已存在的字符串常量

若池中不存在该字符串,则在池中创建一个对象指向堆中的字符串,此时获取返回值,才指向常量池中的对象,但是需要注意的是,该对象仍指向堆中的字符串

那什么时候会放到字符串常量池呢,就是在使用 intern () 方法之后。  

 intern () 的定义:

如果当前字符串内容存在于字符串常量池,存在的条件是使用 equas () 方法为 ture,也就是内容是一样的,那直接返回此字符串在常量池的引用;
如果之前不在字符串常量池中,那么在常量池创建一个引用并且指向堆中已存在的字符串,然后返回常量池中的地址。

三、 使用常量串构造
String str1 = "天下无贼";
//1.在常量池没有找到这个常量
//2.在常量池中创建"天下无贼 "这个常量。
String str2 = "天下无贼";
//1.常量池中存在该字符串
//2.直接使用,不在创建

//str1和str2都指向字符串常量池中的字符串
四、使用 new String() 对象
//假如字符串常量池没有这个字符串
String s1 = new String("I love you. ");
//1.在堆中开辟一块内存,常量池没有找到这个字符串
//2.直接在堆中创建一个字符串对象然后返回给变量

//假如字符串常量池有这个字符串
String s2 = new String("I love you. ");
//首先会在堆中开辟一块内存,创建一个 名为s2(亦是变量)对象引用的 新对象;
//然后将这个对象所在堆内存中的地址指向字符串常量池中的已经存在的常量;
//注意:此时s2变量仍然指向对象在内存的地址,并不是直接指向字符串常量池中的已经存在的常量
五、对象、对象引用
JAVA:”对象的引用“意思是定义一个变量,这个变量指向的是一个对象,所以叫对象的引用。

Object  obj = new Object();
//obj:对象的引用
//new Object():对象
//Object:类
 六、String方法 6.1.String类下面的方法:

方法的功能

方法的参数

方法的返回值

6.1.1 常用方法:

int length(); 获取字符串长度

char charAt(int index); 通过索引下标 获取当前下标的字符

int indexOf (String str);获取指定的字符串第一个出现索引下标

int lastIndexOf(String str);获取指定的字符串最后一次出现索引下标

char[] tocharArray();将字符串转为字符数组【重点】

 6.1.2 返回值是布尔类型数据的方法:

boolean endWith(String str);判断是否是以指定的字符或者字符串结尾的
    
boolean startWith(String str)判断字符串是否以另一个字符串开头,是开头就返回true

boolean isEmpty(); 判断字符串是否为空

boolean contains(String str); 在一个字符串中是否包含另外一个字符串啊

boolean  equalsIgnoreCase();忽略大小写比较字符串的是否相等
    
boolean equals(Object obj) 字符串之间的比较,两个字符串相同,返回true

6.1.3 常用的构造方法

String(char[] ch);将字符数组转为字符串,直接使用String类的构造方法


String(char[] b,int off,int,len);字符数组转成字符串,参数off数组的开始索引,len要转的个数


String(byte[] b);字节数组转成字符串,使用平台的默认字符集
    
String(byte[] b,int off,int len); 字节数组转成字符串,使用平台的默认字符集,参数off数组的开始索引,len要转的个数
    
String(byte[] b,int off,int,len,String,charsetName);
字节数组转成字符串,使用平台的默认字符集,参数off数组的开始索引,len要转的个数,charsetName参数是你自己可以指定编码表
    
String(StringBuffer buffer);
分配一个新的字符串,其中包含当前包含在字符串缓冲区参数中的字符序列。
    
String(StringBuilder builder);
分配一个新的字符串,其中包含当前包含在字符串构建器参数中的字符序列。

 6.1.4 常用的静态方法

static String valueOf(boolean b) 
返回 boolean参数的字符串 boolean形式。  
static String valueOf(char c) 
返回 char参数的字符串 char形式。  
static String valueOf(char[] data) 
返回 char数组参数的字符串 char形式。  
static String valueOf(char[] data, int offset, int count) 
返回 char数组参数的特定子阵列的字符串 char形式。  
static String valueOf(double d) 
返回 double参数的字符串 double形式。  
static String valueOf(float f) 
返回 float参数的字符串 float形式。  
static String valueOf(int i) 
返回 int参数的字符串 int形式。  
static String valueOf(long l) 
返回 long参数的字符串 long形式。  
static String valueOf(Object obj) 
返回 Object参数的字符串 Object形式。  

6.1.5 要用的方法

String replace(char oldChar, char newChar);在字符串中用新的字符替换老的字符

String replaceAll(String regex,String replacement); 替换所有的指定内容

String replaceFirst(String regex, String relacemen);替换首个内容,不会修改对象,而是产生一个新的字符串

String[] split(String regex); 以指定的字符串进行切割
//String[] strs  = "ab&cd&ef".split("&");

String [ ] split(String regex,int limit);将字符串以指定的格式,拆分为 limit 组,有些字符是部分转义,需要在前面加上转义字符

String subString(int beginIndex);从指定的位置开始截取字符串

String subString(int beginIndex, int endIndex);从指定的位置开始截取字符串到指定的位置结束

String toUpperCase();将小写字符转为大写的

String toLowerCase();将大写字符转为小写的
    
String trim();去掉首尾空格

byte[]  getBytes() 字符串转成字节数组 (查询编码表),平台默认字符集

byte[]  getBytes(String charsetName) 字符串转成字节数组 (查询编码表),指定编码表
 七、String类正则表达式相关的功能
正则表达式 : 专门用于处理字符串的技术 (正则大神)

字符类 :
   `[abc]`  字符串的这个位置只能是abc
   `[^abc]`  字符串的这个位置不能是abc
   `[a-zA-Z]` 字符串的这个位置必须是字母,52个
   `[^a-zA-Z]` 字符串的这个位置必须不能是字母,52个
数字类:
   `[0-9]` 字符串的这个位置只能是数字
   `[^0-9]` 字符串的这个位置不能是数字
   `[d]` 等同于 `[0-9]`
  `[D]` 等同于 `[^0-9]`

预定义字符 :
   匹配所有的字符
   `[d]` 等同于 `[0-9]`
   `[D]` 等同于 `[^0-9]`
  `[w]` 文字字符,包含数字,字母,下划线 `[a-zA-Z0-9_]`
   `[W]` 文字字符,不能包含数字,字母,下划线 `[^a-zA-Z0-9_]`

数量词 :
   X{m}  X这个字符只能出现m次  a{3}
   X{m,} X这个字符至少出现m次
   X{m,n} X这个字符至少出现m次,不超过n次
   X?  X这个字符出现一次,或者一次也没有
   X* X这个字符出现零次或者多次
   X+ X这个字符出现至少一次
public static void stringMethod2(){
    String email = "shihehe@sina.com";
    String reg = "[\w]+@[a-z0-9]+(\.[a-z]+)+";
    boolean b = email.matches(reg);
    System.out.println(b);
 
}

public static void stringMethod(){
    String tel = "13800138000";
    //定义正则的规则,也是字符串
    String regex = "1[3459678][0-9]{9}";
    //正则规则,和字符串校验
    //String类的方法 matches()
    boolean b = tel.matches(regex);
    System.out.println(b);
}

 浅浅学到这里。。。

 

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1039805.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号