Object类:
1)Object:是类层次的根类,每个类都使用Object作为超类(父类)
1. public int hashCode()返回该对象的哈希码值--把它理解为地址值(不是实际意义的地址值)
2.public final Class getClass()返回此Object 的运行时类
Class类中有一个方法:
public String getName ()以String的形式返回此Class对象所表现的实体(类,接口,数组类,基本类型或 void)名称;
返回值是Class(JavaSE最后一天:反射)
public class Object1 { public static void main(String[] args) { //创建学生类对象 Student1 s1= new Student1(); Student1 s2=new Student1(); //返回该对象的哈希码值(地址值) System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); System.out.println("-------------"); //返回Student的运行时类 Class cl1=s1.getClass(); Class cl2=s2.getClass(); System.out.println(cl1); System.out.println(cl2); System.out.println("-----------"); //以String的形式返回Class对象所表现的Student类名称 System.out.println(cl1.getName()); System.out.println(s2.getClass().getName()); } }
public class Student1 { }
2)Object中的一个方法:
public String toString();返回该对象的字符串形式
Integer:是int类的包装类类型它里面提供了一个方法
public static String toHexString(int i):以十六进制表示对字符串形式
直接输出对象名称:实际执行了Object中的toString(),输出的全类名@十六进制数据
System.out.println(s1.toString());//org.westos.Object1.Student1@4e25154f
我现在输出对象名称,不想让toString()直接输出的是一个地址值(对象的地址值) 就需要重写Object中的toSring(),一般情况:自动生成即可 ,建议所有子类都重写此方法。
package org.westos.Object2; public class Student { private String name; private int age; public Student() { super(); // TODO Auto-generated constructor stub } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //重写toString方法 @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } } package org.westos.Object2; public class Object { public static void main(String[] args) { //创建Student对象 Student s=new Student("666",999); //调用toString()方法 System.out.println(s.toString()); } }3) public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
==:比较的值相等(地址值)
equals:本身属于Object类中的方法,默认比较的是地址值是否相同
public class Student1 { } package org.westos.Object1; public class Object1 { public static void main(String[] args) { //创建学生类对象 Student1 s1= new Student1(); Student1 s2=new Student1(); System.out.println(s1.equals(s2));//false } }
按照正常情况:equals方法底层实际执行的两个对象在==,比较是地址值;假如:学生的年龄和姓名一致,看成同一个人
在自定义的类中,重写Object中的equals()方法,比较是两个对象的成员变量的值是否相同.
package org.westos.Object2; public class Student { private String name; private int age; public Student() { super(); // TODO Auto-generated constructor stub } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //重写toString方法 @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } //重写equals方法 @Override public boolean equals(java.lang.Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; }
package org.westos.Object2; public class Object { public static void main(String[] args) { //创建Student对象 Student s=new Student("666",999); //调用toString()方法 System.out.println(s.toString()); Student s1=new Student("666",999); System.out.println(s==s1);//false System.out.println(s.equals(s1));//true } }4)protected Object clone()创建并返回此对象的一个副本
Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。
注意,所有的数组都被视为实现接口 Cloneable
package org.westos.Object2; public class Student implements Cloneable { private String name; private int age; public Student() { super(); // TODO Auto-generated constructor stub } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //重写toString方法 @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } //重写equals方法 @Override public boolean equals(java.lang.Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override protected java.lang.Object clone() throws CloneNotSupportedException { // TODO Auto-generated method stub return super.clone(); } }
package org.westos.Object2; public class Object { public static void main(String[] args)throws CloneNotSupportedException { //创建Student对象 Student s=new Student("666",999); //调用toString()方法 System.out.println(s.toString()); Student s1=new Student("666",999); System.out.println(s==s1);//false System.out.println(s.equals(s1));//true java.lang.Object obj= s.clone(); Student s2=(Student)obj; System.out.println(s2==s); System.out.println(s2.equals(s)); } }
Scanner:
1) Scanner类: 简单文本扫描器。
回想:键盘录入的步骤
1)需要创建键盘录入对象
Scanner sc =new Scanner(System.in);
2)导入包:import java.util.Scanenr; ctrl+shift+o
3)接收数据
XXX 变量名= sc.nextXXX();
构造方法:public Scanner(InputStream source): 以输入流的形式录入数据的
InputStream:字节输入流:InputStream in = System.in ; //底层执行返回的是一个字节输入流(标准输入流)
2)Scanner类的一些常见的方法:
XXX 变量名 = 键盘录入对象.nextXXX();
在Scanner类中它提供一个判断功能:
public boolean hasNextXXX():当前扫描器判断是否有下一个可以录入的XXX类型数据
nextXXX();
java.util.InputMismatchException:录入的数据和接收的数据类型不匹配异常
package org.westos.Scanner2; import java.util.Scanner; public class ScannerDemo1 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); //录入数据 System.out.println("请输入一个数据"); if(sc.hasNextInt()) { int i=sc.nextInt(); System.out.println(i); } else {System.out.println("你输入的数据类型有误");} } }3)问题:
键盘录入两个int类型的数据,分别输出,没有问题
键盘录入两个String类型的数据,分别输出:没有问题
先录入一个String类型的数据,在录入int类型的数据,没有问题
先录入一个int类型的数据,在录入String类型的数据,有问题,第二个数据是字符串类型,又由于录入下一 个数据要"空格"本身是一个字符串,b是空格,b的值没有录入!
如何解决:重写创建键盘录入对象
package org.westos.Scanner2; import java.util.Scanner; public class ScannerDemo2 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); //录入数据 System.out.println("请输入第一个数据"); int a=sc.nextInt(); System.out.println("请输入第二个数据"); //String b=sc.nextLine(); //System.out.println("a="+a+",b="+b); //重新创建一个键盘录入对象 Scanner sc2=new Scanner(System.in); String b=sc2.nextLine(); System.out.println("a="+a+",b="+b); } }
Scanner:
1) String:表示字符串:
字符串是常量;它们的值在创建之后不能更改。
String是一种特殊的引用类型:
默认值:null
构造方法:
String():无参构造
String(byte[] bytes) :将字节数转换成字符串
public String(byte[] bytes, int index,int length):将字节数组的一部分转换成字符串
public String(char[] value):将字符数组转化成字符串 toCharArray():将字符串转换成字符
public String(char[] value, int index, int count):将字符数组的一部分转换成字符串
public String(String original):将一个字符串常量构造成一个字符串对象
常用的方法:
public int length()返回此字符串的长度
面试题:
数组中有没有length(),字符串中有没有length(),集合中有没有length()?
数组中没有length()方法,只有length属性
字符串中有length()
集合中没有length(),获取集合的元素数:size()
package org.westos.String1; public class StringDemo1 { public static void main(String[] args) { String str1=new String(); System.out.println("str1="+str1);//返回的不是地址值,说明String类重写了Object类的toString()方法 System.out.println("------------"); byte[]bytes= {48,78,97,65,79,99}; String str2=new String(bytes);//将字节数组转换成字符串 System.out.println("str2="+str2); System.out.println(str2.length());//返回该字符串的长度 String str3=new String(bytes,2,3);//将字节数组的一部分转换成字符串 System.out.println("str3="+str3); System.out.println("----------"); char []value= {'我','是','渣','团','球','迷'}; String str4=new String(value);//将字符数组转换成字符串 System.out.println("str4="+str4); String str5=new String(value,2,3);//将字符数组的一部分转换为字符串 System.out.println("str5="+str5); System.out.println("----------"); String str="tgrdg"; String str6=new String(str);//将一个字符串常量构造成一个字符串对象 System.out.println("str6="+str6); System.out.println("----------"); String str7="";//字符串内容为空 String str8=null;//对象为空 } }2)String字符串的最大的特点:
字符串一旦被赋值,其值不能被改变
package org.westos.String1; public class StringDemo2 { public static void main(String[] args) { String str1="asdfzxcv"; String str2="qwer"; change(str1,str2);//该方法调用后,在main方法str1和str2的只并没有改变 System.out.println("str1="+str1);//"asdfzxcv" System.out.println("str2="+str2);//"qwer" } public static void change(String str1,String str2) { str1+=str2; str2+=str1; System.out.println("str1="+str1+",str2="+str2); } }3)
package org.westos.String1; public class StringDemo3 { public static void main(String[] args) { String str1=new String("999"); String str2="999"; System.out.println(str1==str2);//false System.out.println(str1.equals(str2));//true:说明String类把Object类的equals()方法重写了 System.out.println("-----------"); String str3=new String("666"); String str4=new String("666"); System.out.println(str3==str4);//false System.out.println(str3.equals(str4));//true System.out.println("--------------"); String str5="777"; String str6="777"; System.out.println(str5==str6);//true:常量赋值:如果字符串常量区有,就直接调用.所以str6的地址值与str5一致 System.out.println(str5.equals(str6));//true } }4)String类的常用的判断功能
boolean equals(Object obj):将此字符串与指定的对象比较
boolean equalsIgnoreCase(String str)将此 String 与另一个 String 比较,不考虑大小写
boolean contains(String str):判断当前大川中是否包含子字符串 (重点)
boolean startsWith(String str):以当前str字符串开头(重点)
boolean endsWith(String str):以当前str字符串结尾(重点)
boolean isEmpty():判断字符串是否为空
public String concat(String str):字符串的特有功能:拼接功能和+拼接符是一个意思
String类的常用的判断功能 * * boolean equals(Object obj):将此字符串与指定的对象比较 boolean equalsIgnoreCase(String str)将此 String 与另一个 String 比较,不考虑大小写 boolean contains(String str):判断当前大川中是否包含子字符串 (重点) boolean startsWith(String str):以当前str字符串开头(重点) boolean endsWith(String str):以当前str字符串结尾(重点) boolean isEmpty():判断字符串是否为空 public String concat(String str):字符串的特有功能:拼接功能和+拼接符是一个意思5)String类的常用获取功能:
public int length():获取字符串的长度
public char charAt(int index)返回指定索引处的 字符
public int indexOf(int ch)返回指定字符在此字符串中第一次出现处的索引
问题:既然传入的字符:这里为什么用int类型 ,'a'和97 都表示a
public int indexOf(int ch,int fromIndex)返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。
public int indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引
public int indexOf(String str,int fromIndex)回在此字符串中第一次出现指定字符串处的索引,从指定的索引开始搜索。
截取功能
public String substring(int beginIndex):从指定位置开始截取,默认截取到末尾,返回新的字符串
public String substring(int beginIndex, int endIndex):从指定位置开始到指定位置末尾结束,包前不包后
package org.westos.String1; public class StringDemo5 { public static void main(String[] args) { String str1="wotiqiuhaixing"; String str2="wotiqiuhaixing"; System.out.println(str1==str2);//true System.out.println(str1.length());//14 System.out.println("-----------"); System.out.println(str1.charAt(3));//'i' System.out.println(str1.indexOf(97));//8 System.out.println(str2.indexOf('i',4));//5 System.out.println("---------"); System.out.println(str2.indexOf("qiu"));//4 System.out.println(str1.indexOf("qiu",2));//4 System.out.println("-----------"); System.out.println(str1.substring(3));//"iqiuhaixing" System.out.println(str1.substring(4, 7));//"qiu" } }6)在不使用main方法的情况下,调用org.junit.Test;在该类直接造方法作为测试方法
package org.westos.String1; import org.junit.Test; public class StringDemo6 { @Test public void start() { String str="niliubi"; System.out.println(str); } }
7) String的常用转换功能:
public byte[] getBytes() :将字符串转换为字节数组
public char[] toCharArray() :将字符串转换成字符数组(重点)
public static String valueOf(int i):将int类型的数据转换成字符串(重点)
这个方法可以将任何类型的数据转化成String类型
public String toLowerCase():转成小写
public String toUpperCase():字符串中所有的字符变成大写
package org.westos.String1; import org.junit.Test; public class StringDemo7 { @Test public void start() { String str="wojavaxuedehaixing"; byte [] by=str.getBytes(); System.out.print("["); for(int i=0;i<by.length;i++) { if(i==by.length-1) System.out.println(by[i]+"]"); else System.out.print(by[i]+","); } System.out.println("----------"); char []ch=str.toCharArray(); System.out.print("["); for(int i=0;i<ch.length;i++) { if(i==ch.length-1) System.out.println(ch[i]+"]"); else System.out.print(ch[i]+","); } System.out.println("----------"); System.out.println(String.valueOf(45));//"45" System.out.println(str.toUpperCase()); String str2="ASDFQWERZXCVJKL"; System.out.println(str2.toLowerCase()); } }
8) String类型的其他功能:
public String replace(char oldChar,char newChar):将大字符串中的某个字符替换掉成新的字符
public String replace(String oldStr,String newStr):将大串中的某个子字符串替换掉
public String trim():去除字符串两端空格
public int compareTo(String anotherString)按字典顺序比较两个字符串
package org.westos.String1; public class StringDemo8 { public static void main(String[] args) { String str=" qwerasdf tyuiop "; System.out.println(str.replace('w','z')); System.out.println(str.replace("qwer","zxcv")); System.out.println(str.trim()); System.out.println("------"); String str2="hello"; String str3="heles"; String str4="hellojava"; System.out.println(str2.compareTo(str3));//7 System.out.println(str2.compareTo(str4));//-4 System.out.println(str4.compareTo(str3));//7 } }
9)
1. 需求:把数组中的数据按照指定个格式拼接成一个字符串(用方法改进)
假设有一个数组:
int[] arr = {1 ,2, 3} ;
最终结果是一个String数据
[1, 2, 3]
分析:
1)定义一个int类型的数组
2)定义一空字符串:String s = "" ;
3)遍历数组之前:拼接一个[
4)遍历int类型 数组
判断是否最后一个元素
拼接每一个元素
拼接]
否则
拼接每一个元素
拼接,
package org.westos.String1; public class StringDemo10 { public static void main(String[] args) { int []arr= {12,34,56,78}; String str=""; str+="["; for(int i=0;i<arr.length;i++) { if(i==arr.length-1) { str+=arr[i]; str+="]"; } else { str+=arr[i]; str+=","; } } System.out.println(str); } }2. 需求:把一个字符串的首字母转成大写,其余为小写。(只考虑英文大小写字母字符)
分析:
获取第一个字符:通过截取 返回一个新的字符串s1
将s1转换成大写
在获取除了第一个1字符以为的其他字符,截取s2
s2转换成小写
s1和s2拼接
package org.westos.d_string; public class StringDemo9 { public static void main(String[] args) { String str="assdQDSFsfSW"; System.out.println(str.substring(0,1).toUpperCase().concat(str.substring(1).toLowerCase())); } }