Java基础巩固(Object类( toString()、equals()、hashCode()方法)、String字符串类、StringBuffer、StringBuilder类)

一、Object类

java是面向对象的语言,核心思想:找适合 的对象做适合 的事情:

    
    方式一:自定义类,然后通过自定义的类创建对象。
    
    方式二:sun提供了很多的类给我使用,我们只需要认识这些类,我们就可以通过这些类创建对象了。
    
Object类是所有类的终极父类。 任何一个类都继承了Object类。


Object类:


Object类常用的方法:
    toString();     返回该对象的字符串表示。 返回一个字符串用于描述该对象的。
疑问: toString() 有何作用?      重写toString之后,我们直接输出一个对象的时候,就会输出符合我们所需求的格式数据。
    
    equals(Object obj)   用于比较两个对象的内存地址,判断两个对象是否为同一个对象。
    
    hashCode()   返回该对象的哈希码值(大家可以把哈希码就 理解成是对象的内存地址)/


java中的规范:一般我们重写了一个类的equals方法,我们都会重写它的hashCode方法。

class Person{
	
	int id;
	
	String name;

	public Person(int id, String name) {
		this.id = id;
		this.name = name;
	}

	public Person() {
	}
	
	//目前我需要直接输出一个对象的时候,输出 的格式是: 编号:110 姓名: 狗娃  这种格式。 目前Object的
//	toString方法无法满足子类的需求,那么这时候我们就应该对Object类的toString进行重写。
	@Override
	public String toString() {
		return "编号:"+ this.id + " 姓名:"+this.name;
	}
	
	
	//为什么要重写:Object的equals方法默认比较的是两个对象的内存地址,我目前需要比较的是两个对象的身份证,所以Object类的equals方法不符合我现在的需求。
	@Override
	public boolean equals(Object obj) { 
		Person p  = (Person)obj;
		return this.id== p.id;
	}
	
	@Override
	public int hashCode() {
		return  this.id;
	}
	
		
}


public class Demo1 {

	public static void main(String[] args) {
		
		/*
		Object o = new Object();
		System.out.println(o.toString());  // java.lang.Object@18b3364    返回的字符串表示: 完整类名+@+ 对象的哈希码
		System.out.println(o);  // 通过查看源代码得知,直接输出一个对象 的时候,实际上在println方法内部会调用这个 调用的toString方法,把把toString方法返回的内容输出。
		//疑问: 为什么直接输出一个对象的时候和输出对象的toString方法返回的字符串结果是一样的呢?
		
		
		Person  p1 = new Person(110,"狗娃");
		System.out.println("p1:"+p1);  
		//如果我们能够输出一个p对象的时候,输出的格式: 编号:110 姓名: 狗娃..
		Person  p2 = new Person(112,"狗剩");
		System.out.println("p2:"+p2);  
		*/
		
		
		Person p1 = new Person(110,"狗娃");
		Person p2 = new Person(110,"陈富贵");
		//需求:在现实生活中只要两个人的身份证一致,那么就是同一个人。
		System.out.println("p1与p2是同一个对象吗?"+ p1.equals(p2));
		
		System.out.println("p1哈希码:"+ p1.hashCode());
		System.out.println("p2哈希码:"+ p2.hashCode());
		
		
	}
	
	
	
}
二、String字符串类

(1)字符串特点:字符串是常量;它们的值在创建之后不能更改.

 
 字符串的内容一旦发生了变化,那么马上会创建一个新 的对象。
 
 注意: 字符串的内容不适宜频繁修改,因为一旦修改马上就会创建一个新的对象。
 
 如果需要频繁修改字符串 的内容,建议使用字符串缓冲 类(StringBuffer)。
 
                String str1 = "hello";
		String str2 = "hello";
		String str3 = new String("hello");
		String str4 = new String("hello");
		System.out.println("str1==str2?"+(str1==str2));  // true  
		System.out.println("str2==str3?"+(str2==str3));  //false
		System.out.println("str3==str4?"+(str3==str4));  // false
		System.out.println("str3.equals(str2)?"+(str3.equals(str4))); //true
		//是String类重写了Object的equals方法,比较的是两个字符串对象 的内容 是否一致。
		// "=="用于比较 引用数据类型数据的时候比较的是两个对象 的内存地址,equals方法默认情况下比较也是两个对象 的内存地址。

(2) String 的构造方法:
 
     String()  创建一个空内容 的字符串对象。
     String(byte[] bytes)  使用一个字节数组构建一个字符串对象
     String(byte[] bytes, int offset, int length)
         bytes :  要解码的数组
         offset: 指定从数组中那个索引值开始解码。
         length: 要解码多个元素。
     
     String(char[] value)  使用一个字符数组构建一个字符串。    
     String(char[] value, int offset, int count)  使用一个字符数组构建一个字符串, 指定开始的索引值,与使用字符个数。
    String(int[] codePoints,int offset,int count)
    String(String original)

记住: 使用字节数组或者字符数组都可以构建一个字符串对象。
public class Demo2 {
	
	public static void main(String[] args) {
		String str = new String();
		byte[] buf = {97,98,99};
		
		str = new String(buf); //使用一个字节数组构建一个字符串对象
		str = new String(buf,1,2);   //使用一个字节数组构建一个字符串对象,指定开始解码 的索引值和解码的个数。
		
		char[] arr = {'明','天','是','圣','诞'};
		str = new String(arr); //使用字符数组构建一个字符串
		str = new String(arr,3,2);
		
		int[] 	buf2 = {65,66,67};
		str = new String(buf2,0,3);
		
		str = new String("abc");
		
		
		System.out.println("字符串的内容:"+str);
		
		
		
		
	}
	
}

(3)获取方法
    int length()  获取字符串的长度
    char charAt(int index) 获取特定位置的字符 (角标越界)
    int indexOf(String str) 查找子串第一次出现的索引值,如果子串没有出现 在字符串中,那么则返回-1表示。

    int lastIndexOf(String str) 查找子串最后一次出现的索引值 , 如果子串没有出现 在字符串中,那么则返回-1表示

public class Demo3 {
	
	public static void main(String[] args) {
		String str = "abc中国ab中国";
		System.out.println("字符串的字符 个数: " + str.length() );
		System.out.println("根据索引值获取对应 的字符:"+ str.charAt(3));
		System.out.println("查找子串第一次出现的索引值:" + str.indexOf("中国"));
		System.out.println("查找子串最后一次出现的索引值:" + str.lastIndexOf("中国"));
		
	}
	

}
(4)   判断方法
    boolean endsWith(String str) 是否以指定字符结束
    boolean isEmpty()是否长度为0 如:“” null V1.6
    boolean contains(CharSequences) 是否包含指定序列 应用:搜索
    boolean equals(Object anObject) 是否相等
    boolean equalsIgnoreCase(String anotherString) 忽略大小写是否相等

(5)   转换方法     
char[] toCharArray()  将字符串转换为字符数组
byte[]    getBytes();

字节数组与字符数组、字符串他们三者之间是可以互相转换。
public class Demo4 {
	
	public static void main(String[] args) {
		String str = "Demo.java";
		System.out.println("是否以指定 的字符串结束:"+ str.endsWith("ja"));
		//str = "";
		System.out.println("判断字符串是否为空内容:"+str.isEmpty());
		System.out.println("判断字符串是否包含指定的内容:"+ str.contains("Demo"));
		System.out.println("判断两个 字符串的内容是否一致:"+ "DEMO.JAVA".equals(str));
		System.out.println("判断两个字符串的内容是否一致(忽略大小写比较):"+ "DEMO.JAVA".equalsIgnoreCase(str));
		
		
		//转换的方法
		char[] buf = str.toCharArray();  //把字符串转换字符数组
		System.out.println("字符数组:"+ Arrays.toString(buf));
		byte[] buf2 = str.getBytes();	//把字符串转字节数组
		System.out.println("字节数组:"+ Arrays.toString(buf2));
	}

}

(6)其他方法
    String replace(String oldChar, String newChar) 替换
    String[] split(String regex) 切割
    
    String substring(int beginIndex)   指定开始 的索引值截取子串
    String substring(int beginIndex, int endIndex)指定开始 与结束的索引值截取子串
    
    String toUpperCase() 转大写
    String toLowerCase() 转小写
    String trim() 去除字符串首尾的空格
public class Demo5 {
	
	public static void main(String[] args) {
		String str = "今天晚上不考试";
		System.out.println("指定新内容替换旧 的内容:"+ str.replace("不", "要好好"));
		str = "大家-下-午-好";
		String[] arr = str.split("-"); //根据指定的字符进行切割 。
		System.out.println("字符串数组的内容:"+ Arrays.toString(arr));
		str = "广州传智播客";
		System.out.println("指定开始的索引值截取子串:"+ str.substring(2));
		System.out.println("指定开始的索引值截取子串:"+ str.substring(2,6)); //包头不包尾  注意:截取的内容是包括开始的索引值,不包括结束的索引值, 截取的位置是结束的索引值-1.
		
		str = "abC中国";
		System.out.println("转大写:" + str.toUpperCase());
		str = "AbdfSDD"; 
		System.out.println("转小写:"+ str.toLowerCase());
		
		str = "         大家最近        都非常努力            ";
		System.out.println("去除字符串首尾的空格:"+ str.trim());
		
		
	}

三、StringBuffer、StringBuilder类

如果需要频繁修改字符串 的内容,建议使用字符串缓冲 类(StringBuffer)。



StringBuffer 其实就是一个存储字符 的容器。

笔试题目:使用Stringbuffer无 参的构造函数创建 一个对象时,默认的初始容量是多少? 如果长度不够使用了,自动增长多少倍?
    StringBuffer 底层是依赖了一个字符数组才能存储字符数据 的,该字符串数组默认 的初始容量是16, 如果字符数组的长度不够使用 死,自动增长1倍。


StringBuffer 是一个存储字符的容器

容器的具备 的行为
    
    String
    
    增加
        append(boolean b)    可以添加任意类型 的数据到容器中
        insert(int offset, boolean b)  指定插入的索引值,插入对应 的内容。

    删除
        delete(int start, int end)  根据指定的开始与结束的索引值删除对应的内容。
        deleteCharAt(int index)   根据指定 的索引值删除一个字符。
    
    
    修改
    
        replace(int start, int end, String str) 根据指定 的开始与结束索引值替代成指定的内容。
        reverse()   翻转字符串缓冲类的内容。  abc--->cba
        
        setCharAt(int index, char ch)  把指定索引值的字符替换指定的字符。
        substring(int start, int end)  根据指定的索引值截取子串。
        ensureCapacity(int minimumCapacity)  指定StringBuffer内部的字符数组长度的。
        
    查看
        indexOf(String str, int fromIndex) 查找指定的字符串第一次出现的索引值,并且指定开始查找的位置。
        lastIndexOf(String str)
        
        capacity() 查看当前字符数组的长度。
        length()
        
        charAt(int index)
        toString()   把字符串缓冲类的内容转成字符串返回。
        

StringBuffer 与 StringBuilder的相同处与不同处:
    
    相同点:
        1. 两个类都是字符串缓冲类。
        2. 两个类的方法都是一致的。
    不同点:
        1. StringBuffer是线程安全的,操作效率低 ,StringBuilder是线程非安全的,操作效率高。
        2. StringBuffer是jdk1.0出现 的,StringBuilder 是jdk1.5的时候出现的。
        
推荐使用: StringBuilder,因为操作效率高。
        
public class Demo2 {
	
	public static void main(String[] args) {
		//先使用StringBuffer无参的构造函数创建一个字符串缓冲类。
		StringBuffer sb = new StringBuffer(); 
		sb.append("abcjavaabc");
		/*
		添加 
		sb.append(true);
		sb.append(3.14f);
		插入
		
		sb.insert(2, "小明");
		*/
		
		/*
		删除
		sb.delete(2, 4); //  删除的时候也是包头不包尾
		sb.deleteCharAt(3); //根据指定 的索引值删除一个字符
		
		修改	
		sb.replace(2, 4, "陈小狗");
		
		sb.reverse(); // 翻转字符串的内容
		
		sb.setCharAt(3, '红');
		
		String subString = sb.substring(2, 4);
		System.out.println("子串的内容:"+ subString);
		
		查看
	
		int index = sb.indexOf("abc", 3);
		System.out.println("索引值为:"+index);
			
		sb.append("javajava");
		System.out.println("查看字符数组的长度:"+ sb.capacity());
		*/
		
		System.out.println("存储的字符个数:"+sb.length());
		System.out.println("索引指定的索引值查找字符:"+sb.charAt(2) );
		System.out.println("字符串缓冲类的内容:"+ sb);
		
		String content = sb.toString();
		test(content);
	}
	
	public static void test(String str){
		
	}
	
}



猜你喜欢

转载自blog.csdn.net/linjiehuijh/article/details/80084877