String类的概述和使用(掌握)
1、多个字符组成的一串数据。
其实它可以和字符数组进行相互转换。
2、构造方法:
A:public String()
B:public String(byte[] bytes)
C:public String(byte[] bytes,int offset,int length)
D:public String(char[] value)
E:public String(char[] value,int offset,int count)
F:public String(String original)
下面的这一个虽然不是构造方法,但是结果也是一个字符串对象
G:String s = "hello";
3、字符串的特点
A:字符串一旦被赋值,就不能改变。
注意:这里指的是字符串的内容不能改变,而不是引用不能改变。
B:字面值作为字符串对象和通过构造方法创建对象的不同
String s = new String("hello");和String s = "hello"的区别?
4、字符串创建与存储机制
5、字符串的面试题(看程序写结果)
A:==和equals()
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2);// false
System.out.println(s1.equals(s2));// true
String s3 = new String("hello");
String s4 = "hello";
System.out.println(s3 == s4);// false
System.out.println(s3.equals(s4));// true
String s5 = "hello";
String s6 = "hello";
System.out.println(s5 == s6);// true
System.out.println(s5.equals(s6));// true
B:字符串的拼接
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");// false 这个我们错了,应该是true
System.out.println(s3.equals("hello" + "world"));// true
6、字符串的功能(自己补齐方法中文意思)
A:判断功能
boolean equals(Object obj)
boolean equalsIgnoreCase(String str)
boolean contains(String str)
boolean startsWith(String str)
boolean endsWith(String str)
boolean isEmpty()
B:获取功能
int length()
char charAt(int index)
int indexOf(int ch)
int indexOf(String str)
int indexOf(int ch,int fromIndex)
int indexOf(String str,int fromIndex)
String substring(int start)
String substring(int start,int end)
C:转换功能
byte[] getBytes()
char[] toCharArray()
static String valueOf(char[] chs)
static String valueOf(int i)
String toLowerCase()
String toUpperCase()
String concat(String str)
D:其他功能
a:替换功能
String replace(char old,char new)
String replace(String old,String new)
b:去空格功能
String trim()
c:按字典比较功能
int compareTo(String str)
int compareToIgnoreCase(String str)
7、字符串的案例
A:模拟用户登录
B:字符串遍历
C:统计字符串中大写,小写及数字字符的个数
D:把字符串的首字母转成大写,其他小写
E:把int数组拼接成一个指定格式的字符串
F:字符串反转
G:统计大串中小串出现的次数
8、String,StringBuffer,StringBuilder的区别?
String 是内容不可变的,而 StringBuffer, StringBuilder 都是内容可变的。
StringBuffer 是同步的,数据安全,效率低;
StringBuilder 是不同步的,数据不安全,效率高。
9、String类的常见操作补充
返回指定字符串在此字符串中最后一次出现处的索引
int lastIndexOf(int ch)
将此字符串与指定的字符串比较
/**String中的equals比较的是字符串的值非地址(重写了toString方法)*/
boolean equals(Object anObject)
根据参数 regex 将原来的字符串分割为若干个子字符串
String[] substring(int beginIndex)
StringBuffer类(掌握)
由于字符串是常量,因此一旦创建,其内容和长度是不可改变的(与 String 类最大的区别)。如果需要对一个字符串进行修改,则只能创建新的字符串。
用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了一个字符串缓冲区类。StringBuffer供我们使用。
StringBuffer类的常见操作
StringBuffer具有String的大部分方法
StringBuffer 的构造函数
public StringBuffer() //无参构造方法
public StringBuffer(int capacity) //指定容量的字符串缓冲区对象
public StringBuffer(String str) //指定字符串内容的字符串缓冲区对象
StringBuffer 的方法
public int capacity() //返回当前容量。 理论值
public int length() //返回长度(字符数)。 实际值
StringBuffer 的添加功能
public StringBuffer append(String str) //可以把"任意类型数据"添加到字符串缓冲区里面,并返回字符串缓冲区本身
public StringBuffer insert(int offset,String str) //在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身(注意不要越界)
StringBuffer 的删除功能
public StringBuffer deleteCharAt(int index) //删除指定位置的字符,并返回本身
public StringBuffer delete(int start,int end) //删除从指定位置开始指定位置结束的内容,并返回本身
StringBuffer 的替换功能
public StringBuffer replace(int start,int end,String str) //从start开始到end用str替换
StringBuffer setCharAt(int index, char ch) //修改指定位置 index 处的字符序列
StringBuffer 的截取功能
StringBuffer setCharAt(int index, char ch)
返回 StringBuffer 缓冲区的字符串
String toString()
StringBuffer 的反转功能
public StringBuffer reverse()
StringBuffer 和String 相互转换
String -- StringBuffer
构造方法
append()方法
StringBuffer -- String
构造方法
toString()方法
StringBuffer 特性
A:String,StringBuffer,StringBuilder的区别?
String是内容不可变的,而StringBuffer,StringBuilder都是内容可变的。
StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高
B:StringBuffer和数组的区别?
二者都可以看出是一个容器,装其他的数据。
但是呢,StringBuffer的数据最终是一个字符串数据。
而数组可以放置多种数据,但必须是同一种数据类型的。
C:形式参数问题
String作为参数传递
StringBuffer作为参数传递
注意:
String作为参数传递,效果和基本类型作为参数传递是一样的。
Object类
Object 类是层次结构的根类,每个类都使用 Object 作为超类。每个类都直接或者间接的继承自 Object 类。
Object类的构造方法有一个,并且是无参构造
这其实就是理解当时我们说过,子类构造方法默认访问父类的构造是无参构造
Object类的常见操作
返回该对象的哈希码值(将地址转化为十六进制字符串形式)
/*hashCode与equals的区别与联系
*1、equals方法用于比较对象的内容是否相等(前提覆盖以后,默认比较地址值,String对象默认比较值)
*2、hashcode方法只有在集合中用到
*3、当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法
进行比较(判断对象的内容是否相等)。
*4、将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的
任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合
中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合
中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入
到集合中,否则不放入。*/
public int hashCode()
返回此 Object 的运行时类(编译的字节码文件对象:.class对象)
public final Class getClass()
以 String 的形式返回此 Class 对象所表示的实体
/*通常使用 getClass().getName();
*返回类的全路径*/
public String getName()
返回对象的字符串表示(类的全路径@
/** Integer类下的一个静态方法:
* public static String toHexString(int i):把一个整数转成一个十六进制表示的字符串
* 但是这个信息是没有任何意义的。所以,建议所有子类都重写该方法。
*
* 怎么重写呢?
* 通常自动生成toString()方法。把该类的所有成员变量值组成返回即可。
*
* 注意:
* 直接输出一个对象的名称,其实就是调用该对象的toString()方法。*/
public String toString()
判断对象是否相等(默认比较地址)
/** ==:
* 基本类型:比较的就是值是否相同
* 引用类型:比较的就是地址值是否相同
* equals:
* 重写该方法(自动生成),比较对象的成员变量值是否相同
* 判断对象是否是某个类的对象:对象名 instanceof 类名*/
public boolean equals(Object obj)
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。用于垃圾回收,但是什么时候回收不确定
protected void finalize()
创建并返回此对象的一个副本
protected Object equals(Object obj)
例子
/** Cloneable:此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。
* 这个接口中没有方法是标记接口,告诉我们实现该接口的类就可以实现对象的复制了。
* public class Student implements Cloneable*/
public classStudentDemo {public static void main(String[] args) throwsCloneNotSupportedException {//创建学生对象
Student s = newStudent();
s.setName("林青霞");
s.setAge(27);//克隆学生对象
Object obj =s.clone();
Student s2=(Student)obj;
System.out.println("---------");
System.out.println(s.getName()+"---"+s.getAge());
System.out.println(s2.getName()+"---"+s2.getAge());//以前的做法
Student s3 =s;
System.out.println(s3.getName()+"---"+s3.getAge());
System.out.println("---------");//其实是有区别的:改变克隆对象的成员变量值不会改变原对象的成员变量值
//改变引用相同地址值的对象会改变原对象的成员变量值
s3.setName("刘意");
s3.setAge(30);
System.out.println(s.getName()+"---"+s.getAge());
System.out.println(s2.getName()+"---"+s2.getAge());
System.out.println(s3.getName()+"---"+s3.getAge());
}
}