提交学习笔记专用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

559 lines
15 KiB

  1. # Javase回顾
  2. ## 1.环境
  3. jdk8及之前:jdk+jre
  4. jdk:java development kit
  5. jre: java runtime environment
  6. jdk8以后:只有jdk
  7. 环境变量配置只需要配置JAVAHOME和path里面指向JAVAHOME的bin
  8. ## 2.开发工具
  9. idea(目前最流行)
  10. eclipse(已经不常用)
  11. ## 3.基础语法
  12. ### 3.1 java语言特点
  13. 简单,严谨,易读
  14. 编译+解释
  15. ### 3.2 8种基本数据类型
  16. |数据类型 | 精度 | 范围|
  17. |--|--|--|
  18. | byte | 1 |-2^7^ ~ 2^7^-1(-128~127)
  19. | short | 2|-2^15^ ~ 2^15^-1(-32768 ~ 32767)
  20. | int | 4|-2^31^ ~ 2^31^-1(约21亿多)
  21. |long| 8 |-2^63^~ 2^63^-1(-9223372036854775808 ~ 9223372036854775807)
  22. | float | 4 |约±3.4e38(± 3.4 × 10^38^ )
  23. | double | 8 | 约±1.7e308(± 1.7 × 10^308^ )
  24. | char | 2 |0 ~ 65535(Unicode)
  25. | boolean | 1(不一定,不同虚拟机不一样 ) |
  26. ### 3.3 运算符
  27. > 算数运算符 :+ - * / % 双目运算符
  28. > 比较运算符 : > , <, >= , <=, == , != 计算结果是boolean值
  29. > 逻辑运算符:&& , ||, ! 运算结果是boolean值,存在短路运算
  30. > 赋值运算符: = ,+=, -=, *= , /=
  31. > 条件运算符 a?b:c 唯一的三目运算符
  32. > 位运算符:基本用不到
  33. > 其他运算符:instanceof (例:a instanceof b )
  34. > 表达式(有值)
  35. > ### 3.4语句
  36. > java代码执行的基本单位
  37. >流程控制语句:
  38. >1.顺序结构:
  39. >2.分支结构:
  40. >3.循环结构:
  41. ### 3.5 数组
  42. >int[] a = new int[](1,2,3}
  43. >获取数组长度。.length属性,只读。
  44. >如果访问数组元素。索引(下标),整数,包括0,不能是负数,不能是小数,不能超
  45. >出边界。
  46. ```java
  47. public class Test1 {
  48. public static void main(String[] args) {
  49. int[] a = new int[5];
  50. int[] b = new int[]{1, 2, 3, 4, 5};
  51. int[] c = {1, 2, 3, 4, 5};
  52. System.out.println(c.length);
  53. a[0] = 1;
  54. a[1] = 2;
  55. a[40] = 4;
  56. }
  57. }
  58. ```
  59. ```java
  60. import java.util.Arrays;
  61. public class Test2 {
  62. public static void main(String[] args) {
  63. int[] arr = new int[20];
  64. //存入随机数
  65. for (int i = 0; i < arr.length; i++) {
  66. arr[i] = (int) (Math.random() * 100);
  67. }
  68. //输出随机数数组
  69. System.out.println(Arrays.toString(arr));
  70. boolean found = false;
  71. //判断生成的随机数数组中包不包含50并给出下标
  72. for (int i = 0; i < arr.length; i++) {
  73. if (arr[i] == 50) {
  74. found = true;
  75. System.out.println(i);
  76. break;
  77. }
  78. }
  79. if (!found) {
  80. System.out.println("无此值");
  81. }
  82. }
  83. }
  84. ```
  85. 数组应用:
  86. 排序:冒泡,选择,快排
  87. ```java
  88. import java.util.Arrays;
  89. public class Test3 {
  90. public static void main(String[] args) {
  91. int[] arr = {44, 64, 35, 66, 10, 67, 86, 32, 2, 44};
  92. quickSort2(arr);//调用函数
  93. System.out.println(Arrays.toString(arr));
  94. }
  95. //冒泡
  96. static void bubbleSort(int[] arr) {
  97. for (int i = 0; i < arr.length - 1; i++) {
  98. for (int j = 0; j < arr.length - 1 - i; j++) {
  99. if (arr[j] < arr[j + 1]) {
  100. int temp = arr[j];
  101. arr[j] = arr[j + 1];
  102. arr[j + 1] = temp;
  103. }
  104. }
  105. }
  106. }
  107. static void bubbleSort2(int[] arr) {
  108. for (int i = 0; i < arr.length - 1; i++) {
  109. for (int j = 0; j < arr.length - 1 - i; j++) {
  110. if (arr[j] > arr[j + 1]) {
  111. int temp = arr[j];
  112. arr[j] = arr[j + 1];
  113. arr[j + 1] = temp;
  114. }
  115. }
  116. }
  117. }
  118. //选择
  119. static void selectSort(int[] arr) {
  120. for (int i = 0; i < arr.length - 1; i++) {
  121. for (int j = i + 1; j < arr.length; j++) {
  122. if (arr[j] < arr[i]) {
  123. int temp = arr[j];
  124. arr[j] = arr[i];
  125. arr[i] = temp;
  126. }
  127. }
  128. }
  129. }
  130. static void selectSort2(int[] arr) {
  131. for (int i = 0; i < arr.length - 1; i++) {
  132. for (int j = i + 1; j < arr.length; j++) {
  133. if (arr[j] < arr[i]) {
  134. int temp = arr[i];
  135. arr[i] = arr[j];
  136. arr[j] = temp;
  137. }
  138. }
  139. }
  140. }
  141. //快排
  142. static void quickSort(int[] arr) {
  143. quickSort(arr, 0, arr.length - 1);
  144. }
  145. static void quickSort2(int[] arr) {
  146. quickSort2(arr, 0, arr.length - 1);
  147. }
  148. //快排实现
  149. static void quickSort(int[] arr, int low, int high) {
  150. if (low >= high) {
  151. return;
  152. }
  153. int pivot = arr[low];//基准值
  154. int left = low;//左指针
  155. int right = high;//右指针
  156. while (left < right) {
  157. //右指针不断左移
  158. while (left < right && arr[right] >= pivot) {
  159. right--;
  160. }
  161. //左指针不断右移
  162. while (left < right && arr[left] <= pivot) {
  163. left++;
  164. }
  165. if (left < right) {
  166. int temp = arr[left];
  167. arr[left] = arr[right];
  168. arr[right] = temp;
  169. }
  170. }
  171. //二者相遇
  172. if (left != low) {
  173. arr[low] = arr[left];
  174. arr[left] = pivot;
  175. }
  176. //递归
  177. quickSort(arr, low, left - 1);//对左区递归
  178. quickSort(arr, left + 1, high);//对右区递归
  179. }
  180. static void quickSort2(int[] arr, int low, int high) {
  181. if (low > high) {
  182. return;
  183. }
  184. int target = arr[low];
  185. int left = low;
  186. int right = high;
  187. while (left < right) {
  188. while (left < right && arr[right] >= arr[low]) {
  189. right--;
  190. }
  191. while (left<right &&arr[left]<=arr[low]){
  192. left++;
  193. }
  194. if(left<right){
  195. int temp = arr[left];
  196. arr[left]=arr[right];
  197. arr[right]=temp;
  198. }
  199. }
  200. //left和right相遇
  201. if(left!=low){
  202. arr[low]=arr[left];
  203. arr[left]=target;
  204. }
  205. quickSort2(arr,low,left-1);
  206. quickSort2(arr,left+1,high);
  207. }
  208. }
  209. ```
  210. 查找:二分查找
  211. ```java
  212. public class Test4 {
  213. public static void main(String[] args) {
  214. int[] arr = {2, 10, 32, 35, 44, 44, 64, 66, 67, 86};
  215. int idx = find2(arr, 0, arr.length - 1, 67);
  216. System.out.println(idx);
  217. }
  218. static int find(int[] arr, int low, int high, int target) {
  219. if (low >= high) {
  220. return -1;
  221. }
  222. int mid = (low + high) / 2;
  223. if (target == arr[mid]) {
  224. return mid;
  225. } else if (target < arr[mid]) {
  226. return find(arr, low, mid - 1, target);
  227. } else {
  228. return find(arr, mid + 1, high, target);
  229. }
  230. }
  231. static int find2(int[] arr, int low, int high, int target) {
  232. if (low >= high) {
  233. return -1;
  234. }
  235. int mid = (low + high) / 2;
  236. if (target == arr[mid]) {
  237. return mid;
  238. } else if (target < arr[mid]) {
  239. return find2(arr, low, mid - 1, target);
  240. } else {
  241. return find2(arr, mid + 1, high, target);
  242. }
  243. }
  244. }
  245. ```
  246. ### 3.6 函数(方法)
  247. ### 3.7 面向对象
  248. 类:类型,将很多实例抽取共性,总结归纳
  249. 对象:独一无二的实例,在java中,对象通过类创建
  250. 创建对象:new 构造方法()
  251. ### 3.8封装
  252. 将成员属性和成员方法包含到一个类中,选择性的对外开放成员。
  253. 成员访问修饰符:对外开放程度
  254. public:公开,公有的,任何位置都可访问。
  255. protected:受保护的,包内及后代可以访问。
  256. <>:包内访问。
  257. private:当前类内部访问。
  258. ### 3.9 继承
  259. 单继承,默认继承自object,顶级根类
  260. 1.非私有成员可以被继承
  261. 2.构造函数不能被继承
  262. protect:
  263. super:父对象
  264. this:当前对象
  265. ```java
  266. package com.situ.chapter1;
  267. public class Person {
  268. public int age;//年龄
  269. private String name;//姓名
  270. //无参构造方法
  271. public Person() {
  272. }
  273. //有参构造
  274. public Person(String name) {
  275. this.name = name;
  276. System.out.println("创建Person对象");
  277. }
  278. //行为
  279. protected void sayHello() {
  280. System.out.println("父亲sayHello");
  281. }
  282. void wang() {
  283. System.out.println("aaa");
  284. sayHello();
  285. }
  286. }
  287. ```
  288. ```java
  289. package com.situ.chapter1;
  290. public class Teacher extends Person {
  291. public Teacher() {
  292. super();
  293. }
  294. @Override
  295. protected void sayHello() {
  296. System.out.println("儿子sayHello");
  297. }
  298. public void sayBye() {
  299. this.sayHello();
  300. super.sayHello();
  301. //System.out.println(super.name);
  302. }
  303. }
  304. ```
  305. ```java
  306. package com.situ.chapter1;
  307. public class Test1 {
  308. public static void main(String[] args) {
  309. Person person = new Person();
  310. person.sayHello();
  311. person.wang();
  312. System.out.println("---------------");
  313. Teacher teacher = new Teacher();
  314. teacher.sayHello();
  315. teacher.sayBye();
  316. }
  317. }
  318. ```
  319. 访问构造函数:
  320. this(xxx):调用当前类的构造函数
  321. super(xxx):调用父类的构造函数
  322. 构造函数:对对象的成员属性进行初始化
  323. 1.与类同名
  324. 2.无返回值
  325. 3.如果一个类没有显式定义构造函数,会自动创建一个公有的无参的构造函数,如果显式指定了构造函数,就不会再自动创建无参构造函数
  326. 4.构造函数是类成员,可以指定修饰符
  327. 5.创建对象时,使用new<构造函数>(xxx)
  328. 6.创建子类对象时,必须先调用父类的构造函数
  329. 7.一个构造函数的第一句代码必须是this(xxx)或者super(xxx),有且只有一次调用
  330. 8.如果没有显式调用this(xxx)或super(xxx),默认调用super()
  331. ### 3.10 多态(非常重要)
  332. 在程序运行期间,同一行为,表现出多种形态
  333. 1.继承或接口
  334. 2。重写
  335. 3.使用一个父类型(祖先类型)的引用指向一个子类(后代类)的实例
  336. ```java
  337. package com.situ.chapter2;
  338. public class Animal {
  339. public void run() {
  340. System.out.println("动物在跑");
  341. }
  342. }
  343. ```
  344. ```java
  345. package com.situ.chapter2;
  346. public class Cat extends Animal {
  347. private static String name;
  348. @Override
  349. public void run() {
  350. System.out.println("猫在跑");
  351. }
  352. }
  353. ```
  354. ```java
  355. package com.situ.chapter2;
  356. public class Fish extends Animal {
  357. @Override
  358. public void run() {
  359. System.out.println("鱼在跑");
  360. }
  361. }
  362. ```
  363. ```java
  364. package com.situ.chapter2;
  365. public class Test1 {
  366. static int a = 10;
  367. public static void main(String[] args) {
  368. Animal animal = new Cat();
  369. run(animal);
  370. }
  371. static void run(Animal animal) {
  372. animal.run();
  373. }
  374. }
  375. ```
  376. ### 3.11 static和final
  377. static成员即类成员,属于类的,不属于某个对象,通过类名称直接访问
  378. final:表示最终的,不变的
  379. 1.修饰类,表示类不能被继承
  380. 2.修饰方法:表示方法不可被重写
  381. 3.修饰变量:表示变量为不可变的变量(常量)
  382. ### 3.12 抽象类和接口
  383. 抽象方法:只有方法定义,没有实现的方法,叫抽象方法
  384. 抽象类:使用abstract关键字
  385. 1.使用abstract关键字
  386. 2.不能创建实例(对象)
  387. 3.除此之外,和普通类没有区别。
  388. 4.可以有构造函数。
  389. 5.抽象类中允许有抽象方法(也可以没有),普通类中一定没有抽象方法。
  390. 6.一个类中只要有抽象方法,则必须是抽象类
  391. 接口:
  392. 1.接口不是类。
  393. 2.接口中只能有抽象方法(),jdk1.8之后新增:静态方法(static)和默认方法(default)
  394. 3.接口中的方法默认是public abstract修饰,不写也行
  395. 4.接口中的静态方法和类中的静态方法类似
  396. 可直接接口名调用
  397. 5.接口中的默认方法可被继承到实现类中,在默认方法中可以使用this关键字,由实现类来调用
  398. 接口提供一定的规范和约束,不提供实现
  399. 实现类去实现接口 implements实现接口
  400. 实现类必须对接口中的方法提供实现,如果不能,则只能为抽象类
  401. ### 3.13 常用类
  402. 1.Object:所有类的终极父类。没有父类
  403. hashCode:用于生成对象的唯一(尽量唯一)标识码
  404. 默认返回对象的内存地址。
  405. equals:用于判定两个对象是否逻辑上相等,逻辑是由程序员决定的,重写。默认比较是否同一个内存地址
  406. toString:将一个对象以字符串的形式展示
  407. clone():克隆一个对象
  408. getClass:获取对象的类型实例(Class)
  409. 2.String:表达式字符串,不可继承。内容不可变
  410. 3.Math:数学相关方法
  411. 4.Date:日期相关。LocalDate,LocalTime,LocalDateTime
  412. ### 3.14 集合相关类:
  413. 1.List:ArrayList,LinkedList.列表:有序,可重复。
  414. 2.set:HashSet 集合,无序,不重复
  415. 3.Map:HashMap 映射:存储键-值对,键无序,不重复
  416. ### 3.15 泛型
  417. <T> 类型变量
  418. ### 3.16异常
  419. 程序出错时的处理方式.挽救或补回措施
  420. try...catch...finally
  421. caatch可以已有多个分支,第一个分支,捕获某一个类型的异常
  422. finally分支中的代码一定会执行,无论是否出现异常
  423. 异常是有类型的
  424. 异常分两种:
  425. 异常分成两种:
  426. 1.编译时异常,检查异常 ,checkedException。在编译期就要求处理异常。
  427. 2.运行时异常。RuntimeException。
  428. ### 3.17 IO
  429. Input & Output 流对象完成输入输出的
  430. 流动的方向分为输入流和输出流
  431. 流动的单位:字节流和字符流
  432. 介质类型:文件流,网络流,数组流
  433. 以Stream结尾的是字节流
  434. 以InputStream结尾的是输入流
  435. 流在使用完之后必须关闭,如果忘记,容易内存泄漏
  436. throws:写在方法后面,表示此方法向上抛出异常
  437. throw:原地抛出(触发,引发)异常
  438. ### 3.18 多线程
  439. 进程:Process,操作系统管理的独立的分配资源的单位,依靠端口进行通信
  440. 一个程序至少有一个进程。
  441. 如:QQ此时6个进程
  442. ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f000c716e26b4ac385455546ca2556bb.png)
  443. 线程:Thread。一个进程中可以包含至少一个线程。所有线程共享进程的资源。线程是cpu可调度的最小单位
  444. cpu:单核。一个核心。
  445. 多核。真正的并行。
  446. web开发程序都是并行的,多线程。
  447. ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ac0c637b29364252bc4fef75de588a71.png)
  448. ### 3.18 反射
  449. 反射:java的灵魂,在程序运行期间,在无法直接使用目标类的情况下,以一种间接的方式,去操作对象。
  450. Reflect: 镜像。
  451. 常用类:
  452. Class: 描述其他类,描述类的类
  453. Field: 描述字段的类。描述成员属性
  454. Method:描述成员方法的。
  455. Constructor:描述构造函数的。
  456. Parameter:描述方法的参数的。
  457. Annotation:描述注解的。
  458. 获取Class类型实例三种方式: