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. Spark MLib完整基础入门教程

    Spark MLib 在Spark下进行机器学习,必然无法离开其提供的MLlib框架,所以接下来我们将以本框架为基础进行实际的讲解.首先我们需要了解其中最基本的结构类型,即转换器.估计器.评估器和流水 ...

  2. Pandas 数据的一些基本操作

    一个很偶然的机会,主动出击挑战一个之前没有尝试过的新东西,在做的过程中需要处理一些csv文件的数据,以下是我总结的一些小方法,希望对和我一样的新手朋友们有所帮助,初次尝试,望路过的朋友有更好的方法可以 ...

  3. JVM学习笔记——GC垃圾收集器

    GC 垃圾收集器 Java 堆内存采用分代回收算法,因此 JVM 针对新生代和老年代提供了多种垃圾收集器. 1. Serial 收集器 Serial 收集器是单线程收集器,采用复制算法. 是最基本的垃 ...

  4. 官宣!ElasticJob 3.0.0 版本正式发布

    ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成.它通过弹性调度.资源管控.以及 ...

  5. SPOJ2939 QTREE5(LCT维护子树信息)

    QWQ嘤嘤嘤 此题正规题解应该是边分治??或者是树剖(总之不是LCT) 但是我这里还是把它当成一个LCT题目来做 首先,这个题的重点还是在update上 因为有\(makeroot\)这个操作的存在, ...

  6. Pytorch 的安装

    GPU版本的安装 Windows平台 CPU 版本安装 conda install pytorch torchvision cpuonly -c puython Windows平台需安装VC,需要的联 ...

  7. print spooler LPF 打印机漏洞

    打印机漏洞 该漏洞可以通过创建打印机驱动和端口,实现任意文件写入,用于提权或者写入后门. 打印机调用流程:client通过RPC调用server的spoolsv.exe,spoolsv.exe是sys ...

  8. NX9.0和NX10.0做自定义操作可以用的函数

    NX9.0:LIBUFUNX.DLL int UF_OPER_ask_check_geom(void *,int *,unsigned int * *) int UF_OPER_ask_first_o ...

  9. Gitlab Burndown Chart

    一.说明 通过调用gitlab api直接获取相应project的所有issues,然后对其进行统计以制作燃尽图 二.方法 1.生成 Personal access token Gitlab > ...

  10. WEB前端工程师如何做职业规划?

    对于一个WEB前端的职业规划,其实是有各种的答案,没有哪种答案是完全正确的,全凭自己的选择,只要是自己选定了,坚持去认真走,就好.在这里, 我只是 简要说一下自己对于这块儿内容的理解.有一个观点想要分 ...