![](https://img-blog.csdnimg.cn/20200804175205769.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java语言进阶
文章平均质量分 59
JavaSE就是一种标准版,是Java中的bai基础部分,不过后来du的各种zhi框架,各种产品都是基于JavaSE,也就dao是JavaSE是java向上发展的基础,Java任何高级产品的底层基础都是JavaSE,所以如果要学习,把它学扎实,牢固是很有必要的。
你好像很好吃a
吃不了自律的苦,就要吃平庸的苦。
展开
-
Java 线程池的使用【四】【Executors】
一、使用Executors创建四种线程池:Executors类提供工厂方法用来创建不同类型的线程池,实际上Executors创建的四种线程底层的实现都是通过ThreadPoolExecutor实现的。ExecutorService executorService = Executors.具体类型的线程池;通过调用返回值ExecutorService类的submit方法,将具体执行的线程任务传入到线程池中并执行。线程任务的创建:跳转链接(下面例子都以Runnable接口为例)。1)newCache原创 2022-05-04 16:16:30 · 1465 阅读 · 0 评论 -
Java 线程池的使用【三】【ScheduledThreadPoolExecutor】
一、ScheduledThreadPoolExecutor:1、简介:ScheduledThreadPoolExecutor可以用来:在给定延时后执行异步任务或者周期性执行任务,JDK5.0之前都是使用Timer或TimerTask来处理定时任务,相对于任务调度的Timer来说,其功能更加强大,Timer只能使用一个后台线程执行任务,而ScheduledThreadPoolExecutor则可以通过构造函数来指定后台线程的个数。Timer和TimerTask存在的一些缺陷:Timer只创建了一个线程,原创 2022-05-03 18:48:53 · 2303 阅读 · 0 评论 -
Java 线程池的使用【二】【ThreadPoolExecutor】
一、ThreadPoolExecutor:线程池实现类ThreadPoolExecutor是Executor框架最核心的类,继承自Executor接口,里面有一个execute方法,用来执行线程,线程池主要提供一个队列,队列中保存着所有等待状态的线程。ThreadPoolExecutor类中提供的四个构造方法。我们来看最长的那个,其余三个都是在这个构造方法基础上产生的。public ThreadPoolExecutor(int corePoolSize,//核心线程数原创 2022-05-03 18:33:26 · 1115 阅读 · 0 评论 -
Java 线程池的使用【一】【Executor】
当一个程序中若需要创建大量线程,并在任务结束后销毁,会给系统带来过渡的消耗资源以及过渡切换线程的危险,从而可能导致系统崩溃。线程和数据库连接,这些资源都是非常宝贵的资源。那么每次需要的时候创建,不需要的时候销毁,是非常浪费资源的。那么我们就可以使用缓存的策略,也就是线程池。线程池主要有两个作用:控制线程数量(提高线程的可管理性)重用线程(提高响应速度,降低资源消耗)Java里线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具,真正的线原创 2020-08-28 16:17:44 · 566 阅读 · 0 评论 -
Java 多线程并发安全问题【synchronized】
1、多线程并发的安全问题:产生:当多个线程并发操作同一资源时,由于线程切换实际的不确定性,会导致执行操作资源的代码顺序未按设计顺序执行,出现操作混乱的情况,严重可能导致系统瘫痪。解决:将并发操作同一资源改为同步操作,即:有先后顺序的操作。Thread.yield()方法,模拟并发问题,让当前线程主动让出时间片,回到Runnable状态,等待下一次调度。2、synchronized:1)当一个方法被synchronized修饰后,该方法称为"同步方法",即:多个线程不能同时在方法内部运行,强制让多个原创 2020-08-28 15:33:01 · 1008 阅读 · 0 评论 -
Java 线程常用 API【总结】
线程提供了获取相关信息的方法:1、线程提供了一个静态方法:static Thread currentThread()该方法用来获取运行这个方法的线程,main方法也是靠一个线程运行的,当JVM启动后会自动创建一个线程来执行main方法,而这个线程的名字叫做"main",我们称它为主线程。package thread;public class ThreadDemo { public static void main(String[] args) { //获取运行main方法的线程 Thre原创 2020-08-28 11:49:34 · 9525 阅读 · 1 评论 -
Java 线程的创建方式【总结】
线程是并发运行代码的,有如下几种创建方式:1、继承Thread类并重写run方法:run方法中就是希望线程执行的逻辑,启动线程要调用start方法,而不是直接调用run方法,当start方法调用完毕后,run方法很快会被线程自行调用。第一种创建线程的方式比较简单直接,但是缺点主要有两个:由于需要继承线程,这导致不能再继承其他类,实际开发中经常要复用某个超类的功能,那么在继承线程后不能再继承其他类会有很多不便。定义线程类的同时重写了run方法,这会导致线程与线程要执行的任务有一个必然的耦合关系,不原创 2020-08-26 11:22:45 · 1316 阅读 · 3 评论 -
Java 并发、并行
并发与并行:并行性和并发性是既相似又有区别的两个概念并行性:是指两个或多个事件在同一时刻发生。并发性:是指两个或多个事件在同一时间间隔内发生,多个线程"同时"运行只是我们感官上的一种表现,事实上线程是并发运行的,OS将时间划分为很多很多的时间片段(时间片),尽可能的均匀分配给每一个线程,获取时间片的线程被CPU运行,而其它线程全部等待。...原创 2020-08-25 16:33:13 · 122 阅读 · 0 评论 -
Java 同步、异步
1、同步与异步:同步与异步通常来形容一次方法调用。同步:方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步:方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。此时,其实异步方法会在另一个线程中真实的执行着,整个过程不会阻碍调用者工作。例子: (注:本段内容摘自Java高并发程序设计)打个比方,比如我们去购物,如果你去商场实体店买一台空调,当你到了商场看中了一款空调,你就想售货员下单。售货员去仓库帮你调配物品。这天你热的实在不行了。就催着原创 2020-08-25 15:47:04 · 1173 阅读 · 0 评论 -
Java 线程、进程
1、什么是进程:process进程时操作系统中运行的一个任务(一个应用程序运行在一个进程中)。进程时一块包含了某些资源的内存区域,操作系统利用进程把它的工作划分为一些功能单元。进程中包含的一个或多个执行单元称为线程,进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问。线程只能归属于一个进程,并且它只能访问该进程所拥有的资源,当操作系统创建一个进程后,该进程会自动申请一个名为主线程或者首要线程的线程。2、什么是线程:thread一个线程是进程的一个顺序执行流。同类的多个线程共享一块原创 2020-08-25 14:53:07 · 1199 阅读 · 1 评论 -
Java lambda表达式
1、lambda表达式:lambda可以让Java以函数式编程,该特性是自JDK8之后推出的,使用lambda可以方便快捷创建匿名内部类。语法:(参数列表)->{ 方法体}注:使用lambda创建的匿名内部类实际所属的接口必须只能有一个方法。否则编译不通过。public class LambdaDemo{ public static void mian(String[] args){ Runnable r1 = new Runnable(){ public void run(原创 2020-08-31 10:49:22 · 233 阅读 · 0 评论 -
Java 可变参数
JDK5之后推出了一个新的特性:可变参数1、可变参数的定义:只需要在变量类型和变量名之间使用三个英文半角的点号就可以了(三个点前后有无空格都可以)。修饰符 返回值类型 方法名称(参数类型...参数名称);注意:可变参数必须为参数列表中的最后一项。如果前面声明了其它参数,需要按照顺序正常传入,最后传入变量的类型和可变长变量的类型保持一致即可;可变参数也可以使用相同类型的数组传入,假设可变长参数的类型是String类型,则调用的时候也可以通过传入String数组的方式调用。package demo原创 2020-08-28 17:50:25 · 229 阅读 · 0 评论 -
Java 反射机制
Java反射机制:反射机制可以允许我们实例化一个类,调用方法操作属性从编码期改为运行期决定。并且也可以在运行期间动态的得知一个类的情况(它有哪些方法和属性等)。反射机制可以大大提高代码的灵活度,但是实际开发中使用要适度,过渡使用反射会降低代码的运行效率。1、反射第一步:获取要操作的类的类对象Java中每个被JVM加载的类在JVM内部都有且只有一个类对象(Class实例),与之对应。通过某个类的类对象可以得知这个类的信息(有哪些方法,哪些属性等等信息)并且可以进行实例化等操作。想获取一个类的类对象方原创 2020-08-28 17:49:30 · 106 阅读 · 0 评论 -
Java StringBuilder、StringBuffer、String的区别与使用
1、String类,是由final修饰的,String字符串常量,底层是不可修改的,每次修改都要创建新的对象,并将旧对象销毁,如果重复多次的进行创建和销毁就会大大的浪费内存空间,消耗系统性能。为了适应频繁修改字符串的场景,Java为我们提供了StringBuilder类和StringBuffer类,他们是字符串变量,与String不同的是,在使用StringBuilder或StringBuffer类时,不会产生新的对象,而是使用提供的方法进行修改其内容,这样大大的提高了系统性能。StringBuilde原创 2020-08-25 12:09:02 · 260 阅读 · 0 评论 -
Java String API
1、String是由final修饰的,是不可以改变的,JVM对其做了一个优化,在内存中开辟了一段区域作为常量池,凡是通过"字面量"形式创建的字符串对象都会缓存并重用。package string;public class StringDemo { public static void main(String[] args) { String str = "123"; String s1 = "123"; String s2 = "123"; System.out.println(st原创 2020-08-25 11:16:29 · 737 阅读 · 2 评论 -
Java 日期相关操作
1、Date类:java.util.DateDate的每一个实例用于表示一个时间点,内部维护一个long值,该值记录的是自1970年1月1日00:00:00到当前Date表示的时间之间所经过的毫秒。注意:如果计算1970年1月1日00:00:00之前的时间戳,那么该值为负值,可通过负值正常计算即可。由于Date存在时区以及千年虫问题,所以大部分操作时间的方法都被声明为过时的不再建议使用了。package date;import java.util.Date;public class Date原创 2020-08-20 18:11:33 · 186 阅读 · 0 评论 -
Java IO流【字符流】
1、字符流:java将流按照读写单位又进行了一种划分方式:字节流:字节流的读写单位是字节字符流:而字符流的读写单位是字符,所以字符流只适合读写文本数据。java.io.Reader,java.io.Writer,这两个类也是抽象类,是所有字符输入流与字符输出流的父类,规定了读写字符的相关方法2、转换流:(字符流实现类)java.io.InputStreamReaderjava.io.OutputStreamWriter他们是一对常用的字符流实现类,经常在我们做字符数据读写操作中使用。原创 2020-08-19 17:08:31 · 216 阅读 · 1 评论 -
Java IO流【对象流】
一、对象流:被序列化的对象class:package io;import java.io.Serializable;import java.util.Arrays;/** * * 使用当前类测试对象流的对象读写操作 * * 当一个类的实例希望可以被对象流进行读写, * 那么该类必须实现:java.io.Serializable接口 * 与此同时,当前类中所有引用类型的属性,他们 * 对应的类也必须实现该接口。 * */public class Person imple原创 2020-08-19 16:09:27 · 243 阅读 · 0 评论 -
Java IO流【缓冲流】
缓冲流:缓冲流是一对高级流,功能是提高读写效率链接它们以后,无论我们进行随机读写还是块读写,当经过缓冲流时都会被转换为块读写操作。java.io.BufferedInputStreamjava.io.BufferedOutputStreampackage io;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.原创 2020-08-19 16:08:34 · 186 阅读 · 0 评论 -
Java IO流【概述】
Java IO(input、output)输入与输出,IO是我们的程序与外界交换数据的方式。Java提供了一种统一的标准的方式与外界交换数据。1、Java将流按照功能划分为读和写,并用不同的方向来表示,输入和输出都是针对程序来说的,其中输入流(外界到程序的方向)用于读取数据,输出流(程序到外界的方向)用于写出数据。Java将流划分为两大类:节点流、处理流节点流:也称为低级流,是实际链接程序与数据源的"管道",负责实际搬运数据。读写一定是建立在节点流的基础上进行的。处理流:也称为高级流,不能独立存原创 2020-08-19 13:52:30 · 159 阅读 · 2 评论 -
Java RandomAccessFile综合案例
1、使用RandomAccessFile实现用户的注册功能,将用户的注册信息存储到本地文件中:package io;import java.io.IOException;import java.io.RandomAccessFile;import java.util.Arrays;import java.util.Scanner;public class UserDemo { public static void main(String[] args) throws IOException原创 2020-08-19 13:31:54 · 303 阅读 · 1 评论 -
Java RandomAccessFile
java.io.RandomAccessFile:RAF是专门用来读写文件数据的API。其基于指针对文件数据进行读写操作,可以灵活的编辑文件数据内容。创建RAF时可以指定对文件的权限,常用的有两种:r:只读模式rw:读写模式1、利用RandomAccessFile来进行文件的读和写:public class RafDemo { public static void main(String[] args) throws IOException { //对当前目录的raf.dat文件原创 2020-08-19 10:40:40 · 305 阅读 · 0 评论 -
Java 文件操作【File】
java.io.File,File的每一个实例用于表示硬盘上的一个文件或目录。使用File可以:访问其表示的文件或目录的属性信息(名字,大小,访问权限等信息)操作文件或目录(创建,删除)访问目录子项注意:File不能访问文件数据。下面是关于File的一些常用方法:package io;import java.io.File;import java.io.FileFilter;import java.io.IOException;public class FileDemo {原创 2020-08-18 14:17:30 · 229 阅读 · 0 评论 -
Java TreeMap【记录】
TreeMap:public class TreeMap<K,V>extends AbstractMap<K,V>implements NavigableMap<K,V>,Cloneable,SerializableTreeMap中的元素默认按照keys的自然排序排列。(对Integer来说,其自然排序就是数字的升序,对String来说,其自然排序就是按照字母表排序)构造函数TreeMap():创建一个空TreeMap,keys按照自然排序TreeMa原创 2020-08-17 15:17:03 · 142 阅读 · 1 评论 -
Java TreeMap原理实现及常用方法
1、TreeMap概述:原文链接TreeMap存储K-V键值对,通过红黑树(R-B tree)实现;TreeMap继承了NavigableMap接口,NavigableMap接口继承了SortedMap接口,可支持一系列的导航定位以及导航操作的方法,当然只是提供了接口,需要TreeMap自己去实现;TreeMap实现了Cloneable接口,可被克隆,实现了Serializable接口,可序列化;TreeMap因为是通过红黑树实现,红黑树结构天然支持排序,默认情况下通过Key值的自然顺序进行排序;原创 2020-08-17 14:39:38 · 379 阅读 · 0 评论 -
Java 关于红黑树(R-B Tree)原理
红黑树(R-B Tree)原理:原文链接学过数据结构都知道二叉树的概念,而又有很多中比较常见的二叉树类型,比如完全二叉树、满二叉树、二叉搜索树、均衡二叉树、完美二叉树等;今天我们要说的红黑树就是一棵非严格均衡的二叉树,均衡二叉树又是在二叉搜索树的基础上增加了自动维持平衡的性质,插入、搜索、删除的效率都比较高。红黑树也是实现TreeMap存储结构的基石。1、二叉搜索树:二叉搜索树又叫二叉查找树、二叉排序树,我们先看一下典型的二叉搜索树,这样的二叉树有何规则特点呢?节点的左子树小于本身节点节点的右子原创 2020-08-17 13:36:07 · 891 阅读 · 1 评论 -
Java Map的三种遍历方式
1、遍历所有的Key:Set<K> keySet()将当前Map中所有的key以一个Set集合形式返回。遍历这个集合就等同于遍历了所有的keypublic static void main(String[] args) { Map<String,Integer> map = new LinkedHashMap<String,Integer>(); map.put("语文", 98); map.put("数学", 97); map.put("英语", 96);原创 2020-08-11 14:19:03 · 167 阅读 · 0 评论 -
Java HashMap底层原理【记录】
HashMap是基于哈希表的Map接口的非同步实现。实现HashMap对数据的操作,允许有一个null键,多个null值。JDK1.7:HashMap底层是一个数组+链表结构,创建HashMap的时候就会分配空间(大小为16);JDK1.8+:HashMap增加了红黑树(数组+链表+红黑树),当数组的元素大于64并且链表元素个数大于8时,链表就换转为红黑树,创建HashMap时不会去分配空间,只有put第一个元素的时候才会去分配空间。新建一个HashMap的时候,就会初始化一个Entry数组,每个Ent原创 2020-08-14 14:36:28 · 350 阅读 · 0 评论 -
Java Map接口
Map接口:Map<K,V>java.util.Map,Map查找表,结构看起来像是一个多行两列的表格,左列称为key,右列称为value,所以Map总是以key-value对的形式保存元素。并且总是根据key去获取对应的value,对此我们经常将"查询条件"作为key,将要查询的数据作为value进行保存。Map本身是一个接口,规定了Map操作的相关方法。put(K key,V value):将键值数据存入Map中get(Object key):通过键,获取值,若key不存在则返回n原创 2020-08-10 17:33:56 · 199 阅读 · 0 评论 -
Java List获取子集操作【subList】
获取子集操作:List subList(int start,int end)获取当前集合指定下标对应范围内的元素注意:操作子集就是对原集合对应元素的操作。public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); for (int i = 1; i <= 10; i++) { list.add(i); } System.out.print原创 2020-08-10 16:06:45 · 2478 阅读 · 0 评论 -
Java Deque接口
双端队列:java.util.Deque接口,Deque继承自Queue接口,双端队列是指队列两端都可以做进出队操作。常用的实现类:LinkedList1、由于双端队列两端都可以进出队操作,所以双端队列在原有队列的基础上又新增了一些方法:offerFirst:在队首入队元素offerLast:在队尾入队元素pollFirst:在队首出队元素pollLast:在队尾出队元素peekFirst:获取队首元素peekLast:获取队尾元素public static void main(Str原创 2020-08-10 15:44:26 · 663 阅读 · 0 评论 -
Java Queue接口
Queue接口继承自Collection接口,java.util.Queue,队列也可以保存一组元素但是存取元素必须遵循先进先出模式。1、常用实现类:LinkedListoffer方法:入队操作,向队列末尾追加元素(返回值boolean类型:添加是否成功)poll方法 :出队操作,获取队首元素后该元素即从队列中被删除(返回值:元素类型,返回被出队的元素)peek方法: 引用队首元素,元素不做出队操作(返回值:元素类型:返回队首元素)import java.util.LinkedList;im原创 2020-08-10 14:47:17 · 592 阅读 · 0 评论 -
Java 集合线程安全的实现
集合有线程安全的实现,我们可以借助Collections将现有的集合转换为一个线程安全的。List中常用的实现类:ArrayList、LinkedList它们都不是线程安全的。1、将给定集合转换为一个线程安全的:List<String> list = new ArrayList<String>();list = Collections.synchronizedList(list);2、HashSet同样也不是线程安全的:Set<String> set = n原创 2020-08-10 14:18:27 · 406 阅读 · 0 评论 -
Java 泛型继承类或接口
我们可以使用任何类型来实例化泛型对象,这样是存在弊端的,Java提供了一种语法来限制泛型的可实现类。1、限制泛型的类型:泛型继承类或接口语法:A< T extends anyClass > a;泛型必须是anyClass的子类,虽然这里使用的是extends关键字,但是anyClass既可以是类也可以是接口。import java.util.*;public class Demo2 <T extends List>{ public static void main(Str原创 2020-08-10 11:45:40 · 1940 阅读 · 0 评论 -
Java 继承泛型类和泛型接口
1、Java中,子类可以继承父类的泛型和泛型接口,语法:class FatherClss<T>{}class ChildClass<T> extends FatherClass<T>{}interface TestInterface<E>{}class ChildClass<E> implements TestInterface<E>{}简单的实现:class Father<T>{ T t; public原创 2020-08-10 10:15:57 · 2315 阅读 · 0 评论 -
Java 泛型和类型擦除【记录】
泛型是JDK5推出的特性,也称为参数化类型,它允许将一个类中属性的类型,方法参数的类型以及方法返回值类型等的定义权移交给使用者,这使得实际应用中使用这个类更加灵活便捷。1、语法:类名<类型参数1,类型参数2,...,类型参数n>{}public class Demo<T>{ T attribute; T method(T t){}}注意:如果定义了泛型却不使用,Eclipse会发出警告。2、首先我们写一个没有泛型的例子:public class Demo{ Obj原创 2020-08-07 18:00:48 · 475 阅读 · 0 评论 -
Java 集合与数组互相转换
Java中的Set、List和数组互相转换:1、数组转List:Arrays.asList(arr)public static void main(String[] args){ Integer[] arr = new Integer[]{1,2,3}; List<Integer> list = Arrays.asList(arr); for(Integer i : list){ System.out.println(i); }}使用asList方法会返回一个固定长度的Li原创 2020-08-07 15:51:52 · 195 阅读 · 0 评论 -
Java 遍历时如何选择for循环和Iterator
Java提供了很多的数据结构,例如:数组、集合、Map表等等,迭代器Iterator就是用来帮助我们做集合遍历工作的,在遍历这些数组或集合时通常可以使用for循环或是Iterator迭代器,那么我们如何来选择呢?增强for循环(forEach)底层实现是通过迭代器实现的,所以我们只要区分什么时候要用for循环什么时候要用迭代器就可以了。1、for循环和迭代器的选择:在集合无法使用for循环遍历的时候,可以考虑Iterator,迭代之后可以进行遍历。List接口的实现类ArrayList是在内存中开辟原创 2020-08-07 11:03:18 · 1006 阅读 · 0 评论 -
Java TreeSet【记录】
1、TreeSet简介:TreeSet是一个有序(相对于插入的顺序来说是无序的,和插入顺序不同)的集合,它的作用是提供有序的Set集合。它继承于AbstractSet抽象类,实现了NavigableSet,Cloneable,java.io.Serializable接口。TreeSet继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法。TreeSet实现了NavigableSet接口,意味着它支持一系列的导航方法。比如查找与制定目标最匹配项。TreeSet实现了Clonea原创 2020-08-17 17:41:59 · 173 阅读 · 0 评论 -
Java Set接口及其实现类
Set接口:set存储元素是无序不可以重复的,元素是否重复是依据元素自身equals比较进行判定的。Set接口有两个实现类:散列集合:HashSet(Hash算法)树集合:TreeSet(二叉树算法)因为set接口也是Collection的子接口,所以也可以使用Collection实现的所有方法,其中常用的有:添加:add()删除:remove()检查元素是否存在:contains(Object o)迭代器:iterator()1、TreeSet:树状集合、存放有序语法:Set&原创 2020-08-06 16:54:19 · 576 阅读 · 1 评论