String 特性:

1.String 表示字符串类型,属于引用数据类型,所以其储存的是地址;

2.java 中规定,双引号括起来的字符串是不可变的,也就说” name “永远也只能是” name “,不能改变;

3.由于字符串在使用中过于频繁,所以为了保证执行效率,SUN 公司设定把字符串放到了方法区的字符串常量池中;

4.凡是双引号括起来的,都在字符串常量池中有一份;

注意:字符串变量经过初始化才能使用;

String类 构造方法:

1.String str = "java" ; //首先查找字符串常量池中是否有“java”,若无,则创建并将其地址返回给 栈内存中的字符串变量 str ,若有,则直接返回给 str ;

以下均只讨论字符串常量池中没有被查找字符串的情况

2.String str = new String( "java" ) ; //首先查找字符串常量池中是否有“java”,若无,则创建并将其地址返回给 堆内存中的String对象,然后再将此String对象的地址返回给栈内存中的字符串变量 str;

3.String str = new String( byte数组 ) ;

4.String str = new String( byte数组 ,起始下标,长度 ) ;

6.String str = new String( char数组 ) ;

5.String str = new String( char数组 ,起始下标,长度 ) ;

3,4,5,6构造方法的栗子:

public class pra{
public static void main(String[] args) {
byte [] b={97,98,99};
char [] c={'H','e','l','l','o'};
String s1=new String(b);
System.out.println(s1);
String s2=new String(b,0,2);
System.out.println(s2);
String s3=new String(c);
System.out.println(s3);
String s4=new String(c,0,4);
System.out.println(s4);
}
} 运行结果:
------------------------
abc
ab
Hello
Hell

字符串常量池:

String str = ” zifu“ + ” chuan “ ;//(先查找字符串常量池中有无“zifu”“chuan”,若无)在字符串常量池中创建 ” zifu “ ,” chuan “ ,”  zifuchuan “,三个字符串;若print (str),则str会直接指向字符串常量池,并返回“ zifuchuan ”

String strr = “  zifu ”;//字符串常量池无变化(因为已存在“zifu”);

辅助理解:

1.String s1=“ java ”;

  String s2=“ java ”;

  System.out.println( s1==s2 ) // 输出true/false

答:true,因为字符串常量池中的“java”是不变的,所以无论是s1还是s2,储存的地址对应的都是那个字符串常量池中的“java”,所以自然储存的地址是相同的,而“==”比较地址,输出true;

2.String s1=new String(“ java ”);

  String s2=new String(“ java ”);

  System.out.println( s1==s2 ) // 输出true/false?

答:false,s1与s2只是储存了“=”右边在堆内存中创建的String对象的地址,而这俩个new出来的地址是不同的,所以输出“false”;

再问内存中一共创建了几个对象?

答:3个,方法区中一个 “java”,堆内存中俩个String对象;

String类 的方法:

注意:双引号中的空格正常会影响运行结果,但为了方便阅读,博主加上了一些空格(当它不存在就好了~~)

1.char charAt( int index )

System.out.println( "王狗蛋".charAt( 1 ) ) ; // 输出:狗

2.boolean contains( CharSequence s ) //是否包含

System.out.println( "http".contains( "ht" ) ) //输出:true

3.boolean endWith( String string ) //是否以其结尾

System.out.println( "nameabn".endWith( abn ) ) //输出:true

4.boolean equals( Object object ) // 见 java笔记(6) 

5.boolean equalsIgnoranceCase ( String string ) //判断字符串是否相等,并忽略大小写

System.out.println( "AAA". equalsIgnoranceCase( “aaa” ) ) //输出:true

6.byte [ ] getBytes(  ) //把字符串转化为byte数组

byte [ ] bytes=" abc ".getBytes(  ) ;

遍历数组 bytes ,输出:97    98      99

7.int indexOf( String string ) //判断某个字符串在当前字符串中第一次出现的索引(下标)

System.out.println( "hello". indexOf( "el" )) //输出:1

8.boolean isEmpty(  ) //判断是否为空字符串(底层调用“ Length( ) ”方法)

System.out.println( "yes".isEmpty( ) ) //输出:false

9.int Length( ) //输出字符串长度

System.out.println( "12345".Length( ) ) //输出:5

注意:Length( )方法与“ .length ”不同,前者返回字符串长度,后者返回数组长度

10.int lastIndexOf( String string )//输出某个字符串在当前字符串中最后一次出现的索引(下标)

System.out.println( "mynameisname" .lastIndexOf( “name” ) ) //输出:8

11.String repalce( CharSequence c1 , CharSequence c2 ) //替换字符串

System.out.println("name" . replace ( "name" , " good " ) ) ; //输出:good

12.String [ ] split ( String string ) //根据后面的字符串对前面的字符串进行拆分

String [ ] string = "1,2;3,4;5," . split( " , " ) //输出:1      2 ; 3      4 ; 5

13.boolean startsWith( String string ) //是否以其开始

System.out.println( "nameabn".startsWith( na ) ) //输出:true

14.String subString( int i ) //以 i 为起始下标,截取以后的字符串

System.out.println( "123456789". subString( 2 ) ) //输出:3456789

15.String subString( int i , int j ) //以 i 为起始下标(包括),以 j 为终点下标(不包括),截取字符串

System.out.println( "123456789" . substring( 2 , 9 ) ) //输出:3456789

16.char [ ] toCharArray (  ) //把字符串转化为 char 数组

char [ ] chars =" abc ". toCharArray (  ) ;

遍历数组 chars ,输出:a    b     c

17.String toLowerCase( ) //全转换为小写

System.out.println( "abcd" .  toLowerCase( ) ) //输出:ABCD

18.String toUpperCase( ) //全转换为大写

System.out.println( "ABCD" .  toUpperCase( ) ) //输出:abcd

19.String trim( ) //去除字符串中的空格

System.out.println("              hahaha               " . trim( ) ) ; //输出:hahaha

20.String中只有一个静态方法--- vauleOf( ) //将非字符串转换为字符串

String str1 = String . valueOf( true ) ;  //boolean--->String

String str2 = String . valueOf( 1.33 ) ;  //double--->String

String str3 = String . valueOf( 100 ) ;  //int--->String

21.int compareTo( String string ) //大小根据26个英文字母排序而定

System.out.println( "abc".compareTo( “abc” ) ) //输出 0;

System.out.println( "abc".compareTo( ”abz“ ) ) //输出 -1;

System.out.println( "aby".compareTo( “abd” ) ) //输出 1;

字符串拼接:

1.通过拼接符“ + ”进行拼接,有一个缺点,就是每次拼接,都会在字符串常量池中创建俩个对象(在拼接部分字符串为新字符串的情况下),浪费内存;

2.通过 stringBuffer 和 stringBuilder 方法来进行拼接;

栗子老师:

public class pra {
public static void main(String[] args) {
StringBuffer str1=new StringBuffer();
StringBuilder str2=new StringBuilder();
str1.append("hello");
System.out.println("StringBuffer---str1:"+str1);
str1.append(" world");
System.out.println("StringBuffer---str1:"+str1);
str2.append("hello world");
System.out.println("StringBuilder---str2:"+str2);
}
} 运行结果:
--------------------------
StringBuffer---str1:hello
StringBuffer---str1:hello world
StringBuilder---str2:hello world Process finished with exit code 0

stringbuffer和stringbuilder的区别,目前博主只知道在线程安全方面,StringBuffer >> StringBuilder( 不安全 ) ;

随笔:

1.System.out.println( "jim".equals( 字符串变量) ) ;

System.out.println( "字符串变量".equals(jim ) ) ;

//更推荐使用第一种方式来判断这俩个字符串内容是否相同,因为第一种可以避免“ 字符串变量为null ”而导致的空指针异常;

2.通过源代码可以看出:System.out.println( ) ; 这个方法输出任何类型数据时,都是先转换为字符串,再输出


由于博主目前只是一只猿宝宝,所以有些地方可能说的有些片面,若前辈们能够指点一二就更好了      (~ ̄(OO) ̄)ブ

 

【JAVA】笔记(8)--- java.lang.String 精讲的更多相关文章

  1. Java并发编程核心知识体系精讲

    第1章 开宗明义[不看错过一个亿]本章一连串设问:为什么学并发编程?学并发编程痛点?谁适合学习本课?本课程包含内容和亮点?首先4大个理由告诉你为什么要学,其实源于JD岗位要求就不得不服了.其次5个痛点 ...

  2. 转 Java笔记:Java内存模型

    Java笔记:Java内存模型 2014.04.09 | Comments 1. 基本概念 <深入理解Java内存模型>详细讲解了java的内存模型,这里对其中的一些基本概念做个简单的笔记 ...

  3. Java笔记之java.lang.String#trim

    String的trim()方法是使用频率频率很高的一个方法,直到不久前我不确定trim去除两端的空白符时对换行符是怎么处理的点进去看了下源码的实现,才发现String#trim的实现跟我想像的完全不一 ...

  4. 【JAVA】笔记(7)--- 数组精讲

    数组的静态初始化: 1.一维数组: int [ ] arr = { 1,2,3,4 } ; Object [ ] arr = {   new Object ( ) , new Object ( ) , ...

  5. java 笔记(4) —— java I/O 流、字节流、字符流

    Java中使用流来处理程序的输入和输出操作,流是一个抽象的概念,封装了程序数据于输入输出设备交换的底层细节.JavaIO中又将流分为字节流和字符流,字节流主要用于处理诸如图像,音频视频等二进制格式数据 ...

  6. 疯狂java笔记(七) - Java集合之Map

    Map是以键值对(key-value)的形式来存储数据的.而且Map不允许key的重复,通过Map存储key-value对时,只需要考虑key的存储就可以,key存储后value就会跟着key(完全可 ...

  7. Java笔记:Java集合概述和Set集合

    本文主要是Java集合的概述和Set集合 1.Java集合概述 1)数组可以保存多个对象,但数组长度不可变,一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的,如果需要保存数量变化的数据,数组 ...

  8. Java笔记:Java 流(Stream)、文件(File)和IO

    更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...

  9. 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现

    /*  现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息    对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...

随机推荐

  1. 1.pytest初尝试

    语法规范 pytest命令会默认执行以 -- test_**.py -- 或 -- **_test.py -- 命名文件的测试用例 pytest的测试用例必须以 -- test -- 开头 def t ...

  2. 记一次Kafka服务器宕机的真实经历!!

    大家好,我是冰河~~ 估计节前前祭拜服务器不灵了,年后服务器总是或多或少的出现点问题.不知是人的问题,还是风水问题.昨天下班时,跟运维小伙伴交代了好几遍:如果使用Docker安装Kafka集群的话,也 ...

  3. linux下nginx编译安装、版本信息修改

    环境 centos 7 安装依赖包 yum install -y gcc gcc-c++ glibc glibc-devel pcre pcre-devel zlib zlib-devel opens ...

  4. [源码解析] PyTorch如何实现前向传播(3) --- 具体实现

    [源码解析] PyTorch如何实现前向传播(3) --- 具体实现 目录 [源码解析] PyTorch如何实现前向传播(3) --- 具体实现 0x00 摘要 0x01 计算图 1.1 图的相关类 ...

  5. JDK中的SPI机制

    前言 最近学习类加载的过程中,了解到JDK提供给我们的一个可扩展的接口:java.util.ServiceLoader, 之前自己不了解这个机制,甚是惭愧... 什么是SPI SPI全称为(Servi ...

  6. 【UE4 C++ 基础知识】<8> Delegate 委托

    概念 定义 UE4中的delegate(委托)常用于解耦不同对象之间的关联:委托的触发者不与监听者有直接关联,两者通过委托对象间接地建立联系. 监听者通过将响应函数绑定到委托上,使得委托触发时立即收到 ...

  7. 使用Servlet前Tomcat介绍

    虚拟目录的映射方式:让tomcat服务器自动映射tomcat服务器会自动管理webapps目录下的所有web应用,并把它映射成虚似目录.换句话说,tomcat服务器webapps目录中的web应用,外 ...

  8. Noip模拟66 2021.10.2

    T1 接力比赛 思路就是直接做背包$dp$,然后看看容量相同的相加的最大值. 考虑如何在$dp$过程中进行优化 注意到转移方程的第二维枚举容量没有必要从容量总和开始枚举 那么我们便转移边统计前缀和,从 ...

  9. Jquery校验中国身份证号码是否正确

    在项目中使用表单时经常会涉及到身份证号码是否正确的校验,下面看看应该中国二代身份证号码应该怎么用Jquery校验呢? 二代身份证校验码的计算方法 二代身份证由17位数字和一位校验码组成,那么校验方法是 ...

  10. 第04课 OpenGL 旋转

    旋转: 在这一课里,我将教会你如何旋转三角形和四边形.左图中的三角形沿Y轴旋转,四边形沿着X轴旋转. 上一课中我教给您三角形和四边形的着色.这一课我将教您如何将这些彩色对象绕着坐标轴旋转.其实只需在上 ...