常用类,String类(重点描述),StringBuffer类,StringBuilder类,包装类(Integer,Double,Character等包装类)

常用类(eclipse)

String类,字符串类

在这里我首先要解释一下,我们平时声明的对象都在Gc堆里待着,而变量都在栈里待着
string字符串有些特殊,如果我们象这样声明一个字符串

String string1 = "atguigu";

这样的字符串会指向字符串常量池
我们再换个写法

String string2= new String("123");

这样的字符串会指向GC堆
字符串总不能没有操作吧,我们再来尝试做一些操作

string1 = string1 + "abc";

原来string1本来是指向字符串常量池,但是进行字符串拼接操作后,会指向GC堆,如下图所示
在这里插入图片描述
字符串的方法多而且繁琐,但是只要掌握了使用方法,处理字符串就变得灰常简单,掌握字符串的处理方法是很重要的哦,毕竟你要是处理一个文件要把那里面的数据都看成字符串


 //字符串 : 内容不可改变的Unicode字符序列, 可以看作是一个字符数组.
  		//里面的方法不会修改内容,  任何的修改的方法都会产生新的对象, 而不是修改原内容
      //            2  5    10   15      20        26        32      40 42
 String string = "  abcQQyy 1234 我喜欢你,你喜欢我吗?我不喜欢你 QQQYYYzzz  ";
 
 	public int length() 获取字符串长度, 字符个数, string.length() -> 43
	public char charAt(int index) 获取参数中指定的下标位置处的字符 string.charAt(7) -> 'y', string.charAt(25)
	public char[] toCharArray() 返回一个字符数组, 是内部字符数组的副本
	public boolean equals(Object anObject) 字符串比较内容
	public int compareTo(String anotherString) 字符串比大小
	public int indexOf(String s) 获取参数中的子串在本串中首次出现的下标值, 如果返回-1表示不包含子串
	public int indexOf(String s ,int startpoint) 第二个参数作用是控制开始搜索的下标
	public int lastIndexOf(String s) 获取参数中的子串在本串中首次出现的下标值, 是从右向左搜索的.
	public int lastIndexOf(String s ,int startpoint)从右向左搜索指定的字符串,第二个参数是指定开始搜索的下标
	public boolean startsWith(String prefix) 判断当前串是否以子串为开始 string.startsWith("abcQQ") -> true
	public boolean endsWith(String suffix) 判断当前串是否以子串为结束, 检查文件名,作类型判断.
	public String substring(int start,int end) 截取子串, start是开始下标(包含), end是结束下标(不包含) string.substring(15, 19) -> "我喜欢你" 
	public String substring(int startpoint) 截取子串, 从start开始到最后
	public String replace(char oldChar,char newChar) 把字符串中的所有oldChar替换为newChar
	public String replaceAll(String old,String new) 把字符串中的所有old子串替换为new子串
	public String trim() 修剪字符串首尾的空白字符(码值小于等于32的字符)
	public String concat(String str)在字符串的末尾添加参数里的字符串
	public String toUpperCase() 全部变大写
	public String toLowerCase() 全部变小写
	public String[] split(String regex) 以参数中的字符串为切割器, 把字符串切割成多个部分
	System.arraycopy(value, 0, result, 0, value.length); // 第一个参数是源数组, 第二个参数是源数组的开始下标
	// 第三个参数是目标数组, 第四个参数是目标数组的要复制的开始下标, 第五个参数是要复制的元素个数

以上的方法本人亲测,都试过了没什么错误,就是使用的时候要注意返回值类型,用字符串或者什么的接收,嗯,毕竟这里面一个void类型的方法都没有呢

StringBuffer

经以上代码我们得知,String类的字符串只要经过操作变换地址就会从字符串常量池中转而指向GC堆
而且要用新的字符串接收,很麻烦不是,我们用StringBuffer类来解决问题,一会儿我会介绍更好的,但是现在,先让我们来慢慢的过渡一下吧

  • StringBuffer()初始容量为16的字符串缓冲区
    在这里插入图片描述
    如图,这时StringBuffer的无参构造器,如果我们不传入参数的话,系统默认下会调用指定容量的AbstractStringBuilder方法,传入的参数数值为16
  • StringBuffer(int size)构造指定容量的字符串缓冲区
  • StringBuffer(String str)将内容初始化为指定字符串内容

StringBuffer

StringBuffer append(String s)		在末尾添加字符串,可以直接用StringBuffer的对象调用此方法,并且可以在该方法后调用该方法
StringBuffer append(int n)  		在末尾添加int类型的数据
StringBuffer append(Object o) 		在末尾添加对象数据
StringBuffer append(char n)			在末尾添加char类型数据
StringBuffer append(long n)  		在末尾添加long类型数据
StringBuffer append(boolean n)		在末尾添加boolean类型的数据
StringBuffer insert(int index, String str) 	在指定下标添加字符串
public StringBuffer reverse() 	倒叙输出字符串
StringBuffer delete(int startIndex, int endIndex) 	从开始下标开始到结束下标删除此区间的字符串
public char charAt(int n )	用字符串接收返回指定下标的字符
public void setCharAt(int n ,char ch)	将指定下标的字符改为传入的参数字符,切记,这是单个字符的操作
StringBuffer replace( int startIndex ,int endIndex, String str) 	
成批的处理字符串,将传入的字符串代替从开始下标到结束下标的字符串
public int indexOf(String str)	返回传入参数字符串在原字符串中的下标,若找不到则返回-1
public String substring(int start,int end)  返回一串在两个下标之间的字符串
public int length()	返回字符串的长度

以上是StringBuffer所有的方法,亲测无误,切记若不是void类型的方法要用字符串接收或者直接打印表示

StringBuilder

  • String
    不可变字符序列
  • StringBuffer
    可变字符序列,线程安全,效率较低
  • StringBuilder
    可变字符序列,线程不安全,效率高
    在这里插入图片描述
    看,String类其实是很糟糕的,只不过我们现在在处理的数据对于机器来说就是一个小学数学题和几道数学题题一样,差别不是很大,但是当数据变得非常庞大,String的弊端就会无限的放大
    而StringBuilder比StringBuffer快的那几毫秒也会被放大,所以在这种情况下,我们总是会优先考虑效率的问题,至于安全不安全的,有错就抛出异常呗
    最后做个小练习好了
    String string = new String(“123456”);
    那么问题来了,这一行代码中创建了几个对象呢
    答案是两个
    如果我们在常量池中找到了123456这个对象,我们再创建一个字符串的引用对象就可以了
    如果我们没有在常量池中找到123456这个对象,就要分别在常量池和GC堆中创建对象

包装类

	int i =1;
	Integer n1 = new Integer(i); //装箱
	Integer n2 = 1;	//自动装箱
	int i1 = n1.intValue(); //拆箱
	int i2 = n1;  //自动拆箱

以上代码以int类型和int类型的包装类Integer为例,我们将基本数据类型byte,short,int,long,float,double,char,boolean包装成类,这样他们就有了类的特性,我们就可以调用类的方法来使用
基本数据类型,包装类和String类之间的转换
基本数据类型在被包装成类后,可以调用本包装类的parse···方法

	String string = "21213";
	int i = Integer.parseInt(string);//例如我们可以用Integer类的parseInt方法传入字符串来得到int类型的数据
	System.out.println(i);//输出为21213

int i = Integer.parseInt(string)这句话其实相当于两句话,其实可以理解为先用int的包装类接收数据,在实现包装类的拆箱过程

	String string = "21213";
	Integer i = Integer.parseInt(string);
    int i1 = i.intValue();
	System.out.println(i1);//输出为21213

包装类在程序中最大的作用在于将字符串转化为基本数据类型

.

Integer x = 128;
Integer y = 128;
System.out.println(x == y); 

大家来猜猜最后的结构对不对好了
答案当然是不对
Integer的源码
在这里插入图片描述
我们来看这里,在Integer的源码中默认的最大值是127,最小值是128,当我们包装int类型的数据在这个区间内,会调用IntegerCache的这个方法
而一旦我们超出了这个范围,就会使用一个新的Integer对象,也就是说,虽然两者数值相等,也就是用equals方法判断两者事项等的,但是两者指向的地址不同,那么这里就自然而然的会报错了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值