String是特殊的类,与其他基本类型并不相同,是被java封装的类型
String底层组成对象为数组与字典(字符集编码表)
String 类型的字符串是存储在JVM特别开辟的字符串常量池中
 
创建与修改字符串的本质
String s = "hello"并不等价于String s = new String("hello")
执行String s = "hello"代码
java会先在字符串常量池中寻找是否有hello;如果有,新建一个子串引用,将引用扔到s里,如果没有,便从字典里寻找,在字符串常量池中开辟空间新建数组,找到h放入下标为0的数组,再找到e放入下标为1的数组,依次类推,直到将hello完全存储到数组,再建立一个子串引用,将引用扔给s
 
但在执行String s = new String("hello")时,可能会创建一个对象,也可能会创建两个对象:
步骤:
1.String s定义一个名为s的String对象,并不创建对象
2.= 对 s初始化,将某对象赋值给他
3.“hello”通过双引号在编译期间创建对象,这个创建方法与String s = "hello"一样,先在字符串常量池中寻找是否有hello,有则不添加,没有则将hello添加到字符串常量池中
4.new String() :运行期 在堆中开辟空间,存储hello
注意:
不管串池里有没有"hello",它都会在堆中重新分配一块内存,定义一个新的对象
此时s存放的是堆中hello的地址并非字符串常量池中的地址
(String的intern()方法就是扩充常量池的 一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用)
例:
 String s0 = "abc";
String s1 = "abcd";
String s2 = new String("abc");
System.out.println(s0 == s2);//flase
System.out.println("***********************************");
String s3 = s1+"d"; //拼接对象有new,会在堆中开辟空间
String s4 = "abc"+"d"; //拼接对象无new,只在常量池中进行操作
s2.intern(); //返回s2在常量池中的地址,常量池中若无s2则在常量池中添加s2,并返回它的地址
System.out.println(s0 == s2);//flase
System.out.println("***********************************");
s2 = s2.intern();
System.out.println(s0 == s2);//true
System.out.println(s1 == s3);//flase
System.out.println(s1 == s4);//trun
 
字符串常量池中的字符串是不可以改变的
String word = "Hello, ";
word = word.trim(); //返回一个前后不含任何空格的调用字符串的副本
String s = word.concat("小鱼儿!"); //在 “Hello,” 后面拼接 “小鱼儿!”
这时在字符串常量池中,会存在三个字符串:1."Hello, " 2."Hello," 3.”Hello,小鱼儿!“
word = word.trim(); //不会将已经建立的子串1改变,只是将新建子串2的地址赋值给了word
如果原来的那个 "Hello, "没有任何对象去引用它,虚拟机的垃圾回收机制将接收它。
 
字符串的比较“==”与equals()
"==":比较两个字符串的首地址,而equals()比较两个字符串的内容是否相同
String s1 = new String("abc");
String s1 = new String("abc");
System.out.print(s1 == s2);//输出flase,地址不同
System.out.print(s1.equals(s2));//输出true,内容相同
 
String常用方法
1.public String concat(String)
A.concat(B) //B字符串将被连接到A字符串后面
 
2.public int indexOf(int ch):
返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
 
public int indexOf(int ch, int fromIndex):
返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
 
int indexOf(String str):
返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
 
int indexOf(String str, int fromIndex):
返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
 
3.public String substring(int index)
提取从位置索引开始的字符串部分
 
public String substring(int beginindex, int endindex)
提取beginindex和endindex之间的字符串部分,注意:beginindex<=s<endindex
 
public String trim()
返回一个前后不含任何空格的调用字符串的副本(将字符串空格去掉)
 
4.public String[] split(String c)
将一个字符串根据c分割为若干子字符串,结果作为字符串数组返回,但会将分隔符去掉
String words = "长亭外,古道边,芳草碧连天,晚风拂柳笛声残,夕阳山外山";
String[] printWord = new String[100];
System.out.println("\n拆分后:");
printWord = words.split(",");
for (int i =0;i<printWord.length;i++){
System.out.println(printWord[i]);
}
控制台输出结果:
 
拆分后:
长亭外
古道边
芳草碧连天
晚风拂柳笛声残
夕阳山外山
输出后,作为分隔符的逗号消失
 
5.public bollean equalsIgnoreCase():
比较两个字符串,但不会区分大小写
 
6.toLowerCase():
将字符串中的所有大写字符改为大写字符
 
7.toUpperCase():
将字符串中所有小写字符串改为大写字符
 
将基本类型转换为String类型的简单方法:
1.最简单的方法:基本类型变量+“ ”,所有变量与String类型拼接都会转换为String类型
2. String s = String.valueOf(基本类型变量)
 
 
 

JAVA实训总结 :String的更多相关文章

  1. Java实训:实训一 ——长春职业技术学院 16级网络工程

    Java实训:实训一 本文会解释一些设计思路. 想看具体过程,请转:https://www.cnblogs.com/lxwlxw/p/10114187.html 笑维的码云项目命名不太对,所以我来:h ...

  2. 2018 java实训总结(时间戳&&主键)

    java实训题目:源管理系统. 答辩的时候被老师怼了以下几个的地方: 1.主键改变了 2.没时间戳却说自己的程序里有先后(这就是老师迂腐了,主键自增可以间接反馈出他加入的早晚,即使主键做出了改变但只是 ...

  3. Java实训作业

    1.编写程序:声明一个整型变量a,并赋初值5,在程序中判断a是奇数还是偶数,然后输出判断的结果. public class hello{ public static void main(String[ ...

  4. 第一二次java实训作业

    1. 声明一个整型变量a,并赋初值5,在程序中判断a是奇数还是偶数,然后输出判断的结果. package java1; public class java1 { static int a=5; pub ...

  5. JAVA实训总结:继承-——子类创建对象原理

    继承关键字:extends Java只允许单继承存在 不可以被继承的东西: 1.private成员 体现了java的封装特点,外部类只允许set()get()方法调用,若无set()方法,则类创建的对 ...

  6. JDBC数据库编程(java实训报告)

    文章目录 一.实验要求: 二.实验环境: 三.实验内容: 1.建立数据库连接 2.查询数据 2.1 测试结果 3.添加数据 3.1.测试结果 4.删除数据 4.1.测试结果 5.修改数据 5.1 测试 ...

  7. JAVA实训第二次作业

    一维数组的创建和遍历. 声明并创建存放4个人考试成绩的一维数组,并使用for循环遍历数组并打印分数.要求: (1) 首先按"顺序"遍历,即打印顺序为:从第一个人到第四个人: (2) ...

  8. java实训 :异常(try-catch执行顺序与自定义异常)

    关键字: try:执行可能产生异常的代码 catch:捕获异常 finally:无论是否发生异常代码总能执行 throws:声明方法可能要抛出的各种异常 throw:手动抛出自定义异常 用 try-c ...

  9. Java实训作业1

    1.编写程序:声明一个整型变量a,并赋初值5,在程序中判断a是奇数还是偶数,然后输出判断的结果 2.编写程序:从键盘输入圆的半径,计算圆的面积并输出. 3.编写程序:实现一个数字加密器.运行时输入加密 ...

随机推荐

  1. Java实现MD5加密解密类

    http://blog.csdn.net/m_changgong/article/details/4361526

  2. 2U网络机箱的尺寸是多少,4U网络机箱的尺寸是多少

    厚度以4.445cm为基本单位.1U就是4.445cm,2U则是1U的2倍为8.89cm.48.26cm=19英寸,如果是标准的机架式设备,宽应该是满足这个标准的.纵深的话 有600mm或者800mm ...

  3. PYTHON 爬虫笔记三:Requests库的基本使用

    知识点一:Requests的详解及其基本使用方法 什么是requests库 Requests库是用Python编写的,基于urllib,采用Apache2 Licensed开源协议的HTTP库,相比u ...

  4. 《UML和模式应用》读书笔记(一)

    一.绪论 1. 面向对象分析和设计 1.1 什么是分析和设计 分析(analysis)强调的是对问题和需求的调查研究,而不是解决方案. 设计(design)强调的是满足需求的概念上的解决方案,而不是其 ...

  5. javaScrpit中NaN的秘密

    NaN,不是一个数字,是一种特殊的值来代表不可表示的值,使用typeof或其他任何与之比较的处理方式,‘NaN’则会引起一些混乱, 一些操作会导致NaN值的产生.这里有些例子: Math.sqrt(- ...

  6. 细谈HTML解析模块

     细谈HTML解析模块 Html在网页中所占的位置,用一个简单直观的图给展示一下:    

  7. codeforces 701D D. As Fast As Possible(数学)

    题目链接: D. As Fast As Possible time limit per test 1 second memory limit per test 256 megabytes input ...

  8. 如何用vs2013开发人员命令提示工具执行一个方法(一个简单的demo)

    在任何一个编辑器中编写一个静态的Main方法,必须是静态且名为Main的方法,并将Main方法所在的类文件命名为yang.cs(这个名字随便命名),如图-1. 图-1 打开你的vs2013开发人员命令 ...

  9. CentOS 6 命令行下安装 VirtualBox 虚拟机步骤

    CentOS 6 命令行下安装 VirtualBox 虚拟机步骤 1. 准备工作 安装内核更新 yum install kernel-develyum update kernel*如果内核有更新,则需 ...

  10. 利用union判断系统的大小端

    int checkCPUendian()//返回1,为小端:反之,为大端: { union { unsigned int a; unsigned char b; }c; c.a = 1; return ...