Java基础进阶
文章平均质量分 59
从多线程开始,逐步学习:多线程,常用类,枚举类,集合,泛型与file,IO流,反射,动态代理
Locus-
沉舟侧畔千帆过,病树前头万木春
展开
-
Java日期时间类
本文(Java日期时间类)包含:Date、Calendar、第三代日期类的详解,带你快速上手日期时间类操作!原创 2023-01-09 21:25:04 · 766 阅读 · 0 评论 -
集合08/Set接口:Set实现类(二)
31351原创 2021-08-23 20:39:35 · 71 阅读 · 0 评论 -
集合07/Set接口:Set实现类(一)⭐
Set接实现类之一:HashSetset接口概述Set接口是Collection的子接口,set接口没有提供额外的方法Set集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set集合中,则添加操作失败。Set判断两个对象是否相同不是使用==运算符,而是根据equals()方法重写hashCode()方法的基本原则在程序运行时,同一个对象多次调用hashCode()方法应该返回相同的值。当两个对象的equals()方法比较返回true 时,这两个对象的hashCode(原创 2021-08-21 17:34:47 · 142 阅读 · 0 评论 -
集合06/List接口方法
一、package com.jh;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import org.junit.Test;public class ListTest { @Test public void test1() { ArrayList list = new ArrayList(); list.add(123); ..原创 2021-08-20 19:21:55 · 65 阅读 · 0 评论 -
集合05/List接口
collection子接口之一: List接口Collection接口:单列集合,用来存储一个一个的对象List接口:存储有序的、可重复的数据。–>“动态”数组,替换原有的数组ArrayList:作为List接口的主要实现类;线程不安全的,效率高;底层使用Object[] elementData存储LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[]原创 2021-08-18 22:20:31 · 71 阅读 · 0 评论 -
集合04/集合元素的遍历
集合元素的遍历1.iterator接口2. foreach1. 使用迭代器Iterator接口iterator():返回Iterator接口的实例,用于遍历集合元素。放在IteratorTest.java中测试内部的方法: hasNext()和next()package com.jh;import org.junit.Test;import java.util.ArrayList;import java.util.Collection;import java.util.I原创 2021-08-17 22:13:07 · 378 阅读 · 0 评论 -
集合03/Collection常用方法2
Collection常用方法2(一)remove(Object obj):从当前集合中移除obj元素。removeAll(Collection coll1):从当前集合中移除coll1中所有的元素Person类package com.jh;public class Person { private String name; private int age; public Person() { } public Person(String原创 2021-08-16 22:29:50 · 183 阅读 · 0 评论 -
集合02/Collection常用方法1
Collection常用方法package com.mjl;import org.junit.Test;import java.util.ArrayList;import java.util.Collection;import java.util.Date;public class CollectionTest { @Test public void test() { Collection coll = new ArrayList();原创 2021-08-14 21:03:12 · 75 阅读 · 0 评论 -
集合01/Java集合框架
Java集合框架概述一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用Array存储对象方面具有一些弊端,而Java集合就像一种容器,可以动态地把多个对象的引用放入容器中。数组在内存存储方面的特点:数组初始化以后,长度就确定了。数组声明的类型,就决定了进行元素初始化时的类型数组在存储数据方面的弊端:数组初始化以后,长度就不可变了,不便于扩展数组中提供的属性和方法少,不便于进行添加、删除、插入等操作,且效率不高。同时无法直原创 2021-08-14 20:52:52 · 78 阅读 · 0 评论 -
Java注解(Annotation)
注解(Annotation)注解(Annotation)概述常见的Annotation示例自定义AnnotationJDK中的元注解利用反射获取注解信息(在反射部分涉及)JDK8中注解的新特性概述:示例:如何自定义注解:参照@Suppresswarnings定义如果注解有成员,在使用注解时,需要指明成员的值。注解声明为:@interface内部定义成员,通常使用value表示可以指定成员的默认值,使用default定义如果自定义注解没有成员,表明是一个标原创 2021-08-14 17:22:30 · 245 阅读 · 0 评论 -
枚举类02/使用enum关键字定义的枚举类实现接口
情况一:实现接口,在enum类中实现抽象方法package com.mjl;//说明:定义的枚举类默认继承于java.lang.Enum类public class SeasonTest1 { public static void main(String[] args) { Season1 summer = Season1.SUMMER; //toString(): System.out.println(summer.toString()).原创 2021-08-14 12:17:23 · 180 阅读 · 0 评论 -
枚举类01/定义枚举类
枚举类的理解如何自定义枚举类如何使用关键字enum定义枚举类Enum类的主要方法实现接口的枚举类如何定义枚举类:方式一: jdk5.0之前,自定义枚举类方式二:jdk5.日,可以使用enum关键字定义枚举类package com.mjl;public class SeasonTest { Season spring = Season.SPRING; System.out.println(spring);}//自定义枚举类class Season{原创 2021-08-13 20:23:26 · 349 阅读 · 0 评论 -
常用类13/Java比较器⭐
Java比较器在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。Java实现对象排序的方式有两种:自然排序: java.lang.Comparable定制排序: java.util.Comparator说明:Java中的对象,正常情况下,只能进行比较: == 或 != 。不能使用>或<的。但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。如何实现?使用两个接口中的任何一个:Comparable 或 comparator原创 2021-08-11 18:12:39 · 145 阅读 · 0 评论 -
常用类12/DateTimeFormatter的使用
DateTimeFormatter的使用不需要全部记住,了解,记住类以及作用即可DateTimeFormatter:格式化或解析日期、时 间类似于SimpleDateFormat方式一:预定义的标准格式如:ISo_LOCAL_DATE_TIME;ISo_LOCAL_DATE;ISO_LOCAL_TIME方式二:本地化相关的格式。如: ofLocalizedDateTime(FormatStyle.LONG)方式三:自定义的格式。如: ofPattern(“yyyy-MM-dd hh:mm:原创 2021-08-11 15:39:03 · 447 阅读 · 0 评论 -
常用类11/lnstant类的使用(JDK8中新日期时间API)
常用类11/lnstant类的使用(JDK8中新日期时间API)需要了解世界时间的标准类似于java.utiL.Date类lnstant类的使用package com.cyl.Date;import org.junit.Test;import java.time.Instant;import java.time.OffsetDateTime;import java.time.ZoneOffset;public class JDK8DateTimeTest { //L原创 2021-08-11 14:06:12 · 245 阅读 · 0 评论 -
常用类10/LocalDate,LocalTime,LocalDateTime(JDK8中新日期时间API)
JDK8中新日期时间APIJDK8之前的更新:Date–>Calendar,但是一直存在缺陷,因此:简而言之:Java8以后的java.time API 好用,前面的,不好用。新时间日期APIjava.time - 包含值对象的基础包java.time.chrono - 提供对不同的日历系统的访问java.time.format - 格式化和解析时间和日期java.time.temporal - 包括底层框架和扩展特性java.time.zone - 包含时区支持的类说原创 2021-08-11 13:39:08 · 106 阅读 · 0 评论 -
常用类09/Calendar日历类(抽象类)的使用
Calendar日历类(抽象类)的使用需要学习以下四个:System类中currentTimeMillis(); (已学)java.util.Date和子类java.sql.Date (已学)SimpleDateFormat (已学)Calendar (本节)注意:Calendar日历类(抽象类)的实例化方式一:创建其子类(GregorianCalendar)的对象方式二:调用其静态方法getInstance()package com.cyl.Date;impo原创 2021-08-11 11:31:09 · 95 阅读 · 0 评论 -
常用类08/SimpleDateFormat练习题(留白)
两道练习题1. 将字符串"2020-09-08"转换为java.sqL.Datepackage com.cyl.Date;import org.junit.Test;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class DateTimeTest { @Test public void testSimpleDateFormat原创 2021-08-11 10:43:58 · 140 阅读 · 0 评论 -
常用类07/SimpleDateFormat的使用
SimpleDateFormat的使用概况:jdk 8之前的日期时间的API测试需要学习以下四个:System类中currentTimeMillis(); (已学)java.util.Date和子类java.sql.Date (已学)SimpleDateFormat (本节)Calendar (未学)SimpleDateFormat的两个操作:格式化:日期—>字符串解析:格式化的逆过程,字符串—>日期SimpleDateFormat的实例化:1. 实例原创 2021-08-10 20:46:09 · 92 阅读 · 0 评论 -
常用类06/String类练习题⭐
第一题:将一个字符串进行反转。将字符串中指定部分进行反转。比如"abcdefg”反转为"abfedcg"方法一package com.cyl;public class StringDemo { public static String reverse(String str, int startIndex, int endIndex) { if (str !=null) { char[] arr = str.toCharArray();原创 2021-08-09 19:09:40 · 231 阅读 · 0 评论 -
常用类05/Date类
两个Date类的使用补充:JDK8之前日期时间API1.java.lang.System类System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。此方法适于计算时间差。●计算世界时间的主要标准有:UTC(Coordinated Universal Time)GMT(Greenwich Mean Time)cST(Central Standard Time)System原创 2021-08-08 20:45:55 · 84 阅读 · 0 评论 -
常用类04/String、 StringBuffer、StringBuilder⭐
String、 StringBuffer、StringBuilder三者的异同?不同:String:不可变的字符序列;StringBuffer:可变的字符序列;线程安全的,效率低;stringBuilder:可变的字符序列; jdk5.0新增的,线程不安全的,效率高;相同:底层都是使用char[]存储可变小例子package com.cyl;import org.junit.Test;import java.io.UnsupportedEncodingException;.原创 2021-08-08 19:49:10 · 71 阅读 · 0 评论 -
常用类03/String的转换⭐
String与基本数据类型包装类的转换String–>基本数据类型、包装类:调用包装类的静态方法: parseXxx ( str)基本数据类型、包装类–> String:调用string重载的value0f(xxx)package com.cyl;import org.junit.Test;public class StringMethodTest { @Test public void test(){ String str1 =原创 2021-08-08 17:31:35 · 71 阅读 · 0 评论 -
常用类02/String常用方法⭐
String常用方法1String常用方法2String常用方法3String常用方法1举例~~~javapackage com.cyl;import org.junit.Test;import java.util.Locale;public class StringMethodTest { @Test public void test(){ String s1 = "Hello,World"; //1. int len原创 2021-08-05 17:26:02 · 68 阅读 · 0 评论 -
常用类01/string的实例化
String类string的实例化方式:方式一:通过字面量定义的方式方式二:通过new +构造器的方式补充:equals() 方法用于将字符串与指定的对象比较。String 类中重写了 equals() 方法用于比较两个字符串的内容是否相等。string:字符串,使用一对 " " 引起来表示。String声明为final的,不可被继承String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小原创 2021-08-05 14:15:07 · 298 阅读 · 0 评论 -
多线程15/使用线程池
使用线程池背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具。好处:提高响应速度(减少了创建新线程的时间)降低资源消耗(重复利用线程池中线程,不需要每次都创建)便于线程管理corePoolSize: 核心池的大小maximumPoolSize: 最大线程数keepAliveTime: 线程没有任务时最多保持多长时间后会终止原创 2021-08-04 22:57:42 · 83 阅读 · 0 评论 -
多线程14/实现Callable接口
创建线程的方式三: 实现Callable接口新增方式一:实现Callable接口与使用Runnable相比,Callable功能更强大些相比run()方法,可以有返回值方法可以抛出异常支持泛型的返回值需要借助FutureTask类,比如获取返回结果Future接口 (了解)可以对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等。FutrueTask是Futrue接口的唯一的实现类FutureTask同时实现了Runnable,Futur转载 2021-08-04 21:25:44 · 90 阅读 · 0 评论 -
多线程13/经典例题:生产者/消费者问题⭐
经典例题:生产者/消费者问题●生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。●这里可能出现两个问题:1. 生产者比消费者快时,消费者会漏掉一些数据没有取到。2. 消费者比生产者快时,消费者会取相同的数据。分析:3.原创 2021-08-04 19:45:47 · 168 阅读 · 0 评论 -
多线程12/线程通信
线程通信的例子:使用两个线程打印1-100。线程1,线程2交替打印前置知识:wait(); 一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。notify(); 一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒优先级高的那个。notifyAll(); 一旦执行此方法,就会唤醒所有被wait的线程。注意:wait(),notify(), notifyALL()三个方法必须使用在同步代码块或同步方法中。普通做法:package com原创 2021-08-04 16:52:40 · 55 阅读 · 0 评论 -
多线程11/同步机制例题⭐
例题:银行有一个账户。有两个储户分别向同一个账户存3000元,每次存1000,存3次。每次存完打印账户余额。分析:1.是否是多线程问题? 是,两个储户线程2.是否有共享数据? 有,账户(或账户余额)3.是否有线程安全问题? 有4.需要考虑如何解决线程安全问题? 同步机制: 有三种方式。解答:先按照题意编写代码,此时的代码实现了共享数据存款,同时也出现了线程安全问题注意代码中各个构造函数的作用!package com.dxc;//账户class Account{ priva原创 2021-08-04 15:02:16 · 127 阅读 · 0 评论 -
多线程10/Lock(锁)解决线程安全问题
Lock(锁)从JDK5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当。java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象。ReentrantLock类实现了Lock ,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是R原创 2021-08-04 13:06:45 · 177 阅读 · 0 评论 -
多线程09/线程死锁问题
线程死锁问题死锁不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续解决方法专门的算法、原则尽量减少同步资源的定义尽量避免嵌套同步首先写一个出现死锁的概率极低的代码package com.dxc;public class ThreadTest { public static void main(String[] args) {原创 2021-08-04 12:17:37 · 77 阅读 · 0 评论 -
多线程08/将单例模式中的懒汉式改写为线程安全
使用同步机制将单例模式中的懒汉式改写为线程安全的原代码:不安全package com.dxc;public class BankTest {}class Bank { private Bank() { } private static Bank instance = null; public static Bank getInstance(){ if (instance == null){ instance =原创 2021-08-04 11:24:54 · 161 阅读 · 0 评论 -
多线程07/例题,多窗口卖票2/解决线程安全问题
解决线程安全问题方式一:同步代码块1,Runnable接口的优化没解决线程同步问题时,if中写入Thread.sleep(100);可以增加错票几率synchronized(同步监视器){需要被同步的代码}说明:操作共享数据的代码就是需要被同步的代码共享数据:多个线程共同操作的变量。比如: ticket就是共享数据。同步监视器,俗称:锁。任何一个类的对象,都可以充当锁。要求:多个线程必须要共用同一把锁。class Window1 implements Runnable{原创 2021-08-03 23:16:55 · 179 阅读 · 0 评论 -
多线程06/例题,多窗口卖票1
例题: 创建三个窗口卖票,总票数为100张一,继承Thread方式class Window extends Thread{ private int ticket = 100; public void run(){ while (true){ if(ticket>0){ System.out.println(getName()+":买票,票号为:"+ticket); tick.原创 2021-08-03 21:01:10 · 99 阅读 · 0 评论 -
多线程05/线程的创建和启动2:实现Runnable接口
线程的创建和启动2多线程的创建方式二:实现Runnable接口1.创建一个实现了Runnable接口的类2.实现类去实现Runnable中的抽象方法: run()3.创建实现类的对象4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象5.通过Thread类的对象调用start()例:遍历0-100的偶数//创建一个实现了Runnable接口的类class MThread implements Runnable{ //实现类去实现Runnable中原创 2021-08-03 19:25:11 · 78 阅读 · 0 评论 -
多线程04线程的优先级
线程的优先级:级别MAX_PRIORITY: 10MIN_PRIORITY:1NORM_PRIORITY:5 默认级别如何获取和设置当前线程的优先级:getPriority():获取线程的优先级setPriority(int p):设置线程的优先级如何获取和设置当前线程的优先级:默认状态执行Thread.currentThread().getPriority()获取线程级数package new1;public class demo2 { public原创 2021-08-03 17:40:56 · 118 阅读 · 0 评论 -
多线程03Thread方法
Thread类的有关方法:start():启动当前线程;调用当前线程的run()run():通常需要重写Thread类中的方法,将创建的线程要执行的操作声明在此方法中currentThread():静态方法,返回执行当前代码的线程getName():获取当前线程的名字setName():设置当前线程的名字yield():释放当前cpu的执行join():在线程a中调用线程b的join(),此时线程a就进入阻塞状态,知道线程b完全执行完以后,线程a才结束阻塞状态。stop():已过时。当执原创 2021-08-03 17:17:26 · 61 阅读 · 0 评论 -
多线程02/线程的创建和启动1:继承于Thread类
线程的创建和启动Java语言的JVM允许程序运行多个线程,它通过java.lang.Thread类来体现。Thread类的特性每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run()方法的主体称为线程体通过该Thread对象的start()方法来启动这个线程,而非直接调用run()多线程的创建:方式一:继承于Thread类创建一个继承于Thread类的子类重写Thread类的run():将此线程执行的操作声明在run()中创建Thread类的子类原创 2021-08-03 16:58:31 · 74 阅读 · 0 评论 -
多线程01基本概念:程序、进程线程
基础部分一,基本概念:程序、进程线程程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。进程(process)是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程:有它自身的产生、存在和消亡的过程。——生命周期如:运行中的QQ,运行中的MP3播放器程序是静态的,进程是动态的进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域线程(thread)进程可进一步细化为线程,是一个程序内部的一条执行路径。若原创 2021-08-03 14:05:09 · 70 阅读 · 0 评论