面试题1:
String s = new String("hello");和String s = "hello";的区别?
有。
前者会创建2个对象(首先看常量池有没有该字符常量:有,则创建1个对象,没有则创建2个对象)。
后者会创建1个对象(首先看常量池有没有该字符常量:有,则创建0个对象,没有则创建1个对象)。
* 注意:
* 字符串内容为空和字符串对象为空。
* String s = "";//内容为空
* String s= null;//对象为空
面试题2:
/*
* 看程序写结果
*
* 字符串如果是变量相加,先开空间,在拼接。
* 字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。
*/
public class StringDemo4 {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
System.out.println(s3==s1+s2);//false
System.out.println(s3.equals((s1+s2)));//true
System.out.println(s3=="hello"+"world");//true
System.out.println(s3.equals("hello"+"world"));//true
//通过反编译看源码,我们知道这里已经做好了处理。
// System.out.println(s3 == "helloworld");
// System.out.println(s3.equals("helloworld"));
}
}
练习题:
/*
* 需求:统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数。(不考虑其他字符)
* 举例:
* "Hello123World"
* 结果:
* 大写字符:2个
* 小写字符:8个
* 数字字符:3个
*
* 分析:
* 前提:字符串要存在
* A:定义三个统计变量
* bigCount=0
* smallCount=0
* numberCount=0
* B:遍历字符串,得到每一个字符。
* length()和charAt()结合
* C:判断该字符到底是属于那种类型的
* 大:bigCount++
* 小:smallCount++
* 数字:numberCount++
*
* 这道题目的难点就是如何判断某个字符是大的,还是小的,还是数字的。
* ASCII码表:
* 0 48
* A 65
* a 97
* 虽然,我们按照数字的这种比较是可以的,但是想多了,有比这还简单的
* char ch = s.charAt(x);
*
* if(ch>='0' && ch<='9') numberCount++
* if(ch>='a' && ch<='z') smallCount++
* if(ch>='A' && ch<='Z') bigCount++
* D:输出结果。
StringBuffer线程安全
* 安全:--同步--数据是安全的
* 不安全:--不同步--效率高一些
*
* 安全和效率问题是永远困扰我们的问题。
* 安全:医院的网站,银行网站等
* 效率:新闻网站,论坛之类的网站等
*
* StringBuffer:线程安全的可变字符串
*
StringBuffer和String的区别?
* 前者长度和内容可变,后者不可变。
* 如果使用前者做字符串的拼接,不会浪费太多的资源。
StringBuffer类的构造方法
* public StringBuffer()无参构造 其初始容量为 16 个字符。(常用)
* public StringBuffer(String str)指定字符串内容的字符串缓冲区对象(当需要String和StringBuffer相互转换的时候使用)
* public StringBuffer(int capacity)指定容量的字符串缓冲区对象
StringBuffer的方法:
* public int capacity():返回当前容量,理论值
* public int length():返回长度(字符数),实际值
StringBuffer类的添加功能:
* public StringBuffer append(String str)可以把任意类型添加到字符串缓冲区里面,并返回字符串缓冲区本身。
* public StringBuffer insert(int offset,String str)在指定经位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身。
StringBuffer类的删除功能:
* public StringBuffer deleteChart(int index)删除指定位置的(一个)字符,并返回本身。
* public StringBuffer delete(int start,int end)删除指定位置开始到指定位置结束的内容,并返回本身。【包左不包右】
StringBuffer类的替换功能:
* public StringBuffer replace(int start,int end,String str)从start开始到end用str替换【包左不包右】
StringBuffer类的反转功能:
* public StringBuffer reverse()将StringBuffer字符串进行反转,返回其本身。
StringBuffer类的截取功能:
* public String substring(int start)从指定位置开始截取到末尾,返回截取出来的字符串。
* public String substring(int start,int end)从指定开始位置到指定结束位置进行截取,返回截取出来的字符串。[包左不包右]
StringBuffer类的三个面试题:
* 1、String、StringBuffer、StringBuilder的区别?
* A: String是内容不可变的,
* 而StringBuilder,StringBuffer都是内容可变的。
*
* B: StringBuffer是同步的,数据安全,效率低;
* StringBuilder是不同步的,数据不安全,效率高。
2、StringBuffer和数组的区别?
* 二者都可以看做是一个容器,装其他的数据。
* 但是,StringBuffer的数据最终都是一个字符串数据。
* 而数组可以放置多种数据,但必须是同一种数据类型。
3、形似参数问题?
* String作为参数传递(看成是基本类型)
* StringBuffer作为参数传递(赋值不发生改变,调用方法发生改变)
*
*形式参数:
* 基本类型:形式参数的改变不影响实际参数
* 引用类型:形式参数的改变影响实际参数
*
*注意:String作为参数传递,效果和基本类型作为参数传递是一样的。