大数据必学Java基础(五十):String类和StringBuilder类的讲解
String类和StringBuilder类的讲解
一、String类
【1】直接使用,无需导包:
【2】形象说一下字符串:
【3】 "abc"就是String类下的一个具体的对象
String str = “abc”;
【4】字符串是不可变的
【5】这个String类不可以被继承,不能有子类
【6】String底层是一个char类型的数组
验证:
1、常用方法
【1】构造器:底层就是给对象底层的value数组进行赋值操作。
//通过构造器来创建对象:
String s1 = new String();
String s2 = new String("abc");
String s3 = new String(new char[]{'a','b','c'});
【3】常用方法
String s4 = "abc";
System.out.println("字符串的长度为:"+s4.length());
String s5 = new SZtring("abc");
System.out.println("字符串是否为空:"+s5.isEmpty());
System.out.println("获取字符串的下标对应的字符为:"+s5.charAt(1));
【4】equals
String s6 = new String("abc");
String s7 = new String("abc");
System.out.println(s6.equals(s7));
【5】String类实现了Comparable,里面有一个抽象方法叫compareTo,所以String中一定要对这个方法进行重写:4
String s8 = new String("abc");
String s9 = new String("abc");
System.out.println(s8.compareTo(s9));
【6】常用方法:
//字符串的截取:
String s10 = "abcdefhijk";
System.out.println(s10.substring(3));
System.out.println(s10.substring(3, 6));//[3,6)
//字符串的合并/拼接操作:
System.out.println(s10.concat("pppp"));
//字符串中的字符的替换:
String s11 = "abcdeahija";
System.out.println(s11.replace('a', 'u'));
//按照指定的字符串进行分裂为数组的形式:
String s12 = "a-b-c-d-e-f";
String[] strs = s12.split("-");
System.out.println(Arrays.toString(strs));
//转大小写的方法:
String s13 = "abc";
System.out.println(s13.toUpperCase());
System.out.println(s13.toUpperCase().toLowerC
//去除收尾空格:
String s14 = " a b c ";
System.out.println(s14.trim());
//toString()
String s15 = "abc";
System.out.println(s15.toStr
//转换为String类型:
System.out.println(String.valueOf(false));
2、String的内存分析
【1】字符串拼接:
public class Test02 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
String s1 = "a"+"b"+"c";
String s2 = "ab"+"c";
String s3 = "a"+"bc";
String s4 = "abc";
String s5 = "abc"+"";
}
}
上面的字符串,会进行编译器优化,直接合并成为完整的字符串,我们可以反编译验证:
然后在常量池中,常量池的特点是第一次如果没有这个字符串,就放进去,如果有这个字符串,就直接从常量池中取:
内存:
【2】new关键字创建对象:
String s6 = new String("abc");
内存:开辟两个空间(1.字符串常量池中的字符串 2.堆中的开辟的空间)
【3】有变量参与的字符串拼接:
public class Test03 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
String a = "abc";
String b = a + "def";
System.out.println(b);
}
}
a变量在编译的时候不知道a是“abc”字符串,所以不会进行编译期优化,不会直接合并为“abcdef”
反汇编过程:为了更好的帮我分析字节码文件是如何进行解析的:
利用IDEA中的控制台:
二、StringBuilder类
【1】字符串的分类
(1)不可变字符串:String
(2)可变字符串:StringBuilder,StringBuffer
疑问:
(1)可变不可变??
(2)本节课重点:StringBuilder -----》√
(3)StringBuilder和StringBuffer区别 ??
【2】StringBuilder底层
非常重要的两个属性:
【3】对应内存分析:
package com.lanson.test05;
/**
* @Auther: lanson
*/
public class Test01 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//创建StringBuilder的对象:
StringBuilder sb3 = new StringBuilder();
//表面上调用StringBuilder的空构造器,实际底层是对value数组进行初始化,长度为16
StringBuilder sb2 = new StringBuilder(3);
//表面上调用StringBuilder的有参构造器,传入一个int类型的数,实际底层就是对value数组进行初始化,长度为你传入的数字
StringBuilder sb = new StringBuilder("abc");
System.out.println(sb.append("def").append("aaaaaaaa").append("bbb").append("ooooooo").toString());;//链式调用方式:return this
}
}
1、解释可变和不可变字符串
【1】String---》不可变
【2】StringBuilder---》可变
可变,在StringBuilder这个对象的地址不变的情况下,想把“abc”变成“abcdef”是可能的,直接追加即可
public class Test02 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
System.out.println(sb.append("abc")==sb.append("def"));//true
}
}
2、常用方法
【1】StringBuilder常用方法:
package com.lanson.test05;
/**
* @Auther: lanson
*/
public class Test03 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
StringBuilder sb=new StringBuilder("nihaojavawodeshijie");
//增
sb.append("这是梦想");
System.out.println(sb);//nihaojavawodeshijie这是梦想
//删
sb.delete(3, 6);//删除位置在[3,6)上的字符
System.out.println(sb);//nihavawodeshijie这是梦想
sb.deleteCharAt(16);//删除位置在16上的字符
System.out.println(sb);//nihavawodeshijie是梦想
//改-->插入
StringBuilder sb1=new StringBuilder("$23445980947");
sb1.insert(3, ",");//在下标为3的位置上插入 ,
System.out.println(sb1);
StringBuilder sb2=new StringBuilder("$2你好吗5980947");
//改-->替换
sb2.replace(3, 5, "我好累");//在下标[3,5)位置上插入字符串
System.out.println(sb2);
sb.setCharAt(3, '!');
System.out.println(sb);
//查
StringBuilder sb3=new StringBuilder("asdfa");
for (int i = 0; i < sb3.length(); i++) {
System.out.print(sb3.charAt(i)+"\t");
}
System.out.println();
//截取
String str=sb3.substring(2,4);//截取[2,4)返回的是一个新的String,对StringBuilder没有影响
System.out.println(str);
System.out.println(sb3);
}
}
【2】StringBuffer常用方法:
package com.lanson.test05;
/**
* @Auther: lanson
*/
public class Test03 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
StringBuffer sb=new StringBuffer("nihaojavawodeshijie");
//增
sb.append("这是梦想");
System.out.println(sb);//nihaojavawodeshijie这是梦想
//删
sb.delete(3, 6);//删除位置在[3,6)上的字符
System.out.println(sb);//nihavawodeshijie这是梦想
sb.deleteCharAt(16);//删除位置在16上的字符
System.out.println(sb);//nihavawodeshijie是梦想
//改-->插入
StringBuilder sb1=new StringBuilder("$23445980947");
sb1.insert(3, ",");//在下标为3的位置上插入 ,
System.out.println(sb1);
StringBuilder sb2=new StringBuilder("$2你好吗5980947");
//改-->替换
sb2.replace(3, 5, "我好累");//在下标[3,5)位置上插入字符串
System.out.println(sb2);
sb.setCharAt(3, '!');
System.out.println(sb);
//查
StringBuilder sb3=new StringBuilder("asdfa");
for (int i = 0; i < sb3.length(); i++) {
System.out.print(sb3.charAt(i)+"\t");
}
System.out.println();
//截取
String str=sb3.substring(2,4);//截取[2,4)返回的是一个新的String,对StringBuilder没有影响
System.out.println(str);
System.out.println(sb3);
}
}
三、String,StringBuilder,StringBuffer区别和联系
- String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁。
- StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert、reverse、setChartAt、setLength等方法改变其内容。一旦生成了最终的字符串,调用toString方法将其转变为String
- JDK1.5新增了一个StringBuilder类,与StringBuffer相似,构造方法和方法基本相同。不同是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性能略高。通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder
StringBuilder:JDK1.5开始 效率高 线程不安全
StringBuffer:JDK1.0开始 效率低 线程安全
相关文章
- 大数据必学Java基础(五十六):LinkedList实现类的使用
- java局域网发送文件_Java如何实现局域网文件传输代码案例分享
- 【深入Java基础】HashMap的基本用法
- java nio_(一) Java NIO 概述[通俗易懂]
- Java 基础练习题
- java课程设计成绩管理系统_Java课程设计–学生成绩管理系统
- java如何输入字符串_JAVA中怎样输入字符串「建议收藏」
- java基本数据类型 think in java_Think in Java(一):Java基础[通俗易懂]
- 大数据必学Java基础(六十五):阻塞队列介绍
- JAVA中类内容的先后加载顺序
- 大数据必学Java基础(七十六):创建线程的三种方式
- 【Java基础】JDK和JRE的安装+配置环境变量
- Java基础面试题
- 大数据必学Java基础(九十四):SQL注入攻击
- 大数据必学Java基础(一百零一):BaseDAO抽取
- 大数据必学Java基础(一百一十四):Requet域监听器
- java基础多线程之共享数据详解编程语言
- 数据如何使用Java读取MySQL数据(java读取mysql)
- 写入数据Java实现MySQL数据写入(java向mysql)
- Linux重装Java:给你的操作系统新的灵魂(linux重装java)
- 如何在Linux系统下有效地启动Java程序,让你的代码在Linux中也能正常运行?(linux下启动java)
- 使用Java轻松读取Redis数据 – 一步一步指南!(java读取redis)
- 使用Java连接SQL Server数据库,快速高效地管理数据(java连接sqlserver数据库)
- 进程Linux下创建多个Java进程的简易方法(linux 多个java)
- Java与MySQL的无缝衔接:实现高效数据操作(java中使用mysql)