JAVA基础(个人向)
1.方法的形式参数和返回值问题研究(引用数据类型)
方法的形式参数如果是一个具体类,在调用该方法时,实际参数如何传递呢? 需要创建当前具体类对象进行传递
方法的形式参数如果是一个抽象类,在调用该方法时,实际参数如何传递呢? 需要抽象类多态:创建抽象类的子类对象
方法形式参数如果是一个接口,调用该方法,实际参数如何传递? 需要通过接口多态,定义接口子实现类,通过创建子类类对象
返回值问题:
如果一个方法的返回值是一个具体类,需要返回的? 返回的当前类具体对象
如果方法返回值是一个抽象类:需要返回的是当前抽象类的子类对象
如果方法返回值是一个接口:需要返回的是接口的子实现类对象
2.内部类
- 内部类:
成员内部类
如果成员内部类是一个非静态的,通过外部类直接访问内部类的成员方法?
外部类名.内部类名 对象名 = 外部类对象.内部类对象;
外部类名.内部类名 对象名 = new 外部类名.内部类名() ;
如果成员内部类是静态的,当前内部类的成员方法访问外部类的成员变量,只能访问静态的变量
局部内部类
3.权限修饰符的优先级
私有修饰符private: 只能在当前类中 (范围最小)
默认修饰符: 在同一个包下/同一个包下子类
protected:受保护的 在同一个包下/同一个包下的子类/不同包下的子类
public:共公开的 任何情况下都访问
4.Object类的toString方法以及equals方法
public String toString():对象的字符串表现形式,结果应该简明扼要,易于读懂的表达式(成员信息表达式)
需要建议子类重写这个方法,否则如果直接输出对象名称,打印出来是一个"地址值",没有意义
Student s = new Student(“文章”,35,“男”) ;
如果不重写Object的toString()
直接输出s---->等价于s.toString()
---->this.getClass().getName()+"@"+Integer.toHexString(this.hashCode())
重写toString()-->alt+ins--->toString() 类名{[name="文章",age=35,sex="男"]}
public boolean equals(Object obj)
==和equals
==:如果连接的基本数据类型:比较数据值是否相同
==:如果连接的引用数据类型:比较的是对象的地址值是否相同
Student s1 = new Student(“文章”,35,“男”) ;
Student s2 = new Student(“文章”,35,“男”) ;
s1.equals(s2) ; false
equals:如果不重写Object的equals,它默认比较的是两个对象的地址值是否相同…
return (this == obj) ;
建议子类重写equals方法的同时,还需要重写hashCode()(对象不同,哈希码值是不同的)
alt+ins---->equasl and hashCode()--->idea default
重写之后:s1.equals(s2) ; true
String类型---底层已经对Object的equals重写了,所以String的equals就比较的是字符串内容是否相同!
5.局部内部类访问局部变量,针对局部变量要求
/*
jdk7版本:
局部内部类访问局部变量,局部变量此时必须手动显示给出final关键字
JDK8版本后(包含jdk8)
此时 局部内部类访问局部变量,局部变量不需要显示给出final,jvm做优化了,通过反编译工具查看局部内部类
外部类名$内部类名.class
当前局部变量--->已经加入了final关键字
加入final关键字:此时变量是常量
*/
class Outer{
public void method(){
//final int num = 20 ;//JDK8以后:不需要加入final
class Inner{
public void show(){
System.out.println(num) ;//使用num
}
}
Inner inner = new Inner() ;
inner.show() ;
}
}
/*
局部变量随着方法调用而存在,随着方法调用结束而消失,但是当前局部内部类同对象名访问show()方法,
inner对象不会立即显示,局部内部类中的成员还在使用这个num变量,此时该变量必须为常量,否则就冲突了
*/
6.方法的形式参数和返回值如果是抽象类或者接口,匿名内部类使用
//形式参数是一个抽象类
abstract class Person{
public abstract void work() ;
}
interface Love{ //接口
void love() ;
}
class StudentDemo{
// public void method(Person person){
public void method(Love l){
//person.work() ;
l.love() ;
}
}
class Test{
public static void main(String[] args){
//创建StudentDemo类对象
StudentDemo sd = new StudentDemo() ;
/*
sd.method(new Person(){ //抽象类的匿名内部类
@Override
public void work(){
//....
}
}) ;
*/
sd.method(new Love(){
public void love(){
//...
}
}) ;
}
}
//返回值问题:也可以使用匿名内部类
//需要在控制台输出"helloworld"
interface Inter{
void show() ;
}
class Outer{
//补全代码
public static Inter method(){
return new Inter(){
public void show(){
System.out.println("helloworld") ;
}
} ;
}
}
class Test{
public static void main(String[] args){
Outer.method().show() ;
// Outer.method().show() ;Outer.method()-->具有返回值的方法
}
}
7.String类
7.1 String类的特点
String:字符串是一个常量,一旦被赋值,其值不能被更改;和StringBuffer最大区别:后者支持可变的字符序列,前者是一个不可变的字符序列
String str = “abc” ;
7.2 String类的equals方法
String类底层已经针对Object的equals和hashCode方法进行了重写
hashCode():String对象的哈希码值是否相同,哈希码值相同的不一定内容就相同,所以它需要覆盖equals方法
比较的字符串内容是否相同.
String s1 = “hello” ;
String s2 = new String(“hello”) ;
s1 ==s2—> false
s1.equals(s2) ---->true
7.3 String类的获取功能
char charAt(int index) {} //返回指定索引处的字符
String[] split(String regex){} //String类的拆分功能,通过特定字符串将字符串—转换成String数组
String concat(String anotherStr){}//字符串类的拼接功能
int indexOf(String str/char ch){} //查询某个字符或者子字符串第一次出现的索引值
int length() {}//获取字符串长度的功能
String subString(int beginIndex){}//从指定位置处默认截取到末尾
String subString(int beginIndex,int endIndex){}//从指定位置截取到指定位置结束(endIndex-1)
7.4 String类型作为引用类型,且为形式参数,其特点
形参的改变不会实际参数—基本类型的效果一致
7.5 String类型的转换功能
编码的过程:将字符串转换成字节数组
byte[] getBytes(){}
解码:String类构造方法
String(byte[] bytes){} //String s = new String(字节数组) ;
将字符串转换成字符数组
char[] toCharArray(){}
将字符数组---->String
方式1:String类的构造方法
String(char[] chs){}
方式2:Arrays:针对数组操作的工具类: 将任何类型的数组(包括对象数组:Object[] )
//Student[] students = new Student[5] ;
public static String toString(int[]/char[]/double[]/float[]/long[]/Object[] a)
Arrays.toString(数组对象)----StringBuffer
StringBuffer(String str)
7.6 String类型的按照字典顺序比较compareTo方法
String类型—内置一个属性: char[] value
1)字符串底层---->字符数组 s1和s2—>转换字符串数组 获取长度 5 和 3
2)通过Math的min方法(5,3) —>获取最小值 int lim = 3 ;
3) 创建两个数组对象 char[] c1 = {‘h’,‘e’,‘l’,‘l’,‘o’}
char[] c2 = {‘h’,‘e’,‘l’} ;
4)判断 定义统计变量 k = 0
while(k < lim){
if(c1[k] != c2[k]){
return 对应的字符值进行相减
return ‘h’ - ‘a’ = 104 - 97 = 7
}
k ++ ; //统计变量++
}
return 字符串的长度相减(字符数组长度相减)
8. StringBuffer
8.1 StringBuffer和StringBuilder的区别
共同点:
两个都都是字符串缓冲区,支持可变的字符序列!
不同点:
StringBuffer:线程安全的类---->同步的(多线程:同步锁:源码几乎所有的方法都是同步方法 synchronized)
执行效率低
StringBuilder:线程不安全的类---->不同步----->执行效率高
单线程程序中,只考虑执行效率不考虑安全,所以StringBuilder类用作StringBuffer的简易替换
多线程环境中,要考虑安全问题只能使用StringBuffer,
线程安全的类:StringBuffer,Vector(List接口的子类)
8.2 StringBuffer和数组的区别
共同点:都是容器,都可以存储任意类型的元素 , 可以存储基本类型,也可以存储引用类型
数组---->同一种类型的元素 长度是固定的
如果需求中长度是不断变化的,那么数组用不了,考虑:StringBuffer/集合
StringBuffer---->存储不同类型的元素 append(int/char/double/Object/foat…) 长度是可变的
借助StringBuffer的功能:reverse()/append()追加----->转换成String形式体现
8.3 StringBuffer常用的一些功能
StringBuffer的反转功能:reverse()
StringBuffer的追加功能:append(xxx)
StringBuffer的删除功能:deleteCharAt(int index)
StringBuffer的截取功能:subString(int bengin,int end)
StringBuffer的截取功能:subString(int bengin)
8.4 Date和String类型转换
//java.util.Date---->String: 格式化操作
//1)创建Date对象
Date date = new Date() ;
//2)创建SimpleDateFormat对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ;
//3)格式化的操作
String textDate = sdf.foramt(date) ; //使用textDate:日期文本字符串
//String:日期文本字符串----->java.util.Date :解析操作
//1)日期文本字符串
String source = "2021-7-29" ; //格式
//2)创建SimpleDateFormat对象
SimplDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd") ; //模式必须和String的格式一致,否则解析出错
//3)解析操作
Date date2 = sdf2.parse(source) ; //使用Date
8.5 StringBuffer和String转换
//String--->StringBuffer
String s = "hello" ;
//使用StringBuffer的有参构造方法
StringBuffer sb = new StringBuffer(s)
//或者是StringBuffer的追加功能
StringBuffer sb = new StringBuffer() ;
sb.append(s) ;
//StringBuffer--->String
//String类的构造方法 String(StringBuffer)
StringBuffer buffe = new StringBuffer("world") ;
String str = new String(buffer) ;
//第二种方式:StringBuffer的toString方法
8.6 int和String类型之间转换
//int---->String
//integer类型的静态功能toString
public static String toString(int i)
//String--->int
//Integer的静态功能
public static int parseInt(String s)
//String ---->Integer ---->int
String s = "100" ;
Integer i = new Integer(s) ;
int num = i.intValue() ;
8.Collection
8.1 Collection集合进行遍历的方式
//两种:
//方式1:将Collection转换成Object[] toArray(){}
Collection<String> c = new ArrayList<String>() ;
c.add("hello") ;
c.add("javaee") ;
c.add("javaweb") ;
//直接转成对象数组
Object[] objs = c.toArray() ;
//遍历数组
for(int x = 0 ; x < objs.length; x ++){
System.out.println(objs[x]) ;
}
//方式2:获取Collection的Iterator迭代器(在集合高效的遍历方式)
Collection<String> c2 = new ArrayList<String>() ;
c2.add("hello") ;
c2.add("javaee") ;
c2.add("javaweb") ;
Iterator<String> it = c2.iterator() ;
while(it.hasNext()){
String str = it.next();
System.out.println(str);
}
8.2 Collection的功能
添加
boolean add(Object e){}
boolean addAll(Collection c)
boolean containsAll(Collection c)
boolean removeAll(Collection c)
boolean retainAll(Collection c):A集合对象.retainAll(B集合对象)
//获取交集的元素,将交集的元素保存在A集合中,返回值的意思:A集合前后元素是否发生变化,如果没有变化,则返回false,如果有变化,则返回true
删除
boolean remove(Object e)
void clear()
判断
boolean contains(Object e)
boolean isEmpty()
获取
int size()
Iterator iterator()
Object[] toArray()
9 Iterator的原理
Iterator的原理:
内部具备一个指针,当在第一次获取元素的时候,指针处在第一个元素前面的位置,不指向任何元素;当通过hasNext()判断,如果存在下一个可以迭代的元素,那么指针就会向下一个索引进行移动,并且next()获取前面的元素,依次这样操作,直到hasNext()为false的时候,没有元素了,指针就不会在移动;Iterator是一个接口,具体的移动的操作是通过
ArrayList的成员内部类Itr来进行实现;
10.List集合和Set集合
List集合有序,存储和取出一致的,可以允许元素重复
Set集合无序,存储和取出不一致,不允许元素重复(元素唯一)
每一个子实现类的特点: 通过API后面分析