一、字符串
概述:多个字符组成的一个序列,叫字符串。 生活中很多数据的描述都采用的是字符串的。而且我们还会对其进行操作。所以,java就提供了这样的一个类供我们使用。
创建:1、直接赋值;2、new对象形式。
String():无参构造;如:
String s = new String();
s = "hello";
String(byte[] bys):传一个字节数组作为参数;如:
byte[] bys = {7,8,9,10,11};
String s = new String(bys);
String(byte[] bys,int index,int length):把字节数组的一部分转换成一个字符串;如:
byte[] bys = {97,98,99,100,101};
String s = new String(bys,1,2);
String(char[] chs):传一个字符数组作为参数;如:
char[] chs = {'a','b','c','d','e'};
String s = new String(chs);
String(char[] chs,int index,int length):把字符数组的一部分转换成一个字符串;如:
char[] chs = {'a','b','c','d','e'};
String s = new String(chs,1,2);
String(String str):把一个字符串传递过来作为参数;如:
char[] chs = {'a','b','c','d','e'};
String ss = new String(s);
直接把字符串赋值给字符串引用对象(最常用) ;如:
String s = "hello";
注意:字符串一旦被初始化就不能被改变,所谓的改变只是变量指向了不同的对象而已。
如:
String s1 = "abc";
//s1 = "kk";//这里改变的知识S1的指向,而"abc"并没有改变。
Stirng s2 = new String("abc");//s1和s2是有区别的;s1在内存中只有一个对象啊,s2有两个。
s1==s2 ?==》false
//但是s1.equale(s2) ==》true
//这是因为String复写了Object中的equale方法,用于判断字符串是否相等
String s3 = "abc";
s1==s3 ?==》true 因为s1和s3都指向同一个对象。
常见操作
1、获取
1.1:获取字符串的长度。int length();
1.2:指定位置的字符。char charAt(int index);
1.3:获取指定字符的位置。如果不存在返回-1,所以可以通过返回值-1来判断某一个字符不存在的情况。
从前面开始
int indexOf(int ch);//返回第一次找到的字符角标
int indexOf(int ch,int fromIndex); //返回从指定位置开始第一次找到的角标
int indexOf(String str); //返回第一次找到的字符串角标
int indexOf(String str,int fromIndex);//fromIndex开始位置
从后面开始
int lastIndexOf(int ch);
int lastIndexOf(int ch,int fromIndex);
int lastIndexOf(String str);
int lastIndexOf(String str,int fromIndex);
2、判断
2.1:字符串中包含指定的字符串吗?
boolean contains(String substring);
2.2:字符串是否以指定字符串开头啊?
boolean boolean startsWith(string);
2.3:字符串是否以指定字符串结尾啊?
boolean endsWith(string);
2.4:判断字符串是否相同
boolean equals(string);//覆盖了Object中的方法,判断字符串内容是否相同。
2.5:判断字符串内容是否相同,忽略大小写。
boolean equalsIgnoreCase(string) ;
3、转换
3.1:通过构造函数可以将字符数组或者字节数组转成字符串。
3.2:可以通过字符串中的静态方法,将字符数组转成字符串。
static String copyValueOf(char[] );
static String copyValueOf(char[],int offset,int count);
static String valueOf(char[]);
static String valueOf(char[],int offset,int count);
3.3:将字符串转成数组。
char[] toCharArray();//转成字符数组。
byte[] getBytes();//可以加入编码表。转成字节数组。
3.4:将基本数据类型或者对象转成字符串。(跟用:数据+""一样)
static String valueOf(char);
static String valueOf(boolean);
static String valueOf(double);
static String valueOf(float);
static String valueOf(int);
static String valueOf(long);
static String valueOf(Object);
3.5:将字符串转成大小写。
String toLowerCase();//小写
String toUpperCase();//大写
4、替换:将字符串进行内容替换。注意:修改后变成新字符串,并不是将原字符串直接修改。
String replace(oldChar,newChar);
String replace(oldstring,newstring);
5、切割:将字符串转成字符串数组。切割方法。regex可以是字符串,可以是正则表达式
String[] split(regex);
6、子串: 获取字符串中的一部分
String substring(int start);//从start位开始,到length()-1为止.
String substring(int start,int end);//从start开始到end为止。//包含start位,不包含end位。
String substring(0,str.length());//获取整串
7、去空格,比较:
String trim();//去除字符串两端的空格
int compareTo(String);//如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值。
public static void method()
{
String s1 = "abcdcaxzcvxef";
String s2 = "Abcdcaxzcvxef";
//获取长度
show("1..."+s1.length());
//获取值(可以用字符类型)
show("2..."+s1.charAt(5));//获取角标5的字符
show("2..."+s1.indexOf(40));//获取ASK码为40的字符,没有,返回-1;
show("2..."+s1.indexOf(97,3));//从角标3的位置开始获取ASK码为97的字符
show("2..."+s1.indexOf('c'));//获取字符'c'第一次出现的位置
show("2..."+s1.indexOf('c',5));//获取字符'c'从角标5的位置后第一次出现的位置
//判断(一定要用字符串类型,不能用字符类型)
show("6..."+s1.contains("d"));//是否含有"d"
show("6..."+s1.isEmpty());//是否有内容
show("6..."+s1.startsWith("a"));//是否以"a"开头
show("6..."+s1.endsWith("f"));//是否以"f"结尾
show("6..."+s1.equalsIgnoreCase(s2));//判断字符串是否相同,不区分大小写。
}
public static void method2()
{
String s = "abcdcaxzcvxef";
char[] arr = {'a','v','d','w','d','s','q'};
show(new String(arr));//将字符数组转成字符串。
show(new String(arr,3,3));//指定数组从角标3开始,连续3个字符转成字符串
Arr(s.toCharArray());//将字符串转换成数组。
show(s.replace("a","z"));//将字符a替换为字符z
Arr(s.split("x"));//以x为切割点,分割字符串。
}
public static void method3()
{
String s = " abcdcaxzcvxef ";
char[] arr = {'a','v','d','w','d','s','q'};
show(s.trim());//去除字符串两边空格。
show(s.substring(5));//获取从角标5开始到最后的子串。
show(s.substring(2,7));//获取从角标2开始到角标7的子串,不包含角标7的元素。
show(s.toUpperCase());//把字符串全部变为大写。
show(s.toLowerCase());//把字符串全部变为小写。
show(s.trim());
}
——————————————————————————————————————————————
二、字符串缓冲区
StringBuffer:是一个容器,当数据类型和个数不确定时,而且最红变成字符串的时候使用。
特点:
- 是可变长度的。
- 缓冲区中可以存储任意类型的数据。
- 最终需要通过toString()变成字符串。
CURD:增删改查
create update read delete
增加 修改 读取 删除
1、存储
StringBuffer append(data):在缓冲区中追加数据。追加到尾部。
StringBuffer insert(index,data):在指定位置插入数据。
2、删除
StringBuffer delete(start,end);删除从start至end-1范围的元素
StringBuffer deleteCharAt(index);删除指定位置的元素
3、获取(查不到返回-1)
int indexOf(string); 返回指定子字符串在此字符串中第一次出现处的索引。
int indexOf(string,intfromIndex);从指定位置开始查找字符串
int lastIndexOf(string); 返回指定子字符串在此字符串中最右边出现处的索引。
int lastIndexOf(string,int fromIndex); 从指定的索引开始反向搜索
int length();返回缓冲区长度。String substring(int start,int end)
4、修改
StringBuffer replace(start,end,string);将start至end-1替换成string
void setCharAt(index,char);替换指定位置的字符
void setLength(len);将原字符串置为指定长度的字符串
5、反转
StringBuffer reverse();字符串反转
6、将缓冲区中指定数据存储到指定字符数组中
void getChars(int srcBegin,int srcEnd,Char[] dst,int dstBegin);
public static void main(String[] args)
{
StringBuffer sb = new StringBuffer();
//添加字符串
sb.append("java01,");
sb.insert(0,"java02,");//插入
//sb.append("java03,");
//sb.append("java04,");
//sb.append("java05,");
//sb.append("java06,");
//sb.append("java07,");
sop(sb.toString());
//删除
//sb.delete(0,sb.length());//清空StringBuffer;
sb.deleteCharAt(5);//删除角标5的字符。
//sop(sb.toString());
//改
/*
sb.replace(5,6,"3");
sop(sb);
sb.setCharAt(5,'4');
*/
sb.reverse();//反转
char[] ca = new char[15];
sb.getChars(0,sb.length(),ca,0);// 把字符串的指定子串传到字符数组里面
}
JDK1.5出现StringBuiler;
该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用。
方法和StringBuffer一样;
StringBuffer 和 StringBuilder的区别:
StringBuffer线程安全。
StringBuilder线程不安全。
单线程操作,使用StringBuilder 效率高。
多线程操作,使用StringBuffer 安全。
——————————————————————————————————————————————
三、基本数据类型包装类
基本数据类型包装类:是按照面向对象思想将基本数据类型封装成了对象。
好处:
1:可以通过对象中的属性和行为操作基本数据。
2:可以实现基本数据类型和字符串之间的转换。
数据类型 包装类byte Byte
short Short
int Integer
long Long
boolean Boolean
float Float
double Double
char Character
基本数据类型对象包装类:都有 XXX parseXXX 方法,必须是对应格式。
只有一个类型没有parse方法:Character ;
如:
int i = Integet.parseInt("123");
double d = Double.parseDouble("12.23")
Integer对象
数字格式的字符串转成基本数据类型的方法:
1:将该字符串封装成了Integer对象,并调用对象的方法intValue();
2:使用Integer.parseInt(numstring):不用建立对象,直接类名调用;
将基本类型转成字符串:
- Integer中的静态方法 String toString(int);
- int+"";
转成二进制:toBinaryString
转成八进制:toOctalString
转成十六进制:toHexString
toString(int num,int radix);
将其他进制转换十进制:
parseInt(string,radix); //将给定的数转成指定的基数进制;
在jdk1.5版本后,对基本数据类型对象包装类进行升级。
在升级中,使用基本数据类型对象包装类可以像使用基本数据类型一样,进行运算。
Integer i = newInteger(4); //1.5版本之前的写法;
Integer i = 4; //自动装箱,1.5版本后的写法;
i = i + 5;
//i对象是不能直接和5相加的,其实底层先将i转成int类型,在和5相加。而转成int类型的操作是隐式的。自动拆箱:拆箱的原理就是i.intValue();i+5运算完是一个int整数。如何赋值给引用类型i呢?其实有对结果进行装箱。
Integer a= 127;
Integer b =127;
a==b?==>true
Integer c= 128;
Integer d =128;
c==d?==>false;
//在装箱时,如果数值在byte范围之内,那么数值相同,不会产生新的对象,也就是说多个数值相同的引用指向的是同一个对象。
public void test1()
{
//加上泛型
List<Integer> l = new ArrayList<Integer>();
//自动装箱,把int基本数据类型装箱成Integer包装类
l.add(1);
l.add(2);
l.add(3);
Iterator<Integer> it = l.iterator();
while(it.hasNext())
{
//自动拆箱,把Integer包装类拆箱成int基本数据类型
int x = it.next();
System.out.println(x);
}
}