内容有string的面试题,string的操作,string的升级类
最常见的笔试题:
1,比较是否相等
String str1 = "hello";
String str2 = new String("hello");
String str3 = str2;
System.out.println(str1==str2);System.out.println(str3==str2);System.out.println(str3==str1);
问输出的结果
答案是
false true false
解释一下其中的原因:
String str1 = "hello";
是将一个字符串的堆空间的地址给str,此时的代码中,只在堆内存中开辟了一块空间
String str2 = new String("hello");
使用构造方法进行对象实例化的时候,由于内部的字符串属于匿名对象的原因,所以将产生两块堆内存空间,其中 有一块将成为垃圾。
string的操作:
public class String_do {
//转换,去除空格,比较
public static void method_7(){
String s="Hello Java";
sop("原字符串为:"+s);
sop(s.toUpperCase()); //转换成大写
sop(s.toLowerCase()); //转换成小写
sop(s.trim()); //去空格
//s.toUpperCase();
}
//子串 获取字符串中的一部分
public static void method_sub(){
String s="abcdefghijklmnopqrstuvwxyz";
sop("原字符串为");
sop(s);
String s1=s.substring(9); //从指定位置到结尾。如果角标不存在,则会出现字符串角标越界异常。
sop("获取的子串s1为:");
sop(s1);
String s2=s.substring(7,20); //包含头,不包含尾。 获取整个字符串:s.substring(0,s.length());
sop("获取的子串s2为:");
sop(s2);
}
//切割
public static void method_split(){
String s="zhangsan,lisi,wangwu";
String[] arr=s.split("a");
sop("原字符串为:");
sop(s);
sop("切割后的字符串为:");
for(int x=0;x<arr.length;x++)
{
System.out.print(arr[x]+" ");
}
System.out.println();
String qiege="zhaang shanag,liashi,haangz";
String[]aee=qiege.split("a");
for (int i = 0; i < aee.length; i++) {
System.out.print(aee[i]+" ");
}
}
//判断
public static void method_is(){
String str="ArrayDemo.java";
String str1="arraydemo.java";
//判断文件名称是否以Array开头
sop(str.startsWith("Array"));
//判断文件名称是否是以.java结尾
sop(str.endsWith(".java"));
//判断文件名称中是否包含Demo
sop(str.contains("Demo"));
//判断两个文件名是否相同(区分大小写)
sop(str.equals(str1));
//判断两个文件名是否相同(不区分大小写)
sop(str.equalsIgnoreCase(str1));
}
//获取
public static void method_get(){
String str="abcdeakpf";
sop("字符串为:"+str);
//长度
sop("字符串的长度为:"+str.length());
//根据索引获取字符
sop("角标为四的位置上的字符为:"+str.charAt(4));//当访问到字符串中不存在的角标时,会发生 StringIndexOutOfBoundsException异常
//根据字符获取索引
sop("从角标为3的位置开始往后索引 a 出现的位置为:"+str.indexOf('a',3));//如果没有找到返回-1
//反向索引一个字符出现的位置
sop("从字符串右面开始索引第一个a出现的位置为:"+str.lastIndexOf("a"));
}
//转换
public static void method_trans(){
char[] arr={'a','b','c','d','e','f','g','h'};
String str="jkasdhavsgjv";
char[] a=str.toCharArray();
//字符串操作
System.out.print("将字符串转换为字符数组为:[");
for(int x=0;x<a.length;x++)
{
if(x<a.length-1)
System.out.print(a[x]+",");
else
System.out.print("]");
}
System.out.println();
//字符数组操作
System.out.print("字符数组为:[");
for(int x=0;x<arr.length;x++)
{
if(x<arr.length-1)
System.out.print(arr[x]+",");
else
System.out.print("]");
}
System.out.println();
String s=new String(arr);
sop("转换成字符串为:"+s);
//获取从角标为1的位置的字符开始三个字符
String s1=new String(arr,1,3);
sop("从角标为1的位置的字符开始三个字符组成的字符串为:"+s1);
}
//替换
public static void method_replace(){
String s=" hello java ";
String s1=s.replace('a', 'n'); //如果要替换的字符不存在,则返回的还是原字符串
sop("原来的字符串为:"+s);
sop("替换字符后的字符串为:"+s1);
}
//主函数
public static void main(String[] args) {
// method_get();
// //method_is();
// method_split();
method_replace();
// method_sub();
// method_7();
// method_trans();
}
public static void sop(Object obj){
System.out.println(obj);
}
equals( )和==的区别
equals是String的方法,源代码如下: public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
可以看出equals方法也是使用==来实现判断的,但是他们的区别是,equals是判断值是否一样,忽略存储地址是否来自同一个空间,
String s4="11";
String s5=s4;
String s6=new String("11");
System.out.println(s4==s5);//输出结果true
System.out.println(s4.equals(s5));//输出结果true
System.out.println(s4==s6);//输出结果false
System.out.println(s4.equals(s6));//输出结果true
String,StringBuilder以及StringBuffer的区别
1,String 是常量,定义的值是不能修改的,表面上是可以修改,但实则是新增空间并且重新定义值,如果经常进行这种操作会导致参数很多垃圾,浪费资源,然而stringBuilder和StringBuffer是不会的。2,StringBuffer和StringBuilder是String的升级类,功能跟加强大
3,StringBuffer 是线程安全的,StringBuilder不支持线程安全,但是它的速度会比较快,
4,执行速度方面 StringBuilder > StringBuffer > String
String str1 = "hello";
String str2 =
new String("hello");
String str3 = str2;
System.
out.println("str1 == str2 --> " + (str1 == str2)); // false
System.
out.println("str1 == str3 --> " + (str1 == str3)); // false
System.
out.println("str2 == str3 --> " + (str2 == str3)); // true