文中关键字:Object类 Scanner类 Math类(随机数) String类 StringBuffer类 Integer类 Character类
Object类:
Object:是类层次结构的根类.每个类都使用 Object 作为超类(父类)
publicint hashCode()返回该对象的哈希码值.把它理解地址值(不是实际意义的地址值)
publicfinal Class getClass()返回此 Object 的运行时类
Class类中有一个方法:
publicString getName()以 String 的形式返回此
Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
返回值是Class(JavaSE最后一天:反射)
---------------------------------------
Object中的常用方法:
publicString toString(); 返回该对象的字符串表示
直接输出对象名称:实际执行了Object中的toString(),输出的全类名@十六进制数据
他和后面提到的Integer中的toHexString方法类似:
Integer:是int类型的包装类类型
它里面提供了一个方法
publicstatic String toHexString(int i):以十六进制表示对字符串形式
而一般实际中输出对象名称,不想让toString()直接输出的是一个地址值(对象的地址值)
就需要重写Object中的toSring(),一般情况:自动生成即可 建议所有子类都重写此方法。 快捷键alt+shift+s 选择相应的选项
重新生成的toString方法会返回(在测试类中输出对象名称,显示对象的成员变量的值),可自己来定义功能;
-----------------------------------------
public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
在之前的学习中,我们判断两者是否相等,使用的是==:来比较的值相等(地址值)
equals:本身属于Object类中的方法,默认比较的也是地址值是否相同
按照正常情况:equals方法底层实际执行的两个对象在==,比较是地址值;假如:学生的年龄和姓名一致,看成同一个人
在自定义的类中,重写Object中的equals()方法,比较是两个对象的成员变量的值是否相同,而并非地址值;
自动生成即可! 快捷键alt+shift+s 选择相应的选项
-----------------------------------------
protected Object clone()创建并返回此对象的一个副本
Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。
注意,所有的数组都被视为实现接口 Cloneable
************************************************************************
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 ; //底层执行返回的是一个字节输入流(标准输入流)
-----------------------------------------
Scanner类的一些常见的方法:
XXX 变量名 = 键盘录入对象.nextXXX();
例: Scanner sc=new Scanner(System.in);
String name=sc.Scanner();//简单的录入一个String类型的字符串
在Scanner类中它提供一个判断功能:
public boolean hasNextXXX():当前扫描器判断是否有下一个可以录入的XXX类型数据,ture or flase
nextXXX();
java.util.InputMismatchException:录入的数据和接收的数据类型不匹配异常
-----------------------------------------
问题:
键盘录入两个int类型的数据,分别输出,没有问题
键盘录入两个String类型的数据,分别输出:没有问题
先录入一个String类型的数据,在录入int类型的数据,没有问题
先录入一个int类型的数据,在录入String类型的数据,有问题,第二个数据是字符串类型,又由于录入下一个数据要"空格"本身是一个字符串
b是空格,b的值没有录入!
如何解决:重写创建键盘录入对象
String str =" " ;
************************************************************************
Math类中:
public static double random()返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。可用来获取随机数
random()的取值范围:[0.0,1.0);
获取1-100之间的随机数(int类型)
************************************************************************
String:表示字符串:
字符串是常量;
最大的特点:它们的值在创建之后不能更改。
String是一种特殊的引用类型:
默认值:null
构造方法:
String():无参构造
String(byte[] bytes) :将字节数转换成字符串
public String(byte[] bytes, intindex,int length):将字节数组的一部分转换成字符串
public String(char[] value):将字符数组转化成字符串 toCharArray():将字符串转换成字符
public String(char[] value, intindex, int count):将字符数组的一部分转换成字符串
public String(String original):将一个字符串常量构造成一个字符串对象
常用的方法:
public intlength()返回此字符串的长度
面试题:
数组中有没有length(),字符串中有没有length(),集合中有没有length()?
数组中没有length()方法,只有length属性
字符串中有length()方法
集合中没有length(),获取集合的元素数:size() (提后会提到)
-----------------------------------------
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(Stringstr):字符串的特有功能:拼接功能和+拼接符是一个意思
-----------------------------------------
看程序写结果:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)
public static void main(String[] args) {
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,地址值不一样,s3先在堆内存开辟地址,然后在方法区调用方法.s4在常量区检查,如果没有,就在方法区的常量区中开辟地址值创建常量
System.out.println(s3.equals(s4));//true,和上面的s1.equals(s2)相同,比较的是字符串是否相等.
String s5 = "hello";
String s6 = "hello";
System.out.println(s5 == s6);
//true,s5在常量区检查,如果没有,就在方法区的常量区中开辟地址值创建常量,
//s6相同,检查时发现已经在常量区有hello字符串,则直接返回地址,不再创建新的常量
System.out.println(s5.equals(s6));//true,和上面的s1.equals(s2)相同,比较的是字符串是否相等.
}
结果:
false
true
false
true
true
true
重点:
==:比较的是地址值
equals:默认的比较是地址值,String底层重写了equals方法,所有比较的内容是否相同
-----------------------------------------
面试题:
String s1 = new String("abc");
String s1 = "abc";
这两个分别创建了几个对象?
第一个,两个对象
第二个,一个对象
-----------------------------------------
模拟登录,给三次机会,并提示还有几次。
分析:
1)定义一个规则:
用户名:admin
密码:admin
2)循环三次,使用for循环
创建键盘录入对象
录入的用户名和密码和当前存在的用户名和密码进行比较,如果一致,登录成功,(break)
3)登录失败
分两种情况:
提示有几次机会
次数:2-x
当前2-x==0,换一中提示,当前机会用完了,请联系管理员...
代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)
public static void main(String[] args) {
//定义用户名和密码
String username= "admin" ;
String password = "admin";
//模拟登录,有三次机会
for(int x = 0 ;x <3 ; x ++) {
//创建键盘录入对象
Scanner sc= new Scanner(System.in) ;
System.out.println("请输入用户名:");
String InputUserName = sc.nextLine() ;
System.out.println("请输入密码:");
String InputPwd = sc.nextLine() ;
//判断录入的和存在用户名或者密码和存在的用户名或者密码看他们是否一致
if(username.equals(InputUserName) &&password.equals(InputPwd)) {
//一致,登录成功
System.out.println("登录成功....");
break ;
}else {
//没有登录成功:2,1,0
if((2-x)==0) {
System.out.println("请速联系管理员");
}else {
//!=0 ,2,1
System.out.println("当前您还是有"+(2-x)+"次机会");
}
}
}
}
-----------------------------------------
String类的常用获取功能:
public intlength():获取字符串的长度
public char charAt(intindex)返回指定索引处的字符
public intindexOf(int ch)返回指定字符在此字符串中第一次出现处的索引
问题:既然传入的字符:这里为什么用int类型
'a'和97 都表示a
public intindexOf(int ch,int fromIndex)返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索.
public intindexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引
public intindexOf(String str,int fromIndex)回在此字符串中第一次出现指定字符串处的索引,从指定的索引开始搜索.
截取功能
public String substring(intbeginIndex):从指定位置开始截取,默认截取到末尾,返回新的字符串
public String substring(intbeginIndex, int endIndex):从指定位置开始到指定位置末尾结束,包前不包含
-----------------------------------------
String的常用转换功能:
public byte[] getBytes() :将字符串转换为字节数组
public char[] toCharArray() :将字符串转换成字符数组(重点)
public static String valueOf(int i):将int类型的数据转换成字符串(重点)
这个方法可以将任何类型的数据转化成String类型
public String toLowerCase():转成小写
public String toUpperCase():字符串中所有的字符变成大写
-----------------------------------------
String类型的其他功能:
publicString replace(char oldChar,char newChar):将大字符串中的某个字符替换掉成新的字符
publicString replace(String oldStr,String newStr):将大串中的某个子字符串替换掉
public String trim():去除字符串两端空格
public intcompareTo(String anotherString)按字典顺序比较两个字符串
-----------------------------------------
需求:统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数。(不考虑其他字)
举例
HelloWorld1234Java
分析:
1)定义统计变量
bigCount = 0
smallCount = 0 ;
numberCount=0;
2)键盘录入字符串:有大写字母字符,小写字母字符,数字字符
3)获取每个
可以将录入的字符串遍历
char charAt(intindex)和length方法
4)判断
'a' 97
'A' 65
'0' 48
更简单方法
如果:
char>'a' && char<'z':属于小写字母字符
bingCount++;
'A' 'Z' :大写字母字符
'0' '9' :数字字符
代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)
public static void main(String[] args){
//定义三个统计变量
int bigCount =0 ;
int smallCount= 0 ;
int numberCount= 0 ;
//键盘录入对象
Scanner sc =new Scanner(System.in) ;
System.out.println("请您输入一个字符串:");
String line = sc.nextLine() ;
//将字符串遍历
for(int x =0 ; x < line.length() ; x ++) {
//可以通过索引获取每一个字符
char ch= line.charAt(x) ;
//判断他是否大写字母,小写字母,还是数字字符
if(ch>= 'a' && ch<='z') {
//小写字母字符
smallCount++ ;
}else if(ch>='A'&& ch<='Z') {
bigCount++;
}else if(ch>='0'&& ch<'9') {
numberCount ++;
}
}
System.out.println("大写字母字符有:"+bigCount+"个");
System.out.println("小写字母字符有:"+smallCount+"个");
System.out.println("数字字母字符有:"+numberCount+"个");
}
************************************************************************
StringBuffer:线程程安全的可变字符序列
线程(后面多线程中讲)
线程的安全问题,是难点(多线程属于难点) 多线程------>解决了多线程安全问题------>是死锁 :生产消费模式(Java中等待唤醒机制)
线程安全 --->同步的---->执行效率低
举例:
银行的网站,医疗平台...
线程不安全---->不同步---->执行效率高
举例:
新闻网站,XXX论坛...
面试题:
StringBuffer和String的区别?
前者是一个可变的字符序列,后者是不可变的字符序列
如果从内存角度考虑,String定义的时候,会在常量池中开辟空间,比较耗费内存
而StringBuffer,字符串缓冲区(里面存储的全部都是字符串),它会释放掉
-----------------------------------------
StringBuffer的构造方法:
StringBuffer() :无参构造的形式,初始容量16
StringBuffer(intcapacity) :指定容量构造一个字符串缓冲区
StringBuffer(String str)构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容
-----------------------------------------
StringBuffer的获取功能:
public intlength()返回长度
public intcapacity()返回当前容量 (如果超过容量,系统自动分配(存储字符串的时候,英文的))
-----------------------------------------
StringBuffer的添加功能
(实际开发中用的多):public StringBuffer append(String/boolean....) :在字符串缓冲区中追加数据(在末尾追加),并且返回字符串缓冲区本身
public StringBuffer insert(intoffset,String str):将当前str字符串添加到指定位置处,它返回字符串缓冲区本身
-----------------------------------------
StringBuffer的删除功能:
public StringBuffer deleteCharAt(int index):移除指定位置处的字符..
public StringBuffer delete(intstart,int end):移除从指定位置处到end-1处的子字符串...
-----------------------------------------
StringBuffer的反转功能:
public StringBuffer reverse() :将缓冲区中的字符序列反转取代,返回它(字符串冲)本身
-----------------------------------------
StringBuffer的截取功能:
public String substring(intstart):从指定位置开始截取,默认截取到末尾,返回值不在是缓冲区本身,而是一个新的字符串
public String substring(intstart,int end) :从指定位置开始到指定位置结束截取,包前不包后,
返回值不在是缓冲区本身,而是一个新的字符串
-----------------------------------------
StringBuffer的替换功能:
public StringBuffer replace(intstart,int end,String str)
从指定位置到指定位置结束,用新的str字符串去替换,返回值是字符串缓冲区本身
-----------------------------------------
几个面试题:
1StringBuffer,String,StringBuilder的区别?
StringBuffer和StringBuilder都是一个可变的字符序列,提供一个缓冲区.(两者都看做容器)
StringBuffer:线程安全的,同步的,执行效率低
StringBuilder:线程不安全的,不同步的,执行效率高,并且单线程中优先采用StringBuilder
StringBuffer 执行效率虽然低,但是由于String类型,并且他可变的字符序列,提供了缓冲区
2 StringBuffer和数组的区别?
数组:它是可以存储多个数据的容器,并且多个数据的类型必须一致
数组长度功能:length属性
StringBuffer:它是容器,它在缓冲区始终存储的只能字符串类型的数据
获取缓冲区的长度:length()
-----------------------------------------
jdk5以后的特性:自动拆装箱
int---Interger(是int类型的包装类类型) 需要将int--->String
Interger--int:自动拆箱
char---Character: 需要char--String
为什么要类和类之间转换
要将A类类型转换成B类型,为了使用B类的功能
有时候,有需要将B类转换成A类,可能需求需要的是A类型
例如:String和StringBuffer之间的相互转换
-----------------------------------------
基本类型对应都有一个保证类型,目的就为了将基本数据类型可以String类型之间进行互相转换
* byte Byte
* short Short
* int Integer (讲到)
* long Long
* float Float
* double Double
* char character (讲到)
* boolean Boolean
************************************************************************
Integer类是int类型的包装类类型
问题: 需要将100十进制 (整数默认十进制) 它的二进制,八进制,十六进制...
需求:获取Integer的最值
public static final intMAX_VALUE
public static final intMIN_VALUE
-----------------------------------------
Integer的构造方法:
public Integer(intvalue)
public Integer(String s)
-----------------------------------------
Integer提供了静态功能:
public static String toBinaryString(int i)//以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
public static String toOctalString(int i)//以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。
public static String toHexString(int i)//以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
-----------------------------------------
如何将int转换为String类型
valueOf(int i);
将String转换为int类型
static int parseInt(String s);
-----------------------------------------
JDK5 以后提供了自动拆装箱
可以将Integer-->拆箱 int类型
可以将int类型--->装箱 Integer类型
JDK5 还提供了哪些特性:
泛型,可变参数,增强for循环(在集合中)等等..
JDK8特性:
Stream流 --> 表达式
************************************************************************
Character类:
Character 类在对象中包装一个基本类型 char 的值。Character 类型的对象包含类型为 char 的单个字段。
以确定字符的类别(小写字母,数字,等等),
构造方法:
public Character(char value)
-----------------------------------------
Character类的判断功能:
public static boolean isDigit(char ch)确定指定字符是否为数字。
public static boolean isLowerCase(int ch):确定是否是小写字母字符
public static boolean isUpperCase(int ch):确定是否大写字母字符
两个转换功能:
public static inttoLowerCase(int codePoint)//转换为小写字母字符
public static inttoUpperCase(int codePoint)//转换为大写字母字符
-----------------------------------------
需求:键盘录入一个字符串,统计当前字符串中大写字母字符,小写字母字符,数字字符的个数(不考虑其他字符)
现在改进:直接Charater类的这三个判断功能
代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)
public static void main(String[] args){
//定义三个统计变量
int bigCount =0 ;
int smallCount=0 ;
int numberCount= 0 ;
//创建键盘录入对象
Scanner sc =new Scanner(System.in) ;
//接收数据
System.out.println("请输入一个字符串:");
String line = sc.nextLine() ;
//把字符串转成字符数组
char[] chs =line.toCharArray() ;
//遍历,取出每一个字符
for(int x = 0 ;x < chs.length ; x ++) {
char ch= chs[x] ;
//判断当前ch字符是否为大写字母字符,数字字符,小写字母字符
if(Character.isUpperCase(ch)) {
bigCount ++;
}else if(Character.isDigit(ch)) {
numberCount++;
}else if(Character.isLowerCase(ch)) {
smallCount++ ;
}
}
System.out.println("大写字母字符有:"+bigCount+"个");
System.out.println("小写字母字符有:"+smallCount+"个");
System.out.println("数字字符有:"+numberCount+"个");
}
-----------------------------------------
冒泡排序: 两两比较,大的往后放,第一次比较完毕最大值出现在最大索引处....
需求:把字符串中的字符进行排序。
举例:"dacgebf"
结果:"abcdefg"
分析:
1)键盘录入一个字符串"dacgebf"
2)可以将字符串转换成字符数组
3)冒泡排序
4)最终要字符串类型的数据
代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)
publicstatic void main(String[] args) {
//创建键盘录入对象
Scanner sc =new Scanner(System.in) ;
//接收数据
System.out.println("请输入一个字符串:");
String line = sc.nextLine() ;
//将字符串转换成字符数组
char[] chs =line.toCharArray() ;
//排序
bobbleSort(chs);
//需要的是字符串类型
String result = Arrays.toString(chs) ;
System.out.println("result:"+result);
}
//冒泡排序
public static void bobbleSort(char[] chs) {
for(int x = 0;x < chs.length - 1; x ++) {
for(inty = 0 ; y < chs.length-1-x ; y++) {
if(chs[y]>chs[y+1]) {
char temp= chs[y] ;
chs[y]= chs[y+1] ;
chs[y+1]= temp ;
}
}
}
}
-----------------------------------------
选择排序: 用0索引对应的元素依次后面索引对应的元素进行比较, 1索引..... 小的数据往前方法,就可以得到一个排好序的数组...
需求:使用选组排序进行排序;
代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)
public static voidmain(String[] args) {
// 定义数组
int[] arr = { 24, 69, 80, 57, 13 };
// 遍历功能
System.out.println("排序前:");
printArray(arr);
System.out.println("----------------------");
System.out.println("排序后:");
for (int x = 0;x < arr.length - 1; x++) {
for (inty = x + 1; y < arr.length; y++) {
if (arr[x]> arr[y]) {
inttemp = arr[x];
arr[x]= arr[y];
arr[y]= temp;
}
}
}
printArray(arr);
System.out.println("----------------------");
// 最终版代码:方法改进
System.out.println("排序后:");
selectSort(arr);
printArray(arr);
}
// 选择排序的功能
public static void selectSort(int[]arr) {
for (int x = 0;x < arr.length - 1; x++) {
for (inty = x + 1; y < arr.length; y++) {
if (arr[x]> arr[y]) {
inttemp = arr[x];
arr[x]= arr[y];
arr[y]= temp;
}
}
}
}
//遍历数组的方法
public static void printArray(int[]arr) {
System.out.print("[");
for (int x = 0;x < arr.length; x++) {
if (x == arr.length - 1) {
System.out.println(arr[x] + "]");
} else {
System.out.print(arr[x] + ", ");
}
}
}
-----------------------------------------
数组中的元素查找法(基本查找法)
折半查找(二分查找)前提:数组一定是有序的
分析:
A:定义最小索引和最大索引
B:计算中间索引
C:中间索引对应的元素和需要查找的元素比较
相等,直接返回中间索引
不相等:
大了,左边找
max = mid -1 ;
小了,右边找
min= mid + 1 ;
E:重新计算中间索引 ,回到B继续查找
需求:使用折半查找法查找数组中某一个元素;
代码如下:(只包含了main方法里面的代码,将下面代码复制到创建的class中就可运行)
public static void main(String[] args){
//定义一个数组
int[] arr = {11,22,33,44,55,66,77} ;
//写一个方法来调用
int index =search(arr, 33) ;
System.out.println("index:"+index);
int index2 =search(arr, 333) ;
System.out.println("index2:"+index2);
}
/**
* 两个明确:
* 明确返回值类型:int
* 明确参数类型:2个参数 int[] arr ,intvalue
*/
public static intsearch(int[] arr,int value) {
//1定义数组中的最小索引和最大索引
int min = 0 ;
int max =arr.length -1 ;
//2 计算出中间索引
int mid = (max+min)/2 ;
//3)拿中间索引对应的元素和需要查找的元素进行比较
//如果相等,返回
while(arr[mid]!=value){
//不相等
if(arr[mid]>value) {
max = mid -1 ;
}else {
min = mid + 1 ;
}
//如果这value在数组中找不到,找不到返回-1
if(min>max){
return -1 ;
}
//重新计算出中间索引
mid = (max+min)/2;
}
return mid ;
}
该数组是一个有序的数组,当使用无序的数组是,需要先进行排序需要进行导包来调用函数bobbleSort();导包快捷键:ctrl+shift+O;
-----------------------------------------
例:需要查找: int[]arr = { 24, 69, 80, 57, 13 }; 找80这个元素对应的索引
问题:虽然先排序,后进行折半查找;但是数组已经发生变化,80元素对应的索引已经不是之前的,有问题...
解决方案:
使用基本元素查找法;