Java基础:String、StringBuffer、基本数据类型包装类

来源:互联网 发布:网络策划公司 编辑:程序博客网 时间:2024/05/15 11:25

一、String

1、String介绍

String类代表字符串。Java中所有字符串面值(如:"book")都作为此类的实例对象存在。

字符串是常量,他们的值在创建之后不能更改。(Stirng s = "abc";s = "ee";    这并不是改变字符串的值,而是s的指向改变了)

注意:

1)两种新建对象的方式等效

String s1 = new String();

String s2 = "";

2)新建字符串对象的区别

String s1 = "abc";

String s2 = new String("abc")

s1在内存中只有一个对象

s2在内存中有两个对象(new一个对象,"abc"一个对象)

s1.equals(s2)为true,判断字符串的内容是否相等。

3)同内容的字符串对象相等

String s1 = "abc";

String s2 = "abc"

s1==s2为true(哈希值相同),因为字符串存在于常量池中,s2在new对象时,内存中已经存在了"abc",它就不会再单独开辟空间了。

2、String类中的常见方法

1)获取

int length()    字符串的长度

char charAt(int index)    获取指定位置上的字符

int indexOf(int ch)    获取指定字符在字符串中出现的位置

int indexOf(int ch,int fromIndex)    从指定位置开始索引指定字符在字符串中的位置

int indexOf(String str)

int indexOf(String str,int fromIndex)

int lastIndexOf(int ch)    反向索引

int lastIndexOf(int ch,int froIndex)

int lastIndexOf(String str)

int lastIndexOf(String str,int fromIndex)


注意:索引字符时,是以Unicode进行索引而不是char类型。

2)判断

boolean contains(charSuquence s)    判断字符串中是否包含某一子串

boolean isEmpty()    判断字符串是否为空(依据int length()方法)

boolean startsWith(String str)    判断字符串是否以指定内容开头

boolean endsWith(String str)    判断字符串是否以指定内容结束

boolean equals(Object obj)    判断字符串的内容是否相等(覆盖了Object类中的equals方法)

boolean equalsIgnoreCase(String str)    判断字符串的内容是否相等,并忽略大小写


注意:indexOf方法也可用于判断字符串中是否包含指定内容,并返回索引位置,不存在则返回-1。

3)转换

将字符数组换成字符串

String(char[] chr)    构造方法

String(char[] chr,int offset,int count)    将字符数从offset开始,长度为conut部分转换成字符串

static String copyValueOf(char[] chr)    静态方法

static String copyValueOf(char[] chr,int offset,int count)


char[] toCharArray()    将字符串转换成为字符数组

String(byte[] byt)    使用平台默认编码表将字节数组转换成为字符串

String(bye[] byt,Charset charset)    使用指定的编码表将字节数组转换成为字符串

String(byte[] byt,int offset,int count)

String(byte[] byt,int offset,int count,Charset charset)

byte[] getBytes()    使用平台默认编码表将字符串转换成为字节数组

byte[] getBytes(Charset charset)    将字符串按指定编码转换成为字节数组


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

static String valueOf(int a)

static String valueOf(double d)

... ...


String toUpperCase()    将字符串转换成为大写

String toLowerCase()    将字符串转换成为小写

String trim()    去掉字符串两端多余的空格

int compareTo(String str)    将两个字符串进行自然顺序的比较(覆盖comparable接口中的方法)

4)替换

String replace(char oldChar,char newChar)    将字符串中 的oldChar替换成为newChar

String replace(CharSequence target,CharSequence replacement)    使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。

5)切割

String[] split(String regex)    根据指定的正则表达式匹配拆分此字符串

6)子串

String substring(int beginIndex)    返回一个新的字符串,它是此字符串的一个子字符串。

String substring(int beginIndex,int endIndex)    返回一个新的字符串,它是此字符串的一个子字符串。(包含头不包含尾)

3、示例代码

1)反转字符串

package com.itheima;/* * 需求:反转字符串 * 思路: * 1、将字符串转换成为字符数组 * 2、对字符数组中的元素进行反转 */public class ReverseString{public static void main(String[] args){String str = "abcde";String newString = reverseString(str);System.out.println(newString);}//反转部分字符串,从start开始到end结束,但是不包含endpublic static String reverseString(String str,int start,int end){//将字符串转换成为字符数组char[] chs = str.toCharArray();//对字符数组中的数据进行反转reverse(chs,start,end);//返回新的字符串return new String(chs);}//反转整个字符串public static String reverseString(String str){return reverseString(str,0,str.length());}//反转字符数组private static void reverse(char[] chs,int x,int y) {for(int start=x,end=y-1 ; start<end ; start++,end--){swap(chs,start,end);//从开始处和末尾处开始,交换两者的位置}}//交换数组中两个元素的位置private static void swap(char[] chs, int x, int y) {char temp = chs[x];chs[x] = chs[y];chs[y] = temp;}}

运行结果:

2)自定义实现trim方法

package com.itheima;/* * 需求:自定义实现trim方法 * 思路: * 1、定义两个指针,一个从头开始(start),一个从尾开始(end) * 2、如果位置上的字符是' ',则指针向下移动,直到start==end * 3、获取从start到end处的子串返回 */public class MyTrim{public static void main(String[] args){String str = "     hello      ";String newStr = myTrim(str);System.out.println("old:"+str);System.out.println("new:"+newStr);}//自定义trim方法public static String myTrim(String str){//指针,start从0开始,end从尾开始int start = 0;int end = str.length()-1;//如果位置上的字符是' ',指针就向下移动while(start<=end && str.charAt(start)==' ')start++;while(start<=end && str.charAt(end)==' ')end--;//返回去空格后的子串return str.substring(start,end+1);}}
运行结果:

3)统计字符串中某一子串出现的次数

package com.itheima;/* * 需求:获取字符串中某一个子串出现的次数 * 思路: * 1、查找指定字符串中该子串的索引,由于是次数问题,采用技术器思想 * 2、从索引位+子串.长度处继续查找该子串在字符串中的位置,如此循环直到返回-1 */public class StringDemo{public static void main(String[] args){String str = "goodkkbookstorekkjack";String key = "kk";int count = substringCount(str,key);System.out.println(str);System.out.println("count("+key+")="+count+"次");}//查找某个子串在字符串中出现的次数public static int substringCount(String str,String key){//计数器int count = 0;//索引int index = 0;//字符串中若还存在该子串,则计数器自增1while((index=str.indexOf(key,index))!=-1){index = index+key.length();count++;}return count;}}
运行结果:

4)获取两个字符串中的最大相同子串

package day.day3;/* * 需求:获取两个字符串中的最大子串 * 思路: * 1、将小串作为key去查找大串中是否包含该小串 * 2、若不包含,则调整小字符串的长度,继续第一个步骤 */public class GetMaxSubstring {public static void main(String[] args){String str2 = "abcdehelloefg";String str1 = "hihellojk";System.out.println(str1+"\r\n"+str2);System.out.println("maxSubstring = "+(maxSubstring(str1,str2)));}public static String maxSubstring(String str1,String str2){//若str2不是长度小的字符串,则str1与str2交换,对小串进行操作运算量小一点if(str1.length()<str2.length()){String str = str1;str1 = str2;str2 = str;}//对小串进行遍历for(int x=0;x<str2.length();x++){/* * 定义两个指针,初始位置为0,str2.length,也就是子串的区间 * 若没有符合要求的子串,则调整指针,继续循环(同时调整) */for(int y=0,z=str2.length()-x;z<=str2.length();y++,z++){//获取子串String temp = str2.substring(y,z);//若是两个字符串中的最小相同子串,则返回该子串if(str1.contains(temp))return temp;}}return "";}}
图解:

运行结果:

二、StringBuffer

1、StringBuffer介绍

        StringBuffer是字符串缓冲区,是一个容器,而且长度时可变化的,可以直接操作多个数据类型,最终都可以通过toString()方法转换成为字符串。

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

注意:

StringBuffer sb = new StringBuffer();

StringBuffer sb1 = sb.append("abc");

sb==sb1为true,说明两者指向同一对象,这就是缓冲区的特点,不管增加什么,都是同一个容器。

2、常见方法

1)、存储

StringBuffer append(参数)    

          将指定数据作为参数添加到已有数据的结尾处(支持除byte、short外的基本数据类型,以及char[],对象)

StringBufer insert(int index,数据)    在指定位置插入数据

2)、删除

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

StringBuffer deleteCharAt(int index)        删除指定位置上的数据


StringBuffer sb = new StringBuffer();

sb.delete(0,sb.length());        清空缓冲区

3)、获取

char charAt(int index)        获取指定位置上的字符

int indexOf(String str)

int indexOf(Stirng str,int fromIndex)

int lastIndexOf(String str)

int lastIndexOf(String str,int fromIndex)

String substring(int start,int end)        获取子串(含头不含尾)

4)、修改

StringBuffer replace(int start,int end,String str)    用str替换缓冲区中从start到end处的数据(含头不含尾)

void setCharAt(int index,char ch)    将指定位置上的元素替换成ch

5)、反转

StringBuffer reverse()    反转缓冲区中的元素

6)、转换

void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin)    将缓冲区中的数据传转换成为字符数组

3、StringBuilder

1)StringBuilder与StringBuffer的区别

StringBuilder是JDK1.5版本出现的,两者基本功能都相同,不同之处在于:

StringBuffer:线程同步,效率低。

StringBuilder:线程不同步,效率高。

若为单线程程序,StringBuffer因为线程同步,会导致效率降低,而StringBuffer则比较快速;若为多线程,则使用StringBuffer增加程序的安全性,也可以在自己加锁的条件下使用StringBuilder。

StringBuilder的出现时为了提高效率的,以后开发建议使用StringBuilder。

2)Java升级的目的

(a)提高效率;

(b)简化书写;

(c)提高安全性;


三、基本数据类型包装类

1、基本数据类型包装类与基本数据类型的对应关系

2、与字符串之间的相互转化

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

格式1:基本数据类型+"";

格式2:基本数据类型包装类.toString(基本数据类型值);

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

格式:xxx a = Xxx.parseXxx(String str);    str必须为指定数据格式的字符串

如:int num = Integer.parseInt("123");

3)进制转换

十进制转换成二进制:static String toBinaryString(int num)

十进制转换成八进制:static String toOctalString(int num)

十进制转换成十六进制:static String toHexString(int num)

其他进制的(字符串)数据转换成为十进制:static int parseInt(String str,int radis)     

4)JDK1.5新特性

(a)自动装箱

Integer x = new Integer(4);

Integer y = 4;    自动装箱

y = y+4;    y通过intValue()转成整数(自动拆箱)后与4相加,再自动装箱(封装成对象)。

y与int y=4,并无多大差别,只是y多了一个null值(空指针)。

(b)节省空间

Integer m = 127;

Integer n = 127;

Integer a = 128;

Integer b = 128;

m==n为true,a==b为false,因为当数值在byte范围内时,如果该数值已经存在,就不会再开辟空间。

0 0
原创粉丝点击