亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java swing 圖像處理多種效果實(shí)現(xiàn)教程

 更新時(shí)間:2020年09月12日 10:14:18   作者:陳思源一點(diǎn)也不圓  
這篇文章主要介紹了Java swing 圖像處理多種效果實(shí)現(xiàn)教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

項(xiàng)目記錄:

1.圖像原理

通常圖像都是2D,對一副圖像,可以看做其寬w*高h的一個(gè)二維數(shù)組, 即 圖像=int[w][h],在w和h位置的每一個(gè) int 值,就是這個(gè)點(diǎn)的像素值。

圖像處理的本質(zhì)是:對代表圖像二維數(shù)組中的值進(jìn)行重新計(jì)算。

2.思路:

將一張圖片轉(zhuǎn)化成一個(gè)int型癿二維數(shù)組

對于每一個(gè)像素點(diǎn)大小和顏色進(jìn)行計(jì)算達(dá)到圖像處理的效果。

在畫筆中設(shè)置好顏色,填充形狀然后將新的圖片畫出。

3.實(shí)現(xiàn)效果

獲取像素點(diǎn)方法,首先利用文件imageIO讀取圖片,然后根據(jù)圖片長寬進(jìn)行遍歷得到每個(gè)像素點(diǎn)的顏色,最后return一個(gè)二維數(shù)組為處理做準(zhǔn)備。

 /**
 * 根據(jù)圖片路徑,獲取該該圖片的每個(gè)像素點(diǎn)并保存到對應(yīng)的二維數(shù)組中
 * @param path 圖片路徑
 * @return 保存像素點(diǎn)的二維數(shù)組
 */
 public int[][] getImgPixel(String path){
 File file = new File(path);
 BufferedImage buffImg = null; //緩沖圖片
 try {
  buffImg = ImageIO.read(file);
 } catch (IOException e) {
  e.printStackTrace();
 }
 int w = buffImg.getWidth();
 int h = buffImg.getHeight();
 //定義二維數(shù)組,保存像素點(diǎn)
 int[][] pixelArray = new int[w][h];
 //讀取每個(gè)位置的像素點(diǎn)
 for(int i=0;i<w;i++){
  for(int j=0;j<h;j++){
  int pixel = buffImg.getRGB(i, j); //獲取每個(gè)位置像素值
  pixelArray[i][j] = pixel;
  }
 }
 return pixelArray;
 }

原圖

根據(jù)之前得到的二維數(shù)組進(jìn)行遍歷,然后使用Color對象的get方法得到圖片顏色,最后再使用畫筆畫出圖像。

 //原圖
 public void drawImg(String path, Graphics gr){
   //得到圖片路徑
 int[][] img = getImgPixel(path);
 for(int i=0;i<img.length;i++){
  for(int j=0;j<img[i].length;j++){
  int pixel = img[i][j];
  //原圖顏色不變
  Color c = new Color(pixel);
   gr.setColor(c);
   //使用rectangle填充每一個(gè)點(diǎn)
   gr.fillRect(i, j, 1,1);
  }
 }
 }

黑白

主要是尋找一個(gè)值作為黑白分界線。

 //黑白
 public void drawBw(String path, Graphics gr){
 int [][] img = getImgPixel(path);
 // 此處buffG為存儲(chǔ)圖片做準(zhǔn)備
 buffG = new BufferedImage(img.length, img[0].length, 1);
 Graphics buff=buffG.getGraphics();

 for(int i=0; i<img.length; i++){
  for(int j=0; j<img[i].length; j++){
  int pixel =img[i][j];
  Color c = new Color(pixel);
  int r=c.getRed(); int g=c.getGreen(); int b=c.getBlue();
  //將小于某一值的顏色作為界限區(qū)分黑白
  if(b<100){
   buff.setColor(Color.BLACK);
  }else {
   buff.setColor(Color.white);
  }
  buff.fillRect(i,j,3,3);
  }
 }
 gr.drawImage(buffG,0,0,null);
 }

馬賽克 :

馬賽克不用遍歷每一個(gè)點(diǎn),主要目的是將像素點(diǎn)模糊,所以可以在原來遍歷的基礎(chǔ)上i++變成i+10, 每10個(gè)像素點(diǎn)獲取一個(gè)。 然后再將每個(gè)像素點(diǎn)放大相應(yīng)的倍數(shù)。

 //馬賽克實(shí)現(xiàn)
 public void drawPixel(String path, Graphics gr){
 int[][] pixelArray = getImgPixel(path);
 buffG = new BufferedImage(pixelArray.length, pixelArray[0].length, 1);
 Graphics buff=buffG.getGraphics();
 //減少像素?cái)?shù)量
 for(int i=0;i<pixelArray.length;i+=10){
  for(int j=0;j<pixelArray[0].length;j+=10){
  int pixel = pixelArray[i][j];
  Color color = new Color(pixel);
  buff.setColor(color);
  //放大像素點(diǎn)大小
  buff.fillRect(i, j, 10, 10);
  }
 }
 gr.drawImage(buffG,0,0,null);
 }

灰度圖

主要取原圖顏色RGP的平均值設(shè)置為新顏色畫出。

 //灰度圖實(shí)現(xiàn)
 public void drawGrayScale(String path, Graphics gr){
 int[][] img = getImgPixel(path);
 buffG = new BufferedImage(img.length, img[0].length, 1);
 Graphics buff=buffG.getGraphics();

 for(int i=0; i<img.length;i++){
  for(int j=0;j<img[i].length;j++) {
  int pixel =img[i][j];
  Color c = new Color (pixel);
  // 取rgp平均值
  int r = c.getRed();
  int g = c.getGreen();
  int b = c.getBlue();
  int sum = (r+g+b)/3;
  Color newc= new Color(sum,sum,sum);
  buff.setColor(newc);
  buff.fillRect(i,j,1,1);
  }
 }
 gr.drawImage(buffG,0,0,null);
 }

去背景

只畫大于某一值的顏色,原圖綠色比較多,所以對g進(jìn)行比較。

//去背景實(shí)現(xiàn)
 public void drawRemoveBg(String path, Graphics gr){
 int[][] img = getImgPixel(path);
 buffG = new BufferedImage(img.length, img[0].length, 1);
 Graphics buff=buffG.getGraphics();
 for(int i=0;i<img.length;i++){
  for(int j=0;j<img[i].length;j++){
  int pixel = img[i][j];
  Color c = new Color(pixel);
  //去背景,只畫大于某一值的顏色去背景效果
  int r=c.getRed();int g=c.getGreen();int b=c.getBlue();
  if(g>150){
   Color nc=new Color(r,g,b);
   buff.setColor(nc);
   buff.fillRect(i, j, 1,1);
  }
  }
 }
 gr.drawImage(buffG,0,0,null);
 }

網(wǎng)格化

與馬賽克有點(diǎn)類似,改變填充方法為原點(diǎn)

 //網(wǎng)格化實(shí)現(xiàn)
 public void drawGrid(String path, Graphics gr){
 int [][] img = getImgPixel(path);
 buffG = new BufferedImage(img.length, img[0].length, 1);
 Graphics buff=buffG.getGraphics();

 //減少像素?cái)?shù)量
 for(int i=0;i<img.length;i+=10){
  for(int j=0;j<img[i].length;j+=10){
  int pixel = img[i][j];
  Color c = new Color(pixel);
  int r=c.getRed(); int g=c.getGreen(); int b=c.getBlue();
  Color nc = new Color(r,g,b);
  buff.setColor(nc);
  //放大像素?cái)?shù)量
  buff.fillOval(i, j, 8,8 );
  }
 }
 gr.drawImage(buffG,0,0,null);
 }

油畫

像素點(diǎn)數(shù)量不變,主要是填充隨機(jī)大小癿色塊。

//油畫效果
 public void drawPainting(String path, Graphics gr){
 int[][] img =getImgPixel(path);
 buffG = new BufferedImage(img.length, img[0].length, 1);
 Graphics buff=buffG.getGraphics();
 for(int i=0; i<img.length; i++){
  for(int j=0; j<img[i].length; j++){
  int pixel = img[i][j];
  Color c = new Color(pixel);
  buff.setColor(c);
  ///填充隨機(jī)大小癿色塊
  Random random =new Random();
  int r = random.nextInt(20)+5;
  buff.fillOval(i,j,r,r);
  }
 }
 gr.drawImage(buffG,0,0,null);
 }

雙圖合并

選取兩張圖片,然后從2張圖片中獲取其長和寬的最小值。之后以更小的圖片為大小進(jìn)行處理,主要對顏色進(jìn)行透明處理才能更好地得到合并效果。

 //雙圖
 public void drawDouble(String path1, String path2, Graphics gr ){

 //選取a,b兩張照片, 給顏色不同權(quán)值
 int[][] img1=getImgPixel(path1);
 int[][] img2=getImgPixel(path2);
 // 取其寬高癿最小值,防數(shù)組越界
 int w =Math.min(img1.length,img2.length);
 int h =Math.min(img1[0].length, img2.length);
 buffG = new BufferedImage(w,h, 1);
 Graphics buff=buffG.getGraphics();
 //更大的圖片在前循環(huán)
 for(int i=0; i<w; i+=1){
  for(int j=0;j<h;j+=1){
  Color c1 = new Color(img1[i][j]);
  Color c2 = new Color(img2[i][j]);
  //透明處理
  int r=(int)(c1.getRed()*0.7+c2.getRed()*0.3);
  int g=(int)(c1.getGreen()*0.3+c2.getGreen()*0.7);
  int b=(int)(c1.getBlue()*0.3+c2.getBlue()*0.7);
  Color cn = new Color(r,g,b);
  buff.setColor(cn);
  buff.drawLine(i,j,i,j);
  }
 }
 gr.drawImage(buffG,0,0,null);
 }

卷積效果

卷積算法,就是對圖像二維數(shù)組,乘以不同的卷積核,以獲取不同的特征圖像。

對一幅圖像的卷積處理有如下三步:

1.將原圖像轉(zhuǎn)為二維數(shù)組

2.尋找合適的卷積核二維數(shù)組(百度之)

3.按卷積規(guī)則,相乘這兩個(gè)二維數(shù)組,得到第三個(gè)二維數(shù)組即是。

 //卷積核癿二維數(shù)組:邊緣化
 float[][] kArray= {{-1,-1,-1,-1,-1},
   {-1,-1,-1,-1,-1},{-1,-1,25,-1,-1},
   {-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1}};
 /**
 * 卷積計(jì)算
 * @param src :圖片數(shù)組
 * @param filter :卷積核數(shù)組
 * @return 計(jì)算后癿數(shù)組
 */
 public static int[][] valide(int[][] src,float[][] filter){
 int[][]tem = new int[filter.length][filter[0].length];
 int valideWidth = src[0].length - filter[0].length+1;
 int valideheight = src.length - filter.length+1;
 int[][] valide = new int[valideheight][valideWidth];
 for(int i=0;i<valideheight;i+=1){
  for(int j=0;j<valideWidth;j+=1){
  for(int y=0;y<filter.length;y++){
   for(int z=0;z<filter[0].length;z++){
   tem[y][z] =(int)((src[i+y][j+z])*(filter[y][z]));
   }
  }
  int kk=0;
  for(int y=0;y<filter.length;y++){
   for(int z=0;z<filter[0].length;z++){
   kk += tem[y][z];
   }
  }
  if(kk<0)kk=0; if(kk>255)kk=255;
  valide[i][j]=(byte)kk;
  }
 }
 return valide;
 }
 //卷積效果
 public void drawJJ(String path){
 DrawMouse mouse= new DrawMouse();
 int[][] ia= mouse.getImgPixel(path);
 ia=valide(ia, kArray);
 buffG = new BufferedImage(ia.length, ia[0].length, 1);
 Graphics buff=buffG.getGraphics();
 for(int i=0;i<ia.length;i++){
  for(int j=0;j<ia[0].length;j++){
  int pixel = ia[i][j];
  Color color = new Color(pixel);
  buff.setColor(color);
  //放大像素點(diǎn)大小 保證減少的倍數(shù)與放大倍數(shù)相同,否則是網(wǎng)格化
  buff.fillRect(i, j, 10, 10);
  }
 }
 //在界面上畫出ia數(shù)組圖像,即卷積結(jié)果:
 gr.drawImage(buffG,0,0,null);
 }

4.關(guān)于重繪

jframe 類中的 repaint()方法: 我的理解當(dāng)窗體尺寸發(fā)生變化或者已經(jīng)移動(dòng)到屏幕外時(shí)或者需要刷新一下界面,此時(shí)應(yīng)該使用重繪。

比如,我的代碼是使用了動(dòng)作監(jiān)聽器,每次點(diǎn)擊具體的圖像效果或是打開某張圖片,那么此時(shí)就需要添加重匯到動(dòng)作監(jiān)聽器中。

5.圖片打開

主要使用JfileChooser類中的showOpenDialog對圖片進(jìn)行選擇,會(huì)彈出文件選擇器挑選所要打開的圖像,并且對文件后綴進(jìn)行過濾,只使用jpg文件。

public void openFile(){
 JFileChooser jfc = new JFileChooser();
 jfc.setAcceptAllFileFilterUsed(false);//取消顯示所有文件過濾選項(xiàng)
 //后綴名過濾器
 FileNameExtensionFilter filter = new FileNameExtensionFilter("(*.jpg)", "jpg");
 jfc.setFileFilter(filter);
 jfc.setDialogTitle("打開文件");
 jfc.showOpenDialog(null);
 File file = jfc.getSelectedFile();
 if(file!=null){
  fPath=file.getPath();
  System.out.print(fPath);
  drawImg(fPath, gr);
 }else {
  System.out.println("未選擇文件");
 }
 }

6.圖片保存

對文件進(jìn)行保存,之前畫在畫布上的圖片都儲(chǔ)存在 BufferedImage buffG里,此時(shí)使用JFileChooser類中的showSaveDialog方法,然后選擇要保存的路徑以及圖片名字。

 public void saveFile(){
 JFileChooser jfc = new JFileChooser();
 //后綴名過濾器
 FileNameExtensionFilter filter = new FileNameExtensionFilter(
   "(*.jpg)", "jpg");
 jfc.setFileFilter(filter);
 jfc.setDialogTitle("保存文件");
 jfc.showSaveDialog(null);
 File file = jfc.getSelectedFile();
 try {
  ImageIO.write(buffG,"jpg", file);
  System.out.print("保存成功" );
 } catch (IOException ex) {
  ex.printStackTrace();
 }
 }

初學(xué)swing歡迎大家指正。

補(bǔ)充知識(shí):回歸java8-java進(jìn)階-對象容器集合

對象容器——集合

當(dāng)獲得多個(gè)對象后,需要一個(gè)容器將它們管理起來,這個(gè)容器就是集合。

集合本質(zhì)上是基于某種數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)容器。常見的數(shù)據(jù)結(jié)構(gòu)有:

數(shù)組Array、集合Set、隊(duì)列Queue、鏈表Linkedlist、樹Tree、堆Heap、棧Stack、映射Map…

java中提供了豐富的集合接口和類,來自java.util包。

java集合類型分為Collection和Map,Collection子接口有Set、Queue和List等接口,每一種集合接口描述了一種數(shù)據(jù)結(jié)構(gòu)。

java SE中List名稱的類型有兩個(gè):

java.util.List 是一個(gè)接口,下面的List集合,

java.awt.List 是一個(gè)類,用于圖形用戶界面開發(fā),是一個(gè)圖形界面中的組件。

學(xué)習(xí)java中的集合,首先從接口入手,重點(diǎn)掌握List、Set和Map三個(gè)接口,熟悉這些接口中提供的方法。然后再熟悉這些接口的實(shí)現(xiàn)類,并了解不同實(shí)現(xiàn)類之間的區(qū)別。

List集合

List集合中的元素是有序的,可以重復(fù)出現(xiàn)。(下標(biāo)從0開始)。強(qiáng)調(diào)有序。

List接口的實(shí)現(xiàn)類有:

ArrayList 基于動(dòng)態(tài)數(shù)組數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn),訪問元素速度優(yōu)于LinkedList;

LinkedList 基于鏈表數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn),占用空間內(nèi)存比較大,在批量插入或刪除數(shù)據(jù)時(shí)優(yōu)于ArrayList。

不同的結(jié)構(gòu)對應(yīng)于不同的算法,魚與熊掌不可兼得。提高運(yùn)行速度往往以犧牲空間為代價(jià);節(jié)省占用空間往往以犧牲運(yùn)行速度為代價(jià)。

常用方法

List接口繼承自Collection接口,List接口中常用方法如下:

操作元素:

get(int index) 返回List集合中指定位置的元素。

set(int index, Object element) 用指定元素替換List集合中指定位置的元素。

add(Object element) 在List集合的尾部添加指定的元素。該方法從Collection集合繼承而來。

add(int index, Object element) 在List集合的指定位置插入指定元素。

remove(int index) 移除List集合中指定位置的元素。

remove(Object element) 如果List集合中存在指定元素,則從List集合中移除第一次出現(xiàn)的指定元素。該方法從Collection集合繼承而來。

clear() 從List集合中移除所有元素。該方法從Collection集合繼承而來。

判斷元素:

isEmpty() 判斷List集合中是否有元素,沒有返回true,有返回false。該方法從Collection集合繼承而來。

contains(Object element) 判斷List集合中是否包含指定元素,包含返回true,不包含返回false。該方法從Collection集合繼承而來。

查詢元素:

indexOf(Object o) 從前往后查找List集合元素,返回第一次出現(xiàn)指定元素的索引,若此列表不包含該元素返回-1。

lastIndexOf(Object o) 從后往前查找List集合元素,返回第一次出現(xiàn)指定元素的索引,若此列表不包含該元素返回-1。

其他:

iterator() 返回迭代器對象,迭代器對象用于遍歷集合。該方法從Collection集合繼承而來。

size() 返回List集合中的元素?cái)?shù),返回值是int類型。該方法從Collection集合繼承而來。

subList(int fromIndex, int toIndex) 返回List集合中指定的fromIndex(包括)和toIndex(不包括)之間的元素集合,返回值為List集合。

// 聲明List類型集合變量list,使用ArrayList類實(shí)例化list,List接口不能實(shí)例化
List list = new ArrayList();
String b = "B";

list.add("A");
list.add(b);

list.clear(); // [] 清空集合,變量list所引用的對象還在,不是null,只是集合中沒有了元素
list.add(1); // 發(fā)生自動(dòng)裝箱
int item = (Integer)list.get(0); // 發(fā)生自動(dòng)拆箱

java中任何集合中存放的都是對象,即引用數(shù)據(jù)類型,基本數(shù)據(jù)類型不能放到集合中。

從集合中取出的也是對象。

遍歷集合

遍歷:將集合中的每一個(gè)元素取出來,進(jìn)行操作或計(jì)算。

List集合遍歷三種方法:

for循環(huán)。

for (int i = 0; i < list.size(); i++) {
  System.out.println(i, list.gei(i));
}

增強(qiáng)for循環(huán)。是針對遍歷各種類型集合而退出的,推薦使用。

for (Object item : list) {
  String s = (String) item;
  System.out.println(s);
}

迭代器。java提供了多種迭代器,List集合可以使用Iterator和ListIterator迭代器。

Iterator it = list.iterator(); // 迭代器對象
while (it.hasNext()) { // 判斷集合中是否還有元素可以迭代,有true,沒有false
  Object item = it.next(); // 返回迭代的下一元素
  String s = (String) item;
  System.out.println(s);
}

Set集合

Set集合是由一串無序的,不能重復(fù)的相同類型元素構(gòu)成的集合。強(qiáng)調(diào)不重復(fù)。

Set接口直接實(shí)現(xiàn)類主要是HashSet,HashSet是基于散列表數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)。

常用方法

Set接口繼承自Collection接口,Set接口中常用方法如下:

操作元素:

add(Object element) 在Set集合的尾部添加指定元素。該方法從Collection集合繼承而來。

remove(Object element) 如果Set集合中存在指定元素,則從Set集合中移該元素。該方法從Collection集合繼承而來。

clear() 從Set集合中移除所有元素。該方法從Collection集合繼承而來。

判斷元素:

isEmpty() 判斷Set集合中是否有元素,沒有返回true,有返回false。該方法從Collection集合繼承而來。

contains(Object element) 判斷Set集合中是否包含指定元素,包含返回true,不包含返回false。該方法從Collection集合繼承而來。

其他:

iterator() 返回迭代器對象,迭代器對象用于遍歷集合。該方法從Collection集合繼承而來。

size() 返回Set集合中的元素?cái)?shù),返回值是int類型。該方法從Collection集合繼承而來。

Set set = new HashSet(); // []

遍歷集合

Set集合中的元素由于沒有序號(hào),所以不能使用for循環(huán)進(jìn)行遍歷,

但可以使用增強(qiáng)for循環(huán)和迭代器進(jìn)行遍歷,這兩種遍歷方法繼承自Collection集合,

所有的Collection集合類型都有這兩種遍歷方式。

Map集合

Map(映射)集合表示一種非常復(fù)雜的集合,允許按照某個(gè)鍵來訪問元素。

Map集合由兩個(gè)集合構(gòu)成,鍵(key)集合,值(value)集合。

鍵集合是Set類型,不能有重復(fù)元素;值集合是Collection類型,可以有重復(fù)元素。

Map集合中的鍵和值是成對出現(xiàn)的。

適合通過鍵快速訪問值。

Map接口直接實(shí)現(xiàn)類主要是HashMap,HashMap是基于散列表數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)。

常用方法

操作元素:

get(Object key) 返回指定鍵所對應(yīng)的值;如果Map集合中不包含該鍵值對,返回null。

put(Object key, Object value) 指定鍵值對添加到集合中。

remove(Object key) 移除鍵值對。

clear() 移除Map集合中所有鍵值對。

判斷元素:

isEmpty() 判斷Map中是否有鍵值對,沒有返回true,有返回false。

containsKey(Object key) 判斷鍵集合中是否包含指定元素,包含返回true,不包含返回false。

containsValue(Object key) 判斷值集合中是否包含指定元素,包含返回true,不包含返回false。

查看集合:

keySet() 返回Map中的所有鍵集合,返回值是Set類型。

values() 返回Map中的所有值集合,返回值是Collection類型。

size() 返回Map集合中鍵值對數(shù)。

Map map = new HashMap();

map.put(102, "張三");
map.put(105, "李四");
map.put(102, "王五"); // 102鍵已存在,替換原來值

map.get(102); // 王五
map.clear(); // {}

遍歷集合

Map有兩個(gè)集合,可以只遍歷值的集合、鍵的集合、同時(shí)遍歷。

使用增強(qiáng)for循環(huán)

Set keys = map.keySet();
for (Object key : keys) {
  int ikey = (Integer) key; // 自動(dòng)拆箱
  String value = (String) map.get(ikey); // 自動(dòng)拆箱
}

使用迭代器

Collection values = map.values(); // 獲得值集合
Iterator it = values.iterator(); // 遍歷值集合
while (it.hasNext()) {
  Object item = it.next();
  String s = (String) item;
}

以上這篇Java swing 圖像處理多種效果實(shí)現(xiàn)教程就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot整合Web開發(fā)之文件上傳與@ControllerAdvice

    SpringBoot整合Web開發(fā)之文件上傳與@ControllerAdvice

    @ControllerAdvice注解是Spring3.2中新增的注解,學(xué)名是Controller增強(qiáng)器,作用是給Controller控制器添加統(tǒng)一的操作或處理。對于@ControllerAdvice,我們比較熟知的用法是結(jié)合@ExceptionHandler用于全局異常的處理,但其作用不止于此
    2022-08-08
  • IDEA?Debug過程中使用Drop?Frame或Reset?Frame實(shí)現(xiàn)操作回退的方法

    IDEA?Debug過程中使用Drop?Frame或Reset?Frame實(shí)現(xiàn)操作回退的方法

    在IDEA中就提供了一個(gè)幫助你回退代碼的機(jī)會(huì),但這個(gè)方法并不是萬能的,好了,下面就來具體說說IDEA?Debug過程中使用Drop?Frame或Reset?Frame實(shí)現(xiàn)操作回退的方法,感興趣的朋友一起看看吧
    2022-04-04
  • jvm調(diào)優(yōu)的幾種場景(小結(jié))

    jvm調(diào)優(yōu)的幾種場景(小結(jié))

    本文主要介紹了jvm調(diào)優(yōu)的幾種場景,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • idea搭建可運(yùn)行Servlet的Web項(xiàng)目

    idea搭建可運(yùn)行Servlet的Web項(xiàng)目

    在網(wǎng)上看到一篇很詳細(xì)的 intelliJ IDEA 創(chuàng)建web項(xiàng)目并簡單部署servlet的圖文教程,今天自己也配置一下,留個(gè)筆記,感興趣的可以了解一下
    2021-06-06
  • 關(guān)于多線程常用方法以及對鎖的控制(詳解)

    關(guān)于多線程常用方法以及對鎖的控制(詳解)

    下面小編就為大家?guī)硪黄P(guān)于多線程常用方法以及對鎖的控制(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • JavaWeb組件Servlet使用實(shí)例解析

    JavaWeb組件Servlet使用實(shí)例解析

    這篇文章主要介紹了JavaWeb組件Servlet使用實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java對象在內(nèi)存中的布局是如何實(shí)現(xiàn)的?

    Java對象在內(nèi)存中的布局是如何實(shí)現(xiàn)的?

    Java對象在內(nèi)存中屬于oop-klass二分模型,即對象的實(shí)例數(shù)據(jù)和對象類型的元數(shù)據(jù)(字段定義、方法、常量池等元數(shù)據(jù))是分開存儲(chǔ)的.而由于JVM對對象內(nèi)相同寬度的字段分配在一起,所以只要指定了字段類型分配的順序,就可以計(jì)算出每種類型字段相對于當(dāng)前對象的偏移起始位置
    2021-06-06
  • mybatis的動(dòng)態(tài)SQL以及連接池詳解

    mybatis的動(dòng)態(tài)SQL以及連接池詳解

    這篇文章主要介紹了mybatis的動(dòng)態(tài)SQL以及連接池詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SpringBoot+Logback實(shí)現(xiàn)一個(gè)簡單的鏈路追蹤功能

    SpringBoot+Logback實(shí)現(xiàn)一個(gè)簡單的鏈路追蹤功能

    Spring Boot默認(rèn)使用LogBack日志系統(tǒng),并且已經(jīng)引入了相關(guān)的jar包,所以我們無需任何配置便可以使用LogBack打印日志。這篇文章主要介紹了SpringBoot+Logback實(shí)現(xiàn)一個(gè)簡單的鏈路追蹤功能,需要的朋友可以參考下
    2019-10-10
  • springboot啟動(dòng)mongoDB報(bào)錯(cuò)之禁用mongoDB自動(dòng)配置問題

    springboot啟動(dòng)mongoDB報(bào)錯(cuò)之禁用mongoDB自動(dòng)配置問題

    這篇文章主要介紹了springboot啟動(dòng)mongoDB報(bào)錯(cuò)之禁用mongoDB自動(dòng)配置問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評論