黑马程序员——常用API详解之Object、Scanner、String

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

A:Object类

Object类是所有类的根类,其所有的方法为所有类所共有,所以很多类的基本功能都是依赖于Object实现的。

如:

无参构造方法(Object只有无参构造);

public Object()

直接打印类的对象名(其实是Object的toString方法);

public String toString()
如果没有重写该方法,这里的toString其实相当于:this.getClass().getName()+'@'+this.hashCode();
获取对象的字节码文件对象;
public final Class<?> getClass()
此方法被final修饰,说明不能被重写。

equals方法(默认比较地址值,一般都会重写该方法);

public boolean equals(Object obj)

hashCode方法(返回该对象的哈希码值,可以理解为是地址值但是是有区别的);

public int hashCode()
equals方法和hashCode方法在HashSet集合中被重写,用以保证集合元素的唯一性。

clone方法(创建并返回此对象的一个副本,克隆对象与原对象的地址值不同);

protected Object clone()
如果想克隆某个对象,该对象必须实现Cloneable接口,该接口与后面的序列化接口Serializable类似,都是标记接口。

B:Scanner类

Scanner是在图形界面之前用来接收键盘录入数据的,在Scanner之前我们是使用main方法中的String args参数类传递键盘数据。

因为是键盘录入数据,键盘属于标准输入设备,所以在创建Scanner对象时,需要传入一个标准输入流对象:InputStream的子类对象

构造方法:		Scanner(InputStream source)
Scanner的两个常用方法:接收int类型的数据和接收String类型的数据

		public int nextInt():获取一个int类型的值
 		public String nextLine():获取一个String类型的值
可以与hasNestXxx方法配合用于接收符合判断要求的数据

如:只接收键盘录入的int类型的数据,并打印

		// 创建对象
		Scanner sc = new Scanner(System.in);

		// 获取数据
		if (sc.hasNextInt()) {
			int x = sc.nextInt();
			System.out.println("x:" + x);
		} else {
			System.out.println("你输入的数据有误");
		}
扩展:接收键盘录入数据的3种方法
		 		A:String[] args 
		 			赋值时间:(编译期间不能赋值)控制台运行java文件时赋值
		 			赋值方法:java 类名 hello world java(录入的数据用空格隔开)
		 		B:Scanner
		 			Scanner sc = new Scanner(System.in);
		 			注意事项:
		 				如果是先录入int类型的数据,再录入String类型的数据会出个小问题
		 				Scanner扫描器会把换行符赋值给String类型
		 		C:通过字符缓冲流包装标准输入流实现
		 			BufferedInputStream bis = new BufferedInputStream(System.in);
		 			BufferdeReader br = new BufferedReader(new InputStreamReader(System.in));
		 			因为Scanner是jdk5以后才出现的,所以5以前都是使用此方法
		 			原理:
		 				public static final InputStream in	“标准”输入流
		 				in是System类的一个成员变量,但是返回值却是一个InputStream字节流对象,即
		 				InputStream is = System.in;

C:String类与基本类型的包装类。

String类是使用最多、最频繁也是方法最多最灵活的类。

1.String类的特点:

1)字符串字面值"abc"也可以看成是一个字符串对象;

2)一旦被赋值,就不能被改变,图解如下


在方法区中存在一个字符串常量池,当需要给字符串赋值或创建字符串对象时,都会在常量池中查找该值是否存在,如果不存在则新建。然后再把常量池的地址值赋值给字符串或字符串对象。

 * String s = new String(“hello”)和String s = “hello”;是有区别的
 * 前者会创建2个对象,后者创建1个对象。<pre name="code" class="java">/*
 * 看程序写结果
 * 字符串如果是变量相加,先开空间,在拼接。
 * 字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。
 */
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");// false 这个我们错了,应该是true
		System.out.println(s3.equals("hello" + "world"));// true

		// 通过反编译看源码,我们知道这里已经做好了处理。
		// System.out.println(s3 == "helloworld");
		// System.out.println(s3.equals("helloworld"));
	}
}

 这样的话,在做字符串的拼接时其实是很浪费内存空间的,因为每拼接一个字符串都要在在常量池中开辟一个空间,所以有了后来的字符串缓冲区。 

2.字符串的主要运用场景:

1)字符串的判断

 * ==:比较引用类型比较的是地址值是否相同
 * equals:比较引用类型默认也是比较地址值是否相同,而String类重写了equals()方法,比较的是内容是否相同。<pre name="code" class="java"> * String类的判断功能:
* boolean equals(Object obj):比较字符串的内容是否相同,区分大小写 * boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写 * boolean contains(String str):判断大字符串中是否包含小字符串 * boolean startsWith(String str):判断字符串是否以某个指定的字符串开头 * boolean endsWith(String str):判断字符串是否以某个指定的字符串结尾 * boolean isEmpty():判断字符串是否为空。
 
 

2)字符串的处理:获取;拼接;替换;去两端空格;按字典顺序比较;

 * String类的获取功能
 * int length():获取字符串的长度。
 * char charAt(int index):获取指定索引位置的字符
 * int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。
 * 		为什么这里是int类型,而不是char类型?
 * 		原因是:'a'和97其实都可以代表'a'
 * 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):从指定位置开始到指定位置结束截取字符串。<pre name="code" class="java"> * 拼接功能
* String concat(String str):把字符串拼接。与"+"效果相同,一般不用。
 
 
 * 替换功能:
 * String replace(char old,char new)
 * String replace(String old,String new)
 *
 * 去除字符串两空格	
 * String trim()
 * 
 * 按字典顺序比较两个字符串  
 * int compareTo(String str)
 * int compareToIgnoreCase(String str)此时字符串会自动转换为一个字符数组,然后按照对应关系一一比较,直到相减(this-str)得到的值不等于0停止比较。如果是两个以相同字符开头,且具有包含关系的字符串比较则返回值是字符串的长度之差。如:hello和hel比较,结果为2.
 
 

3)类型间的转换

 * String类,字符串内容的大小写转换
 * 			String toLowerCase():把字符串转成小写。
 * 			String toUpperCase():把字符串转成大写。
 * String类转换为常见数据类型
 * 		转换为数组:char[] byte[]
 * 			byte[] getBytes()把字符串转换为字节类型的数组
 * 			char[] toCharArray()把字符串转化成字符类型的数组
 * 		由数字组成的字符串转换为int类型
 * 			1)使用int包装类Integer的静态parseInt方法
 * 			public static int parseInt(String s)
 * 			2)使用Integer的构造方法
 * 			public Integer(String s)	Integer可以自动拆箱为int
 * 常见数据类型转换为String类型
 * 		String类的valueOf静态方法可以把任意类型的数据转成字符串
 * 			static String valueOf(char[] chs)
 * 			static String valueOf(int i)
 * 			static String valueOf(Object obj)
 * 		Integer类的toString方法(任意包装类的该方法都可以转换为String类型)
 * 			static String toString(int i)
 * 			public String toString()
 * 扩展:char类型转换为int类型
 * 			char--String--int
 * 			int = Integer.parseInt(String.valueOf(char));另:直接使用"+"进行字符串的拼接,同样可以实现其他类型到String类型的转换。
 

4)与正则表达式的配合使用

 * 判断功能
 *		String类的public boolean matches(String regex)	判断此字符串是否符合该规则

 * 分割功能
 *		String类的public String[] split(String regex)
 *		根据给定正则表达式的匹配拆分此字符串。<pre name="code" class="java"> * 替换功能
* String类的public String replaceAll(String regex,String replacement) * 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
 * 获取功能
* Pattern和Matcher类的使用 * 模式和匹配器的基本使用顺序 // 把规则编译成模式对象Pattern p = Pattern.compile(regex);// 通过模式对象得到匹配器对象Matcher m = p.matcher(s);
	while (m.find()) {
System.out.println(m.group());}
 
 
 
 
 
 

5)字符串的经典案例:统计一个小串在长串中出现的次数

/*
 * 统计大串中小串出现的次数
 举例:在字符串” woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun”中java出现了5次
 分析:
 A:定义几个变量:大串、小串、索引和统计次数
 B:获取小串在大串中第一次出现的索引值
 C:如果没有返回-1;如果有统计次数
 D:然后用小串长度加上索引值去截取大串并重新赋值给大串
 E:重复B步操作
 * int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。
 * int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
 * String substring(int start):从指定位置开始截取字符串,默认到末尾。截下来的字符串包含start
 * String substring(int start,int end):从指定位置开始到指定位置结束截取字符串。包含start不包含end
 */
public class CountNum2 {

	public static void main(String[] args) {
		// 给定一个字符串
		String bigS = "woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun";
		// 给定一个小串
		String smaS = "java";
		//写一个方法实现
		int count = countNum(bigS,smaS);
		System.out.println(count);
	}

	private static int countNum(String bigS, String smaS) {
		//定义一个统计变量和一个索引值
		int index;
		int count=0;
		//获取小串在大串中第一次出现的索引值赋值给index,如果不存在则默认返回-1
		//然后用该值加上小串长度去截取大串再次赋值给大串并count++,直到index=-1
		while((index=bigS.indexOf(smaS))!=-1){
			count++;
			bigS = bigS.substring(index+smaS.length());
		}
		return count;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一夸克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值