知识补充----Java
1.String對象的比較:
Minor GC 會引發STW,暫停其他用戶的線程,等垃圾回收結束,用戶線程才會恢復運行。
Maven有什么作用?
1.管理依賴
?以pom.xml文件中dependency屬性管理依賴的jar包,所有需要的jar包先從本地倉庫拿,獲取不到再去遠程倉庫下載,即使jar包沖突也能在項目中有所體現,可以很直觀的看到哪些jar包有沖突
2.構建項目
什么是構建?
以java源文件、框架配置文件、jsp、html、其它靜態素材等資源為原材料,去生產一個可以運行的項目的過程。
1.==比較是否進行引用同一個對象
對于我們簡單類型或者內置類型來說,我們直接比較的是變量的值,對于引用類型,我們比較的是引用中的地址,也就是說,對于我們的基本變量類型來說,==比較的是引用的地址
package CompileRun;public class HelloWorld {public static void main(String[] args) {int a=10;int b=20;int c=30;//對于我們的基本變量來說,==比較的是兩個變量中存儲的值是否相同System.out.println(a==b);//falseSystem.out.println(a==c);//false//對于我們的引用類型來說,==比較的是兩個引用變量是否指向的是同一個對象String str1=new String("hello");String str2=new String("hello");String str3=new String("world");String str4=str3;System.out.println(str1==str2);//falseSystem.out.println(str2==str3);//falseSystem.out.println(str3==str4);}}2.boolean equals(Object anObject)
1)我們的String類是重寫了Object中的equals()方法,Object中的equals默認使用==來進行比較,String重寫equals方法之后,按照如下規則來進行比較:
2)對象運算符(instanceof)用來判斷一個對象是否屬于某個指定的類或其子類的實例,如果是,返回真(true),否則返回假(false)
public boolean equals(Object anObject) {if (this == anObject) { //1.我們先進行比較this和anObject是否是同一個對象進行比較,如果它們是同一個對象,那么就直接返回truereturn true;}if (anObject instanceof String) { //2.進行檢測anObject是否是String類型的對象,如果是我們就繼續進行比較,不是就進行返回 //3.將anObject進行向下轉型成為String類型的對象(向下轉型:父類引用的對象轉換為子類類型稱為向下轉型)String anotherString = (String)anObject;int n = value.length; //4.我們來進行比較一下this和anObject兩個字符串的長度是否相同,如果相同,那么就繼續進行比較,否則就會返回falseif (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0; //5.從前向后,逐個字符進行比較while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;}3.重寫hashCode方法:
1)我們的hashcode方法,我們的這個方法用于確定對象在內存中存儲的位置是否相同,在我們的散列表中hashcode()的作用是進行獲取到對象的散列碼,從而我們來進行確定該對象在散列表中的位置
2)我們來看下面的代碼,沒有進行重寫hashcode方法,但是我們的兩個對象具有相同的內容,但是我們所得出的hashcode的值是不相同的
class Person {public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;} } public class TestDemo4 {public static void main(String[] args) {Person per1 = new Person("xin", 21) ;Person per2 = new Person("xin", 21) ;System.out.println(per1.hashCode());System.out.println(per2.hashCode());} }所以,我們如果希望說如果兩個對象有者相同的內容,那么我們說在內存的位置應該是相等的,我們就需要進行重寫hashcode方法
1.對于AOP的理解:?
是對之前面向對象的一種補充,攔截器是AOP的一種實現,我們的攔截器會做一個參數校驗,只有登陸了才可以請求通過,但是我們的AOP,我們只是定義一個切面,當我們執行環繞通知的時候,也會攔截,但不會做任何的參數校驗
?比如說當我們實現了一個單例類的時候,我們的外部人員還是new了一個類怎們辦?
當我們的構造方法是私有的時候,在外部是不能夠進行new的
AOP是一種思想,但是攔截器是Spring自身的規則,也是AOP思想的一個實現,攔截器是攔截當前項目的所有接口,但是當引入AOP之后,就可以進行指定我們所攔截的一個規則了
使用AOP的方法:
1)在項目里面添加依賴:引入AOP框架
2)添加一個切面:AOP實現的是更小維度的一個攔截,使用@Aspect注解,表明這個類是作為我們的AOP來進行攔截使用的
3)寫一個空方法,實現一個切點,指明攔截的規則,使用@pointcut注解,指明我們的攔截規則(攔截哪些類),一個切點可以有被很多通知實現,切點可以有一個或者多個;
4)添加通知,在我們的通知里面指明這個通知是屬于哪一個切點的(在對應的注解里面指明),指定切點的名字就是使用@pointcut修飾的方法
注意我們在實現環繞通知的時候,必須要進行傳遞參數,就是ProceedingJoinPoint joinPoint參數,這個類是用來執行我們的UserController里面的方法的,我們可以使用joinPoint中的proceed方法來執行我們的Controller里面的代碼,我們就可以在這個方法實現之前和實現之后來干我們想要干的事情了
比如說我們實現事務的一個開啟和提交,我們在proceed方法執行之前開啟一個事務,在proceed方法執行完之后提交一個事務,在我們的catch語句塊里面回滾一個事務
2.Spring的事務傳播機制:
我們要想使用Spring的事務傳播機制,那么我們先干兩件事情:
1.引入依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>2.我們要寫上MYSQL的配置文件(如果不寫就會發生異常):
logging.level.root=warn #數據庫連接配置: spring.datasource.url=jdbc:mysql://127.0.0.1:3306/javaee?characterEncoding=utf-8&useSSL=false spring.datasource.username=root spring.datasource.password=12503487 spring.datasource.driver-class-name=com.mysql.jdbc.Driver @Controller public class BlogController {@RequestMapping("/Java100")@ResponseBodypublic String start(){GetAll();return "生命在于運動";}public void GetAll(){TestA();TestB();}public void TestA(){System.out.println(1);}@Transactional(propagation=Propagation.MANDATORY)public void TestB(){System.out.println(2);} }我們的上面的這種寫法是錯誤的,對我與我們的事務開啟,自己調用自己的方法是不會觸發到AOP的,還不能用static關鍵字來進行修飾的
舉個例子:Propagation.REQUIRED:是一個默認的隔離級別,它表示如果當前存在事務,那么就直接加入到事務里面,如果當前沒有事務,就進行創建一個新的事務
寫一段代碼:當前我們會把兩個get方法都會加到一個事務里面
1)我們的User1Controller1里面的代碼: package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional;@Controller public class User1Controller {@Transactionalpublic String get() {return "我叫";} }2)咱們的User2Controller2里面的代碼: package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; @Controller public class User2Controller {@Transactionalpublic String get() {return "李佳偉";} }//3咱們的UserController里面的代碼: package com.example.demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class UserController {@AutowiredUser1Controller user1Controller;@AutowiredUser2Controller user2Controller;@RequestMapping("/Java100")@ResponseBodypublic String GetAll(){return user1Controller.get()+user2Controller.get();} }1)就拿我們的Propagation.REQUIRED來說,當我們的GetAll()方法沒有加上@Transactional注解,這時候只要GetAll里面中調用的方法有一個加了@Transactional,那么就會把這個方法連同調用它的方法當成一個事務
2)拿我們的Propagation.SUPPORTS,如果說當我們的GetAll()方法沒有加上@Transactional注解,那么就算我們的兩個方法加上了Propagagation.SUPPORTS,那么我們的方法也會以非事務形態來進行運行,況且來說,如果說我們的GetAll方法加上了事務,況且兩個方法都加上了@Transactional(propagation = Propagation.SUPPORTS),那么我們的兩個方法加上主方法都會當成一個事務來進行,只要有一個步驟出錯,那么整個過程就會及進行回滾;
總結
以上是生活随笔為你收集整理的知识补充----Java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信登入,获取用户信息
- 下一篇: java美元兑换,(Java实现) 美元