包装类
包装类 - 引入
【1】什么是包装类:
以前定义变量,经常使用基本数据类型
对于基本数据类型来说,它就是一个数,加点属性,加点方法,加点构造器将基本数据类型对应进行了一个封装,产生了一个新的类,---》包装类。
int,byte..--->基本数据类型
包装类--->引用数据类型
【2】对应关系:
基本数据类型 对应的包装类 继承关系
byte Byte ---》Number---》Object
short Short ---》Number---》Object
int Integer ---》Number---》Object
long Long ---》Number---》Object
float Float ---》Number---》Object
double Double ---》Number---》Object
char Character Object
boolean Boolean Object
【3】已经有基本数据类型了,为什么要封装为包装类?
(1)java语言面向对象的语言,最擅长的操作各种各样的类。
(2)以前学习装数据的---》数组,int0]Stringldoublel StudentD
以后学习的装数据的---》集合,有一个特点,只能装引用数据类型的数据
【4】是不是有了包装类以后就不用基本数据类型了?
不是
包装类 - 常用属性 - 常用构造器
【1】直接使用,无需导包:
java. lang
类Integer
【2】类的继承关系:
jara. lang. object
jaya.lang.Number
java. lang. integer
【3】实现接口:
所有已实现的接口;
Serializable,Comparable<Integer)
【4】这个类被final修饰,那么这个类不能有子类,不能被继承:
pubilc final class Integer
extends Number
implements Cosparable<Integer>
【5】包装类是对基本数据类型的封装:
对int类型封装产生了Integer
Integer类在对象中包装了一个基本类型int的值。
Integer类型的对象包含一个int类型的字段。
【6】类的历史:
从以下版本开始:
JDK1.0
public class test01 {
//这是一个main方法,是程序的人口
public static void main(String[] args){
//属性:
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
//“物极必反”原理:
System.out.println(Integer.MAX_VALUE+1);
System.out.println(Integer.MIN_VALUE-1);
}
}
运行结果如下:
【7】属性:
//属性:
System.out.println(IntegerMAXVALUE);
System.out.println(IntegerMIN VALUE);
//"物极必反"原理:
System.out.println(Integer.MAX VALUE+1);
System.out.println(Integer.MIN VALUE-1);
【8】构造器(发现没有空参构造器)
(1)int类型作为构造器的参数
Integer i2 = new Integer("12");
Inteqer i3 = new Integer("abcdef");
(2)String类型作为构造器的参数
Integer i1 = new Integer(12);
包装类 - 自动装箱 - 自动拆箱
【9]包装类特有的机制:自动装箱、自动拆箱:
//自动装箱:int--->Integer
Integer i = 12;
System.out.println(i);
//自动拆箱:Integer--->int
Integer i2 = new Integer(12);
int num = i2;
System.out.println(num);
(1)自动装箱自动拆箱是从JDK1.5以后新出的特性
(2)自动装箱自动拆箱:将基本数据类型和包装类进行快速的类型转换。
包装类 - 常用方法
【10】Integer 常用方法
public class Test04 {
//这是一个main方法,是程序的人口:
public static void main(String[] args){
//compareTo:只返回三个值:要么是0,-1,1
Integer i1 = new Integer(value:6);
Integer i2 = new Integer( value:12);
System.out.println(i1.compareTo(i2));// return(x<y)?-1:((x==y)?0:1)
//eauals:Inteaer对Obiect中的eauals方法进行了重写,比较的是底层封装的那个value的值。
//Integer对象是通过new关键字创建的对象:
Integer i3 = new Integer(value: 12);
Integer i4 = new Integer(value: 12);
System.out.println(i3 == i4);//false因为比较的是两个对象的地址
boolean flag = i3.equals(i4);
System.out.println(flag);
//Integer对象通过自动装箱来完成:
Integer i5 = 130;
Integer i6 = 130;
System.out.println(i5.equals(i6));//true
System.out.println(i5==i6);
/*
如果自动装箱值在-128~127之间,
那么比较的就是具体的数值否在,比较的就是对象的地址
*/
//intValue():作用将Integer--->int
Integer i7 = 130;
int i= i7.intValue();
System.out.println(i);
//parseInt(String s) :String--->int:
int i8=Integer parseInt(s:"12");
System.out.println(i8);
//toString:Integer--->String
Integer i10 = 130;
System.out.println(i10.toString());
}
}
日期相关
日期相关 - java.util.Date
package zuoye15;
import java.util.Date;
public class Test {
//这是一个main方法·是程序的人口:
public static void main(String[] args){
//java.util.Date:
Date d=new Date();
System.out.println(d);
System.out.println(d.toString());
System.out.println(d.toGMTString());//过期方法·过时方法·废弃方法。
System.out.println(d.toLocaleString());
System.out.println(d.getYear());//122+1900=2022
System.out.println(d.getMonth());//5:返回的值在日和11之间·值日表示1月
//返回自1970年1月1日00:00:00GMT以来此Date对象表示的毫秒数。
System.out.println(d.getTime());//1592055964263
System.out.println(System.currentTimeMillis());
/* (1)疑问:以后获取时间差用:getTime()还是currentTimeMiLLis()
答案:currentTimeMillis()--》因为这个方法是静态的,可以类名,方法名直接调用
(2)public static native long currentTimeMillis();本地方法
为什么没有方法体?因为这个方法的具体实现不是通过java写的。
*/
}
}
/*
(3)这个方法的作用:
一般会去衡量一些算法所用的时间
*/
public class Test {
//这是一个main方法·是程序的人口:
public static void main(String[] args){
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
System.out.println(i);
long endTime=System.currentTimeMillis();
System.out.println(endTime-startTime);
}
}
}
日期相关 - java.sql.Date
(使用 IDEA)
import java.sql.Date;
public class Text {
public static void main(String[] args){
//java.sql.Date:
Date d = new Date(1592055964263L);
System.out.println(d);
/*
(1)java.sql.Date和java.util.Date的区别:
java.util.Date: 年月日 时分秒
java.sql.Date: 年月日
(2)java.sql.Date和java.utilDate的联系:
java.sql.Date(子类) extends java.util.Date(父类)
*/
//java.sql.Date和java.util.Date相互转换:
//【1】util--->sqL:
java.util.Date date = new Date(1592055964263L);//创建util.Date的对象
//方式1:向下转型
Date date1=(Date) date;
/*
父类:Animal 子类:Dog
Animal an =new Dog();
bog d=(Dog)an;*/
//方式2:利用构造器
Date date2 = new Date(date.getTime());
//【2】sql-->util:
java.util.Date date3=d;
//[3]String--->sqL.Date:
Date date4 = Date.valueOf("2020-5-7");
}
}
日期相关 - SimpleDateFormat
【1】String---》java.util.Date类型转换:
分解:
(1)String--->java.sql.Date
(2)java.sql.Date--->java.util.Datepublic class Test04 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
// (1)string--->java.sql.Date
java.sq1.Date date = java.sq1.Date.valueOf("2015-9-24");
//(2)java.sgl.Date--->java.util.Date
java.util.Date date2 = date;
System.out.println(date2.toString());
}
}
上面的代码有局限性,字符串的格式只能是年-月-日拼接的形式,换成其它类型,就会出现异常:
【2】引入新的类:
package zuoye15;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test05 {
//这是一个main方法,是程序的入口:
public static void main(String[] args){
//日期转换:
//SimpleDateFormat(子类) extends DateFormat(父类是一个抽象类)
//格式化的标准已经定义好了:
DateFormat df =new SimpleDateFormat( pattern:"yyyy-MM-ddHH:mm:ss");
//String--->Date
try {
Date d=df.parse( source:"2019-4-6 12:23:54");
System.out.println(d);
} catch (ParseException e){
e.fillInStackTrace();
}
//Date--->String
String format=df.format(newDate());
System.out.println(format);
Date date = new Date();
System.out.println(date.toString());
System.out.println(date.toGMTString());
System.out.println(date.toLocaleString());
}
private static Date newDate() {
// TODO Auto-generated method stub
return null;
}
}
日期相关 - Calendar
import java.util.Calendar;
import java.util.GregorianCalendar;
public class Test06 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//Calendar是一个抽象类,不可以直接创建对象
//GregorianCalendar()子类extendsCalendar(父类是一个抽象类)
Calendar cal=new GregorianCalendar();
Calendar cal2=Calendar.getInstance();
System.out.println(cal);
//常用的方法:
//get方法,传入参数:Calendar中定义的常量
System.out.println(cal.get(Calendar.YEAR));
System.out.println(cal.get(Calendar.MONTH));
System.out.println(cal.get(Calendar.DATE));
System.out.println(cal.get(Calendar.DAY_OF_WEEK));
System.out.println(cal.getActualMaximum(Calendar.DATE));//获取当月日期的最大天数
System.out.println(cal.getActualMinimum(Calendar.DATE));//获取当月日期的最小天数
// set方法:
cal.set(Calendar.YEAR,1990);
cal.set(Calendar.MONTH,3);
cal.set(Calendar.DATE,16);
System.out.println(cal);
//String--->Calendar:/1分解:
//String--->java.sql.Date:
java.sql.Date date = java.sql.Date.valueOf("2022-5-7");
//java.sql.Date-->Calendar: cal.setTime(date);
System.out.println(cal);
}
}
运行结果如下:
日期相关 - Calendar练习 :
import java.util.Calendar;
import java.util.Scanner;
public class Test08 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//录入日期的string:
Scanner sc=new Scanner(System.in);
System.out.print("请输入你想要查看的日期:(提示:请按照例如2012-5-6的格式书写)");
String strDate=sc.next();
//System.out.println(strDate);
//String--->Calendar:
// String-->Date:
java.sql.Date date = java.sql.Date.valueOf(strDate);
//Date--->Calendar:
Calendar cal=Calendar.getInstance(); cal.setTime(date);
//后续操作:
// 星期提示:
System.out.println("日\t一\t二\t三\t四\t五\t六\t");
//获取本月的最大天数:
int maxDay=cal.getActualMaximum(Calendar.DATE);//获取当前日期中的日:
int nowDay=cal.get(Calendar.DATE);
//将日期调为本月的1号:
cal.set(Calendar.DATE,1);//获取这个一号是本周的第几天
int num =cal.get(Calendar.DAY_OF_WEEK);
//System.out.println(num);
//前面空出来的天数为:
int day =num -1;//引入一个计数器:
int count=0;//计数器最开始值为0//在日期前将空格打印出来:
for (int i = 1; i <= day; i++) {
System.out.print("\t");
}
//空出来的日子也要放入计数器 count = count + day;
count = count +day;
//遍历:从1号开始到maxDay号进行遍历:
for (int i = 1; i <= maxDay ;i++) {
if(i==nowDay){//如果遍历的和当前日子一样的话,后面多拼一个*
System.out.print(i+"*"+"\t");
}else{
System.out.print(i+"\t");}
count++;//每在控制台输出一个数字,计数器做加1操作
if(count%7 == 0){//当计数器的个数是7的倍数的时候,就换行操作
System.out.println();
}
}
}
}运行结果如下:
日期相关 - JDK1.8新增日期时间API的原因
日期相关 - JDK1.8新增日期时间API - LocaLDate,LocaLTime,LocalDateTime
LocaLDate:日期
LocaLTime:时间
LocalDateTime:日期+时间
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Test09 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//1.完成实例化:
// 方法1:now()--获取当前的日期,时间 日期+时间
LocalDate localDate=LocalDate.now();
System.out.println(localDate);
LocalTime localTime = LocalTime.now();
System.out.println(localTime);
LocalDateTime localDateTime=LocalDateTime.now();
System.out.println(localDateTime);
//方法2:of()--设置指定的日期,时间,日期+时间
LocalDate of = LocalDate.of(2010,5,6);
System.out.println(of);
LocalTime of1 = LocalTime.of(12,35,56);
System.out.println(of1);
LocalDateTime of2 = LocalDateTime.of(1890,12,23,13,24,15);
System.out.println(of2);
//LocaLDate,LocaLTime用的不如LocalDateTime多
// 下面讲解用LocaLDateTime:
// 一系列常用的get***
System.out.println(localDateTime.getYear());//年
System.out.println(localDateTime.getMonth());//月(英语)
System.out.println(localDateTime.getMonthValue());//月(数字)
System.out.println(localDateTime.getDayOfMonth());//日
System.out.println(localDateTime.getDayOfWeek());//星期
System.out.println(localDateTime.getHour());//时
System.out.println(localDateTime.getMinute());//分
System.out.println(localDateTime.getSecond());//秒
//不是set方法,叫with//体会:不可变性
LocalDateTime localDateTime2=localDateTime.withMonth(8);
System.out.println(localDateTime);
System.out.println(localDateTime2);
//提供了加减的操作:
// 加:
LocalDateTime localDateTime1=localDateTime.plusMonths(4);
System.out.println(localDateTime);
System.out.println(localDateTime1);
//减:
LocalDateTime localDateTime3=localDateTime.minusMonths(5);
System.out.println(localDateTime);
System.out.println(localDateTime3);
}
}
运行结果如下:
日期相关 - DateTimeFormatter
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;
public class Test10 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//格式化类:DateTimeFormatter
//方式一:预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
DateTimeFormatter df1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//df1就可以帮我们完成LocalDateTime和string之间的相互转换:
// LocalDateTime-->String:
LocalDateTime now=LocalDateTime.now();
String str = df1.format(now);
System.out.println(str);//2020-06-15T15:02:51.29
//String--->LocalDateTime
TemporalAccessor parse = df1.parse("2020-06-15T15:02:51.29");
System.out.println(parse);
运行结果如下:
Math 类
【1】直接使用,无需导包:
package java.lang;
【2】final修饰类,这个类不能被继承:
public final class Math {
}
【3】构造器私有化,不能创建Math类的对象:
/**
* Don't let anyone instantiate this class.
*/
private Math() {}
不能:
public static void main(String[] args) {
Math m=new Math();
}
【4】Math内部的所有的属性,方法都被static修饰:类名.直接调用,无需创建对象:
Math.java
public static final double PI = 3.14159265358979323846;
/**
* Returns the trigonometric sine of an angle. Special cases:<ul><li>If the argument is NaN * * or an infinity, then the* result is NaN.
* <li>If the argument is zero, then the result is a zero with the same sign as the argument. * </ul>
*
* <p>The computed result must be within 1 ulp of the exact result.* Results must be semi-
* monotonic.
*
* @param a an angle, in radians.
* @return the sine of the argument.
*/
@Contract(pure=true) public static double sin(double a) { return StrictMath.sin(a)}
【5】常用方法:
public class Test01 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//常用属性:
System.out.println(Math.PI);//常用方法:
System.out.println("随机数:"+Math.random());//[0.0,1.0)
System.out.println("绝对值:"+Math.abs(-80));
System.out.println("向上取值:"+Math.ceil(9.1));
System.out.println("向下取值:"+Math.floor(9.9));
System.out.println("四舍五入:"+Math.round(3.5));
System.out.println("取大的那个值:"+Math.max(3,6));
System.out.println("取小的那个值:"+Math.min(3,6));
}
}
运行结果如下:
【6】静态导入
package zuoye15;
import static java.lang.Math.*;
public class Test01 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//常用属性:
System.out.println(PI);//常用方法:
System.out.println("随机数:"+random());//[0.0,1.0)
System.out.println("绝对值:"+abs(-80));
System.out.println("向上取值:"+ceil(9.1));
System.out.println("向下取值:"+floor(9.9));
System.out.println("四舍五入:"+round(3.5));
System.out.println("取大的那个值:"+max(3,6));
System.out.println("取小的那个值:"+min(3,6));
}
//如果跟Math中方法重复了,那么会优先走本类中的方法(就近原则)
public static int random(){
return 100;
}
}
运行结果如下:
Random 类
随机数:
package zuoye15;
import java.util.Random;
public class Test02 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//返回带正号的 double 值,该值大于等于0.0 且小于 1.0。
System.out.println("随机数:"+Math.random());
//学习Random类
//(1)利用带参数的构造器创建对象:
Random r1 =new Random(System.currentTimeMillis());
int i=r1.nextInt();
System.out.println(i);
//(2)利用空参构造器创建对象:
Random r2 =new Random();//表面是在调用无参数构造器,实际底层还是调用了带参构造器
System.out.println(r2.nextInt(10));//在0(包括)和指定值(不包括)之间均匀分布的 int值。
System.out.println(r2.nextDouble());//在0.0和 1.0之间均匀分布的 double 值。
}
}
运行结果如下:
String 类
String 类
String 的本质
String 的常用方法
【1】构造器:底层就是给对象底层的value数组进行赋值操作。
通过构造器来创建对象:
String s1 = new String();
String s2 = new String("abc");
String s3 = new String(new char[] {'a' 'b' 'c'});
【2】常用方法
String s4 = "abc";
System.out.println("字符串的长度为:"+s4.length());
String s5 =new String("abc");
System.out.println("字符串是否为空:"+s5.isEmpty());
System.out.println("获取字符串的下标对应的字符为:"+s5.charAt(1));
【3】equals:
String s6 = new String("abc");
String s7 = new String("abc");
System.out.println(s6.equals(s7));
比较字符串是否相等:
【4】String类实现了Comparable,里面有一个抽象方法叫compareTo,所以String中一定要对这个方法进行重写:
String s8 = new string("abc");
String s9 = new string("abc");
System.out.println(s8.compareTo(s9));
【5】其他常用方法
//字符串的截取:
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( oldChar: 'a', newChar: 'u'));
//按照指定的字符串进行分裂为数组的形式:
String s12 = "a-b-c-d-e-f";
String[] strs = s12.split( regex: "-");
System.out.println(Arrays.toString(strs));
//转大小写的方法:
String s13 = "abc";
System.out.println(s13.toUpperCase());
System.out.println(s13.toUpperCase().toLowerCase())
//去除收尾空格:
String s14 =" abc ";
System.out.println(s14.trim());//tostring()
string s15="abc";
System.out.println(s15.tostring());
//转换为string类型:
System.out.println(string.valueOf(false));
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中的控制台:
StrinngBuilder 类
【1】字符串的分类:
(1)不可变字符串:String
(2)可变字符串:StringBuilder,StringBuffer
疑问:
(1)可变不可变??
(2)本节课重点:StringBuilder -----》√(3)StringBuilder和StringBuffer区别 ??
【2】StringBuilder底层:非常重要的两个属性:
【3】对应的内存分析
public class Test01 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//创建StrinqBullder的对象:
StringBuilder sb3 = new StringBuilder();
//表面上调用StrinqBuilder的空构造器,实际底层是对value数组进行初始化,长度为16
StringBuilder sb2 =new StringBuilder(3);
//表面上调用StringBuilder的有参构造器,传入一个int类型的数,实际底层就是对 ivalue数组进行初始化,长度为你传入的数字
StringBuilder sb = new StringBuilder("abc");
sb.append("def") . append("aaaaaaaa"). append("bbb").append("ooooooo");//链式调用方式: return this
System.out.println(sb.append("def") . append("aaaaaaaa"). append("bbb").append("ooooooo"));
}
}
运行结果如下:
String 和 StringBuilder
【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"));
}
}
运行结果如下:
StringBuilder 和 StringBuffer
StringBuilder常用方法:
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);
}
}
运行结果如下:
StringBuffer常用方法:
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,对StringBuffer没有影响
System.out.println(str);
System.out.println(sb3);
}
}
运行结果如下:
String、StringBuffer、StringBuilder区别与联系
1、String类是不可变类,即一日一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁。
2、StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert、reverse、setChartAt、setLength等方法改变其内容。一旦生成了最终的字符串,调用toString方法将其转变为String。
3、JDK1.5新增了一个StringBuilder类,与StringBuffer相似,构造方法和方法基本相同。不同是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性能略高。通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder。