柳州做网站哪家好,网页版梦幻西游决战华山奖励,生物制药公司网站建设,网络推广站Java基础篇
修饰权限符
public: 可以被任何其他类访问。如果一个类是public的#xff0c;那么你可以从任何其他类中访问它。protected: 可以被同一包内的任何类访问。可以被不同包中的子类访问。但是#xff0c;它不能被其他不同包中的非子类访问。(default) package-priva…Java基础篇
修饰权限符
public: 可以被任何其他类访问。如果一个类是public的那么你可以从任何其他类中访问它。protected: 可以被同一包内的任何类访问。可以被不同包中的子类访问。但是它不能被其他不同包中的非子类访问。(default) package-private (没有修饰符):可以被同一包内的任何类访问。不能被其他包中的类访问无论它们是否是子类。 private只能被其所在的类访问。类的成员如字段、方法、内部类等可以声明为private但最外层的类不能声明为private。
equals()和hashCode的关系
HashSetHastMap都不允许重复在存放数据时会先调用HoahCode来判断和之前的数据是否重复如果和其他对象的hashCode值一样就会再调用equals来判断是否是一个对应equals如果也一样的话就断定是一个值。
可以使用 int Objects.hash(args...)函数来实现hashCode参数一般填为自己的所有字段。
垃圾回收
System.gc()建议vm进行垃圾回收的函数。
垃圾回收时会从所有的GC Root作为是起始点从这些点开始垃圾回收器会尝试查找和访问堆上的对象。换句话说从GC Root可以直接或间接地引用到的对象都被认为是活动的也就是还在使用中。而那些从GC Root无法访问到的对象则可能是垃圾它们可能会在下一次垃圾回收时被清除。
以下是常见的GC Root 虚拟机栈引用的对象当前线程中的局部变量、参数、返回值等都属于这一类。 方法区中静态属性引用的对象也就是所有的类级别的静态变量。 方法区中常量引用的对象例如字符串常量池中的引用。 本地方法栈中JNI即通常所说的Native方法引用的对象。 活跃的线程本身。 所有被同步锁synchronized持有的对象。
硬引用、软引用、弱引用虚引用
各种引用的区别就是垃圾回收的时候处理的方式不一样。
硬引用
普通创建的对象就是硬引用除非引用变量在栈中被销毁否则不会被回收。
软引用
一般作为缓存使用。
当系统内存充足时持有软引用的对象不会被垃圾收集器回收。
当系统内存不足或即将耗尽时持有软引用的对象会被垃圾收集器考虑回收即使这个对象还有软引用指向它。
举例
想要创建一个图像的缓存。你不希望一直持有这些图像以防止占用太多内存但当内存充足时你也不希望它们被频繁地回收和重新加载。这时软引用是一个很好的选择
import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.Map;public class ImageCache {private MapString, SoftReferenceImage cache new HashMap();public Image getImage(String path) {SoftReferenceImage softRef cache.get(path);if (softRef ! null) {Image image softRef.get();if (image ! null) {return image; // 使用缓存中的图像}}// 缓存中没有图像或图像已被回收重新加载它Image image loadImageFromDisk(path);cache.put(path, new SoftReference(image));return image;}private Image loadImageFromDisk(String path) {// 从磁盘加载图像的代码// ...return new Image();}// Image类的定义为简洁起见此处省略实际实现private static class Image {}
}多线程篇
Java中有几种创建线程的方式
四种继承Thread类实现Runnable接口
ThreadLocal
ThreadLocal只能放入一个对象和取出一个对象但是很神奇的是同一个线程中get出的对象是相同的。
static ThreadLocalString xin new ThreadLocal(); 一般把这个变量作为静态变量写在工具类中属于同一个线程的方法使用了存入与取出的对象是一样的。
Spring篇
Bean的作用域
Spring中Bean默认作用域是单利的spring中的一个类加上Component时这个类有一个属性为aa默认为0第一个通过AutoWrite获取时设置a为1第二次通过AutoWrite获取这个类的示例时时a的值是1。
可以用过Bean与Scope(prototype)来设置作用域。
Spring 的常用作用域
Singleton: 默认。每个Spring容器只有一个实例。Prototype: 每次请求都新建实例。Request: 一个HTTP请求内共享同一个实例。Session: 一个HTTP Session内共享同一个实例。
MVC架构
MVC 是 Model-View-Controller 的缩写它是一种设计模式。MVC 将应用程序逻辑分为三个互相关联的组件以实现模块化和更容易的管理。以下是这三个组件的解释 Model模型这是应用程序的数据部分。它包含所有的业务逻辑、数据和规则。模型是独立于视图和控制器的这意味着模型不知道用户界面如何显示数据。 View视图这是用户看到和与之互动的部分。它负责展示模型的数据。当模型中的数据发生变化时视图会相应地更新。 Controller控制器控制器是模型和视图之间的接口。它接收用户的输入并决定如何处理。基于用户的行为控制器可以请求模型进行更改或更新或者更改视图的表示。
前后端分离的现在后端已经没有View层了。
Server、Mapperdomain等层属于Model类Controller层属于controller类。
Spring如何解决循环依赖
注意如果A变量的构造函数需要BB的构造函数需要A这种是误解的。
能解决什么类型的循环依赖问题
如果两个Java类在它们的构造函数中相互依赖那么这会导致问题因为无法在初始化一个类的同时初始化另一个类。
但是Spring框架确实提供了处理循环依赖的机制。以下是Spring如何解决这个问题的 字段注入如你所说如果A类有一个B类型的字段并且这个字段是通过Spring注入的同时B类也有一个A类型的字段并且这个字段是通过Spring注入的那么Spring可以解决这种依赖关系。这是因为Spring首先创建了A和B的实例然后再为它们的字段注入依赖。 Setter方法注入与字段注入类似使用setter方法注入也可以解决循环依赖。Spring首先创建对象实例然后使用setter方法为对象注入依赖。
Spring解决循环依赖的原理
这里举例A依赖B。B依赖A
初始化A时会先创建A类原始的Bean未填充属性的然后把这个Bean放入二级缓存并在三级缓存中创建A的工厂对象。
填充A的属性时发现需要B于是就创建B。
创建B时发现需要ASpring会从一级缓存中查找A找不到就去二级缓存中查找A发现二级有A的早期实例就会拿这个填充。
这时B创建完了就用B填充A。
三级缓存的问题
三级缓存中的工厂是什么时候放进去的
三级缓存中的工厂对象是在bean实例化但还未完全初始化如属性填充时放进去的。
三级缓冲中的工厂有什么用
三级工厂就是为了返回未初始化完成的Bean而创建。三级工厂返回的Bean会放入二级缓存。
这么做是为了不影响二级中的Bean初始化二级中的Bean初始化完成之后要直接放入一级缓存。
工厂返回的Bean与二级缓存中的Bean是一样的同一个引用。
对象没有循环依赖的情况
当Spring容器开始初始化一个bean例如A时它会首先调用A的构造方法来实例化它。
然后Spring会进行属性注入、执行初始化方法等其他初始化步骤。
一旦bean完全初始化它会直接放入一级缓存这时它已经是一个完全初始化的单例bean可以被其他bean或应用代码引用。
常用注解
Autowired与Resource区别
这两个都是做Bean注入用的Resource并不是Spring的注解他的包是javax.annotation.Resource需要导入但是Spring支持改注解的注入。
共同点都可以写在字段和setter方法上两者如果都写在字段上。
Autowired默认按照类型byType装配依赖对象。
默认情况下他要求依赖的对象必须存在如果允许为null可以设置他的required属性为false。
如果我们想按名称byName来装配可以结合Qualifier注解一起使用Qualifier注解来指定名称。
Resource默认按照名称ByName装配依赖对象由j2ee提供。
Resource有两个重要的属性name和type。
Spring将Resource注解的name属性解析为bean的名字而type属性则解析为bean的类型。
Indexed
需要额外添加依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-context-indexer/artifactId
/dependency这是Indexed的依赖添加这个依赖之后可以提高Springboot的启动速度。
添加这个依赖编译项目使用Maven的install后会自动把ComponentIndexedControllerServiceRepository这些相关的额注解标注的类的路径自动包含在“target/META-INF/spring-components”文件中启动时提高速度。
Import
Import注解的作用让Spring容器从其他指定的配置类中加载被Bean修饰过的方法。
public class Person {...
}public class Address {...
}Configuration
public class MainConfig {Beanpublic Person john() {return new Person(John);}
}Configuration
public class AdditionalConfig {Beanpublic Address newYorkAddress() {return new Address(New York);}
}Configuration
Import({MainConfig.class, AdditionalConfig.class})
public class CombinedConfig {Autowiredprivate Person john;Autowiredprivate Address newYorkAddress;Beanpublic String johnsAddressInfo() {return john.getName() lives in newYorkAddress.getCity();}
}上面代码中
CombinedConfig类上的Import注解使MainConfig和AdditionalConfig中所有用Bean标注的方法的返回值被注册到Spring容器中。
当Spring启动并处理CombinedConfig时它不仅会注册CombinedConfig中定义的beans还会注册MainConfig和AdditionalConfig中定义的beans。这正是Import注解的主要目的。
Controller与RestController的区别
RestController
public class HelloController {GetMapping(/restController)public User test() {return new User();}
}Controller
public class HelloController {GetMapping(/controller)public User test() {return new User();}
}RestController:
它是一个组合注解等同于 Controller 和 ResponseBody 的组合。 它意味着这个控制器的所有方法的返回值都将自动序列化为 JSON 或其他媒体类型并作为 HTTP 响应的体返回。因此当你访问 http://localhost/restController时在浏览器中直接看到的是 xxx 对象的 JSON 表示。
问RequestMapping(/hello) public String Hello(){ return hello; } }:返回字符串时RestController不是返回的json格式吗为什么,为什么浏览器的网络相应中返回的是hello而不是“hello”为什么hello会直接输出到页面上RestController什么时候返回json什么时候返回xml
答
为什么返回的是 hello 而不是 “hello”
当你返回一个简单的字符串时Spring MVC 会直接将这个字符串作为响应体返回而不会将它视为一个 JSON 字符串值。所以返回的就是 hello 而不是 JSON 格式的 hello。
为什么 hello 会直接输出到页面上
这是因为默认的 Content-Type 是 text/plain。所以浏览器会把它当作纯文本来处理并直接显示。
RestController 何时返回 JSON 和何时返回 XML
RestController 会基于请求的 Accept 头和项目的依赖来确定返回什么格式的数据。
如果请求头包含 Accept: application/json 并且你的项目中有合适的 JSON 库如 Jackson那么默认返回的是 JSON 格式。 如果请求头包含 Accept: application/xml 并且你的项目中有 XML 绑定库那么会返回 XML 格式。 如果方法返回一个对象或集合并且接受的请求头是 Accept: application/json则 RestController 通常会返回 JSON 格式的数据。如果没有特定的 Accept 头或者接受多种内容类型那么通常默认返回的是 JSON前提是你的项目中有相关的 JSON 库。
Controller:
当你在方法上没有使用 ResponseBody 注解时Controller 注解的方法默认返回的是一个视图view的名字通常用于模板引擎例如 Thymeleaf, JSP 等。 http://localhost:86/controller 时方法返回的是一个 User 对象。但因为你没有指定视图名也没有使用 ResponseBodySpring 将尝试查找一个与 User 对象名匹配的视图这通常不是你想要的。这里的视图指的是JSP那种。
普通方法与REST风格方法的对比
REST风格
在REST风格中HTTP动词方法如 GET, POST, PUT, DELETE 通常有以下的含义和约定 GET: 用于检索资源。它应该只是读操作不会更改资源的状态或执行任何副作用。例如GET /api/users/123 可以用来检索ID为123的用户的详细信息。 POST: 用于创建新资源。通常在创建新资源时使用响应中经常会返回一个 Location 头指示新创建资源的URI。例如POST /api/users 可以用来创建一个新用户请求体中包含用户的详细信息。 PUT: 用于更新现有资源或创建新资源如果它不存在的话。与POST不同PUT是幂等的这意味着多次执行同一个PUT请求应该总是产生相同的结果。例如PUT /api/users/123 可以用来更新ID为123的用户的详细信息或创建一个新用户如果它之前不存在。 DELETE: 用于删除资源。例如ELETE /api/users/123 会删除ID为123的用户。
URL 中可以使用路径变量来指定具体的资源实例如 /api/users/{id}。数据通常以 JSON 或 XML 格式传输。get类型请求用于查询delete请求用来删除等。
REST风格使用多个参数GetMapping(/api/users/{userId}/orders/{orderId});对应的普通请求链接“/api/userOrder?userId123orderId456”。
普通风格
GET /getUser?id1用来查询。
RESTful
REST 描述了一种理论上的架构风格和一组原则而当一个 Web 服务实际遵循这些原则时我们称其为 RESTful。
数据库篇
索引篇 什么是索引
排好序可以快速查找的数据结构。
索引的优势与劣势
优势提高数据检索的效率降低数据库的io成本通过索引排序能够大大减少CPU的消耗因为索引已经是排好序的。
劣势需要经常增删的表不建议使用索引因为更新表的数据时也会更新索引数据会降低更新的速度。
索引的分类
主键索引单值索引唯一索引复合索引。
单值索引和唯一索引的区别就是单值索引允许重复单一索引不允许。
设计模式篇
观察者模式
对象间的一种一对多的关系当一个对象的状态发生改变时所有依赖它的对象都会通知并自动更新。
一般主线程中一个while(1)循环不停的判断子线程的状态状态变化时通知其它子线程比如任务的撤销。
工厂模式
工厂根据传递过来的参数决定生产哪个对象Spring中可以通过getBean方法获取对象的时候根据id或者name获取就是简单的工厂模式。
适配器模式
将一个类的接口转换为客户希望的另一个接口使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
装饰者模式包装模式
用来动态的为一个对象添加新的功能装饰者模式是一种用于替代继承的技术无需通过继承增加子类就能扩展对象的新功能使用对象的关联关系替代继承关系更加灵活同时避免体系的快速膨胀。
代理模式
Spring AOP的实现就是代理模式。
策略模式
策略模式对应于解决某一个问题的一个算法族允许用户从该算法族中任选一个算法解决莫一问题同时可以方便的更换算法或者增加新的算法并且由客户端决定使用哪个算法。