java.lang.string,java.lang.String的常用的方法
老铁们,大家好,相信还有很多朋友对于java.lang.string和java.lang.String的常用的方法的相关问题不太懂,没关系,今天就由我来为大家分享分享java.lang.string以及java.lang.String的常用的方法的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
java.lang.String的常用的方法
public boolean equals(Object obj)
判断当前字符串与obj的内容是否相同
public boolean equalsIgnoreCase(String str)
判断当前字符串与str的内容是否相同,这个方法不会区分大小写字母的区别
public int length()
返回字符串的长度,即字符的总个数
public String trim()
去掉字符串两端的空白,包括“空格,\t,\n,\r等控制符”
public String substring(int start,int end)
根据开始和结束的位置,返回当前String的子字符串
public String substring(int start)
从开始位置开始到字符串结束,返回子字符串
public char charAt(int index)
返回指定位置的字符
public int indexOf(String str)
返回子字符串在当前字符串的位置,如果当前字符串不包含子字符串就返回-1
public String concat(String str)
返回一个字符串,内容是当前字符串与str连接而成的。
字符串连接可以简化写为String str= str1+ str2;结果与concat方法相同
public boolean startsWith(String str)
判断当前字符串,是否以str开头
public boolean endsWith(String str)
判断当前字符串,是否以str结尾
========================================================
String str= I am+ Lingo!;
这样可以获得一个内容为I am Lingo!的字符串,在java里可以通过这种简单的方式实现字符串的连接
。这里需要注意的是,这个过程实际上生成了三个String对象,I am和Lingo!先被生成,然后用他
们再创建一个String对象str,str的内容是两者的总和。所以,使用+进行字符串连接的时候会很耗费资
源,这个时候就需要使用另一个类StringBuffer,它的内容是可以修改的,实际上jvm内部编译之后,“
用+进行字符串连接”也是用StringBuffer实现的。
String str= I am+ Lingo!;
String str= new StringBuffer(I am).append(Lingo!).toString();
上边两个是等价的。
StringBuffer类还提供了许多便利的方法,对字符串进行操作
public void reverse()
反转字符串
public void append(...)
在字符串最后添加信息
public void insert(int start,...)
在索引位置插入信息
public void delete(int start,int end)
删除指定范围的内容
split与replaceAll方法
public String[] split(String regex)
根据分隔符,把字符串切割成字符串数组
public String replace(String regex,String str)
把字符串中所有与regex匹配的部分都替换成str
regex代表“正则表达式”,如果你并不清楚它的原理,很可能会出现问题。
1,3,4.split(,)返回的结果是{1,3,4}这三个字符串组成的数组
1|3|4.split(|)返回的结果却是{1,|,3,|,4}五个字符串组成的数组
这个问题的原因是由于在“正则表达式”中,“|”是一个有特殊含义的字符,表示“或”,直接使用
split(|)就会把每个字符分开了。如果希望使用|作为分隔符,就需要使用转义字符。
1|3|4.split(\\|)返回的结果就是{1,3,4}三个字符串组成的数组了
“\|”是正则表达式中代表|的专一字符,但因为在String中“\”不能单独出现,还需要进行一次转义
,就变成了“\\|”这种形式。
replaceAll(String regex,String str)也是这种情况
关于java中String类!!!
ava字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生。
一、从根本上认识java.lang.String类和String池
首先,我建议先看看String类的源码实现,这是从本质上认识String类的根本出发点。从中可以看到:
1、String类是final的,不可被继承。public final class String。
2、String类是的本质是字符数组char[],并且其值不可改变。private final char value[];
然后打开String类的API文档,可以发现:
3、String类对象有个特殊的创建的方式,就是直接指定比如String x="abc","abc"就表示一个字符串对象。而x是"abc"对象的地址,也叫
做"abc"对象的引用。
4、String对象可以通过“+”串联。串联后会生成新的字符串。也可以通过concat()来串联,这个后面会讲述。
6、Java运行时会维护一个String Pool(String池),JavaDoc翻译很模糊“字符串缓冲区”。String池用来存放运行时中产生的各种字符串,
并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区。
5、创建字符串的方式很多,归纳起来有三类:
其一,使用new关键字创建字符串,比如String s1= new String("abc");
其二,直接指定。比如String s2="abc";
其三,使用串联生成新的字符串。比如String s3="ab"+"c";
二、String对象的创建
String对象的创建也很讲究,关键是要明白其原理。
原理1:当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,
如果不存在,则在池中创建一个字符串s,否则,不在池中添加。
原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
原理3:使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢
了!但绝不会在堆栈区再去创建该String对象。
原理4:使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。
另外,String的intern()方法是一个本地方法,定义为public native String intern(); intern()方法的价值在于让开发者能将注意力集中到
String池上。当调用 intern方法时,如果池已经包含一个等于此 String对象的字符串(该对象由 equals(Object)方法确定),则返回池
中的字符串。否则,将此 String对象添加到池中,并且返回此 String对象的引用。
三、不可变类
不可改变的字符串具有一个很大的优点:编译器可以把字符串设置为共享。
不可变类String有一个重要的优点-它们不会被共享引用。
是这样的,JAVA为了提高效率,所以对于String类型进行了特别的处理---为string类型提供了串池
定义一个string类型的变量有两种方式:
string name="tom";
string name=new string("tom")
使用第一种方式的时候,就使用了串池,
使用第二中方式的时候,就是一种普通的声明对象的方式
如果你使用了第一种方式,那么当你在声明一个内容也是"tom"的string时,它将使用串池里原来的那个内存,而不会重新分配内存,也就是说,string saname="tom",将会指向同一块内存
另外关于string类型是不可改变的问题:
string类型是不可改变的,也就是说,当你想改变一个string对象的时候,比如name="madding"
那么虚拟机不会改变原来的对象,而是生成一个新的string对象,然后让name去指向它,如果原来的那个"tom"没有任何对象去引用它,虚拟机的垃圾回收机制将接收它。
据说这样可以提高效率!!!
运算符 !不能应用于 java.lang.String,java.lang
看代码,错误出现在if那一行里,但是请让我先不说为什么。
你看完下面的例子,你思考下,就知道为什么了
publicclassBiJiao{
publicstaticvoidmain(String[]args){
//比较基本数据类别,比如intbyteshort..等使用两个==表示等于,使用!=表示不等于
intx=10;
inty=10;
if(x==y){
System.out.println(x+"和"+y+"相等");
}
chara='A';
charb='B';
if(a!=b){
System.out.println(a+"和"+b+"不等于");
}
//比较String这种非基本数据类型的对象,应该调用该对象的equals方法
Strings1="张三";
Strings2="张三";
if(s1.equals(s2)){
System.out.println(s1+"和"+s2+"相等");
}
s2="王五";
if(!s1.equals(s2)){
System.out.println(s1+"和"+s2+"不相等");
}
//下面建一个Person类的两个实例,就重写了该类的equals的方法
Personp1=newPerson("张三",20);
Personp2=newPerson("张三",20);
if(p1.equals(p2)){
System.out.println("这是一个人啊");
}else{
System.out.println("这不是一个人啊");
}
}
}
classPerson{
Stringname;
intage;
publicPerson(Stringname,intage){
this.name=name;
this.age=age;
}
//重写equals方法.大概逻辑就是比较对象两者的名字一样且年龄一样就是同一人
publicbooleanequals(Objectobj){
if(this==obj)
returntrue;
if(obj==null)
returnfalse;
if(getClass()!=obj.getClass())
returnfalse;
Personother=(Person)obj;
if(age!=other.age)
returnfalse;
if(name==null){
if(other.name!=null)
returnfalse;
}elseif(!name.equals(other.name))
returnfalse;
returntrue;
}
}
你的错误,是想用一个等号,去比较两个字符串String是否相等,怎么修改,你看上面的例子
//用==无法判断字符串内容是否相等
if(s1==s2){
System.out.println("相等");
}else{
System.out.println("不等");
}
关于本次java.lang.string和java.lang.String的常用的方法的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。