作者小头像 Lv.2
96 成长值

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

IOT、数据库、编程语言、人工智能、大数据
个人勋章
TA还没获得勋章~
成长雷达
30
66
0
0
0

个人资料

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

IOT、数据库、编程语言、人工智能、大数据

达成规则

发布时间 2021/09/06 09:50:21 最后回复 大卡 2021/11/03 21:04:04 版块 社区活动
7080 134 0
他的回复:
华为云账号:cqy_self+ 第七周笔记一、字符串类1、String类String类的底层使用char的数组保存数据。String类是一个final类,不允许被继承。String类是一个不可变类,该类的对象生成后,内容不会发生变化。String类中的所有返回String类型对象的成员方法都是返回一个新的String对象。String类重写了equals方法,用来比较两个字符串的内容是否相同。String类的equals方法和==做区分,==比较的是两个字符串对象的地址。2、字符串类实例化机制Java中string类型的创建有以下两种方式∶创建的时候,JVM会先在字符串常量池中去查找是否存在该字符串,如果存在直接返回该字符串对象的地址,否则会在常量池中创建该字符串对象并返回地址。创建的时候,也会先查找常量池中是否存在该字符串,如果存在就会在堆里面复制一份这个字符串对象,然后把堆里面的对象地址返回给变量;不存在的话就会在堆中和常量池中各创建一个对象,并返回堆中对象的地址。3、字符串的维护和参数传递String类的+和concat都可以将2个字符串拼接到一块,形成新的字符串。String的+还可以将字符串与非字符串拼接在一起,成为新的字符串,concat不可以与非字符串拼接在一起。4、StringBuffer&StringBuilder类StringBuffer又称为可变字符序列,它是一个类似于String的字符串缓冲区,可以改变该序列的长度和内容。StringBuffer是同步安全的。StringBuilder类也是字符串缓冲区,非同步安全。String、StringBuffer、StringBuilder的区别如下:String是内容不可变的。StringBuffer、StringBuilder都是内容可变的。StringBuffer是同步的,数据安全,效率低。StringBuilder是不同步的,数据不安全,效率高。 二、Java常用类1、System类System类代表系统,系统级的很多属性和控制方法都放置在该类的内部,该类位于java.lang包。由于该类的构造方法是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员方法和成员变量都是static的,所以可以通过类名呼叫。System中包含了in、out和err三个成员变量,分别代表标准输入流、标准输出流和标准错误输出流。System中常用的方法:2、深度克隆克隆和现实生活中的克隆一样,复制一个一模一样的对象出来。clone()这个方法是从Object继承下来的,一个对象要实现克隆,需要实现一个叫做Cloneable的接口,实现了这个接口就能实现克隆操作。克隆分深度克隆和浅度克隆。深度克隆:被克隆得到的对象基本类型的值修改了.原对象的值改变。3、浅度克隆浅度克隆:被克隆得到的对象基本类型的值修改了,原对象的值不会改变。
发布时间 2021/09/06 09:50:21 最后回复 大卡 2021/11/03 21:04:04 版块 社区活动
7080 134 0
他的回复:
华为云账号:cqy_self+ 第六周笔记第一章 Java集合Collection接口及List子类1、集合框架简介1.1、简介集合可以看作是一种容器,用来存储对象信息。所有集合类都位于java.util包下,但支持多线程安全的集合类位于java.utilL.concurrent包下。Java集合类主要由两个根接口Collection和Map派生出来的。1.1.2 Collection接口单个对象保存的最顶层父接口Collection接口以及其子接口,在每次进行数据操作时只能对单个对象进行处理。Collection接口的定义如下:public interface Collection extends IterableInterable:迭代器接口(就是为了遍历集合)Interator iterator();(取得集合的迭代器,JDK1.5之前直接写在Collection接口中)从JDK1.5开始Collection接口追加了泛型应用,可以直接避免ClassCastException。核心方法:向集合中添加数据:public boolean add(E e);取得Iterator接口对象,用于集合输出:public Iterator iteratorCollection派生出了三个子接口:List、Set、Queue ( Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系。1.1.3 List接口在进行单个集合处理的时候,优先考虑List接口。核心方法:根据索引取得保存数据:public E get(int index);修改数据:public E set(int index,E element);List子接口与Collection接口相比,最大的特点在于其有一个get()方法,可以根据索引取得内容。由于List本身还是接口,要想取得接口的实例化对象,就必须有子类,在List接口下有三个常用的子类:ArrayList , Vector , LinkedList;集合类的继承体系:1.2集合和数组的区别数组声明了它容纳的元素的类型,而集合不声明。数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。数组的存放的类型只能是一种(基本类型/引用类型)。集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。1.3 Collections工具类Collections是一个操作Set、List和Map等集合的工具类。Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。Collections中常用方法,都是静态方法reverse(List)︰反转List中元素的顺序。shuffle(List):对List集合元素进行随机排序。sort(List)︰根据元素的自然顺序对指定List集合元素按升序排序。swap(List,int,int)︰将指定list集合中的i处元素和j处元素进行交换。int frequency(Collection,Object):返回指定集合中指定元素的出现次数。void copy(List dest,List src)︰将src中的内容复制到dest中。boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换List对象的所有旧值。  第二章 Java集合Collection接口及Set子类1. Set接口和简介set接口继承自Collection接口,但是并没有对方法进行扩充,是Collection的子接口。Set接口中元素无序,并且会对元素进行对比,保证存入的元素不出现重复。Set接口不允许重复元素,最多包含一个null。Set接口的遍历方式:使用迭代器或增强for循环。set接口主要有两个实现类,分别是HashSet和TreeSet。2、HashSet子类和APIHashSet是Set接口的一个实现类,它不保证Set的迭代顺序,无序存放。Set接口的唯一性:底层依赖于hashCode()和equals()方法。2. HashSet子类和APIHashSet是Set接口的一个实现类,它不保证Set的迭代顺序,无序存放。Set接口的唯一性:底层依赖于hashCode()和equals()方法。3.TreeSet子类和APITreeSet是set接口的一个实现类,主要作用是对象的排序及确定存入对象的唯一性。TreeSet中的元素支持2种排序方式:第一种:自然排序,在元素中定义排序规则。元素自身具有比较性,实现Comparable接口,重写compareTo方法第二种:比较器排序,创建TreeSet时提供Comparator进行排序。实现Comparator接口,实现compare方法。4. Set与List接口及其子类的异同List集合中的元素可重复,Set集合中的元素不可重复。List集合中的元素有序的,Set集合中的元素是无序。List中最常用的两个子类: ArrayList和LinkedList。Set中最常用的两个子类:HashSet和TreeSet。第三章 Java集合Map接口及子类1. Map接口和简介1.1 定义Map集合中存储的元素是一组键值对象,是key与value是一个映射。Map提供了一个更通用的元素存储方法,每个键映射有一个值。Map集合中一个key对应一个value,不能存在相同的key值,value值可以相同。key和value之间存在单向一对一关系,即通过指定的key总能找到唯一确定的value。Map接口的常用实现类有:HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap。1.2 Map集合和Collection集合区别:① Map集合存储元素是成对出现的,也就是键值对出现,而且键是不可以重复的。② Collection集合存储元素是一个一个存储的,也就是单一存储的。第四章 Java集合队列1. Queue队列机制1.1 定义队列是一种先进先出的数据结构,队列中插入元素和删除元素分别位于队列的两端。队列:先进先出;队头删除,队尾插入。属性:队头指针front,队尾指针rear。方法:入列enQueue,出列deQueue,判断是否为空isEmpty,判断是否已满isFull,清空makeEmpty,返回元素个数size。1.2 Java中的Queue的实现有三种方式:阻塞队列:阻塞队列是一个可以阻塞的先进先出集合,比如某个线程在空队列获取元素时、或者在已存满队列存储元素时,都会被阻塞。非阻塞队列:非阻塞队列是使用CAS( compare and set)机制实现,并发性能好。双端队列(Deque):Deque是一个既可以在头部操作元素,又可以为尾部操作元素,俗称为双向队列。2. Queue队列之阻塞队列ArrayBlockingQueue基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须制定容量大小。ArrayBlockingQueue可以指定公平性与非公平性,默认情况下为非公平的,即不保证等待时间最长的队列最优先能够访问队列。ArrayBlockingQueue常用方法:put方法用来向队尾存入元素,如果队列满,则等待。take方法用来从队首取元素,如果队列为空,则等待。offer方法用来向队尾存入元素,如果队列满,则等待一定的时间,当时间期限达到时,如果还没有插入成功,则返回a1se;否则返回true 。poll方法用来从队首取元素,如果队列空,则等待一定的时间,当时间期限达到时,如果取不到,则返回null;否则返回取得的元素。3. Queue队列之优先级队列PriorityQueue优先级队列既可以根据元素的自然顺序来排序,也可以根据Comparator来设置排序规则。PriorityQueue优先级队列对于自定义的类来说,需要自定义比较器。PriorityQueue优先队列的大小是不受限制的,但在创建时可以指定初始大小。当我们向优先队列增加元素的时候,队列大小会自动增加。PriorityQueue优先队列不允许空值。PriorityQueue是非线程安全的,所以Java提供了PriorityBlockingQueue在多线程环境使用。4.Queue队列之延时队列DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。不能将null元素放置到DelayQueue队列中。DelayQueue只能添加(offer/put/add)实现了Delayed接口的对象。第五章 Java Stream1.Stream概述流Stream是数据渠道,用于操作数据源集合、数组等所生成的元素序列。集合讲的是数据,流讲的是计算。Stream不是数据结构,不会保存数据。Stream不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中。Stream是惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作的时候才会进行实际的计算。2. Stream的操作流程和创建Stream操作的三个步骤:创建Stream:一个数据源(集合、数组),获取一个流。中间操作:一个中间操作链,对数据源的数据进行处理。③终止操作:一个终止操作,执行中间操作链。并产生结果。3.Stream中间操作中间操作:中间操作会返回一个新的流,一个流可以后面跟随零个或多个intermediate操作。中间操作目的主要是打开流,做出某种程度的数据映射/过滤,然后会返回一个新的流,交给下一个操作使用。这类操作都是惰性化的,就是说,仅仅调用到这类方法,并没有真正开始流的遍历。而是在终端操作开始的时候才真正开始执行。 4.Stream的串行流和并行流Stream的串行流:所有的collection集合都可以通过stream默认方法获取流: list.stream();Stream接口的静态方法of可以获取数组对应的流:Stream.of(6,1,5,4,3);Stream的并行流:并行流是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流规约成一个value的规约操作。
发布时间 2021/09/06 09:50:21 最后回复 大卡 2021/11/03 21:04:04 版块 社区活动
7080 134 0
他的回复:
华为云账号:cqy_self+ 第五周笔记5.JUC并发包5.1 线程的ThreadLocal本地缓存对象ThreadLocal线程范围内的共享变量:线程范围内的共享变量,每个线程只能访问自己的数据,不能访问别的线程数据。 每个线程调用全局ThreadLocal对象的set方法,就相当于往其内部的map中增加一条记录,key分别是各自的线程,value是各自的set方法传进去的值。 5.2 线程的volatile关键字volatile关键字可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性。 volatile的作用:使变量在多个线程间可见,但是无法保证原子性。需要注意的是一般volatile用于只针对多个线程可见的变量操作,并不能代替synchronized的同步功能。 5.3 线程池的作用和应用线程池的作用:--1、降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。--2、提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。--3、提高线程的可管理行:线程是稀缺资源,如果无限制的创建,不仅会消耗系统消耗,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 5.4 线程的同步工具类CountDownLatchCountDownLatch同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待:--1、CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用countDown()方法,计数器减1,计数器大于0时,await()方法会阻塞程序继续执行。--2、由于调用了countDown()方法,所以在当前计数到达零之前,await()方法会一直受阻塞。之后,会释放所有等待的线程,await()的所有后续调用都将立即返回。这种现象只出现一次,计数无法被重置。一个线程或者多个,等待另外N个线程完成某个事情之后才能执行。 5.5 线程的同步工具类CyclicBarrierCyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公众屏障点(common barrier point)。因为该barrier在释放等待线程后可以重用,所以称它为循环的battier。5.6 线程的同步工具类SemaphoreSemaphore是一个计数信号量,它的本质是一个共享锁,是基于AQS实现的,通过state变量来实现共享。通过调用acquire方法,对state值减去一,当调用release的时候,对state值加一。当state变量小于0的时候,在AQS队列中阻塞等待。5.7 线程的交换类ExchangerExchanger(交换者)是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchanger()交换数据。如果第一个线程先执行exchanger()方法,它会一直等待第二个线程也执行exchanger(),当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。 5.8 线程的Fork/Join机制Fork/Join框架是Java7提供一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。分治法:把一个规模大的问题划分为规模较小的子问题,然后分而治之,最后合并子问题的解得到原问题的解。 6.常用线程池6.1 优势线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队到,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。他的主要特点为:线程复用:控制最大并发数:;管理线程。第一:降低资源消耗。通过重复利用己创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控 6.2 四种线程池6.2.1 newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。6.2.2 newFixedThreadPool  创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。6.2.3 newScheduledThreadPool 创建一个可定期或者延时执行任务的定长线程池,支持定时及周期性任务执行。 6.2.4 newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 6.3 核心类① int corePoolSize, 核心线程大小② int maximumPoolSize,最大线程大小③long keepAliveTime, 超过corePoolSize的线程多久不活动被销毁时间④TimeUnit unit,时间单位⑤BlockingQueue workQueue 任务队列⑥ThreadFactory threadFactory 线程池工厂⑦RejectedExecutionHandler handler 拒绝策略 6.4线程池任务执行流程当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,释放空闲线程当设置allowCoreThreadTimeOut(true)时,该参数默认false,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭
发布时间 2021/09/06 09:50:21 最后回复 大卡 2021/11/03 21:04:04 版块 社区活动
7080 134 0
他的回复:
华为云账号:cqy_self+ 第四周笔记 Java多线程实战1. 多线程1.1概念多线程的概念程序、进程与线程:程序:一段静态的代码,它是应用软件执行的蓝本。进程:程序的一次动态执行过程(动态概念),它对应了从代码加载、执行到执行完毕的完整过程。一个程序可以被多次加载到系统的不同区域分别执行,形成不同的进程。线程:比进程更小的执行单位(动态概念)。一个进程在执行过程中可产生多个线程,形成多条执行线索。每个进程都有一段专用的内存区,并以PCB(Process Control Block)作为它存在的标志;而一个进程中的所有线程可以共享该进程的同一个地址空间和操作系统资源,并利用这些共享单元实现数据交换、实时通信与必要的同步操作。因此多线程占用系统资源少、线程间通信快。1.2线程的生命周期线程是一个动态执行的过程,它也有一个从产生到死亡的过程。下图显示的是线程的生命周期:1.2.1 新建状态:使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。1.2.2 就绪状态当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。1.2.3 运行状态如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。1.2.4 阻塞状态如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:1.2.5 等待阻塞运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。1.2.6 同步阻塞线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。1.2.7 其他阻塞通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。1.2.8 死亡状态一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。1.3线程优先级每一个 Java 线程都有一个优先级,这样有助于操作系统确定线程的调度序。Java 线程的优先级是一个整数,其取值范围是 1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。默认情况下,每一个线程都会分配一个优先级 NORM_PRIORITY(5)。具有较高优先级的线程对程序更重要,并且应该在低优先级的线程之前分配处理器资源。但是,线程优先级不能保证线程执行的顺序,而且非常依赖于平台。 2. 多线程实现2.1 继承Thread类通过定义java.lang包中的Thread类的子类并在子类中重写run()方法。由于java不能多重继承,此方法简单但不灵活。Thread类的构造函数及主要方法如下:public Thread():产生一个名字自动生成的线程,名字形式为Thread_1、Thread_2、、、;public Thread(Runnable target):生成一个指定目标对象的线程;public Thread(String name):生成一个指定名字的线程;public Thread(ThreadGroup group,Runnable target):生成一个指定线程组和目标对象的线程;public Thread(ThreadGroup group,String name):生成一个指定线程组和名字的线程。通过继承Thread类实现多线程示例:ThreadTest.java程序中subThread类继承了Thread类,先定义了一个构造函数调用父类的构造函数给该线程置名,然后重写了run()方法,使线程运行时每输出一个循环变量后休眠一段随机时间,让另一个线程运行,一个线程的run()方法结束前输出该线程的结束信息。2.2 实现Runnable接口Runnable接口只有一个run()方法,要实现此接口就必须定义run()方法的具体内容,方法体内可定义用户要做的操作。然后以这个实现了Runnable接口的类为参数创建Thread类的对象,也就是用Runnable接口的目标对象初始化Thread类的对象,如此就可把用户实现的run()方法继承过来。创建一个线程,最简单的方法是创建一个实现Runnable接口的类。为了实现Runnable,一个类只需要执行一个方法调用run(),声明如下:Public void run();在创建一个实现Runnable接口的类之后,你可以在类中实例化一个线程对象。Thread(Runnable threadOb,String threadName);threadOb 是一个实现Runnable接口的类的实例,并且threadName指定新线程的名字。新线程创建之后,调用start()方法才会运行。void start();2.3 通过Callable和Future创建线程创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并有返回值。 创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。使用FutureTask对象作为Thread对象的target创建并启动新线程。调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。 3. 多线程的基本控制在控制线程从一种状态转入另一种状态时,必须调用正确的方法,否则将产生异常。除了注意状态转换时需调用的方法外,为使多个线程之间能协调工作,必须控制线程的互斥、同步及死锁问题。3.1互斥一组并发进程中一个或多个程序段,因共享某一公用资源而导致它们必须以一个不允许交叉执行的单位执行。即不允许两个以上共享该公用资源的并发进程同时进入临界区。3.2同步一组并发进程因直接制约而互相发送消息,进行相互合作,互相等待,使得各进程按一定的执行速度执行的过程,称为进程间同步。3.3死锁在多个进程并行执行时,当某进程提出资源申请后,使得若干进程在无外力作用下,永远得不到所需要的资源,不能再继续运行的情况。如生产者与消费者问题:生产的产品存入仓库,消费时从仓库取出产品。当仓库满时再生产将无处可放,而当仓库空时再消费将取不到产品。采用同步策略可协调生产与消费.。 4. 线程通信4.1 线程通信机制线程间同步可以归纳为一个线程间通信的一个子集,线程通信是指两个线程之间可以交换一些实时的数据信息。4.2 实现线程间的通信方法(wait/notify,Lock/Condition)线程通信的wait和notify机制- 等待/通知机制- wait就是线程在获取对象锁后,主动释放对象锁,同时本线程休眠。知道线程调用notify唤醒该线程,才能继续获取对象锁,继续执行- 都是Object类的方法线程通信的Lock和Condition机制-Lock用于控制多线程对需要竞争的共享资源的顺序访问,保证状态连续性-Condition是java提供实现等待/通知的类,由Lock对象所创建-Condition中的wait方法相当于Object的wait方法,signal方法相当于Object的notify方法