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. 【vue】获取异步加载后的数据

    异步请求的数据,对它做一些处理,需要怎么做呢?? axios 异步请求数据,得到返回的数据, 赋值给变量 info .如果要对 info 的数据做一些处理后再赋值给 hobby ,直接在 axios ...

  2. asp.net core 集成swagger ui

    什么是Swagger? 说swagger 之前,我们先说一下OpenApi 规范. OpenApi 是一种和语言无关的用于描述RESTAPIs 接口功能的一种规范,对RESTAPIs 接口的描述包括: ...

  3. ApsNetCore打造一个“最安全”的api接口

    Authentication,Authorization 如果公司交给你一个任务让你写一个api接口,那么我们应该如何设计这个api接口来保证这个接口是对外看起来"高大上",&qu ...

  4. openGauss X ShardingSphere,分布式方案的另一种最佳实践

    Apache ShardingSphere 持续助力于 openGauss 分布式数据库能力的构建.openGauss 数据库自 2020 年 6 月开源以来,受到了业界的广泛关注,现已吸引众多伙伴. ...

  5. UOJ 2021 NOI Day2 部分题解

    获奖名单 题目传送门 Solution 不难看出,若我们单个 \(x\) 连 \((0,x),(x,0)\),两个连 \((x,y),(y,x)\) ,除去中间过对称轴的一个两个组,就是找很多个欧拉回 ...

  6. Vue3学习(五)之集成HTTP库axios

    一.安装axios npm install axios@0.21.0 --save 二.axios的使用 1.在主页中引用axios 在Vue3新增了setup初始化方法,所以我们在这里开始使用并测试 ...

  7. 电脑日常使用bug记录

    1.由于电脑太卡了,于是决定关一点服务,一不小心,电脑无线无法使用了.启动无线服务时提示"windows无法启动wlan autoconfig服务错误1068依赖服务" 启动 Ex ...

  8. SharkCTF2021 bbpop题记

    一道挺好的web. 做完这一题,感觉php序列化(甚至魔术方法)之类的有点开始玩明白了. 题面很长: 预备知识: PHP类的方法中,有一部分以下划线开头的"魔术方法".不同于普通方 ...

  9. HTTP标签

    系统的http状态码知识,我是在<图解http里学习的>. 状态码的职责是告知从服务器端返回的请求结果. 分类如下: 2XX --> 成功 200 OK(一般情况) 204 No C ...

  10. ScatterLayout分散布局在kv中的引用

    from kivy.uix.scatterlayout import ScatterLayout from kivy.app import App class ScatterLayoutWidget( ...