目录 :
1 ) . String(概述)
2 ) . String(常见功能--获取和判断)
3 ) . String(常见功能--转换)
4 ) . String(常见功能--切割和替换)
5 ) . String(常见功能--比较和去除空格)
6 ) . String(字符串练习1)
7 ) . String(字符串练习2)
8 ) . String(字符串练习3)
9 ). String(字符串练习4)
10 ).StringBuffer(常见功能--增加)
11 ). StringBuffer(常见功能--删除和修改)
12 ).StringBuilder
13 ). 基本数据类型对象包装类
14 ). 基本数据类型对象包装类新特性
一
. String(概述)
1 ) . 概述 :
1.1 简述 : 字符串是一个特殊的对象
1.2 特点 : 字符串一旦初始化就不可以被改变
[1] 例如 : String s1="ABC" ; s1 ="DFS" ; --> 改变的是s1的指向,而不是"ABC"这个对象
1.3 区分 : String str ="abc" ; String str1= new String("abc"); 有何区别 ?
[1] 两者的实现是相同的都实例化了一个字符串内容是abc的string对象,第一个是简写版,第二个是完整版
[2] 区别在于str在内存中是只有一个对象string,而str1在内存中有两个对象,一个是string,一个是new
1.4 解读 : String str ="abc" ;
[1] String -->String类型的类
[2] str -->类类型变量名
[3] "abc" -->是一个对象
2 ) . ==与equals 的区别?
2.1 ==在比较基本数据类型时比较的是 字面值 ,而在比较对象时比较的是两个对象的地址值
2.2 equals被string重写后 比较的是内存地址值
String类复写了Object类中的equals方法,该方法用于判断字符串是否相同
3 ) . Demo :
class StringDemo{public static void main(String args[]) throws InterruptedException{String s = new String("ABC");String s1="ABC";// s与s1的共同和区别?//共同点在于 都是实例化了一个字符串内容是ABC的string对象//区别在于 s在内存中有一个对象String,而s1在内存中有两个对象String和newSystem.out.println(s==s1); // -->true 用于比较字面值System.out.println(s.equals(s1)); // -->false 用于比较字符串内容}}
小结 :
1. API是java为我们提供的应用程序接口2. String字符串存在于常量池中,常量池中用来保存已创建有的字符常量,在之后引用使用
3. String字符串有自己的比较方式equals,判断字符串内容是否相同
二. String(常见功能--获取和判断)
1 ) . 学习字符串的重要两点 :
1.1 明白String的基本特点特性
1.2 String方法的使用
2 ) . 引入 : -->String类适用于描述字符串事物,那么它为我们提供了多个方法对字符串进行操作,常见的操作有以下几种:
2.1 获取
[1] 字符串中包含的字符数,也就是字符串的长度
方法 : int length() ;获取长度
[2] 根据位置获取位置上某个字符
方法 : char charAt(int index);
[3] 根据字符串获取该字符在字符串上的位置
方法一 :int indexOf(int ch);返回的是ch在字符串中第一次出现的位置
方法二 :indexOf(int ch,int fromIndex); 从fromIndex指定位置开始,获取ch在字符串中出现的位置
方法三 :int indexOf(String str);返回的是str在字符串中第一次出现的位置
方法四: indexOf( String str ,int fromIndex); 从fromIndex指定位置开始,获取str在字符串中出现的位置
2.2 判断
[1] 字符串中是否包含某个子串?
方法 : boolean contains(str);
[2] 字符中是否有内容?
方法 : boolean isEmpty() ; 原理就是判断长度是否为0
特殊之处 : indexOf(Str)可以索引str第一次出现的位置,若返回-1则表示字符串不存在,因此也可判断是否包含
例子 ; if(str.indexOf("aa")!=-1) 表示判断是否包含
[3] 字符串是否是以指定内容开头?
方法 : boolean startsWith(str);
[4] 字符串是否是以指定内容结尾?
方法 : boolean endsWith(str);
[5] 判断字符串内容是否相同-->其实是复写了Object类中的equals方法
方法: boolean equals (str)
[6] 判断内容是否相同,并忽略大小写
方法 : boolean equalsIgnoreCase();
3 ) . "" 与 null 的区别?
3.1 "" 是对象, null 是指向空
4 ) . 如何查API?
4.1 想到功能-->想到结果-->再想到返回值类型-->再查API即可
5 ). contatin与indexOf比较 ?
5.1 相同点在于都可用于判断字符串中是否包含某字符串
5.2 不同点在于若既判断是否存在若存在又可取其坐标的话用indexOf方便些
6 ).Demo :
class StringDemo1{public static void method_get(){String str="asdfgjdhbn";//1.获取//获取字符串长度sop(str.length());//根据位置获取某位置上的字符串sop(str.charAt(3)); //当访问到字符串中不存在的角标是会抛出字符串索引越界异常StringIndexOutOfBoundsException//根据字符正向获取在字符串中的位置sop(str.indexOf("d",9)); //当指定的位置以后没有找到或字符串中压根就没有时则返回-1//根据字符反向获取在字符串中的位置sop(str.lastIndexOf("d"));}public static void method_is(){String str="StringDemo.java";//2.判断//判断文件名称是否以String单词开头sop(str.startsWith("String"));//判断文件名称是否以.java结尾sop(str.endsWith(".java"));//判断文件名的内容是否包含Demosop(str.contains("Demo"));}/* public static boolean if(boolean obj){System.out.println(obj);}*/public static void sop(Object obj){System.out.println(obj);}public static void main(String args[]) throws InterruptedException{// method_get();method_is();/* String s1="ABC";String s2="ABC";String s3=new String("ABC");//equals在string重写后比较的是对象地址值,==在基本数据类型的情况下比较的是字面值,而在对象的情况下比较的是地址值System.out.println(s1.equals(s2)); //--> TRUESystem.out.println(s2.equals(s3)); // --> TRUESystem.out.println(s1.equals(s3)); // --> TRUESystem.out.println(s1==s2); //--> TRUESystem.out.println(s2==s3); // --> FALSESystem.out.println(s1==s3); // --> FALSE*/}}
小结 :
1. 固定不变的数据存在于常量池中2. 数组的length是属性,而字符串string的length是方法,都是用来获取对象长度的
3. 基本数据类型的类型提升,也就是装箱
三. String(常见功能--转换)
1 ) . 转换的常见功能 :
1.1 将字符数组转成字符串
[1] 方式一 : 构造函数
String(char[])
String(char[],offset,count); 将字符数组中的一部分转成字符串
[2] 方式二 : 静态方法
static String copyValueOf(char[]);
static String copyValueOf(char[] data,int offset,int count)
static String value(char[])
1.2 将字符串转成字符数组. **
[1] char[] toCharArray();
1.3 将字节数组转成字符串
[1] String(byte[])
[2] String(byte[],offset,count); 将字节数组中的一部分转成字符串
1.4 将字符串转成字节数组
[1] byte[] getBytes();
1.5 将基本数据类型转成字符串
[1] static String valueOf(int)
[2] static String valueOf(double)
ps : 3+"" 与 String.valueOf(3) 一样,只是后者专业些而已
字符串和字节数组在转换过程中,是可以指定编码表的
2 ) . Demo :
class StringDemo2{//转换方法public static void method_set(){char[] chr ={'A','B','C','D','E'};String str0="ASDFGHK";int num=123;//字符数组转化成字符串-->构造函数的方式String str1 = new String(chr);//字符数组转化成字符串-->静态方法的方式String str=new String();String str2 = str.valueOf(chr);sop("str="+str1);sop("str="+str2);//将字符串转换为字符数组char[] chr1 =str0.toCharArray();for(int i=0;i<chr1.length;i++){sop("chr1="+chr1[i]);}//将数组转化为字符串的形式String str3 = str.valueOf(num);sop("str3="+str3);}//用来输出的方法public static void sop(Object obj){System.out.println(obj);}//主方法public static void main(String args[]){method_set();// System.out.println("Hello World");}}
小结 :
1. 每个方法接的应该都是结果值,因此面向类型去编写方法最快
四. String(常见功能--切割和替换)
1 ) . 替换-->可将字符串内的单个或多个字符进行替换
方法 : String replace(oldchar,newcahr);
2 ) . 切割 -->可将字符串以标识符号为分割的方式分成字符串数组
方法 : String[] split(regex);
3 ) . 获取 -->获取字符串当中的一部分
方法 :
String subString(begin); -->获取从指定下标到结束的字符串,若角标不存在则会出现角标越界异常
String subString( begin,end); -->获取指定范围下标的字符串
4 ) . Demo
class StringDemo3{//替换方法public static void method_replace(){//原始字符串String str="Hello Java";//替换单个字符String str1 = str.replace("H","L"); //若替换的字符不存在,则返回的还是原串//替换多个字符String str2 = str.replace("Hello","Hei");sop(str1);sop(str2);}//分割方法public static void method_split(){//原始字符串String str="Summer,untumn,winter";//以,号进行分割为字符串数组String[] str1 = str.split(",");//将字符串数组进行遍历for(int i=0;i<str1.length;i++){sop(str1[i]);}}//获取子串方法public static void method_subString(){//原始字符串String str="asdfgghjk";sop(str.substring(2)); // -->截取下标为2的字符到结束sop(str.substring(2,4)); //-->截取下标为2到下标为4之间的字符}//用来输出的方法public static void sop(Object obj){System.out.println(obj);}//主方法public static void main(String args[]){method_subString();//method_split();// method_replace();// System.out.println("Hello World");}}
小结 :
1. 替换就是替换字符串内的指定内容,切割就是以设定分隔符的方式进行切割,获取子串就是以下标为依据获取字符串内的相应内容
五
. String(常见功能--比较和去除空格)
1 ) . 转换,去除空格,比较
1.1 将字符串转成大写或者小写
[1] String toupperCase();
[2]String toLowerCase();
1.2 将字符串两端的多个空格去除
[1] String trim();
1.3 将两个字符串进行自然顺序的比较
[1] int compareTo(String);
2 ) . 忽略大小写比较的原理是?
2.1无论字符串是大写还是小写,我都把你变小写然后采用equalse进行比较即可
3 ) . Demo:
class StringDemo4{//转化方法public static void method_conversion(){//原始字符串String str=" small hello java ";String str1=" BIG HELLO JAVA ";//转化为大写String upp = str.toUpperCase();//转化为小写String low = str.toLowerCase();//去掉两端空格String tri = str.trim();sop("upp = "+upp);sop("low = "+low);sop("low = "+tri);//对两个字符串进行自然顺序的比较String s="ABC";String s1="ACB";//比较的是ASIC码表,若A>B则返回整数,若A<B则返回负数sop(s.compareTo(s1));}//用来输出的方法public static void sop(Object obj){System.out.println(obj);}//主方法public static void main(String args[]){method_conversion();}}
小结 :
1. 转化指的是大小写之间的转化,去空格指的是去掉字符串两端空格,比较的是采用ASIC码表值进行比较
六. String(字符串练习1)
1 ) . 需求 : 模拟一个trim方法,用来去除字符串两端的空格
![]()
2 ) . Text
/*需求一: 模拟一个trim方法,去除字符串两端的空格思路:1.判断字符串第一个位置是否是空格,若是则继续向下判断,直到不是空格为止,结尾处同理2.当开始和结尾都判断不到空格时,就是要获取的字符串*/class StringText1{//去除两端空格的方法public static String getTrim(String str){//索引的开始端与结束端变量int start=0,end =str.length()-1;//从开始端循环判断是否为空while(start<=end && str.charAt(start)==' ')start++;//从结束端循环判断是否为空while(start<=end && str.charAt(end)==' ')end--;//返回将值放入获取子串的方法后的结果return str.substring(start,end+1);}//用来输出public static void sop(String str){System.out.println(str);}//主方法public static void main(String args[]){//原始串String str =" ABC EDS ";//打印原始串sop("("+str+")");//打印去掉空格后的串sop("("+getTrim(str)+")");}}
3 ) . 思考 : 一步一步分析
小结 :
1. 找不到符号的两大原因,要么单词写错,要么单词大小写搞混2. 切记" " 与 '' ,一个是字符串一个是字符
3 .切记循环过后结尾的坐标会矮一位,记得 +1
七. String(字符串练习2)
1 ) . 需求 : 将一个字符串进行反转与将字符串中指定部分进行反转
2 ) . Text --> 字符串反转
/*需求二:将一个字符串进行反转,将字符串中指定部分进行反转,"SDSDFD";abfedcg思路:1. 曾经学习过的对数组的元素进行反转2.将字符串变成数组,对数组反转3.将反转后的数组变成字符串4.只要将或反转的部分的开始和结束位置作为参数传递即可*/class StringText2{//用来反转字符串的方法public static String ReverseString(String str){return ReverseString(str,0,str.length()-1);}//用来反转指定角标字符串的方法public static String ReverseString(String str,int start,int end){//字符串变数组char[] ch = str.toCharArray();//反转数组reverse(ch,start,end);//将数组变成字符串return new String(ch);}//反转方法private static void reverse(char[] arr,int x,int y){//角标循环方式for(int start=x,end=y; start<end;start++,end--){// 位置置换方法swap(arr,start,end);}}//位置置换private static void swap(char[] arr,int x,int y){char temp=arr[x];arr[x]=arr[y];arr[y]=temp;}//输出字符串public static void sop(String str){System.out.println(str);}//主方法public static void main(String args[]){String str=" SDSDFD ";//输出原字符串sop(str);//输出全面反转后的字符串sop(ReverseString(str));//输出指定反转后的字符串sop(ReverseString(str,5,6));}}
3 ) . 得到 :
3.1 依靠功能点进行方法的拆分
小结 :
1. 一个功能尽量细分为多个功能,方便修改,方便扩展
八
. String(字符串练习3)
1 ) . 需求 : 获取一个字符串在另一个字符串中出现的次数
2 ) . Text:
/*需求三:获取一个字符串在另一个字符串中出现的次数"abkkcdkkefkkskk"思路:1.定义个计数器2.获取KK第一次出现的位置3.从第一次出现位置剩余的字符串中继续获取kk出现的位置,每获取一次就计数一次4.当获取不到时,计数完成*/class StringText3{//查询字符串内字符串的个数方式一/* public static int getCount(String str,String key){int count =0;int index=0;//循环判定str中是否有key,若有则循环,并赋值位置while((index=str.indexOf(key))!= -1){//给定最新位置依次循环并记录countstr=str.substring(index+key.length());count++;}return count;}*///查询字符串内字符串的个数方式二 ---- 建议用这种public static int getCount(String str,String key){int count =0;int index=0;//通过判定字符串key在str中是否出现以及返回出现的位置循环记录while((index=str.indexOf(key,index))!= -1){//循环记录下一个字符出现的位置index=index+key.length();count++;}return count;}//输出语句public static void sop(int num){System.out.println(num);}//主方法public static void main(String args[]){String sky="kk";String str="abkkcdkkefkkskk";sop(getCount(str,sky));}}
3 ) . 得到:
3.1 通过 indexOf 获取字符串在字符串中出现的索引
小结 :
1. 能用已有方法解决的事情别自己创造
九
. String(字符串练习4)
1 ) . 获取两个字符串中最大相同子串
2 ) . Text:
/*需求四: 获取两个字符串中最大相同子串,第一个动作:将短的那个串进行长度一次递减的子串打印"abcwerthelloyuiodef""cvhellobnm"思路:1 .将短的那个子串按照长度递减的方式获取到2.将每获取到的子串去长串中判断是否包含,若包含则找到*/class StringText4{//获取最大子串的方法public static String getMaxSubString(String str,String sky){String max="",min="";//获取最常字符串max=(str.length()>sky.length())?str:sky;//获取较短的字符串min=(max==str)?sky:str;//循环较短字符串for(int x=0;x<min.length();x++){//较短字符串依次递减for(int y=0,z=min.length()-x;z!=min.length()+1;y++,z++){//获取子串String temp=min.substring(y,z);//判断max中是否有子串temp,有则返回if(max.contains(temp))return temp;}}return "";}public static void sop(String str){System.out.println(str);}//主方法public static void main(String args[]){String str="asd";String str1="asdfghj";//获取最大子串的示例sop(getMaxSubString(str,str1));// System.out.println("Hello World");}}
小结 :
1. 通过循环递减的方式判断并截取
十. StringBuffer(常见功能--增加)
1 ) . 简述 :
1.1 概述
[1] 字符串的组成原理是通过该类实现的
[2] StringBuffer可以对字符串内容进行存储,删除,获取,修改
[3]StringBuffer是一个容器,很多方法与String相同
1.2 特点 :
[1] 长度是可变化的
[2] 可以字节操作多个数据类型
[3] 最终会通过toString方法变成字符串
2 ) . 使用场景 :
2.1 当数据类型不确定,个数也不确定最终结果还需变成字符串时,采用StringBuffer的方式
3 ) . Demo :
/*C create R read U update D delete1.存储StringBuffer append(); 将指定数据作为参数添加到已有数据结尾处StringBuffer insert(index,数据);可以将数据插入到指定index位置2.删除3.获取4.修改
*/class StringBufferText{//输出方法public static void sop(String str){System.out.println(str);}//主方法public static void main(String args[]){//创建StringBuffer对象StringBuffer sb = new StringBuffer();//添加数据sb.append("ABC").append("123").append(true);//添加数据到指定位置sb.insert(5,"QQ");//转化为String类型sop(sb.toString());}}
小结 :
1. 同一对象,不同引入2. 方法调用链指的是一连串的方法调用返回的还是原对象类型
十一. StringBuffer(常见功能--删除和修改)
1 ) . 详情见下文示例以及上边解释 :
/*C create R read U update D delete1.存储StringBuffer append(); 将指定数据作为参数添加到已有数据结尾处StringBuffer insert(index,数据);可以将数据插入到指定index位置2.删除StringBuffer delete(start,end); 删除缓冲区中的数据,包含start,不包含endStringBuffer deleteCharAt(index); 删除指定位置的字符3.获取char charAt(int index)int indexOf(String str)int lastIndexOf(String str)int length()String substring(int strat,int end)4.修改StringBuffer replace(start,end,string);void setCharAt(int index,char ch);5.反转StringBuffer reverse();6.void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin)*/class StringBufferText1{//输出方法public static void sop(String str){System.out.println(str);}//增加相关方法public static void method_app(){//创建StringBuffer对象StringBuffer sb = new StringBuffer();//添加数据sb.append("ABC").append("123").append(true);//添加数据到指定位置sb.insert(5,"QQ");//转化为String类型sop(sb.toString());}//删除相关方法public static void method_del(){//创建StringBuffer对象StringBuffer sb = new StringBuffer("ASDFGHG");//删除某坐标范围内的字符串// sb.delete(2,4);//删除某个坐标字符串sb.deleteCharAt(2);//转化为String类型sop(sb.toString());}//修改相关方法public static void method_replace(){//创建StringBuffer对象StringBuffer sb = new StringBuffer("ASDFGHG");//修改某坐标范围内的字符串// sb.replace(2,4,"QQ");//修改某个坐标字符串sb.setCharAt(2,'W');//转化为String类型sop(sb.toString());}//反转相关方法public static void method_reverse(){//创建StringBuffer对象StringBuffer sb = new StringBuffer("ASDFGHG");//将字符串进行反转sb.reverse();//转化为String类型sop(sb.toString());}//获取StringBuffer中的字符串并存到数组中的方法public static void method_getChars(){//创建StringBuffer对象StringBuffer sb = new StringBuffer("ASDFGHG");char[] ch=new char[4];//获取StringBuffer中的字符串并存到ch数组中sb.getChars(1,4,ch,1); //-->范围坐标1-4(不包含4)的字符存入chs数组中,从坐标1开始存//打印验证下for(int i=0;i<ch.length;i++){sop("ch="+ch[i]);}}//主方法public static void main(String args[]){method_app();// method_del();// method_replace();// method_reverse();// method_getChars();}}
十二
. StringBuilder
1 ) . StringBuilder与StringBuffer之间的区别? -->相同之处在于使用方式完全相同,StringBuilder与StringBuffer 之间只有有没有锁的区别
1.1 StringBuffer是线程同步,而StringBuilder是线程不同步的
1.2 使用场景 :
[1] 在单线程情况下使用StringBuilder ,提高效率 -->建议开发使用StringBuilder
[2] 在多线程情况下使用StringBuffer,提高安全性,当然也可使用StringBuilder,只是需要自己加锁
2 ) . java升级的三个特点 :
2.1 提高效率
2.2 简化书写
2.3 提高安全性
十三
. 基本数据类型对象包装类
引入 :
byte -->Byte ; short -->Short ; int -->Integer ; long -->Long ; boolean-->Boolean ; float -->Float; double -->Double ; char-->Character;
基本数据类型对象包装类的最常见作用就是用于基本数据类型和字符串类型之间的转换;
1 ) . 基本属性类型转成字符串:
1.1 方式一 :基本数据类型+""
1.2 方式二 :基本数据类型.toString(基本数据类型值);
如 : Integer.toString(34); //将34整数变成"34";
2 ) . 字符串转成基本基本数据类型 :
2.1 xxx a =Xxx.parseXxx(String);
2.2 int a= Integer.parseInt("123");
2.3 double b = Double.parseDouble("12.23");
2.4 boolean b =Boolean.parseBoolean("true");_
3 ) . 十进制转成其它进制:
3.1 toBinaryString();
3.2 toHex String();
3.3 toOctalString();
4 ) . 其他进制转成十进制
4.1 parseInt(String,radix);
5 ). Demo:
class IntegerDemo{//输出方法public static void sop(String str){System.out.println(str);}//主方法public static void main(String args[]){//获取整数类型的最大值sop("int max:"+Integer.MAX_VALUE);//将一个字符串转成整数int num=Integer.parseInt("123");sop("num:"+(num+123));//二进制的转换sop(Integer.toBinaryString(6));//十六进制的转换sop(Integer.toHexString(6));//将110转化成二进制,十进制,十六进制只需更改括号内的第二个参数即可int x = Integer.parseInt("110",2);sop("x="+x);}}
小结 :
1. 基本数据类型封装后对应的是引用数据类型,也就是基本数据类型对象包装类
2.基本数据类型封装后多了一些方法,更加的遍历,详情 参考JDK
十四. 基本数据类型对象包装类新特性
1 ) . 特性 :
1.1 特性一 : 自动拆箱与自动装箱
2 ) .
class IntegerDemo1{//输出方法public static void sop(String str){System.out.println(str);}public void method(){Integer x = new Integer("123");Integer y = new Integer(123);sop("x==y:"+(x==y)); //flase ,因为是俩对象sop("x==y:"+(x.equals(y))); //true,因为指向了同一个数,引用数据类型自己又做了方法的重写}//主方法public static void main(String args[]){Integer x=new Integer(4);Integer x1=4; //自动装箱 // new Integer(4)x=x/*x.intValue()*/+2; //x=2: x 进行自动拆箱,转化了int类型,而后和2进行加法运算,再将和进行装箱赋给Integer m=128;Integer n=128;sop("m==n:"+(m==n)); // 结果falseInteger a=127;Integer b=127;sop("a==b:"+(a==b)); // 结果true ,因为a和b指向了同一个Integer对象,因为当数值在byte范围内时,若数值已存在,则不会再开辟新空间}}
3 ) . 何为自动 拆箱与自动装箱?
3.1 自动拆箱就是自动对相应的基本数据类型做自动的转化
3.2 自动装箱就是在new基本数据类型包装类对象时右边的类无需写,直接写数据即可,jvm自动完成装箱
小结 :
1. 能单单调用引用时,绝不另开辟空间,当涉及到new对象时,定开辟了空间
十五. 总结
1 ) . String与StringBuffer都是CharSequence接口的实现类
2 ) . 必须记得的是StringBuffer 与 引用数据类型(是封装类,也是对象 , 大大加快了工作效率
3 ) . String常用方法 : 获取,转化,切割, 反转, 修改, 常用功能: 比较,去除空格,
4 ) . StringBuffer与StringBulider 的 常用方法 : 获取, 删除, 修改, 存储,反转,
5 ) .Stringbuffer安全,但效率低; 建议使用StringBulider 效率高,可后期自己加锁
6 ),引用数据类型最大的好处就是封装了以上能想到的所有方法,对字符串与基本数据类型的相互转化也提供了最大的便利