牛客网题目五

1.AOP:

AOP将散落在系统中的“方面”代码集中实现

AOP有助于提高系统可维护性

AOP是一种设计模式,Spring提供了一种实现

2.关于Spring的理解

IoC的实现原理就是工厂模式加反射机制

DI依赖注入是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中

Spring默认使用JDK动态代理来创建AOP代理,当需要代理的类不是代理接口的时候,自动切换使用CGLIB代理

3.Spring开发模式的工作流程:

1)pring MVC请所有的请求都提交给DispatcherServlet
2)DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller
3)DispatcherServlet请请求提交到目标Controller
4)Controller进行业务逻辑处理后,会返回一个ModelAndView
5)找到ModelAndView对象指定的视图对象
6)视图对象负责渲染返回给客户端

4.关于spring mvc 和struts2的描述

spring mvc是基于方法的设计,而struts2是基于类的设计

struts2有以自己的interceptor机制,spring mvc用的是独立的AOP方式

spring mvc的方法之间基本上独立的,独享request response数据,struts2所有Action变量是共享的

5.Spring DAO

Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。

异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明

Spring提供的DAO支持了JDBC、JDO和Hibernate

6.PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作

7

8.

抽象类

特点:

1.抽象类中可以构造方法

2.抽象类中可以存在普通属性,方法,静态属性和方法。

3.抽象类中可以存在抽象方法。

4.如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。

5.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。

接口

1.在接口中只有方法的声明,没有方法体。

2.在接口中只有常量,因为定义的变量,在编译的时候都会默认加上

public static final 

3.在接口中的方法,永远都被public来修饰。

4.接口中没有构造方法,也不能实例化接口的对象。

5.接口可以实现多继承

6.接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法

7.则实现类定义为抽象类。

 

9.值类型的变量赋值只是进行数据复制,创建一个同值的新对象,而引用类型变量赋值,仅仅是把对象的引用的指针赋值给变量,使它们共用一个内存地址。

10.Runnable和Callable的说法

Runnable和Callable都是接口

Runnable和Callable都采用Thread.start()启动线程

Callable接口的call()方法允许抛出异常,Runnable的run()方法异常只能在内部消化,不能往上继续抛

11.垃圾回收的算法

引用计数法

标记清除算法

复制算法

12.ROW_NUMBER()和RANK()

当碰到相同数据时,row_number()排名按照记录集中记录的顺序依次递增

当遇到相同数据时,rank()函数返回不唯一的值

rank()是跳跃排序

13.请简述java语言中,ArrayList、Vector、LinkedList的关系与区别:

ArrayList,LinkedList,Vestor这三个类都实现了java.util.List接口,同在java.util包下,他们都允许null值。 区别:ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢。 Vector由于使用了synchronized方法,是线程安全的,所以性能上比ArrayList要差。 LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快! ArrayList和LinkedList都不是线程安全的。

14.无限制创建线程的不足有哪些?

1、线程生命周期的开销非常高。线程的创建和销毁都是有代价的,线程的创建过程都需要时间,并且需要JVM和操作系统提供一些辅助操作,如果请求的到达率非常高而且请求的处理过程是轻量级的,那么为每个请求创建一个新线程将消耗大量的计算资源; 2、资源消耗。活跃的线程会消耗系统资源,尤其内存。如果运行的线程数多于可用的处理器数量,那么这些线程将闲置。大量空闲的线程会占用许多内存,给垃圾回收器带来压力,而且大量线程竞争CPU资源时还会产生其他的性能开销。 3、稳定性。在可创建的线程数量上存在一个限制,破坏了这些限制可能会抛出OutOfMemoryError异常,要想从这些错误中恢复过来是非常危险的,更简单的方法时哦通过构造程序来避免超出这些限制。

 

 

 

 

使用 Python 编写爬虫程序抓取牛客网题目信息,需要结合网络请求和网页解析技术。以下是实现该功能的步骤和代码示例。 ### 1. 准备工作 - **安装必要的库**:使用 `requests` 发送 HTTP 请求,使用 `lxml` 或 `BeautifulSoup` 解析 HTML 页面,也可以使用 `selenium` 模拟浏览器操作。 - **分析网页结构**:通过浏览器开发者工具(F12)查看目标网页的 HTML 结构,找到题目和答案所在的标签。例如,根据提供的信息,答案位于 `class="design-answer-box"` 的标签中。 ### 2. 使用 `requests` 和 `BeautifulSoup` 爬取静态页面 如果牛客网题目信息是静态加载的,可以直接使用 `requests` 获取页面内容,并使用 `BeautifulSoup` 解析 HTML。 ```python import requests from bs4 import BeautifulSoup # 设置请求头,模拟浏览器访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } # 发送 GET 请求 url = 'https://www.nowcoder.com/' response = requests.get(url, headers=headers) # 解析 HTML 内容 soup = BeautifulSoup(response.text, 'html.parser') # 查找题目答案所在的标签 answers = soup.find_all('div', class_='design-answer-box') for answer in answers: print(answer.get_text(strip=True)) ``` ### 3. 使用 `selenium` 处理动态加载内容 如果牛客网的内容是通过 JavaScript 动态加载的,`requests` 无法直接获取完整的 HTML 内容,此时可以使用 `selenium` 来模拟浏览器操作。 ```python from selenium import webdriver from selenium.webdriver.common.by import By import time # 设置浏览器驱动路径 driver = webdriver.Chrome(executable_path='/path/to/chromedriver') # 打开目标网页 driver.get('https://www.nowcoder.com/') # 等待页面加载完成 time.sleep(5) # 查找题目答案所在的标签 answers = driver.find_elements(By.CLASS_NAME, 'design-answer-box') for answer in answers: print(answer.text) # 关闭浏览器 driver.quit() ``` ### 4. 使用 XPath 提取特定数据 根据提供的 XPath 路径 `/html/body/div[1]/div[2]/div[2]/div[2]/div[1]`,可以使用 `lxml` 或 `selenium` 提取特定节点的内容。 ```python from lxml import html # 解析 HTML 内容 tree = html.fromstring(response.text) # 使用 XPath 提取数据 answer_text = tree.xpath('/html/body/div[1]/div[2]/div[2]/div[2]/div[1]/text()') print(answer_text) ``` ### 5. 遵守网站规则 在进行网页爬取时,务必遵守目标网站的 `robots.txt` 文件和相关法律法规,避免频繁请求导致 IP 被封禁。 ### 6. 数据存储 爬取到的数据可以存储为文件(如 JSON、CSV)或写入数据库,以便后续处理和分析。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值