java中String的常用方法
java中String的常用方法
java中String的常用方法
1、length() 字符串的长度
例:char chars[]={'a','b'.'c'};
String s=new String(chars);
int len=s.length();
2、charAt() 截取一个字符
例:char ch;
ch="abc".charAt(1); 返回'b'
3、 getChars() 截取多个字符
void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)
sourceStart指定了子串开始字符的下标,sourceEnd指定了子串结束后的下一个字符的下标。因此, 子串包含从sourceStart到sourceEnd-1的字符。接收字符的数组由target指定,target中开始复制子串的下标值是targetStart。
例:String s="this is a demo of the getChars method.";
char buf[]=new char[20];
s.getChars(10,14,buf,0);
4、getBytes()
替代getChars()的一种方法是将字符存储在字节数组中,该方法即getBytes()。
5、toCharArray()
6、equals()和equalsIgnoreCase() 比较两个字符串
7、regionMatches() 用于比较一个字符串中特定区域与另一特定区域,它有一个重载的形式允许在比较中忽略大小写。
boolean regionMatches(int startIndex,String str2,int str2StartIndex,int numChars)
boolean regionMatches(boolean ignoreCase,int startIndex,String str2,int str2StartIndex,int numChars)
8、startsWith()和endsWith() startsWith()方法决定是否以特定字符串开始,endWith()方法决定是否以特定字符串结束
9、equals()和==
equals()方法比较字符串对象中的字符,==运算符比较两个对象是否引用同一实例。
例:String s1="Hello";
String s2=new String(s1);
s1.eauals(s2); //true
s1==s2;//false
10、compareTo()和compareToIgnoreCase() 比较字符串
11、indexOf()和lastIndexOf()
indexOf() 查找字符或者子串第一次出现的地方。
lastIndexOf() 查找字符或者子串是后一次出现的地方。
12、substring() 它有两种形式,第一种是:String substring(int startIndex)
第二种是:String substring(int startIndex,int endIndex)
13、concat() 连接两个字符串
14 、replace() 替换
它有两种形式,第一种形式用一个字符在调用字符串中所有出现某个字符的地方进行替换,形式如下:
String replace(char original,char replacement)
例如:String s="Hello".replace('l','w');
第二种形式是用一个字符序列替换另一个字符序列,形式如下:
String replace(CharSequence original,CharSequence replacement)
15、trim() 去掉起始和结尾的空格
16、valueOf() 转换为字符串
17、toLowerCase() 转换为小写
18、toUpperCase() 转换为大写
19、StringBuffer构造函数
StringBuffer定义了三个构造函数:
StringBuffer()
StringBuffer(int size)
StringBuffer(String str)
StringBuffer(CharSequence chars)
(1)、length()和capacity() 一个StringBuffer当前长度可通过length()方法得到,而整个可分配空间通过capacity()方法得到。
(2)、ensureCapacity() 设置缓冲区的大小
void ensureCapacity(int capacity)
(3)、setLength() 设置缓冲区的长度
void setLength(int len)
(4)、charAt()和setCharAt()
char charAt(int where)
void setCharAt(int where,char ch)
(5)、getChars()
void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)
(6)、append() 可把任何类型数据的字符串表示连接到调用的StringBuffer对象的末尾。
例:int a=42;
StringBuffer sb=new StringBuffer(40);
String s=sb.append("a=").append(a).append("!").toString();
(7)、insert() 插入字符串
StringBuffer insert(int index,String str)
StringBuffer insert(int index,char ch)
StringBuffer insert(int index,Object obj)
index指定将字符串插入到StringBuffer对象中的位置的下标。
(8)、reverse() 颠倒StringBuffer对象中的字符
StringBuffer reverse()
(9)、delete()和deleteCharAt() 删除字符
StringBuffer delete(int startIndex,int endIndex)
StringBuffer deleteCharAt(int loc)
(10)、replace() 替换
StringBuffer replace(int startIndex,int endIndex,String str)
(11)、substring() 截取子串
String substring(int startIndex)
String substring(int startIndex,int endIndex)
例子:
//String所给出的方法均可以直接调用
public class Test{
public static void main(String[] args){
String s = "Welcome to Java World!";
String s1 = " sun java ";
System.out.println(s.startsWith("Welcome"));//字符串以Welcome开头
System.out.println(s.endsWith("World"));//字符串以World结尾
String sL = s.toLowerCase();//全部转换成小写
String sU = s.toUpperCase();//全部转换成大写
System.out.println(sL);
System.out.println(sU);
String b = s.substring(11);//从第十一位开始
System.out.println(b);
String c = s.substring(8,11);//从第八位开始在第十一位结束
System.out.println(c);
String d = s1.trim();//去掉首尾的空格
System.out.println(d);
String s2 = "我是程序员,我在学java";
String e = s2.replace("我","你");
System.out.println(e);
int f = 5;
String s3 = String.valueOf(f);
System.out.println(s3);
String s4 = "我是,这的,大王";
String[] g = s4.split(",");
System.out.println(g[0]);
当把字符串转换成基本类型时,例如,int,integer.praseInt(String s)
当把基本类型转换成字符串时,例如,static String valueOf(int i)
数组
Java数组声明、创建、初始化
一维数组的声明方式:
type var[]; 或type[] var;
声明数组时不能指定其长度(数组中元素的个数),
Java中使用关键字new创建数组对象,格式为:
数组名 = new 数组元素的类型 [数组元素的个数]
实例:
TestNew.java:
程序代码:
public class TestNew
{
public static void main(String args[]) {
int[] s ;
int i ;
s = new int[5] ;
for(i = 0 ; i < 5 ; i++) {
s[i] = i ;
}
for(i = 4 ; i >= 0 ; i--) {
System.out.println("" + s[i]) ;
}
}
}
初始化:
1.动态初始化:数组定义与为数组分配空间和赋值的操作分开进行;
2.静态初始化:在定义数字的同时就为数组元素分配空间并赋值;
3.默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐士初始化。
实例:
TestD.java(动态):
程序代码:
public class TestD
{
public static void main(String args[]) {
int a[] ;
a = new int[3] ;
a[0] = 0 ;
a[1] = 1 ;
a[2] = 2 ;
Date days[] ;
days = new Date[3] ;
days[0] = new Date(2008,4,5) ;
days[1] = new Date(2008,2,31) ;
days[2] = new Date(2008,4,4) ;
}
}
class Date
{
int year,month,day ;
Date(int year ,int month ,int day) {
this.year = year ;
this.month = month ;
this.day = day ;
}
}
TestS.java(静态):
程序代码:
public class TestS
{
public static void main(String args[]) {
int a[] = {0,1,2} ;
Time times [] = {new Time(19,42,42),new Time(1,23,54),new Time(5,3,2)} ;
}
}
class Time
{
int hour,min,sec ;
Time(int hour ,int min ,int sec) {
this.hour = hour ;
this.min = min ;
this.sec = sec ;
}
}
TestDefault.java(默认):
程序代码:
public class TestDefault
{
public static void main(String args[]) {
int a [] = new int [5] ;
System.out.println("" + a[3]) ;
}
}
Char与Byte
java的char表示为一个字符,比如汉字中的一个 ‘汉’,那就是一个字符,意思是符号的意思
byte表示为一个字节 汉字可能是有几个字节表示而成,看具体的编码
String是字符串,那应该是字符的串 ,比如‘汉’ 那长度就为1 ,字节数就是2,对于英文
要看是什么编码的,
ANSI 字符串 在内存中,如果“字符”是以 ANSI 编码形式存在的,
一个字符可能使用一个字节或多个字节来表示,那么我们
称这种字符串为 ANSI 字符串或者多字节字符串。 "中文123"(占7字节)
UNICODE 字符串 在内存中,如果“字符”是以在 UNICODE 中的序号存在的,
那么我们称这种字符串为 UNICODE 字符串或者宽字节字符串。 "中文123"(占10字节)
进化:ASCII --> gb2312 -- >gbk -->18030
String string = "中国123";
byte [] bytes = string.getBytes("GB2312");
for (int i = 0 ; i< bytes.length ; i++){
System.out.println(bytes[i]);
}
中 国 1 2 3
-42-48 -71-6 49 50 51
准确来说是二进制
把上面的程序换成UTF-8 由于UTF-8的字符集编码是对Unicode字符集,是一种不定字节
的编码技术,可能是1,2,3个
中 国 1 2 3
-28-72-83 -27-101-67 49 50 51
准确来说是二进制
刚刚听到一首比较好听的歌曲 名字叫思觉失调,结果有道显示是一种精神病名称,呵呵
如果用GBK拿到的字节数组,再转成字符串的话,会出乱码
有个问题。不是说java的虚拟机都是unicode的吗?为啥会出现英文字符会是一个字节
因为内存中,如果是unicode类型的,那应该是2个字节呀
如果 java 的源程序编码与当前默认 ANSI 编码不符,则在编译的时候,需要指明一下源程序的编码。比如:
E:\>javac -encoding BIG5 Hello.java
以上需要注意区分源程序的编码与 I/O 操作的编码,前者是在编译时起作用,后者是在运行时起作用。
发现一个奇怪的特性
如果不适用myeclipse的时候 直接在cmd下运行java程序
System.getProperty("file.encoding") 读到的机器的编码是 GB18030
但是如果使用myeclipse的话,那就是UTF-8,不知这个是否与myeclipse的编码有关
这是因为
eclipse使用的是内置的编译器,并不能添加参数,
如果要为javac添加参数则建议使用ANT来编译。
不过这并非出现乱码的原因,因为eclipse可以为
每个JAVA文件设置字符编码类型,而内置编译器会根据此设置来编译JAVA文件。
我 unicode是6211
utf-8的话是 -26 -120 -111
6211
01100010 00010001
对应的utf-8的话,已经无从对应
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
所以可知 01100010 00010001是unicode字符集,没有采用任何的编码
6211是‘我’字在unicode中的序号
char wo = ox6C49
System.out.println(wo)
结果为 我
这其实也是说,只要你正确的读入了“汉”这个字,那么它在内存中的表示形式
一定是0x6C49,没有任何其他的值能代表这个字
所谓的内存就是指在JVM中,在内存中,在你的代码里声明的每一个char,
String类型的变量中