常用类
Object:是类层次结构的根类.每个类都使用 Object 作为超类(父类)
public int hashCode()返回该对象的哈希码值. 把它理解地址值(
是实际意义的地址值)
public final Class getClass()返回此 Object 的运行时类
Class类中有一个方法:
public String getName()以 String 的形式返回此
Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
public boolean equals(Object obj)
指示其他某个对象是否与此对象“相等”。
==:比较的值相等(地址值)
equals:本身属于Object类中的方法,默认比较的是地址值是否相同
按照正常情况:equals方法底层实际执行的两个对象在==,比较是地址值;假如:学生的年龄和姓名一致,看成同一个人
在自定义的类中,重写Object中的equals()方法,比较是两个对象的成员变量的值是否相同.
自动生成即可!
在Object中的equals方法
public boolean equals(Object obj) {
return (this == obj); //在底层实际走了一个==:比较的是地址值
//this:s1
//obj:s2
}
(重写后的内容比较的是)
/重写了Object中的equals方法
@Override
public boolean equals(Object obj) {//传入对对象
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())//this.getClass ();正在运行的那个类: class 包名.类名
return false;
Student other = (Student) obj;//向下转型
if (age != other.age)//this.age other:传入的s2
return false;
if (name == null) {//this
if (other.name != null) //传入的姓名的值是否为null
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
Object中的一个方法:
public String toString(); 回该对象的字符串表示
public static String toHexString(int i):以十六进制表示对字符串形式
直接输出对象名称:实际执行了Object中的toString(),输出的全类名@十六进制数据
我现在输出对象名称,不想让toString()直接输出的是一个地址值(对象的地址值)
就需要重写Object中的toSring(),一般情况:自动生成即可 建议所有子类都重写此方法。
自动生成重写后的toString方法
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
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类中它提供一个判断功能:
public boolean hasNextXXX():当前扫描器判断是否有下一个可以录入的XXX类型数据
nextXXX();
问题:
键盘录入两个int类型的数据,分别输出,没有问题
键盘录入两个String类型的数据,分别输出:没有问题
先录入一个String类型的数据,在录入int类型的数据,没有问题
先录入一个int类型的数据,在录入String类型的数据,有问题,第二个数据是字符串类型,又由于录入下一个数据要"空格"本身是一个字符串
b是空格,b的值没有录入!
如何解决:重写创建键盘录入对象
String:
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() (后面讲)
String字符串的最大的特点:
字符串一旦被赋值,其值不能被改变
面试题:
String s1 = new String("abc");
String s1 = "abc" ;
这两个分别创建了几个对象?
==:比较的是地址值
equals:默认的比较是地址值,String底层重写了equals方法,所有比较的内容是否相同
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类的常用获取功能:
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):从指定位置开始到指定位置末尾结束,包前不包含
compareTo函数()
比较两个String类型的字符串 返回较短String的的长度
应用:
需求:需要遍历一个字符串:
String s = "helloworld";
//利用charAt和length() 使用for循环遍历
for(int x = 0 ;x < str.length();x++) {
System.out.println(str.charAt(x));
}
需求:把一个字符串的首字母转成大写,其余为小写。(只考虑英文大小写字母字符)
helloWORLD
如何实现:
截取一个字母:转换为大写
从下标1开始截取到结束,转换给小写.
然户将两个字符串拼接
String s = “helloWORLD”;
String s1 = s.substring(0, 1) ;
//在截取除了第一个字符以为的其他字符
String s2 = s.substring(1);
//将s1转换成大写
String s3 = s1.toUpperCase() ;
//s2转换成小写
String s4 = s2.toLowerCase() ;
//s3和s4拼接
String result = s3.concat(s4) ;
System.out.println("result:"+result);
StringBuffer:线程安全的可变字符序列
线程安全即代表了数据是同步的,但是由此又导致了执行效率低下
例如:
银行网站:它的每个步骤都需要确认,由此它是安全,但是也是效率低下的
线程不安全即代表了不同布,不安全,但是由此使得下次效率变高
StringBuffer和String的区别?
前者是一个可变的字符序列,后者是不可变的字符序列
如果从内存角度考虑,String定义的时候,会在常量池中开辟空间,比较耗费内存
而StringBuffer,字符串缓冲区(里面存储的全部都是字符串),它会释放掉
StringBuffer的构造方法:
StringBuffer() :无参构造的形式,初始容量16 :如果赋值超过了该初始容量,容量会以现在有的容量为准
StringBuffer(int capacity) :指定容量构造一个字符串缓冲区
StringBuffer(String str) 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容,值得注意的是该容量为 初始容量+当前字符数
注意:StringBuffer sb = “嘿嘿”;
这是错误的,不能直接将一个字符串类型赋值给StringBuffer.类型.
StringBuffer添加功能(这是实际开发中应用最多的)
public StringBuffer append(String /boolean...) :在字符串缓冲区末尾中追加数据() 并且返回字符串缓冲区本身
这中方式便捷的缘故在于它能直接返回字符串缓冲区本身.
由于这样我们可以在这直接使用链式编程.
sb.append(“哈”).append(“哈”);同样可以输出同样的结果,不过一般不提倡使用链式编程.
StringBuffer的删除功能:
public StringBuffer deleteCharAt(int index):移除指定位置处的字符..
public StringBuffer delete(int start,int end):移除从指定位置处到end-1处的子字符串...
如图:
StringBuffer的反转功能:
public StringBuffer reverse() :将缓冲区中的字符序列反转取代,返回它(字符串冲)本身
StringBuffer的截取功能:
public String substring(int start):从指定位置开始截取,默认截取到末尾,返回值不在是缓冲区本身,而是一个新的字符串
public String substring(int start,int end) :从指定位置开始到指定位置结束截取,包前不包后,返回值不在是缓冲区本身,而是一个新的字符串
StringBuffer的替换功能:
public StringBuffer replace(int start,int end,String str)
从指定位置到指定位置结束,用新的str字符串去替换,返回值是字符串缓冲区本身
故而不需要再重新定义字符串或这字符串缓冲区
拆装箱
这是JDK5以后的新特性:自动拆装箱.
例如int----Interger(是int类型的包装类类型)
Interger---int:自动拆箱
还有char---Character:
有时候需要将A类型转换成B类型.
例如将String 转换成StringBuffer相互转换
有两种方法,
方式一:通过带参构造将,String的值直接赋给StringBuffer例如:StringBuffer sb = new StringBuffer(s);
方式二:通过无参构造,后面使用append方法给后面添加sb.也能完成String到StringBuffer的转换.
将StringBuffer转换为String
方式一:通过String的构造方法来直接给StringBuffer进行类型转换
方式二:通过StringBuffer的toString方法进行转换
字符串的应用
有一个数组:需要将数组 拼接成字符串类型:
方式String类型的方式:
方式2:StringBuffer进行实现
判断一个字符串是否是对称字符串(方法改进)
方式一比较简单:将String类型数据转换为StringBuffer ,使用reverse方法进行转化,再将其经过toString()方法将其转换为String类型,然后和原来的String类型数据进行比较,如果相等则堆成:代码如下
String s = “aba”;
StringBuffer sb = new StringBuffer(s);
Sb.reverse();
String s1 =sb.toString();
s1.equals(s);
若返回值是ture,则对称,反之则部队称.
链式编程 new StringBuffer(s).reverse.toString().equals(s)
方式二:可以将String类型转换为char类型数组,然后将数组中的第一值对比最后一个,第二个对比倒数第二个,依次对比.
拆装箱
基本类型对应都有一个保证类型,目的就为了将基本数据类型可以String类型之间进行互相转换
byteByte
shortShort
intInteger(讲)
longLong
floatFloat
doubleDouble
charcharacter(讲)
booleanBoolean
规律:一般保证类型是基本类型第一个字母大写就好了.
只有int--->Integer;
和 char--->Character; 这两个需要特别记忆下.
Integer类是int类型的包装类类型
Integer提供了静态功能:
public static String toBinaryString(int i)//该方法可以将数转换为二进制
public static String toOctalString(int i)//转换为八进制
public static String toHexString(int i)//转换为十六进制
Integer的构造方法:
public Integer(int value)
public Integer(String s)//当前的字符串必须为数字字符串.
若是Integer i = new Integer(“abc”);
这会导致错误,错误类型:java.lang.NumberFormatException
注意:代码:Integer i = 200;
虽然200是int类型,但是为什么能直接转化呢?
经过反编译后发现,底层代码实际执行的是valueOF(int i);该类中本身有一层缓冲区:缓冲值的范围:-128~127
如何将int转换为String类型
valueOf(int i) ;
将String转换为int类型
static int parseInt(String s);
首先是Int转化为String类型的演示
方式一:
方式1: 字符串拼接
Int num = 19;
例如:String s = “” + num;
方式二:方式2:valueOf(int i) ;
int -->Integer--->String
例如:Integer i = new Integer(100);
String s = i.toString();
方式3:静态toString(int i): 由于static String toString(int i )
String s = Integer.toString(num);
String--->int
方式1:String-->integer--->int
String s = "923";
Integer i = new Integer(s);
int i1 = i.intValue();
方式2:方式2:(常用)public static int parseInt(String s)
String s = "923";
int a = Integer.parseInt(s);
System.out.println(s);
注意:
JDK5 以后提供了自动拆装箱
可以将Integer-->拆箱 int类型
可以将int类型--->装箱 Integer类型
JDK5 还提供了哪些特性:
泛型,可变参数,增强for循环(在集合中)等等..
JDK8特性:
Stream流--> 表达式
Character类:
Character 类在对象中包装一个基本类型 char 的值。Character 类型的对象包含类型为 char 的单个字段。
以确定字符的类别(小写字母,数字,等等),
构造方法:
构造方法:
public Character(char value)
例如 Character ch = new Character(‘a’);
Character类的判断功能:
public static boolean isDigit(char ch)确定指定字符是否为数字。
public static boolean isLowerCase(int ch): 确定是否是小写字母字符
public static boolean isUpperCase(int ch):确定是否大写字母字符
两个转换功能:
public static int toLowerCase(int codePoint)
public static int toUpperCase(int codePoint)
排序算法:
1. 冒泡排序思想:
两两比较,大的往后放,第一次完毕后,最大值在最大索引处!依次这样比较,得到一个排好序的数组.
规律:1)两联比较,大的往后放,最大值在最大索引处
2)第一次全部比较,确定数组最大值.
选择排序:
思想:从0索引依次开始和后面的索引值进行比较,小的往前放,第一次放完后,最小值在最小索引处,然后这样比较,得到一个排列好的数组.
规律:
从0索引开始,依次和后面的索引对应的元素进行比较,小的往前放.
折半查找:
前提:一定是数组原来的元素是有序的,
中心思想:将元素减半,方便开发者使用.
分析:
A:定义最小索引和最大索引
B:计算中间索引
C:中间索引对应的元素和需要查找的元素比较
相等,直接返回中间索引
不相等:
大了,左边找
max = mid -1 ;
小了,右边找
min = mid + 1 ;
E:重新计算中间索引 ,回到B继续查找
使用二分查找时,可以先进行排序,再进行二分查找,可这样各个数的索引值会发生改变.
故这时候直接使用基本元素查找法更直接:
关键代码
//value为想要查找的数
For( int x = 0 ; x <arr.length ; x++){
if( arr[x] = value){
Return x;
}
}
Return -1;