java学习

面向对象

接口

接口:一个类中全部都是抽象方法,就可以把类改进为接口。接口的两个重点
制定规则:所有方法都必须被重写
可扩展:类中可以写更多的方法
定义:interface(替代class的位置就好了)
实现:类implements接口,重写所有方法,可以实现多个接口,全部重写方法

接口中的变量:接口里的成员变量默认 public static final相当于是常量
接口中的方法:只能是抽象方法 public abstract(jdk7和以前)。

jdk8增加默认方法,不用在子类实现。关键字public default void show(),但也可以重写。也允许static静态方法。静态方法可以通过接口名.调用,不能重写。

jdk9接口增加私有方法,关键字private,只能接口内部调用。静
默认方法可以调用私有的静态方法和非静态方法
静态方法只能调用私有的静态方法

接口和接口也可以继承

多态

多态:
继承关系
方法重写
父类引用指向子类对象
成员变量用父类的,方法用子类
父类没方法编译不通过,父类没成员变量编译不通过。
成员变量 编译看父类,运行看父类 成员方法 编译看父类,运行看子类.
缺点:不能调用子类特有的内容
调用特有方法:直接创建子类对象,or强制类型转换父类转子类

内部类

一个类中定义另一个类
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象; 举例:Outer.Inner oi = new Outer().new Inner();

将一个类,设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有 化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。

静态成员内部类访问格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();
静态成员内部类中的静态方法:外部类名.内部类名.方法名();

局部内部类是在方法中定义的类
局部内部类,外界是无法直接使用,需要在方法内部创建对象并使用 该类可以直接访问外部类的成员,也可以访问方法内的局部变量

匿名内部类的本质是一个特殊的局部内部类,是一个继承了该类或者实现了该接口的子类匿名对象
匿名内部类将继承\实现,方法重写,创建对象,放在了一步进行

应用:方法的参数是接口或者抽象类时,创建一个接口的实现类对象使用匿名内部类

lambda表达式

lambda表达式可以对匿名内部类进行的优化
(形式参数) -> {代码块}
使用条件:有一个接口 接口中有且仅有一个抽象方法,一般情况是另外一个方法调用前面那句话(也就是说接口作为参数)。

参数类型可以省略。但是有多个参数的情况下,不能只省略一个
如果参数有且仅有一个,那么小括号可以省略
如果代码块的语句只有一条,可以省略大括号和分号,和return关键字

匿名内部类和lambda的区别
匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
Lambda表达式:只能是接口

如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式

API

math

构造方法私有化不能在外界创建对象,通过类名调用
public static int abs(int a) 返回参数的绝对值
public static double ceil(double a) 返回大于或等于参数的最小double值,等于一个整 数 public static double floor(double a) 返回小于或等于参数的最大double值,等于一个整 数 public static int round(float a) 按照四舍五入返回最接近参数的int
public static int max(int a,int b) 返回两个int值中的较大值
public static int min(int a,int b) 返回两个int值中的较小值
public static double pow (double a,double b) 返回a的b次幂的值
public static double random() 返回值为double的正值,[0.0,1.0)

system

public static void exit(int status) 终止当前运行的 Java 虚拟机,非零表示异常终止 public static long currentTimeMillis() 返回当前时间(以毫秒为单位)

object

object是一切类的超类,快捷键ait+insert空参构造和全参构造,可以重写object类中的方法。所以object里一般都是重写类的方法
查看源码:ct+B

toString方法的作用: 以良好的格式,更方便的展示对象中的属性值

equals
用于对象之间的比较,返回true和false的结果 举例:s1.equals(s2); s1和s2是两个对象
不希望比较对象的地址值,想要结合对象属性进行比较的时候,子类重写。

equals题目
string equals stringbuider
stringbulder equals string
1.调用的是string的equals方法,必须是string类型才能比较属性值
2.没有重写equals,直接用的object比较地址

BigDecimal
可以用来进行精确计算
参数:小数,字符串
如果想使用精确运算,请使用字符串构造
方法.add.subtract…

包装类

写法是大写的

构造方法
public Integer(int value) 根据 int 值创建 Integer 对象(过时)
public Integer(String s) 根据 String 值创建 Integer 对象(过时)
静态方法:Integer.valueof
public static Integer valueOf(int i) 返回表示指定的 int 值的 Integer 实例
public static Integer valueOf(String s) 返回一个保存指定值的 Integer 对象 String

装箱拆箱:基本数据类型和包装类的转换
Integer i1=100;
可以,自动装箱。把基本数据类型自动包装类,底层自动调用valueof。
i1+=200
先把i1编程int,+成300再装箱

int转换为String
方法一:直接在数字后加一个空字符串“”
方法二:通过String类静态方法valueOf() S
String s2 = String.valueOf(number);
用谁的静态方法,就转换成谁

String转换为int
方式一:先将字符串数字转成Integer,再调用valueOf()方法
注意valueof很多方法都有,String有,Integer也有
方式二:通过Integer静态方法(Integer.parseint)parseInt()进行转换
把string解析成int

split返回数组

数组高级操作

二分查找:数组的元素有大小顺序
拿所要查询的值与middle比较,更新min=middle+1或者max=middle-1

1.定义两个变量,表示要查找的范围。默认min = 0 ,max = 最大索引
2 循环查找,但是min <= max
3.计算出mid的值
4.判断mid位置的元素是否为要查找的元素,如果是直接返回对应索引
5. 如果要查找的值在mid的左半边,那么min值不变,max = mid -1.继续下次循环查找
6.如果要查找的值在mid的右半边,那么max值不变,min = mid + 1.继续下次循环查找
7. 当min > max 时,表示要查找的元素在数组中不存在,返回-1

冒泡排序:
一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有的 数据进行操作,直至所有数据按要求完成排序 如果有n个数据进行排序,总共需要比较n-1次 每一次比较完毕,下一次的比较就会少一个数据参与

递归的内存模型
没有new对象不涉及堆内存,方法被调用,进栈执行。
方法被调用进栈,递归的出口在最顶上,后进先出。
在这里插入图片描述

Arrays:静态方法,toString,sort(底层快排,升序),binarysearch(数组有序,返回索引)

时间API

date类
对象调用gettime方法返回毫秒值

**simpledateformat类:**对date对象进行格式化和解析。
构造:
public SimpleDateFormat() 构造一个SimpleDateFormat,使用默认模式和日期格式
public SimpleDateFormat(String pattern) 构造一个SimpleDateFormat使用给定的模式和默认的日期 格式

把date对象转换成字符串。
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月dd日 HH:mm:ss”);
String s = sdf.format(d);

把字符串转换成date对象
String start = “2020年11月11日 0:0:0”;
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月dd日 HH:mm:ss”);
long startTime = sdf.parse(start).getTime()
parse转换成类对象,对象调用gettime方法返回毫秒值

jdk8新增
在这里插入图片描述

在这里插入图片描述
该类封装了很多方法,可以获取时间的很多信息

localdatetime可以转成另外两个。

异常

在这里插入图片描述
编译时异常
都是Exception类及其子类 必须显示处理,否则程序就会发生错误,无法通过编译

运行时异常
都是RuntimeException类及其子类 无需显示处理,也可以和编译时异常一样处理

JVM默认处理异常的方式(理解) 如果程序出现了问题,我们没有做任何处理,最终JVM 会做默认的处理,处理方式有如下两个步骤: 把异常的名称,错误原因及异常出现的位置等信息输出在了控制台 程序停止执行

trycatch快捷键ctrl alt+t

异常的处理方法一般是
public void printStackTrace() 把异常的错误信息输出在控制台
写在catch。

集合

集合和数组的区别:
数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类

collection

单列:collection
双列(键值对):map
在这里插入图片描述
集合的遍历:迭代器
Collection c = new ArrayList<>();
Iterator it = c.iterator();
while (it.hasNext())
{ String s = it.next(); System.out.println(s); }
next:取出当前元素,将迭代器往后移动一个索引的位置
hasnext判断当前位置是否有元素
虽然写的是next但其实判断的都是当前位置
collection的方法
在这里插入图片描述

增强for:它是JDK5之后出现的,其内部原理是一个Iterator迭代器 实现Iterable接口的类才可以使用迭代器和增强for 简化数组Collection集合的遍历
在这里插入图片描述
list
特点:
存取有序 可以重复 有索引
在这里插入图片描述
特有方法只能用list和arraylist创建才能使用,用collection泛型不行

在这里插入图片描述
linkedlist特有方法,底层双向链表
在这里插入图片描述
泛型
定义的时候数据类型不确定

  1. 把运行时期的问题提前到了编译期间
  2. 避免了强制类型转换
    创建实体的时候必须要指定数据类型
    泛型类:public class Generic
    泛型方法:public void show(T t)
    泛型接口:public interface Generic
Set

不可以存储重复元素
没有索引,不能使用普通for循环遍历
存取顺序不一样

便利不能用普通for,可以用增强for和迭代器

Treeset
不可以存储重复元素 没有索引 可以将元素按照规则进行排序
TreeSet():根据其元素的自然排序进行排序
TreeSet(Comparator comparator) :根据指定的比较器进行排序,想要使用自定义对象必须指定排序规则
在这里插入图片描述
比较器排序更灵活!
在这里插入图片描述

数据结构

二叉查找树

二叉查找树(也叫二叉排序树、二叉搜索树):左小右大在这里插入图片描述

在这里插入图片描述

平衡二叉树

在这里插入图片描述
左左:根节点的左子树的左子树有节点插入,处理:右旋,把5变成7的左节点
在这里插入图片描述
左右(根节点的左子树的右子树有节点插入),对7的左子树左旋,然后就变成了左左的情况了(图为已完成这一步的状态)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

红黑树

treeset底层是红黑树
并不是很好记先溜了
在这里插入图片描述

haseset

是无序的,treeset是有序的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Map

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Hashmap底层和hashset一样
在这里插入图片描述

treemap底层和treeset一样
在这里插入图片描述

stream流

像scala那样的…+lamda
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

IO流

字符流=字节流+编码

多线程

并行:在同一时刻,有多个指令在多个CPU上同时执行。
并发:在同一时刻,有多个指令在单个CPU上交替执行。
区别:执行cpu的个数不同
在这里插入图片描述
进程:应用程序
线程:程序中做的事,执行路径,线程属于进程

实现多线程的方式:集成thread类
在这里插入图片描述
run和start方法
在这里插入图片描述

在java线程中 start与run的不同
start与run方法的主要区别在于当程序调用start方法一个新线程将会被创建,并且在run方法中的代码将会在新线程上运行,然而在你直接调用run方法的时候,程序并不会创建新线程,run方法内部的代码将在当前线程上运行
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
解决:不要写锁的嵌套
//套路:
//1. while(true)死循环
//2. synchronized 锁,锁对象要唯一
//3. 判断,共享数据是否结束. 结束
//4. 判断,共享数据是否结束. 没有结束

在这里插入图片描述

网络编程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

反射

在这里插入图片描述
反射的目的:知道类的属性和方法,调用或修改类的属性和方法。
在这里插入图片描述
获取class对象的目的:为了进一步获取类的属性和方法。
在这里插入图片描述
获取构造方法的目的:创建对象
在这里插入图片描述

利用class类获取成员变量的目的:赋值,获取值

利用class类获取成员方法的目的:使用方法

枚举

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值