黑马程序员--字符串类

来源:互联网 发布:数据挖掘pdf 编辑:程序博客网 时间:2024/05/17 07:23

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

1.String类

字符串是一个特殊的对象

字符串一旦初始化就不可以被改变


1.1开辟内存情况:

String str=”abc”;

String str1=new String(“abc”);

有什么区别?

s1在内存中有一个对象

s2在内存中有两个对象


方法区中有:静态区,  方法区  和常量池,常量池中存放字符串常量String

1.String s1="HelloWorld";//此处和"Hello"+"World"是相同的,会拼起来当成一个串放入常量池

当用以上方式创建实例对象时,会首先去常量池中查找,如果有指向引用,没有则开辟空间存储常量,并指向引用

2.String s5=new String("HelloWorld");

当用new创建实例对象时,会在堆内存中开辟空间存放"HelloWorld",然后再去常量池中查看是否有"HelloWorld",

如果有则与堆内存的"HelloWorld"建立关系,没有则创建之后再建立关系,此时输出s1==s5也是false,因为指向不同

3.而String s2="Hello",Strings3="World"都会在常量池中开辟空间存放字符串

4.当需要拼串时,也就是s4=s2+s3,会在堆内存中开辟空间存放新的字符串,指向s4

双等号比较的是两个引用的内存地址值:所以s1和s4不相等


String s1=”abc”

//s1是一个类类型变量,”abc”是一个对象

//字符串最大的特点:一旦被初始化就不可以被改变.

s1=”kk” //输出为kk怎么解释?是s1又指向了kk这个对象


1.2类的构成:

public final class String extends Object implements Serializable, Comparable<String>, CharSequence
//此类被final修饰,不能被继承

1.3常见操作:

1.3.1   获取

字符串中包含的字符数,也就是字符串的长度

length    

public int length()

根据位置获取位置上的某个字符

charAt   

public char charAt(int index)

             注:当访问到字符串中不存在的脚标时,会发生StringIndexOutOfBoundsException.

根据字符获取给字符在字符串中的位置

indexOf

public int indexOf(int ch)  //返回的是ch在字符串中第一次出现的位置
public int indexOf(int ch, int fromIndex) //从fromIndex指定位置开始,获取ch在字符串中出现的位置
           注:如果没有找到,返回-1
public int indexOf(String str)  //返回的是str在字符串中第一次出现的位置
public int indexOf(String str, int fromIndex)

lastIndexOf

方法和上面四个类似

1.3.2判断

是否包含某一个子串

contains

public boolean contains(CharSequence s)
以某个字符串开头

startsWith

public boolean startsWith(String prefix)     //以某个字符串或者正则表达式开头
public boolean startsWith(String prefix, int toffset)  //从某一位开始

注意:特殊之处:indexOf(Stringstr),可以索引str第一次出现的位置,如果不存在返回-1,表示该str不在字符串中存在.所以,也可以用于指定字符串是否包含.

         If(str.indexOf(“aa”)!=-1)   //如果为真,说明找到了

         而且该方法既可以判断,也可以获取出现的位置

以某个字符串结尾:

endsWith

public boolean endsWith(String suffix)
判断字符串内容是否相同,重写了Object类中的equals方法

equals

public boolean equals(Object anObject)
判断内容是否相同,并忽略大小写

equalsIgnoreCase

public boolean equalsIgnoreCase(String anotherString) 

1.3.3转换

将字符数组转成字符串
构造函数:

String

public String(char[] value)
public String(char[] value, int offset, int count)

静态方法:

copyValueOf

public static String copyValueOf(char[] data)
 public static String copyValueOf(char[] data, int offset, int count)
将字符串转成字符数组

toCharArray

public char[] toCharArray()
将字节数组转成字符串

String

public String(byte[] bytes)
public String(byte[] bytes, int offset, int length)
将字符串转成字节数组

getBytes

public byte[] getBytes()

特殊:字符串和字节数组在转换过程中,是可以指定编码表的

将基本数据类型转成字符串

valueOf

public static String valueOf(boolean b)

//3+”” =   String.valueOf(3);  两个等价

1.3.4替换

public String replace(char oldChar, char newChar)
//如果要替换的字符不存在,还是原串

1.3.5切割

split

public String[] split(String regex)

1.3.6子串

substring

public String substring(int beginIndex)
public String substring(int beginIndex, int endIndex)
获取字符串中的一部分

1.3.7转换,去除空格,比较

将字符串转成大写或者小写

toUpperCase

public String toUpperCase()

toLowerCase

public String toLowerCase()
将字符串两端的多个空格去除

trim

public String trim()
对两个字符串进行自然顺序的比较

compareTo

public int compareTo(String anotherString)

1.4练习

1.4.1模拟trim方法,去除两端的空格

思路:

1.      判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止

2.      当开始和结尾都判断不是空格时,就要获取该字符串

class TrimDemo{public static void main(String[] args){DoTrim dt=new DoTrim();String dodo=dt.getString("   lala   kk  ");System.out.println(dodo);System.out.println(dodo.length());}}class DoTrim{public String getString(String str){//char[] c=str.toCharArray();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);}}

1.4.2将一个字符串进行翻转.将字符串中指定部分进行翻转,”abcdeg”;abfecg

思路:

1.      曾经学习过对数组的元素进行反转

2.      将字符串变成数组,对数组反转

3.      将反转后的数组变成字符串

4.      只要将或反转的部分的开始和结束为止作为参数传递即可

class RollOverDemo{public static void main(String[] args){RollOver ro=new RollOver();String arr="123456qwerty";ro.print(arr);String x=ro.rollOver(arr);ro.print(x);}}class RollOver{public String rollOver(String str,int start,int end){char[] arr=str.toCharArray();reverse(arr,start,end);return new String().valueOf(arr);}private void reverse(char[] arr,int start,int end){for(int i=start,j=end-1;i<j;i++,j--){ //包含头不包含尾swap(arr,i,j);}}public String rollOver(String str){  //全部调换位置是局部调换位置的一个特殊类型return rollOver(str,0,str.length());}private void swap(char[] arr,int begin,int end){char temp=arr[begin];arr[begin]=arr[end];arr[end]=temp;}public void print(String str){System.out.println(str);}}

1.4.3获取一个字符串在另一个字符串中出现的次数

思路:

1.      定义一个计数器

2.      获取kk第一次出现的位置

3.      从第一次出现位置后剩余的字符串中继续获取kk出现的位置.没获取一次就计数一次

4.      当获取不到时,计数完成

class CountDemo{public static void main(String[] args){String str="sdfaasdfkakka";String str1="aa";Count c=new Count();System.out.println(c.getCount1(str,str1));}}class Count{public int getCount(String sou,String res){int index=0;int count=0;while((index=sou.indexOf(res))!=-1){sou=sou.substring(index+res.length());count++;}return count;}public int getCount1(String sou,String res){int index=0;int count=0;while((index=sou.indexOf(res,index))!=-1){index+=res.length();count++;}return count;}}

1.4.4获取两个字符串中最大相同子串,第一个动作,将短的那个串进行长度依次递减的子串打印

思路:

1.      将短的那个子串按照长度递减的方式获取到

2.      将每次获取到的子串去长串中判断是否包含,包含就是找到

class MaxString{public static void main(String[] args){Max m=new Max();String a="12345jjj6";String b="yisdfsodfj";System.out.println(m.getString(a,b));}}class Max{public String getString(String a,String b){String max="";String min="";max=(a.length()>b.length())?a:b;min=(max.length()==b.length())?a:b;for(int i=0;i<min.length();i++){for(int j=0,k=min.length()-i;k<min.length();j++,k++){String x=min.substring(j,k);if(max.contains(x)){return x;}//System.out.println(x);}}return "";}}

2.StringBuffer类

字符串的组成原理就是通过该类实现的

StringBuffer可以对字符串内容进行增删操作

StringBuffer是一个容器, 所以具备了crud的操作

特点:

1.      长度是可变的;

2.      可以同时操作多个数据类型,

3.      最终会通过toString()方法变为字符串

很多方法与String相同

StingBuffer是可变长度的

2.1类结构:

public final class StringBuffer extends Object implements Serializable, CharSequence 

StringBuffer也是被final修饰过得,不能被继承

2.2存储

append

public StringBuffer append(boolean b)

没有两个基本数据类型.byte和short,因为可以被int提升

将指定数据作为参数添加到已有数据结尾处

insert

public StringBuffer insert(int offset, boolean b)

可以将数据插入指定index的位置上

2.3删除

delete

public StringBuffer delete(int start, int end)  //删除缓冲区中的数据,包含start,不包含end

deleteCharAt

public StringBuffer deleteCharAt(int index)  //删除指定位置的字符

2.4获取

charAt

public char charAt(int index)  //获得某个位置上的字符

indexOf

public int indexOf(String str)   //字符串从前开始第一次出现的位置

lastIndexOf

public int lastIndexOf(String str)  //字符串从后开始第一次出现的位置

length

public int length() //获取长度

substring

public String substring(int start)  //截取

//注意,返回的还是String

2.5修改:

replace

public StringBuffer replace(int start,int end, String str)

//头尾和要替换的内容

setCharAt

public void setCharAt(int index, char ch)

//注意:它没有返回值,替换完即可

2.6反转:

reverse

public StringBuffer reverse()

2.7将缓冲区的指定数据存在指定数组中

public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

3.StringBuilder类

在jdk1.5之后出现的

StringBuffer是线程同步的,StringBuilder是线程不同步的

多线程使用StringBuffer

单线程使用StringBuilder

Java升级就这几点:

1.      提高效率

2.      简化书写

3.      提高安全性

4.基本数据类型对象包装类

基本数据类型对象包装类的最常见作用.

就是用于基本数据类型和字符串类型之间做转换

 

基本数据类型转换成字符串

         基本类型.toString(基本数据类型)

 

字符串转成基本数据类型

         将字符串变为正数

        public static int parseInt(String s)
 throws NumberFormatException
 
jdk1.5后的新特性
 
Integer x=4;
X是引用数据类型,4是对象
自动装箱:   new Integer(4)
自动拆箱:   变成int类型与2相加,在装箱赋给对象值
 
新特性的时候,会有另一个值:为null,要进行判断
 
Integer m=128;
Integer n=128;
值为false
 
Integer a=127;
Integer b=127;
值为true
 
结果为true,因为a和b指向了同一个Integer对象.因为当数值在byte范围内容,对于新特性,如果该数值对象已经存在,则不会再开辟新的空间


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
0 0
原创粉丝点击