------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、String类
1.字符串时一个特殊的对象,字符串一旦被初始化,就不可以被改变;
(1)比较两种写法:
String s1="abc";
String s2 = new String("abc");
s1在内存中是一个对象;
s2在内存中是两个对象;new是一个对象,“abc”是一个对象
记住:String s2=new String() 等效于String s = ""; 不等效String s = null;
(2)比较三种结果
String s1="abc";
String s2 = new String("abc");
String s3="abc";
s1==s2; false 原因:s1、s2是两个对象
s1.equals(s2); true 原因:String类复写了Equals方法,该方法判断字符串是否相同
s1==s3; true 原因:建立s1对象后,又建立一个s3,发现常量池中,已经有abc字符串,为了节约内存,直接把S3的引用指向和s1同一个对象;
2.String类适用于描述字符串事物;
那么他就提供了多个方法对字符串进行操作;
常见的操作:
1.获取;
1.1 字符串中的包含的字符数,也就是字符串中的长度;
int length();获取长度;
1.2 根据位置获取位置上某个字符。
char charAt(int index);
1.3 根据字符获取该字符在字符串中的位置。
int indexOf(int ch);返回的是ch在字符串中第一次出现的位置。
int indexOf(int ch,int fromIndex)从fromIndex指定的位置开始;
int indexOf(String str)返回的是str在字符串中第一次出现的位置;
int indexOf(String str,int fromIndex)从fromIndex指定的位置开始;
int lastIndexOf(int ch) 反向查找;
2.判断;
2.1字符串中是否包含某一个子串;
boolean contains(str)
特殊之处:indexOf(str)可以索引str第一次出现位置,如果返回-1,表示该字符串中存在。所
以,也可以用于对指定判断是否包含。if(str.indexOf("a")!=-1),
而且该方法即可以判断,又可以获取出现的位置。
2.2字符串是否有内容;
boolean isEmpty();原理就是判断长度是否为零; "" 对象null 空
2.3字符串是否是以指定内容开头;
boolean startWith(str);
2.4字符串是否是以指定内容结束;
boolean endWith(str);
2.5判断字符串内容是否相同,复写了object类中的equals方法
boolean equals(str);
2.6判断内容是够相同,并忽略大小写;
boolean equalsIgnoreCase();
3.转换。
3.1将字符数组转成字符串;
构造函数:String(char[])
String(char[],offset,count);将字符数组中的一部 分转成字符串;
静态方法:
static String copyValueOf(char[])
static String copyValueOf(char[] data,int offset,int count)
static String valueOf(char[])
3.2将字符串转成字符数组;
char[] toCharArray();
3.3将字节数组转成字符串;
String(byte[])
String(byte[],offset,count)
3.4将字符串转成字节数组;
byte[] getByte();
3.5将基本数据类型转成字符串;、
static String ValueOf(int)
static String valeuOf(double)
//3+""//String.valueOf(3)
特殊:字符串和字节数组在转换过程中,是可以指定编码表的;
4.替换;
String replace(oldchar,newchar)
5. 切割
String[] split(regex)
6.子串 获取字符串中的一部分;
String subString(begin,end);
7.转换,去除空格,比较;
7.1将字符串转成大写或者小写;
String toUpperCase()
String toLowerCase()
7.2将字符串两端的多个空格去除;
String trim()
7.3将两个字符串进行自然顺序的比较;
int compareTo(String anotherString)
巧记:判断存在contains,获取位置indexof,根据位置获取字符charat。
练习1
package day05;
/*
2.将一个字符串反转,将字符串中指定部分进行反转,
思路:
1.曾经学习过对数组的元素的反转;
2.将字符串编程数组;对数组进行反转
3.将反转后的数组编程字符串
4.只要将反转的部分的开始和结束为止作为参数传递即可
*
*/
public class StringTest{
public static void sop(Object obj)
{
System.out.println(obj);
}
public static String myTrim(String str)
{
//定义两个变量。记录第一个不是空格的字符下标,和最后一个不是空格的字符下标
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);
}
public static void main(String[] args) {
String str=" abc ";
sop(myTrim(str));
}
}
练习2
package day05;
/*
2.将一个字符串反转,将字符串中指定部分进行反转,
思路:
1.曾经学习过对数组的元素的反转;
2.将字符串编程数组;对数组进行反转
3.将反转后的数组编程字符串
4.只要将反转的部分的开始和结束为止作为参数传递即可
*
*/
public class StringTest2 {
//反转字符串
public static String reverseString(String str,int start,int end)
{
char[] ch=str.toCharArray();
reverseArr(ch,start,end);
return new String(ch);
}
//反转字符串中的一部分
public static String reverseString(String str)
{
return reverseString(str,0,str.length()-1);
}
//反转字符数组
public static void reverseArr(char[] ch,int x,int y)
{
for(int start =x,end =y-1;start<end;start++,end--)//一般查数包含头不包含尾,所以end=y-1
swap(ch,start,end);
}
//交换两个字符的位置
public static void swap(char[] ch,int x,int y)
{
//注意中间变量要用char类型
char temp =ch[x];
ch[x]=ch[y];
ch[y]=temp;
}
public static void main(String[] args) {
String str ="abcdie sl";
System.out.println("反转全部字符串:"+reverseString(str));
System.out.println("反转部分:"+reverseString(str,0,2));
}
}
练习3.
package day05;
/**
* 3.获取一个字符串在另一个字符串中出现的次数 "abkkdeddedkkskk"
* 思路: 1.低估一个计数器;
* 2.获取kk第一次出现的位置
* 3.从第一次出现位置后剩余的字符串继续获取kk出现的位置, 每获取一次计数器加1
* 4.当获取不到时,计数完成;
*/
public class StringTest3 {
public static int getSubCount(String str, String key) {
int count=0;
int index=0;
while((index=str.indexOf(key))!=-1)
{
//从第一次出现位置后剩余的字符串继续获取kk出现的位置, 每获取一次计数器加1
str=str.substring(index+key.length());
count++;
}
return count;
}
//方式二
public static int getSubCount_2(String str, String key) {
int count=0;
int index=0;
while((index=str.indexOf(key,index))!=-1)
{
//int indexOf(String str,int fromIndex)从fromIndex指定的位置开始;
//每次改变位置即可,不用取子串
index=index+key.length();
count++;
}
return count;
}
public static void main(String[] args) {
String str="abkkdeddedkks";
int i=getSubCount_2(str, "kk");
System.out.println(i);
}
}
练习4
package day05;
/*
4.获取两个字符串中最大相同子串,第一个动作,将短的那个串进行长度递减的子串打印
“abcwerthelloyuipodef”
"cvhellohmn"
*/
public class StringTest4 {
public static String getMaxSubString(String str1,String str2)
{
String max="",min="";
//判断两个字符串长度大小
max=str1.length()>str2.length()?str1:str2;
min=(max==str1)?str2:str1;
/*
1.将短的字符串按照长度递减的方式获取到
2.将每获取的子串去长串中判断是否包含
如果包含,就找到了
*/ for(int x=0;x<min.length();x++)
{
//长度减1,减1后的子串有多个;
for(int y=0,z=str2.length()-x;z!=min.length()+1;y++,z++)
{
String temp=str2.substring(y,z);
if(max.contains(temp))
return temp;
}
}
return "";
}
public static void main(String[] arg){
String str1="abcwerthelloyuipodef";
String str2="cvhellohmn";
System.out.println(getMaxSubString(str1, str2));
}
}
二、 StringBuffer
StringBuffer是字符串缓冲区,用于存储数据的容器。
1.特点:
(1).长度的可变的。
(2).可以存储不同类型数据。
(3).最终要转成字符串进行使用。
(4).可以对字符串进行修改。
2.既然是一个容器对象。应该具备什么功能呢?
(1)添加:
StringBuffer append(data);
StringBuffer insert(index,data);
(2)删除:
StringBuffer delete(start,end):包含头,不包含尾。
StringBuffer deleteCharAt(int index):删除指定位置的元素
(3)查找:
char charAt(index);
int indexOf(string);
int lastIndexOf(string);
(4)修改:
StringBuffer replace(start,end,string);
void setCharAt(index,char);
增删改查 C(create)U(update)R(read)D(delete)
(5)反转
StringBuffer reverse()
(6)将缓冲区中指定数据存储到指定字符数组中;
void getChar(int srcBegin,int srcEnd,char[] dst,int dsBegin)
2.jdk1.5以后出现了功能和StringBuffer一模一样的对象。就是StringBuilder
不同的是:
StringBuffer是线程同步的。通常用于多线程。
StringBuilder是线程不同步的。通常用于单线程。 它的出现提高效率。
jdk升级:
(1)简化书写。
(2)提高效率。
(3)增加安全性。
三、基本数据类型
1.基本数据类型包装类
Int integer
char Character
其他的基本数据类型的包装类只要将首字母大写即可。
2.作用:将基本数据类型封装成对象,可以将基本数据类型和字符串之间做转化。
(1)基本数据类型转化成字符串
方法一:基本数据类型+""
方法二:基本数据类型. toString(基本数据类型);
如:Integer.toString(21)//将21整数变成"34";
(2) 字符串转化成基本数据类型
xxx a = Xxx.parseXxx(string)
如:int a = Integer.parseInt("12");
(3)十进制转成其他进制
toBinaryString()
toHexString()
toOctalString()
(4)其他进制转成十进制
parseInt(String,radix)
如:Int a = Integer.ParseInt("3c",16)
(5) 自动装箱,拆箱
Integer x = new Integer(5);
等价于:Integer x = 5;//自动装箱,new Integer;
x = x+2;//x进行自动拆箱,变成了int类型,和2运算,再将和进行装箱赋给x
练习1.
package day05;
/*
"11 -5 20 -6 32 95 -3"
要求对字符串中的数值进行排序。生成一个数值从小到大新字符串。
思路:1、将字符串切割为字符串数组
2、将字符串数组转换为整数类型数组
3、对整数类型数组进行冒泡排序
4、将排序后的整数类型数组转换为字符串
*/
public class StringSort
{
public static void main(String[] args)
{
String s="11 -5 20 -6 32 95 -3";
sop(s);
sop(stringSort(s));
}
public static String stringSort(String s)
{
//将字符串切割成字符串数组
String[] str=s.split(" ");
//将字符串数组转换为整数类型数组
int[] arr=stringToInt(str);
// 对整数类型数组进行冒泡排序
bubbleSort(arr);
//将排序后的整数类型数组转换为字符串
return intToString(arr).toString();
}
// 将字符串数组转换为整数类型数组方法
private static int[] stringToInt(String[] str)
{
int[] arr=new int[str.length];
for(int x=0;x<str.length;x++)
{
arr[x]=Integer.parseInt(str[x]);
}
return arr;
}
//对数组进行冒泡排序
private static void bubbleSort(int[] arr)
{
for (int x=0;x<arr.length ;x++ )
{
for (int y=0;y<arr.length-x-1; y++)
{
if(arr[y]>arr[y+1])
swap(arr,y,y+1);
}
}
}
//交换数组中的两元素
private static void swap(int[] arr,int x,int y)
{
int temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
//将整数类型数组存放到一个StringBuiler容器中
private static StringBuilder intToString(int[] arr)
{
StringBuilder sb=new StringBuilder();
for (int x=0;x<arr.length-1; x++)
{
sb.append(arr[x]+" ");
}
sb.append(arr[arr.length-1]+"");
return sb;
}
//打印字符串
private static void sop(Object obj)
{
System.out.println(obj);
}
//遍历数组
private static void sop(int[] arr)
{
for (int x=0; x<arr.length;x++ )
{
System.out.print(arr[x]+"\t");
}
System.out.println();
}
}
思考:、String和stringbuffer的区别?
String是字符串的类类型,用于描述字符串事物。字符串是一个特殊的对象。特殊之处就在于:
Stings= new String();和String s1=””;两种写法都是在创建对象,使用起来一样。
字符串最大的特点就是:一旦被初始化就不可以被改变。
StringBuffer是一个容器,字符串的组成原理就是通过该类实现的。StringBuffer可以对字符串内容进行增删改查等操作,很多方法和String相同。