comparetoignorecase() compare and
大家好,今天来为大家解答comparetoignorecase()这个问题的一些问题点,包括compare and也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
compareto java
compareto java是什么,让我们一起了解下?
compareto java是从数字上比较两个Double对象。在应用到基本double值时,通过此方法进行的比较与通过Java语言的数值比较运算符()进行的比较。
一.在java中compareto的详细方法介绍如下:
1、返回参与比较的前后两个字符串的asc码的差值,如果两个字符串首字母不同,则该方法返回首字母的asc码的差值。
Stringa1="a"; Stringa2="c"; System.out.println(a1.compareTo(a2));//结果为-2
2、即参与比较的两个字符串如果首字符相同,则比较下一个字符,直到有不同的为止,返回该不同的字符的asc码差值。
Stringa1="aa"; Stringa2="ad"; System.out.println(a1.compareTo(a2));//结果为-3
3、如果两个字符串不一样长,可以参与比较的字符又完全一样,则返回两个字符串的长度差值。
Stringa1="aa"; Stringa2="aa12345678"; System.out.println(a1.compareTo(a2));//结果为-8
4、返回为正数表示a1>a2,返回为负数表示a1。
5、数字类型不能用compareTo,nt跟int的比较不能用compareTo方法,直接用大于(>)小于。
intnum1=4;intnum2=5; num1.compareTo(num2);//CannotinvokecompareTo(int)ontheprimitivetypeint
你可以先把你的int型变量转换成String再进行比较。
intnum1=4;intnum2=5;//parseinttoString System.out.println((num1+"").compareTo(num2+""));//-1 System.out.println(newInteger(num1).toString().compareTo(newInteger(num2).toString()));//-1 System.out.println(String.valueOf(num1).compareTo(String.valueOf(num2)));//-1
6、compareToIgnoreCase忽略大小写。
不考虑大小写,按字典顺序比较两个字符串。此方法返回一个整数,它的正负号是调用 compareTo的正负号,调用时使用了字符串的规范化版本,其大小写差异已通过对每个字符调用 Character.toLowerCase(Character.toUpperCase(character))得以消除。
注意,此方法不考虑语言环境,因此可能在某些特定的语言环境中产生不理想的排序。java.text包提供 Collators来完成语言环境敏感的排序。
7、int型可以直接比较,所以没有用到compareTo比较,如果声明的是Date、String、Integer、或者其他的,可以直接使用compareTo比较。
Integern1=5; Integern2=6; System.out.println(n1.compareTo(n2));//-1
二. Comparable接口中的compareTo,compareTo方法内必须做非空判断(规范问题),当然int类型就不用了。
注意事项:
1、模型必须实现Comparable接口。
2、Collection.sort(list)会自动调用compareTo,如果没有这句,list是不会排序的,也不会调用compareTo方法。
3、如果是数组则用Arrays.sort(a)方法注意要非空判断,这里实例就不判断了。
jave语言的string字符串有哪些特点
以主流的 JDK版本 1.8来说,String内部实际存储结构为 char数组,源码如下:
publicfinalclassString
implementsjava.io.Serializable,Comparable<String>,CharSequence{
//用于存储字符串的值privatefinalcharvalue[];
//缓存字符串的hashcodeprivateinthash;//Defaultto0
//......其他内容}
String源码中包含下面几个重要的方法。
1.多构造方法
String字符串有以下 4个重要的构造方法:
//String为参数的构造方法publicString(Stringoriginal){
this.value=original.value;
this.hash=original.hash;
}//char[]为参数构造方法publicString(charvalue[]){
this.value=Arrays.copyOf(value,value.length);
}//StringBuffer为参数的构造方法publicString(StringBufferbuffer){
synchronized(buffer){
this.value=Arrays.copyOf(buffer.getValue(),buffer.length());
}
}//StringBuilder为参数的构造方法publicString(StringBuilderbuilder){
this.value=Arrays.copyOf(builder.getValue(),builder.length());
}
其中,比较容易被我们忽略的是以 StringBuffer和 StringBuilder为参数的构造函数,因为这三种数据类型,我们通常都是单独使用的,所以这个小细节我们需要特别留意一下。
2. equals()比较两个字符串是否相等,源码如下:
publicbooleanequals(ObjectanObject){
//对象引用相同直接返回trueif(this==anObject){
returntrue;
}
//判断需要对比的值是否为String类型,如果不是则直接返回falseif(anObjectinstanceofString){
StringanotherString=(String)anObject;
intn=value.length;
if(n==anotherString.value.length){
//把两个字符串都转换为char数组对比charv1[]=value;
charv2[]=anotherString.value;
inti=0;
//循环比对两个字符串的每一个字符while(n--!=0){
//如果其中有一个字符不相等就truefalse,否则继续对比if(v1[i]!=v2[i])
returnfalse;
i++;
}
returntrue;
}
}
returnfalse;
}
String类型重写了 Object中的 equals()方法,equals()方法需要传递一个 Object类型的参数值,在比较时会先通过 instanceof判断是否为 String类型,如果不是则会直接返回 false,instanceof的使用如下:
ObjectoString="123";
ObjectoInt=123;
System.out.println(oStringinstanceofString);//返回trueSystem.out.println(oIntinstanceofString);//返回false
当判断参数为 String类型之后,会循环对比两个字符串中的每一个字符,当所有字符都相等时返回true,否则则返回 false。
还有一个和equals()比较类似的方法 equalsIgnoreCase(),它是用于忽略字符串的大小写之后进行字符串对比。
3. compareTo()比较两个字符串
compareTo()方法用于比较两个字符串,返回的结果为int类型的值,源码如下:
publicintcompareTo(StringanotherString){
intlen1=value.length;
intlen2=anotherString.value.length;
//获取到两个字符串长度最短的那个int值intlim=Math.min(len1,len2);
charv1[]=value;
charv2[]=anotherString.value;
intk=0;
//对比每一个字符while(k<lim){
charc1=v1[k];
charc2=v2[k];
if(c1!=c2){
//有字符不相等就返回差值returnc1-c2;
}
k++;
}
returnlen1-len2;
}
从源码中可以看出,compareTo()方法会循环对比所有的字符,当两个字符串中有任意一个字符不相同时,则 returnchar1-char2。比如,两个字符串分别存储的是 1和 2,返回的值是-1;如果存储的是 1和 1,则返回的值是 0,如果存储的是 2和 1,则返回的值是 1。
还有一个和compareTo()比较类似的方法 compareToIgnoreCase(),用于忽略大小写后比较两个字符串。
可以看出compareTo()方法和equals()方法都是用于比较两个字符串的,但它们有两点不同:
equals()可以接收一个 Object类型的参数,而 compareTo()只能接收一个String类型的参数;
equals()返回值为Boolean,而compareTo()的返回值则为int。
它们都可以用于两个字符串的比较,当equals()方法返回true时,或者是compareTo()方法返回 0时,则表示两个字符串完全相同。
4.其他重要方法
indexOf():查询字符串首次出现的下标位置
lastIndexOf():查询字符串最后出现的下标位置
contains():查询字符串中是否包含另一个字符串
toLowerCase():把字符串全部转换成小写
toUpperCase():把字符串全部转换成大写
length():查询字符串的长度
trim():去掉字符串首尾空格
replace():替换字符串中的某些字符
split():把字符串分割并返回字符串数组
join():把字符串数组转为字符串
知识扩展
1.==和equals的区别
==对于基本数据类型来说,是用于比较“值”是否相等的;而对于引用类型来说,是用于比较引用地址是否相同的。
查看源码我们可以知道 Object中也有equals()方法,源码如下:
publicbooleanequals(Objectobj){
return(this==obj);
}
可以看出,Object中的 equals()方法其实就是==,而 String重写了 equals()方法把它修改成比较两个字符串的值是否相等。
publicbooleanequals(ObjectanObject){
//对象引用相同直接返回trueif(this==anObject){
returntrue;
}
//判断需要对比的值是否为String类型,如果不是则直接返回falseif(anObjectinstanceofString){
StringanotherString=(String)anObject;
intn=value.length;
if(n==anotherString.value.length){
//把两个字符串都转换为char数组对比charv1[]=value;
charv2[]=anotherString.value;
inti=0;
//循环比对两个字符串的每一个字符while(n--!=0){
//如果其中有一个字符不相等就truefalse,否则继续对比if(v1[i]!=v2[i])
returnfalse;
i++;
}
returntrue;
}
}
returnfalse;
}
2.final修饰的好处
从String类的源码我们可以看出String是被final修饰的不可继承类,源码如下:
publicfinalclassString implementsjava.io.Serializable,Comparable<String>,CharSequence{//......}
那这样设计有什么好处呢?他会更倾向于使用 final,因为它能够缓存结果,当你在传参时不需要考虑谁会修改它的值;如果是可变类的话,则有可能需要重新拷贝出来一个新值进行传参,这样在性能上就会有一定的损失。
String类设计成不可变的另一个原因是安全,当你在调用其他方法时,比如调用一些系统级操作指令之前,可能会有一系列校验,如果是可变类的话,可能在你校验过后,它的内部的值又被改变了,这样有可能会引起严重的系统崩溃问题,这是迫使 String类设计成不可变类的一个重要原因。
总结来说,使用 final修饰的第一个好处是安全;第二个好处是高效,以 JVM中的字符串常量池来举例,如下两个变量:
Strings1="java";
Strings2="java";
只有字符串是不可变时,我们才能实现字符串常量池,字符串常量池可以为我们缓存字符串,提高程序的运行效率,如下图所示:
试想一下如果 String是可变的,那当 s1的值修改之后,s2的值也跟着改变了,这样就和我们预期的结果不相符了,因此也就没有办法实现字符串常量池的功能了。
3.String和StringBuilder、StringBuffer的区别
因为 String类型是不可变的,所以在字符串拼接的时候如果使用 String的话性能会很低,因此我们就需要使用另一个数据类型 StringBuffer,它提供了 append和 insert方法可用于字符串的拼接,它使用 synchronized来保证线程安全,如下源码所示:
@OverridepublicsynchronizedStringBufferappend(Objectobj){
toStringCache=null;
super.append(String.valueOf(obj));
returnthis;
}
@OverridepublicsynchronizedStringBufferappend(Stringstr){
toStringCache=null;
super.append(str);
returnthis;
}
因为它使用了 synchronized来保证线程安全,所以性能不是很高,于是在 JDK 1.5就有了StringBuilder,它同样提供了append和insert的拼接方法,但它没有使用 synchronized来修饰,因此在性能上要优于 StringBuffer,所以在非并发操作的环境下可使用 StringBuilder来进行字符串拼接。
4.String和JVM
String常见的创建方式有两种,new String()的方式和直接赋值的方式,直接赋值的方式会先去字符串常量池中查找是否已经有此值,如果有则把引用地址直接指向此值,否则会先在常量池中创建,然后再把引用指向此值;而 new String()的方式一定会先在堆上创建一个字符串对象,然后再去常量池中查询此字符串的值是否已经存在,如果不存在会先在常量池中创建此字符串,然后把引用的值指向此字符串,如下代码所示:
Strings1=newString("Java");
Strings2=s1.intern();
Strings3="Java";
System.out.println(s1==s2);//falseSystem.out.println(s2==s3);//true
它们在 JVM存储的位置,如下图所示:
除此之外编译器还会对String字符串做一些优化,例如以下代码:
Strings1="Ja"+"va";
Strings2="Java";
System.out.println(s1==s2);
虽然s1拼接了多个字符串,但对比的结果却是true,我们使用反编译工具,看到的结果如下:
Compiledfrom"StringExample.java"publicclasscom.lagou.interview.StringExample{
publiccom.lagou.interview.StringExample();
Code:
0:aload_0
1:invokespecial#1//Methodjava/lang/Object."<init>":()V4:returnLineNumberTable:
line3:0publicstaticvoidmain(java.lang.String[]);
Code:
0:ldc#2//StringJava2:astore_1
3:ldc#2//StringJava5:astore_2
6:getstatic#3//Fieldjava/lang/System.out:Ljava/io/PrintStream;9:aload_1
10:aload_2
11:if_acmpne1814:iconst_1
15:goto1918:iconst_0
19:invokevirtual#4//Methodjava/io/PrintStream.println:(Z)V22:returnLineNumberTable:
line5:0line6:3line7:6line8:22}
从编译代码#2可以看出,代码"Ja"+"va"被直接编译成了"Java",因此 s1==s2的结果才是 true,这就是编译器对字符串优化的结果。
java ArrayList数组中如何插入一个元素
具体方法如下:
java ArrayList数组中插入一个元素具体指令如下:
import java.util.ArrayList;
public static void main(String[] args){
ArrayList list= new ArrayList();
list.add(0);//插入第一个元素
list.add(1);
System.out.println(list);//打印list数组
System.out.println(list)}}
扩展资料:
集合类存放于java.util包中。集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
集合类型主要有3种:set(集)、list(列表)和map(映射)。集合接口分为:Collection和Map,list、set实现了Collection接口。
参考资料:百度百科-java集合类
关于comparetoignorecase()到此分享完毕,希望能帮助到您。