作者小头像 Lv.3
515 成长值

个人介绍

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

感兴趣或擅长的领域

自动化运维、云计算、大数据、编程语言、数据库
个人勋章
  • 考证狂人
成长雷达
30
210
125
150
0

个人资料

个人介绍

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

感兴趣或擅长的领域

自动化运维、云计算、大数据、编程语言、数据库

达成规则

发布时间 2021/09/06 09:50:21 最后回复 大卡 2021/11/03 21:04:04 版块 社区活动
7076 134 0
他的回复:
华为云ID:wq765416999 + 第7周笔记 ## Java常用类### 字符串类的分析和使用1. String类的分析:String类的底层使用char的数组保存数据。String类是一个final类,不允许被继承。String类是一个不可变类,该类的对象生成后,内容不会发生变化。String类中的所有返回String类型对象的成员方法都是返回一个新的String对象。2. String类的比较:   - String类重写了equals方法,用来比较两个字符串的内容是否相同。   - ==比较的是两个字符串对象的地址,即是否为同一个对象3. StringBuffer类和StringBuilder类   - StringBuffer又称为可变字符序列,它是一个类似于String的字符串缓冲区,可以改变该序列的长度和内容。StringBuffer是同步安全的。   - StringBuilder类也是字符串缓冲区,非同步安全。4. String、StringBuffer、StringBuilder三者的区别   1. String是内容不可变的。   2. StringBuffer、StringBuilder都是内容可变的。   3. StringBuffer是同步的,数据安全,效率低。   4. StringBuilder是不同步的,数据不安全,效率高。### Java常用类#### System类1. System类代表系统,系统级的很多属性和控制方法都放置在该类的内部,该类位于java.lang包。System中包含了in、out和err三个成员变量,分别代表标准输入流、标准输出流和标准错误输出流。2. System中常用的方法:   - System.arraycopy(a,b,c,d,e):其中a是被复制的数组,b是复制的起始位置,c是复制到的数组,d是复制到这个数组的起始位置,e是复制到这个数组的结束位置。   - System.currentTimeMillis():返回毫秒数,这个就比较简单了,和Date类中的getTime方法一样。   - getProperty():获取系统属性。#### CharSequence类- CharSequence是一个接口,表示char值的一个可读序列,此接口对许多不同种类的char序列提供统一的自读访问。- CharSequence与String都能用于定义字符串,但CharSequence的值是可读可写序列,而string的值是只读序列。#### Runtime类- Runtime类封装了运行时的环境,每个Java应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接。Runtime类通过totalMemory()和freeMemory()方法可以知道对象的堆内存有多大,还剩多少。#### Cleaner类- Cleaner负责清理对象,替代finialize()方法,Cleaner是在JDK1.9之后才提供的一个对象清理操作。#### 克隆:复制一个一模一样的对象出来。- clone()这个方法是从Object继承下来的,一个对象要实现克隆,需要实现一个叫做Cloneable的接口,实现了这个接口就能实现克隆操作。克隆分深度克隆和浅度克隆。  - 深度克隆:复制对象本身的同时,也复制对象包含的引用指向的对象,即修改被克隆对象的任何属性都不会影响到克隆出来的对象。  - 浅度克隆:复制对象时仅仅复制对象本身,包括基本属性,但该对象的属性引用其他对象时,该引用对象不会被复制,即拷贝出来的对象与被拷贝出来的对象中的属性引用的对象是同一个。#### Math数学类- Math类中包含基本的数字操作,如指数、对数、平方根和三角函数。Math类中包含E和PI两个静态常量,以及进行科学计算的类方法,可以直接通过类名调用。#### 随机数类- Random类用于产生随机数。Random.nextlnt(int bound):随机生成[0,bound)之间的整数。注意是左开右闭区间,可能取到0,不能取到bound的值。#### 科学精确计算类- BigDecimal是一个不变的、任意精度的有符号的十进制数对象。#### 日期处理类- Date类和Calendar类都是关于日期的类,都在java.util包中。java.util.Date类的对象用来表示时间和日期,用得最多的是获取系统当前日期和时间,精确到毫秒。java.util.Calendar类是抽象类,无法实例化。Java8新增java.time用于日期、时间处理。#### UUID类- UUID全称: Universally Unique ldentifier缩写,即通用唯一识别码。UUID产生的目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定,每个人都可以创建不与其他人冲突的UUID。#### Hutool类- Hutool是一个小而全的Java工具类库,使Java拥有函数式语言般的优雅,让Java语言也可以简单易用。
发布时间 2021/09/06 09:50:21 最后回复 大卡 2021/11/03 21:04:04 版块 社区活动
7076 134 0
他的回复:
华为云ID :wq765416999    第六周笔记## 集合框架简介- 集合可以看作是一种容器,用来存储对象信息。- 所有集合类都位于java.util包下,但支持多线程安全的集合类位于java.utilL.concurrent包下。- Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue ( Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系。- List代表了有序可重复集合,可直接根据元素的索引来访问; set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合;Map代表的是存储key-value对的集合,可根据元素的key来访问value。- Collections工具类  - Collections是一个操作Set、List和Map等集合的工具类。  - Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。  - Collections中常用方法,都是静态方法### Collection接口之List#### List接口- List是有序集合,可以通过下标访问集合中的元素。List允许重复值,允许有多个null值。- List接口是Collection接口的子类。- List的实现类有LinkedList、ArrayList、Vector、Stack。#### ArrayList子类- ArrayList是List接口的常用实现类,底层采用数组实现,其容量能自动增长。- ArrayList特点是随机访问速度快,插入和移除性能较差。- ArrayList支持null元素、有序、元素可以重复、线程不安全#### LinkedList子类- LinkedList底层的数据结构是基于双向循环链表。- LinkedList是有序,可以重复,非同步的。- LinkedList最经常使用的两种数据结构:栈和队列。- LinkedList和ArrayList区别:    - 时间复杂度:对于随机访问,ArrayList通过索引快速定位元素位置,而LinkedList需要对列表中元素挨个查找,所以ArrayList快于LinkedList。对于删除插入操作,ArrayList需要对数组重新排序,而且在数组装满的时候要将所有的数据重新装入一个新的数组,LinkedList只需添加一项Entry对象,所以LinkedList快于ArrayList。    - 空间复杂度:LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。#### Vector子类- Vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组。- Vector集合也是以0开始的下标表示元素的位置。- 当Vector对象创建后,数组的元素个数会随着Vector集合中元素个数的增大和缩小而自动变化。- Vector类中的大多数方法是同步的,使用synchronized修饰的,Vector是线程安全的。### Collection接口之Set#### Set接口和简介- set接口继承自Collection接口,但是并没有对方法进行扩充,是Collection的子接口。Set接口中元素无序,并且会对元素进行对比,保证存入的元素不出现重复。- Set接口不允许重复元素,最多包含一个null。- Set接口的遍历方式:使用迭代器或增强for循环。- set接口主要有两个实现类,分别是HashSet和TreeSet。#### HashSet子类和API- HashSet是Set接口的一个实现类,它不保证Set的迭代顺序,无序存放。- Set接口的唯一性:底层依赖于hashCode()和equals()方法。#### TreeSet子类和API- TreeSet是set接口的一个实现类,主要作用是对象的排序及确定存入对象的唯一性。- TreeSet中的元素支持2种排序方式:  1. 自然排序,在元素中定义排序规则。元素自身具有比较性,实现Comparable接口,重写compareTo方法  2. 比较器排序,创建TreeSet时提供Comparator进行排序。实现Comparator接口,实现compare方法。### Collection接口之Map#### Map接口和简介- Map集合中存储的元素是一组键值对象,是key与value是一个映射。- Map提供了一个更通用的元素存储方法,每个键映射有一个值。- Map集合中一个key对应一个value,不能存在相同的key值,value值可以相同。- key和value之间存在单向一对一关系,即通过指定的key总能找到唯一确定的value。- Map接口的常用实现类有:HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap#### Map集合和Collection集合区别:- Map集合存储元素是成对出现的,也就是键值对出现,而且键是不可以重复的。- Collection集合存储元素是一个一个存储的,也就是单一存储的。#### HashMap子类- HashMap根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。- HashMap由数组+链表组成的。- HashMap最多只允许一条记录的键为null,允许多条记录的值为null。- HashMap非线程安全,即同一时刻可以有多个线程同时操作HashMap,可能会导致数据的不一致。- 如果需要满足线程安全,可以用Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。#### LinkedHashMap子类- LinkedHashMap是链表和哈希表组合的一个数据存储结构。- LinkedHashMap存储数据是有序的。- LinkedHashMap是线程不安全的。#### ConcurrentHashMap子类- ConcurrentHashMap底层采用数组+链表+红黑树的存储结构。- ConcurrentHashMap 的key和value都不能为空。- ConcurrentHashMap 线程是安全的,支持高并发操作。- ConcurrentHashMap采用分段锁技术有效提升并发访问效率。#### Hashtable子类- Hashtable是线程同步安全的。- Hashtable的键和值不能为null。### Stream#### Stream概述- 流Stream是数据渠道,用于操作数据源集合、数组等所生成的元素序列。集合讲的是数据,流讲的是计算。- Stream不是数据结构,不会保存数据。- Stream不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中。- Stream是惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作的时候才会进行实际的计算。#### Stream的操作流程和创建- Stream操作的三个步骤:  1. 创建Stream:一个数据源(集合、数组),获取一个流。  2. 中间操作:一个中间操作链,对数据源的数据进行处理。  3. 终止操作:一个终止操作,执行中间操作链。并产生结果。#### Stream中间操作- 中间操作:中间操作会返回一个新的流,一个流可以后面跟随零个或多个intermediate操作。- 中间操作目的主要是打开流,做出某种程度的数据映射/过滤,然后会返回一个新的流,交给下一个操作使用。这类操作都是惰性化的,就是说,仅仅调用到这类方法,并没有真正开始流的遍历。而是在终端操作开始的时候才真正开始执行。#### Stream的串行流和并行流- Stream的串行流:  - 所有的collection集合都可以通过stream默认方法获取流: list.stream();  - Stream接口的静态方法of可以获取数组对应的流:Stream.of(6,1,5,4,3);- Stream的并行流:并行流是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。
发布时间 2021/09/06 09:50:21 最后回复 大卡 2021/11/03 21:04:04 版块 社区活动
7076 134 0
他的回复:
华为云ID:  wq765416999  + 第五周笔记   线程2### 线程的同步和安全- 线程安全问题:1. 设计并发编程的目的是为了使程序获得更高的执行效率,但绝不能出现数据一致性出错的问题。2. 如果并发程序连基本的执行结果准确性都无法保证,那并发编程就没有意义。- 为什么会出现数据不正确:如果一个资源(变量、对象、文件、数据库)可以同时被很多线程使用就会出现数据不一致问题,也就是我们说的线程安全问题。这样的资源被称为共享资源或临界区。- 线程的互斥访问之synchronized:- 互斥锁:顾名思义就是互斥访问目的的锁,如果对临界资源加上互斥锁,当一个线程在访问临界资源时,其他线程便只能等待。在java中,每一个对象都拥有一个锁标记,也称为监视器,多线程同时访问某个对象时,只有拥有该对象锁的线程才能访问。- 同步代码块:控制竞争资源的正确的安全访问,因此只要在访问竞争资源的时候保证同一时刻,只能一个线程访问即可,所以引入了同步代码块的策略,以提高性能。- synchronized(obj){同步代码块;}- obj叫做同步监视器(即锁对象),任何线程进入下面同步代码块之前必须先获得对obj的锁;其他线程无法获得锁。- 锁对象可以是任意对象,但必须保证是同一对象任何时刻只能有一个线程可以获得对同步监视器的锁定。当同步代码块执行完成后该线程会释放对该同步监视器的锁定。### 线程的死锁- 当一个线程永远地持有一个锁,并且其他线程都尝试去获得这个锁时,那么它们将永远被阻塞。- 如果线程A持有锁L并且想获得锁M,线程B持有锁M并且想获得锁L,那么这两个线程将永远等待下去,这种情况就是最简单的死锁形式。### 线程的明锁:Lock对象- 在java5中,专门提供了锁对象Lock,利用锁可以方便的实现资源的封锁,用来竞争资源并发访问的控制。- Lock所有加锁和解锁的方式都是显式的。- Lock.lock():获取锁 Lock.unlock():释放锁- Lock与synchronize对比:1. lock不是java语言内置的,synchronize是java语言的关键字,因此是内置特性。Lock是一个类,通过这个类可以实现同步访问。2. synchronized不需要手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。###  JUC并发包- ThreadLocal线程范围内的共享变量:线程范围内的共享变量,每个线程只能访问自己的数据,不能访问别的线程数据。- 每个线程调用全局ThreadLocal对象的set方法,就相当于往其内部的map中增加一条记录,key分别是各自的线程,value是各自的set方法传进去的值。- volatile关键字可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性- volatile的作用:使变量在多个线程间可见,但是无法保证原子性。需要注意的是一般volatile用于只针对多个线程可见的变量操作,并不能代替synchronized的同步功能。- 线程池的作用:1. 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2. 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。3. 提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。- 线程池的应用场景:请求频繁,考虑到服务的并发问题,如果每个请求来到后,服务都为它启动一个线程,那么这对服务的资源可能会造成很大的浪费。#### 线程的同步工具类:CountDownLatch- CountDownLatch同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。- CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用countDown()方法,计数器减1,计数器大于0时,await()方法会阻塞程序继续执行。- 由于调用了countDown()方法,所以在当前计数到达零之前,await()方法会一直受阻塞。之后,会释放所有等待的线程,await()的所有后续调用都将立即返回。这种现象只出现一次,计数无法被重置。一个或多个线程,等待另外N个线程完成某个事情之后,才能执行。- CountDownLatch最重要的方法是countDown()和await()#### 线程同步辅助类:CyclicBarrier-  CyclicBarrier允许一组线程互相等待,直到到达某个公共屏障点(common barrier point)。因为该barrier在释放等待线程后可以重用,所以称它为循环的barrier。#### 线程同步工具类Semaphore- Semaphore是一个计数信号量,它的本质是一个共享锁,是基于AQS实现的,通过state变量来实现共享。通过调用acquire方法,对state值减去一,当调用release的时候,对state值加一。当state变量小于0的时候,在AQS队列中阻塞等待。#### 线程的交换类Exchanger- Exchanger(交换者)是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交换。- 它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。- 这两个线程通过exchange()交换数据:如果第一个线程先执行 exchange()方法,它会一直等待第二个线程也执行exchange(),当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。#### 线程的Fork/Join机制- Fork/Join框架是Java7提供一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。#### 线程的锁的synchronized和Lock、volatile区别1. synchronized和volatile区别:- volatile关键字解决的是变量在多个线程之间的可见性;而sychronized关键字解决的是多个线程之间访问共享资源的同步性。- volatile只能用于修饰变量,而synchronized可以修饰方法,以及代码块。- 多线程访问volatile不会发生阻塞,而sychronized会出现阻塞。- volatile能保证变量在多个线程之间的可见性,但不能保证原子性;而sychronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公有内存中的数据做同步。2. synchronized和Lock区别:- Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现。- synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;- Lock可以提高多个线程进行读操作的效率(读写锁)。#### 线程的读写分离机制:ReadWriteLock- ReadWriteLock:顾名思义,是读写锁:它维护了一对相关的锁“读取锁”和“写入锁”,一个用于读取操作,另一个用于写入操作。- 读取锁用于只读操作,它是共享锁,能同时被多个线程获取。- 写入锁用于写入操作,它是独占锁,写入锁只能被一个线程锁获取。- 不能同时存在读取锁和写入锁,可以读/读,但不能读/写、写/写。
发布时间 2021/09/06 09:50:21 最后回复 大卡 2021/11/03 21:04:04 版块 社区活动
7076 134 0
他的回复:
华为云账号:wq765416999   + 第四周笔记  线程## 进程和线程- 进程:是并发执行程序在执行过程中资源分配和管理的基本单位。应用程序一旦执行,就是一个进程。- 线程:是进程的一个执行单元,是进程内可调度的实体,是比进程更小的独立运行的基本单位,也被称为轻量进程。### 创建线程的五种方式1. 继承Thread类(线程间资源不可共享):- 通过继承Thread并且重写其run(),run方法中定义需要执行的任务。- 创建后的子类通过调用start()方法即可执行线程方法。- 通过继承Thread实现的线程类,多个线程之间无法共享线程的实例变量,需要创建不同Thread对象,自然不共享资源。2. 实现Runnable接口(线程间资源可共享):- 需要先定义一个类实现Runnable接口并重写该接口的run方法,此run方法是线程执行体。- 接着创建Runnable实现类的对象,作为创建Thread对象的参数target,此Thread对象才是真正的线程对象。- 利用实现Runnable接口的线程类创建对象,可以实现线程之间的共享资源。3. 实现Callable接口实现带有返回值的线程:- Callable接口如同Runnable接口的升级版,其提供的call方法将作为线程的执行体,同时允许有返回值。- Callable对象不能直接作为Thread对象的target,因为Callable接口是JAVA5新增的接口,不是Runnable接口的子接口。- 对于如此,引入Future接口,此接口可以接受call的返回值,RunnableFuture接口是Future接口和Runnable接口的子接口,可以作为Thread对象的target。4. 继承TimerTask:- Timer和TimerTask可以作为实现线程的另一种方式,Timer是一种线程设施,用于安排以后在后台线程中执行的任务。- 可安排执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。- 还是一个抽象类,实现了Runnable接口,所以具备类多线程的能力。5. 通过线程池启动多线程:- 通过Executors的工具类可以创建线程池。1. 提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行。2. 降低系统资源消耗,通过重用已存在的线程,降低线程和销毁造成的消耗。3. 方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换。### Thread类和Runnable接口的区别1. 实现Runnable接口避免无法使用多继承的局限。2. 实现Runnable接口可以更好的体现共享的概念。3. Runnable接口是Thread类的父类。### 四、线程start和run方法区别1. 线程对象调用run方法和start方法案例:start先启动新线程再执行```javapublic class Test{public static void main(String[] args){System.out.printIn(Thread.currentThread().getName()+",执行main方法");UserThread ut = new UserThread();ut.run();    // 在当前主线程中执行run方法ut.start();  // 启动一个新线程执行run方法}}public class UserThread extends Thread{public void run(){  System.out.printIn(Thread.currentThread().getName()+",执行run方法");}}```### 线程的优先级1. Java线程的优先级范围是1-10,默认优先级是5,10最高,主线程的优先级是5。2. 线程的优先级仍然无法保障线程的执行次序:优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行### 接口同步回调和异步回调- 同步调用:一种阻塞式调用,调用要等待对方执行完毕才返回,是一种单向调用。- 回调:一种双向调用模式,被调用方在接口被调用时也会调用对方的接口- 异步调用:一种类似消息或者事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或者发生某种事件时,会主动通知客户方。### 线程的生命周期- 在线程的生命周期中,它要经过新建,就绪,运行,阻塞和死亡5种状态- 当线程启动多次以后,他不可能一直霸占着CPU独自运行,所以CPU需要在多条线程之间切换,于世线程状态也会多次运行、阻塞之间切换。- 线程的生命周期五个阶段:1. 新建状态,当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时仅由JVM为其分配内存,并初始化成员变量的值。2. 就绪状态,当线程对象调用了start方法之后,该线程处于就绪状态。Java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行。3. 运行状态,如果处于就绪状态的线程获得了CPU,开始执行run方法的线程执行体,则该线程处于运行态。4. 阻塞状态,当处于运行状态的线程失去所占用资源之后,便进入阻塞状态。5. 死亡。### 线程的睡眠- 线程休眠的方法是Thread.sleep(long millis)。哪个线程调用sleep方法,就休眠哪个线程。- 线程休眠的目的是使线程让出CPU的最简单的做法之一,线程休眠的时候会将CPU资源交给其他线程,以便乱换执行,当休眠一定时间后,线程会苏醒进入准备状态等待执行。### 线程的让步- Yield的作用是让步,它能让当前线程由“运行状态”进入到“就绪状态”,从而让其他具有相同优先级的等待线程获取执行权。- 但是,并不能保证在当前线程调用yield之后,其他具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行。### 线程的合并- 线程的合并的作用就是将几个并行线程合并为一个单线程执行。- 当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。### 守护线程- 调用线程对象的方法setDeamon(true),则可以将其设置为守护线程,该方法必须在启动线程前调用。- JVM的垃圾回收、内存管理等线程都是守护线程。- setDeamon(boolea on):将该线程标记为守护线程或用户线程。- 当正在运行的线程都是守护线程时,java虚拟机退出。### 线程的中断和死亡- 线程中断就是让目标线程停止执行,但它不会使线程立即终止,而是给线程发送一个通知,告诉线程jvm希望退出执行,至于目标线程何时退出,则由其自己决定。- 线程会以如下三种方式结束,结束后就处于死亡状态。1. run或call方法执行完成,线程正常结束。2. 线程抛出一个未捕获的Exception或Error。3. 直接调用该线程的stop方法结束该线程----容易导致死锁。
发布时间 2021/09/06 09:50:21 最后回复 大卡 2021/11/03 21:04:04 版块 社区活动
7076 134 0
他的回复:
华为云ID: wq765416999  +第三周笔记  爬虫## Java爬虫编程- 爬虫一般指网络爬虫(Web crawler),是一种按照一定的规则,自动地抓取万维网信号的程序或者脚本,可以自动采集所有其能够访问到的页面内容,以获取相关数据。- 从功能上来讲,爬虫一般分为数据采集,处理,存储三个部分。 爬虫能解决什么问题:大数据时代获取更多数据源;实现私人的搜索引擎;优化搜索引擎### Jsoup是一个Java HTML Parser,能够从 URL、文件或字符串中解析HTML。####  Jsoup的主要功能:1. 从URL,文件或字符串中抓取和解析HTML;2. 使用CSS选择器或DOM遍历查找提取数据;3. 可操作HTML元素、属性和文本#### Jsoup的特点- 它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。Jsoup是居于MIT协议发布的,可以放心使用于商业项目- jsoup元素支持类似于CSS(或jquery)的选择器语法,来实现非常强大和灵活的查找功能。- jsoup提供了select(String selector)方法,可以实现制定元素的过滤,或链式选择访问,该方法将返回一个Elements集合对象,并提供一组方法来抽取和处理结果。- Jsoup.connect(String url)方法返回了一个org.jsoup.Connection对象。在Connection对象中,可以使用get()或post()方法来执行请求,并返回一个org.jsoup.nodes.Document对象,可以通过解析Document对象来获取我们想要的元素。- Jsoup.parse(String str)方法可以解析HTML字符串,并返回一个Document对象,可以通过解析Document对象来获取我们想要的元素。#### selector选择器概述:- tagname,按照标签查找元素;- #id,通过id查找元素;- .class,通过类名查找元素;- [attribute],利用属性名查找元素;-  [attr=value],利用属性值查找元素#### Elements提供了一系列类似于DOM的方法来提取和操作他们的数据:- id():获取id- className():获取class- attr(String str):读取attr为str的值- attributes():获取所有属性- text():获取文本内容