【JAVA】笔记(8)--- java.lang.String 精讲
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 精讲的更多相关文章
- Java并发编程核心知识体系精讲
第1章 开宗明义[不看错过一个亿]本章一连串设问:为什么学并发编程?学并发编程痛点?谁适合学习本课?本课程包含内容和亮点?首先4大个理由告诉你为什么要学,其实源于JD岗位要求就不得不服了.其次5个痛点 ...
- 转 Java笔记:Java内存模型
Java笔记:Java内存模型 2014.04.09 | Comments 1. 基本概念 <深入理解Java内存模型>详细讲解了java的内存模型,这里对其中的一些基本概念做个简单的笔记 ...
- Java笔记之java.lang.String#trim
String的trim()方法是使用频率频率很高的一个方法,直到不久前我不确定trim去除两端的空白符时对换行符是怎么处理的点进去看了下源码的实现,才发现String#trim的实现跟我想像的完全不一 ...
- 【JAVA】笔记(7)--- 数组精讲
数组的静态初始化: 1.一维数组: int [ ] arr = { 1,2,3,4 } ; Object [ ] arr = { new Object ( ) , new Object ( ) , ...
- java 笔记(4) —— java I/O 流、字节流、字符流
Java中使用流来处理程序的输入和输出操作,流是一个抽象的概念,封装了程序数据于输入输出设备交换的底层细节.JavaIO中又将流分为字节流和字符流,字节流主要用于处理诸如图像,音频视频等二进制格式数据 ...
- 疯狂java笔记(七) - Java集合之Map
Map是以键值对(key-value)的形式来存储数据的.而且Map不允许key的重复,通过Map存储key-value对时,只需要考虑key的存储就可以,key存储后value就会跟着key(完全可 ...
- Java笔记:Java集合概述和Set集合
本文主要是Java集合的概述和Set集合 1.Java集合概述 1)数组可以保存多个对象,但数组长度不可变,一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的,如果需要保存数量变化的数据,数组 ...
- Java笔记:Java 流(Stream)、文件(File)和IO
更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...
- 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现
/* 现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息 对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...
随机推荐
- mybatis: No enum constant org.apache.ibatis.type.JdbcType."VARCHAR"
mybatis 插入的时候一句sql报错如下. org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ib ...
- 【理解OS】1.保护模式概述
这个系列文章主要目的是为了记录我个人学习保护模式后的总结与一点点的思考.我也是一个学习者,其中由错误在所难免,若各位朋友指出将不胜感激. 1. Intel CPU的运行模式概述 这里我将粗略介绍Int ...
- 常见错误0xCCCCCCCCC 读取字符串的字符时出错及其引申。
问题描述在一个函数调用中,使用二级指针作为函数参数,传递一个字符串指针数组,但是在访问的时候,却出现了运行时错误,具体表现为"0xCCCCCCCC 读取字符串的字符时出错". 第一 ...
- Spring面试复习整理
Spring Spring核心分为三方面: 控制反转(IoC): 就是将创建对象的权利交给框架处理/控制,不需要人为创建,有效降低代码的耦合度,降低了开发成本. 依赖注入(DI): 容器动态地将将某种 ...
- Frida高级逆向-Hook Native(Java So)2
Frida Hook So 一些操作说明 Native方法第一个参数是 JNIEnv *env 如何在Frida中获取 JNIEnv 对象呢? Java.vm.getEnv(); 如何将string类 ...
- pycharm中的terminal和Windows命令提示符有什么区别?二者用pip安装的包是不是位于相同位置?
那要看pycharm使用了什么shell,可以在设置->工具->终端里查看shell path.如果使用的是cmd.exe那就没区别.pycharm终端和Windows命令提示符用pip安 ...
- WPF 排版基础
一.WPF 排版基础 WPF使用控制面板来进行排版,控制面板实际上是一种可以放入WPF界面元素的容器.当用户把界面元素放入控制面板后,WPF会自动把这些界面元素放在它认为合适的地方.WPF开发人员需要 ...
- 《手把手教你》系列技巧篇(三十四)-java+ selenium自动化测试-单选和多选按钮操作-中篇(详解教程)
1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历单选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的单选按钮进行实战. 2.d ...
- spring源码分析(二)- 容器基础
1.基本用法 用过Spring的都知道,bean是Spring中最基础也是最核心的.首先看一个简单的例子. 一个类和一个配置文件 package bean; public class MyBean { ...
- 【二食堂】Beta - 测试报告
Beta - 测试报告 测试过程中发现的bug Beta阶段的新bug 我们在Beta阶段的开发过程中就进行了测试,发现了许多bug.这其中后端的bug比较多,在这里我列举一些比较重要的功能性bug. ...