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;
}
}