JavaSe:集合
java集合
❤️概述
Java 集合可分为 Collection 和 Map 两种体系
Collection接口:单列数据,定义了存取一组对象的方法的集合
List:元素有序、可重复的集合
Set:元素无序、不可重复的集合
Map接口:双列数据,保存具有映射关系“key-value对”的集合
Collection接口继承树
Map接口继承树
java集合框架图
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
✋Collection 接口方法
1、添加
add(Object obj)
addAll(Collection coll)
2、获取有效元素的个数
int size()
3、清空集合
void clear()
4、是否是空集合
boolean isEmpty()
5、是否包含某个元素
boolean contains(Object obj):是通过元素的equals方法来判断是否是同一个对象 (单个对象)
boolean containsAll(Collection c):也是调用元素的equals方法来比较的。拿两个集合的元素挨个比较。(一个集合)
6、删除
boolean remove(Object obj) :通过元素的equals方法判断是否是要删除的那个元素。只会删除找到的第一个元素
boolean removeAll(Collection coll):取当前集合的差集
7、取两个集合的交集
boolean retainAll(Collection c):把交集的结果存在当前集合中,不影响c
8、集合是否相等
boolean equals(Object obj)
9、转成对象数组
Object[] toArray()
10、获取集合对象的哈希值
hashCode()
11、遍历
iterator():返回迭代器对象,用于集合遍历
1234567891011121 ...
JavaSe:枚举&注解
🎈枚举类的使用
主要内容
如何自定义枚举类
如何使用关键字enum定义枚举类
Enum类的主要方法
实现接口的枚举类
类的对象只有有限个,确定的。
举例如下:
星期:Monday(星期一)、…、Sunday(星期天)
性别:Man(男)、Woman(女)
季节:Spring(春节)…Winter(冬天)
支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)
就职状态:Busy、Free、Vocation、Dimissio
订单状态:Nonpayment(未付款)、Paid(已付款)、Delivered(已发货)
Return(退货)、Checked(已确认)Fulfilled(已配货)
线程状态:创建、就绪、运行、阻塞、死亡
当需要定义一组常量时,强烈建议使用枚举类
💔自己定义枚举类@Deprecated
123456789101112131415161718192021222324252627282930313233343536373839package pers.dhx_.java0607;/** * @author Dhx_ * @className SeasonTest * @description TODO * @date 2022/6/7 9:21 */public class SeasonTest { Season nowSeason = Season.SUMMER;}//自定义枚举类 JDK 5.0之前// 使用 enum JDK 5.0之后class Season { //1.声明Season对象的属性:private final 修饰 private final String type; //私有化类的构造器 private Season(String type) { this.type = type;} private Season() {type = null;} //提供当前枚举类的有限个对象,声明为 public static finalpublic static final Season SPRING = new Season("SPRING");public static final Sea ...
JavaSe:日期API
0606
💔SimpleDateFormat的使用
❤️用法介绍
1.为什么要使用SimpleDateFormat?
在Java中,如果我们想获取当前时间,一般会使用Date类的无参构造函数,如下所示,我们获取到当前时间并输出:
1234567import java.util.Date;public class SimpleDateFormatDemo { public static void main(String[] args) { Date currentTime = new Date(); System.out.println(currentTime); // 输出:Mon Feb 18 10:24:30 CST 2019 }}
此时我们会发现, 输出的格式并不是我们预期的格式,一般情况下,我们希望的格式都是类似于2019-02-18,2019-02-18 10:24:30,2019/02/18这样的,此时我们就需要用到java.text.SimpleDateFormat来自定义格式。
2.使用format()方法将日期转换为字符串
使用format()方法,我们可以将日期类型转换为自己自定义的字符串格式,如2019-02-18,2019/02/18,2019-02-18 10:24:30等,自定义格式如下表所示:
格式
释义
举例
yyyy
年
2019
MM
月
02
dd
日
18
HH
小时(24小时制)
13,下午一点
mm
分钟
53
ss
秒
42
SSS
毫秒
629
1234567891011121314151617181920212223package com.zwwhnly.springbootdemo;import java.text.SimpleDateFormat;import java.util.Date;public class SimpleDateFormatDemo { public static void main(String[] args) { Date currentTime = new Date(); System.out.println(currentTime); // Mon ...
JavaSe:常用类
Java常用类
🍓String
注意String 已被声明为final
String类:代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。
字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。
String对象的字符内容是存储在一个字符数组value[]中的。
⭐String类和常量池
String对象的两种创建方式:
123String str1 = "abcd";String str2 = new String("abcd");System.out.println(str1==str2);//false
👻这两种不同的创建方法是有差别的,第一种方式是在常量池中拿对象,第二种方式是直接在堆内存空间创建一个新的对象。
🍅记住:只要使用new方法,便需要创建新的对象。
12345678910111213141516171819202122 String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2); //true s1 = "hello"; //创建了一个新的值为"hello"的字符串 赋值给s1; System.out.println(s1 == s2); //false String str1 = "str"; String str2 = "ing"; String str3 = "str" + "ing";//常量池中的对象 String str4 = str1 + str2; //在堆上创建的新的对象 String str5 = "string";//常量池中的对象 String str6 = str1+"ing";//在堆上创建的新的对象 System.out.println(str3 == str4);//false System.out.println(str3 == str5);//true System.out.println(str4 == str5);//false ...
JavaSe:多线程-锁
0602创建多线程4种方式
💃 线程的生命周期
JDK中用Thread.State类定义了线程的几种状态
要想实现多线程,必须在主线程中创建新的线程对象。Java语言使用Thread类及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下的五****种状态:
新建: 当一个Thread类或其子类的对 象被声明并创建时,新生的线程对象处于新建状态
**就绪:**处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它已具备了运行的条件,只是没分配到CPU资源
**运行:**当就绪的线程被调度并获得CPU资源时,便进入运行状态, run()方法定义了线程的操作和功能
**阻塞:**在某种特殊情况下,被人为挂起或执行输入输出操作时,让出 CPU 并临时中止自己的执行,进入阻塞状态
**死亡:**线程完成了它的全部工作或线程被提前强制性地中止或出现异常导致结
✋卖票中的线程安全问题
原因:存在多个线程共享一个数据时,如果线程a正在处理数据,此时线程a 因为阻塞或者其他问题没有执行完(such as : Thread.currentThread.sleep() ),线程b也开始处理这个数据,此时数据由于线程a 没有执行完,数据没有改变,就会造成不良后果。这就是线程安全问题
阻塞越久,影响越恶劣。(如下的Thread.currentThread.sleep() 的参数大小,以及sleep的位置)
解决方法:当一个线程在操作数据时,其他的线程不能参与进来,直到线程a操作完。即使a 阻塞,也不影响数据操作
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162package pers.dhx_.java0602;public class SafeTest { public static void main(String[] args) { Thread1 t1 = new Thread1();// Thread1 t2 = new Thread1();// Thread1 t3 = new Thread1( ...
JavaSe:多线程
0601
🎈Java多线程
⭐基本概念
程序(program)
是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。
进程(process)
是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程:有它自身的产生、存在和消亡的过程。——生命周期
如:运行中的QQ,运行中的MP3播放器
程序是静态的,进程是动态的
进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域
线程(thread)
进程可进一步细化为线程,是一个程序内部的一条执行路径。
若一个进程同一时间并行执行多个线程,就是支持多线程的
线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序计数器(pc),线程切换的开销小 .
一个进程中的多个线程共享相同的内存单元/内存地址空间它们从同一堆中分配对象,可以访问相同的变量和对象。这就使得线程间通信更简便、高效。但多个线程操作共享的系统资源可能就会带来安全的隐患。
⭐多线程程序的优点
提高应用程序的响应。对图形化界面更有意义,可增强用户体验。
提高计算机系统CPU的利用率
改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和修改
⭐ cpu线程数和Java多线程
线程是CPU级别的,单个线程同时只能在单个cpu线程中执行
Java多线程并不是由于cpu线程数为多个才称为多线程,当Java线程数大于cpu线程数,操作系统使用时间片机制,采用线程调度算法,频繁的进行线程切换。
线程是操作系统最小的调度单位,进程是资源(比如:内存)分配的最小
Java中的所有线程在JVM进程中,CPU调度的是进程中的线程
⭐ 单核CPU和多核CPU的理解
单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务。例如:虽然有多车道,但是收费站只有一个工作人员在收费,只有收了费才能通过,那么CPU就好比收费人员。如果有某个人不想交钱,那么收费人员可以把他“挂起”(晾着他,等他想通了,准备好了钱,再去收费)。但是因为CPU时间单元特别短(4.1Ghz),因此感觉不出来。
如果是多核的话,才能更好的发挥多线程的效率。(现在的服务器都是多核的)
一个Java应用程序java.exe,其实至少有三个线程:main()主线程,gc()垃圾回 ...
JavaSe:开发人员调度软件
Project3开发人员调度软件
🎈目标
模拟实现一个基于文本界面的《开发团队调度软件》
熟悉Java面向对象的高级特性,进一步掌握编 程技巧和调试技巧
主要涉及以下知识点:
类的继承性和多态性
对象的值传递、接口
static和final修饰符
特殊类的使用:包装类、抽象类、内部类
异常处理
🎈需求说明
该软件实现以下功能:
软件启动时,根据给定的数据创建公司部分成员列表(数组)
根据菜单提示,基于现有的公司成员,组建一个开发团队以开发一个新的项目
组建过程包括将成员插入到团队中,或从团队中删除某成员,还可以列出团队中现有成员的列表
开发团队成员包括架构师、设计师和程序员
⭐软件结构
该软件由以下三个模块组成:
com.atguigu.team.view模块为主控模块,负责菜单的显示和处理用户操作
com.atguigu.team.service模块为实体对象(Employee及其子类如程序员等)的管理模块, NameListService和TeamService类分别用各自的数组来管理公司员工和开发团队成员对象
domain模块为Employee及其子类等JavaBean类所在的包
🎈domain
✨Architect.java
12345678910111213141516171819202122232425262728293031323334package src.SUMMER_java.project_3.domain;public class Architect extends Designer {// ?????? private int stock; public int getStock() { return stock; } public void setStock(int stock) { this.stock = stock; } Architect() { super(); } public Architect(int id, int age, String name, double salary, Equipment equipment, double bonus, int stock) { supe ...
JavaSe:异常处理
异常处理
🎈概述:
Error(错误): Java虚拟机无法解决的严重问 题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError(栈溢出)和OOM(OutOfMemory:堆溢出)。一般不编写针对性的代码进行处理。
一般不针对性的写解决Error的代码
Exception(异常): 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。
空指针访问
试图读取不存在的文件
网络连接中断
数组角标越界
对于这些错误,一般有两种解决方法
一是遇到错误就终止程序的运行。
程序员在编写程序时,就考虑到错误的检测、错误消息的提示,以及错误的处理。
捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生。
比如:除数为0,数组下标越界等
🎈分类:
编译时(checked)异常(非RuntimeException)
是指编译器要求必须处置的异常。即程序在运行时由于外界因素造成的一般性异常。编译器要求Java程序必须捕获或声明所有编译时异常。
对于这类异常,如果程序不处理,可能会带来意想不到的结果。
运行时(unchecked)异常(RuntimeException)
是指编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该积极避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常。
对于这类异常,可以不作处理,因为这类异常很普遍,若全处理可能会对
程序的可读性和运行效率产生影响。
🎈常见异常举例
RuntimeException(可以编译)
NullPointerException
12String a = null;System.out.println(a.charAt(0));
ArrayOutOfBoundsException
12int[] arr = new int[5];System.out.println(arr[6]);
ClassCastException(类强制转换异常)
12Object obj = new Object();String str = (String) obj;
NumberFormatException
12345String str= ...
JavaSe:抽象类-接口
0529
属性赋值
可以对象初始化的位置:
默认初始化
显式初始化
在代码块中赋值
构造器初始化
通过对象 ,(A.age)赋值
先后顺序按上面的 1 2 3 4 5 进行(静态代码块 优先于非静态代码块)
native关键字
表明接下来要调用底层的C/C++代码
Final关键字
final用来修饰类、方法、 变量、
final修饰方法
方法不能重写
如Object中的getClass() ,修饰为final
final修饰类
此类不能被继承(如String、String Buffer、System)
final修饰属性 (常量一般用大写字母表示 eg: WIDTH)
此时的“变量”称为常量(C++ const)
可以赋值的位置:
默认初始化
显式初始化
构造器初始化
代码块初始化
final修饰局部变量
就是常量,不再能进行赋值
final修饰形参时, 相当于传入的是个常量
1234void f(final int a ){ System.out.println(a);}
final 修饰对象
虽然对象被修饰为了final ,但是如果对象的属性是变量,则依然可以赋值
1234//以下代码编译通过final Person p=("dd",12);// public String name;p.name="dddd";
static final
用来修饰属性,全局常量
代码
12345678910111213141516171819202122232425package src.SUMMER_java;public class Day0529 { public static void main(String[] args) { }}// final class A {class A { final void show() { //num = 11; //The final field A.num cannot be assigned } final int num = 10;}// class B extends A { // The type B cannot subclass the final class A ...
JavaSe:代码块-单例
0528
单例模式(Singleton )
🎈采取一定的方法,对于某个类来说只有一个实例化对象。
私有化类的构造器
内类包含一个声明为static 的对象
类命名的对象 共享一个内存(实际上只有一个对象)
🎈区分 (优先懒汉式)
饿汉式
直接就实例化对象
对象加载时间过长(生命周期过长)
饿汉式 线程安全
懒汉式(相比更好一点,不会提前占用内存,即用即new)
啥时候用,啥时候实例化对象
延迟对象的创建
目前的写法 线程不安全 ()
12345678910111213141516171819202122232425262728293031323334353637383940414243public class Day0528 { public static void main(String[] args) { // System.out.println("d" + "chcp936"); Bank bank1 = Bank.GetInstance(); Bank bank2 = Bank.GetInstance(); System.out.println(bank1 == bank2); // true Flower f1 = Flower.GetInstance(); Flower f2 = Flower.GetInstance(); System.out.println(f1 == f2); // true }}// 饿汉式class Bank { private Bank() { // 私有化构造器 System.out.println("Bank Singleton"); } private static Bank instance = new Bank(); // 内部创建类的对象 // 要求此对象也声明为静态的 public static Bank GetInstance() { // 提供公共的静态的方法,返回类的对象 return instance; }}// 懒汉式class Flower { private Flower() { } ...