Java入门进阶
文章目录
- 1、常用API
-
- 1.1、Math
- 1.2、System
- 1.3、Object
- 1.4、Arrays
- 1.5、基本类型包装类
-
- 1.5.1、基本类型包装类概述
- 1.5.2、Integer
- 1.5.3、int和String相互转换
- 1.5.4、自动装箱和拆箱
- 1.6、日期类
-
- 1.6.1、Date类
- 1.6.2、SimpleDateFormat类
-
- 1.6.2.1、格式化(从Date到String)
- 1.6.2.2、解析(从String到Date)
- 1.6.3、Calendar类
- 1.7、String
- 1.8、StringBuilder
- 1.9、Scaner
- 1.10、Random
- 2、异常
-
- 2.1、异常概述
- 2.2、JVM的默认处理方案
- 2.3、异常处理
- 2.4、异常处理之try…catch…
- 2.5、Throwable的成员方法
- 2.6、编译时异常和运行时异常的区别
- 2.7、异常处理之throws
- 2.8、自定义异常
- 2.9、throws和throw的区别
- 3、集合进阶
-
- 3.1、Collection
- 3.2、List
-
- 3.2.1、List
- 3.2.2、List并发修改异常
- 3.2.3、ListIterator
- 3.2.4、增加for循环
- 3.2.5、数据结构
-
- 3.2.5.1、栈
- 3.2.5.2、列
- 3.2.5.3、数组
- 3.2.5.4、链表
- 3.2.6、List集合子类特点
- 3.2.7、LinkedList集合的特有功能
- 3.3、Set
-
- 3.3.1、Set集合概述和特点
- 3.3.2、哈希值
- 3.3.3、HashSet集合添加一个元素的过程
- 3.3.4、哈希表
- 3.3.5、LinkedHashSet
- 3.3.6、TreeSet
- 3.3.7、自然排序Comparable的使用
- 3.3.8、比较器排序Comparator的使用
- 3.4、泛型
-
- 3.4.1、泛型概述
- 3.4.2、泛型类
- 3.4.3、泛型方法
- 3.4.4、泛型接口
- 3.4.5、类型通配符
- 3.4.6、可变参数
- 3.4.7、可变参数的使用
- 3.5、Map
-
- 3.5.1、Map集合概述
- 3.5.2、Map集合的基本功能
- 3.5.3、Map集合的获取功能
- 3.5.4、Map集合的遍历
- 3.5.5、HashMap的案例
- 3.5.6、ArrayList中嵌套HashMap
- 3.5.7、HashMap中嵌套ArrayList
- 3.5.8、统计字符串中每个字符出现的次数
- 3.6、Collections
-
- 3.6.1、Collections的概述
- 3.6.2、对ArrayList排序
1、常用API
1.1、Math
方法名
说明
public static int abs(int a)
返回参数的绝对值
public static double ceil(double a)
返回大于或等于参数的最小double的值,等于一个整数
public static floor(double a)
返回小于或等于参数的最大double值,等于一个整数
public static int round(float a)
按四舍五入返回最接近参数的int
public static int max(int a,int b)
返回两个int值中的较大值
public static int min(int a,int b)
返回两个int值中的较小值
public static double pow(double a,double b)
返回a的b次幂的值
public static double random()
返回double的正值[0.0,1.0)
示例:
public class MathDemo {public static void main(String[] args) {
// public static int abs(int a) 返回参数的绝对值System.out.println(Math.abs(88));System.out.println(Math.abs(-88));System.out.println("*************");
// public static double ceil(double a) 返回大于或等于参数的最小double的值,等于一个整数System.out.println(Math.ceil(9.4));//输出10.0System.out.println(Math.ceil(9.5));//输出10.0System.out.println("*************");
// public static floor(double a) 返回小于或等于参数的最大double值,等于一个整数System.out.println(Math.floor(9.4));//输出9.0System.out.println(Math.floor(9.5));//输出9.0System.out.println("*************");
// public static int round(float a) 按四舍五入返回最接近参数的intSystem.out.println(Math.round(9.4F));//输出9System.out.println(Math.round(9.5F));//输出10System.out.println("*************");
// public static int max(int a,int b) 返回两个int值中的较大值System.out.println(Math.max(2,8));System.out.println("*************");
// public static int min(int a,int b) 返回两个int值中的较小值System.out.println(Math.min(2,8));System.out.println("*************");
// public static double pow(double a,double b) 返回a的b次幂的值System.out.println(Math.pow(2,3));//输出8.0System.out.println("*************");
// public static double random() 返回double的正值[0.0,1.0)System.out.println(Math.random());//[0.0,1.0)System.out.println((int)(Math.random()*100));//[1,99)之间的随机int数System.out.println((int)(Math.random()*100)+1);//[1,100)之间的随机int数System.out.println((int)(Math.random()*91)+10);//[10,100)之间的随机int数}
}
1.2、System
- System包含几个有用的类字段和方法,它不能被实例化。
System类的常用方法:
方法名
说明
public static void exit(int status)
终止当前运行的Java虚拟机,非零表示异常终止。
public static long currentTimeMillis()
返回当前时间(以毫秒为单位)
1.3、Object
方法名
说明
toString()
建议所有子类覆盖此方法。
public boolean equals?(Object obj)
比较对象是否相等。默认比较地址,重写可以比较内容。
1.4、Arrays
- Arrays类包含用于操作数组的各种方法:
方法名
说明
public static String toString?(int[] a)
返回指定数组的内容的字符串表示形式
public static void sort?(int[] a)
按照数字顺序排序指定的数组
工具类的设计思想:
- 构造方法用private修饰,主要是不让外部创建对象。
- 成员用public static修饰,主要是让外部可以用类名调用。
1.5、基本类型包装类
1.5.1、基本类型包装类概述
- 将基本类型封装成对象的好处在于可以在对象中定义更多的功能方法操作数据。
- 常用的操作之一:用于将基本数据类型与字符串之间的转换。
基本数据类型
包装类
byte
Byte
short
Short
int
Integer
long
Long
float
Float
doube
Double
char
Character
boolean
Boolean
1.5.2、Integer
- 包装一个对象中的原始类型int的值。
方法名
说明
public Integer(int value)
根据int值创建Integer对象(已过时)
public Integer(String s)
根据String值创建Integer对象(已过时)
public static Integer valueOf(int i)
返回表示指定的int值的Integer实例
public static Integer valueOf(String s)
返回一个保存指定值的Integer对象String
1.5.3、int和String相互转换
int转String
/*int转String*/int number=100;//方式一:String s=""+number;//方式二:String s1=String.valueOf(number);
String转int
/*String转int*/String s="100";//方式一:String转Integer转intInteger i=Integer.valueOf(s);int x=i.intValue();//方式二:int y=Integer.parseInt(s);
1.5.4、自动装箱和拆箱
-
装箱:把基本数据类型转换为对应的包装类类型。
//装箱 Integer i=Integer.valueOf(100); Integer j=100;//自动装箱,JDK5以后简化成了此种写法。
-
拆箱:把包装类类型转换为对应的基本数据类型。
//拆箱 Integer i=100;//拆箱 ii=ii.intValue()+1;//ii.intValue()是拆箱 ii+=1;// 自动拆箱
注意: 使用包装类类型时,若操作,最好先判断是否为null
只要是对象,使用前必须进行不为null的判断。
1.6、日期类
1.6.1、Date类
- Date代表了一个特定的时间,精确到毫秒
方法名
说明
public Date()
分配一个Date对象,并初始化,以代表它被分配到的时间,精确到毫秒
public Date (long date)
分配一个Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数
public long getTime()
获取的是日期对象从1970年1月1日00:00:00到现在的毫秒值
public void setTime(long time)
设置时间,给的是毫秒值
1.6.2、SimpleDateFormat类
- 用于日期格式化和解析。
方法名
说明
pubblic SimpleDateFormat()
构造一个SimpleDateFormat,使用默认模式和日期格式
public SimpleDateFormat(String pattern)
构造一个SimpleDateFormat模式使用给定的模式和默认的日期格式
1.6.2.1、格式化(从Date到String)
public final format(Date date)
:将日期格式化成日期/时间字符串
默认格式
import java.util.Date;
import java.text.SimpleDateFormat;
public class SimpleDateFormatDemo {public static void main(String[] args) {Date d=new Date();SimpleDateFormat sdf=new SimpleDateFormat();String s=sdf.format(d);System.out.println(s);}
}
指定格式
Date d=new Date();SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String t=sdf.format(d);System.out.println(t);
1.6.2.2、解析(从String到Date)
public Date parse(String source)
:从给定字符串的开始解析文本生成日期
import java.text.ParseException;
import java.util.Date;
import java.text.SimpleDateFormat;
public class SimpleDateFormatDemo {public static void main(String[] args) throws ParseException {String t="2022-02-28 12:00:01";SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d=sdf.parse(t);System.out.println(d);}
}
1.6.3、Calendar类
-
Calendar提供了一个类方法getInstance用于获取Calendar对象,其日历字段已使用当前日期和时间初始化:
Calendar rightNow=Calendar.getInstance();
import java.util.Calendar;
public class CalendarDemo {
public static void main(String[] args) {
Calendar c=Calendar.getInstance();
int year=c.get(Calendar.YEAR);
int month=c.get(Calendar.MONTH)+1;
int date=c.get(Calendar.DATE);
System.out.println(year+“年”+month+“月”+date+“日”);
}
}
Calendar常用方法:
方法名
说明
public int get(int field)
返回给定日历字段的值
public abstract void add(int field,int amount)
根据日历的规则,将指定的时间量添加或减去给定的日历字段
public final void set(int year,int month,int date)
设置当前日历的年月日
import java.util.Calendar;
public class CalendarDemo {public static void main(String[] args) {Calendar c=Calendar.getInstance();//public abstract void add(int field,int amount)c.add(Calendar.YEAR,-2);//两年前int year=c.get(Calendar.YEAR);int month=c.get(Calendar.MONTH)+1;int date=c.get(Calendar.DATE);System.out.println(year+"年"+month+"月"+date+"日");// public final void set(int year,int month,int date)c.set(2000,0,1);//将日历设置为2000-1-1year=c.get(Calendar.YEAR);month=c.get(Calendar.MONTH)+1;//月份从0开始date=c.get(Calendar.DATE);System.out.println(year+"年"+month+"月"+date+"日");}
}
二月天案例:
import java.util.Scanner;
import java.util.Calendar;
public class CalendarDemo {public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("请输入年份:");int year=sc.nextInt();Calendar c=Calendar.getInstance();//将日历设置为3月1日,再减一天就是2月的最后一天c.set(year,2,1);c.add(Calendar.DATE,-1);int date=c.get(Calendar.DATE);System.out.println(year+"年二月有"+date);}
}
1.7、String
1.8、StringBuilder
1.9、Scaner
1.10、Random
2、异常
2.1、异常概述
- 异常:就是程序出现了不正常的情况
#mermaid-svg-4t2aA5Fz629v7TEb {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-4t2aA5Fz629v7TEb .error-icon{fill:#552222;}#mermaid-svg-4t2aA5Fz629v7TEb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4t2aA5Fz629v7TEb .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-4t2aA5Fz629v7TEb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4t2aA5Fz629v7TEb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4t2aA5Fz629v7TEb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4t2aA5Fz629v7TEb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4t2aA5Fz629v7TEb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4t2aA5Fz629v7TEb .marker.cross{stroke:#333333;}#mermaid-svg-4t2aA5Fz629v7TEb svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4t2aA5Fz629v7TEb .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-4t2aA5Fz629v7TEb .cluster-label text{fill:#333;}#mermaid-svg-4t2aA5Fz629v7TEb .cluster-label span{color:#333;}#mermaid-svg-4t2aA5Fz629v7TEb .label text,#mermaid-svg-4t2aA5Fz629v7TEb span{fill:#333;color:#333;}#mermaid-svg-4t2aA5Fz629v7TEb .node rect,#mermaid-svg-4t2aA5Fz629v7TEb .node circle,#mermaid-svg-4t2aA5Fz629v7TEb .node ellipse,#mermaid-svg-4t2aA5Fz629v7TEb .node polygon,#mermaid-svg-4t2aA5Fz629v7TEb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4t2aA5Fz629v7TEb .node .label{text-align:center;}#mermaid-svg-4t2aA5Fz629v7TEb .node.clickable{cursor:pointer;}#mermaid-svg-4t2aA5Fz629v7TEb .arrowheadPath{fill:#333333;}#mermaid-svg-4t2aA5Fz629v7TEb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4t2aA5Fz629v7TEb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4t2aA5Fz629v7TEb .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-4t2aA5Fz629v7TEb .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-4t2aA5Fz629v7TEb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4t2aA5Fz629v7TEb .cluster text{fill:#333;}#mermaid-svg-4t2aA5Fz629v7TEb .cluster span{color:#333;}#mermaid-svg-4t2aA5Fz629v7TEb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4t2aA5Fz629v7TEb :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}
Throwable
Error
Exception
RuntimeException
非RuntimeException
- Error:严重问题,不需要处理
- Exception:称为异常类,它表示程序本身可以处理的问题。
- RuntimeException:在编译期是不检查的,出现问题后,需要我们回来修改代码。
- 非RuntimeException:编译期就必须处理,否则程序不能通过编译。
2.2、JVM的默认处理方案
如果程序出现 问题,我们没有做任何处理,最终JVM会做默认的处理。
- 把异常的名称,异常原因及异常出现的位置等信息输出在了控制台。
- 程序停止执行。
2.3、异常处理
如果程序出现了问题,我们需要自己来处理,有两种方案:
try...catch...
throws
格式:
try{可能出现异常的代码;
}catch(异常类名 变量名){异常处理代码;
}
执行流程:
- 程序从try里面的代码开始执行。
- 出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统。
- 当Java运行时系统接收异常对象时,会到catch中云找匹配的异常类,找到后进行异常的处理。
- 执行完毕后,程序还可继续往下执行。
2.4、异常处理之try…catch…
public class ExceptionDemo {public static void main(String[] args) {System.out.println("开始");methood();System.out.println("异常处理完毕仍可继续运行");}public static void methood(){try{int[] arr={1,2,3};System.out.println(arr[3]);}catch(ArrayIndexOutOfBoundsException e){System.out.println("数组下标越界");e.printStackTrace();}}}
2.5、Throwable的成员方法
方法名
说明
public String getMessage()
返回此throwable的详细消息字符串
public String toString()
返回此可抛出的简短描述
public void printStackTrace()
把异常的错误信息输出在控制台
2.6、编译时异常和运行时异常的区别
- Java中的异常被分为两大类:编译时异常和运行时异常,也被称为受检异常和非受检异常。
- 所有的RuntimeException类及其子类被称为运行时异常,其他的异常都是编译时异常。
编译时异常: 必须显示处理,否则程序就会发生错误,无法通过编译。
运行时异常: 无需显示处理,也可以和编译时异常一样处理。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionDemo {public static void main(String[] args) {System.out.println("开始");methood();System.out.println("结束");}public static void methood(){try{String s="2000-01-01";SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");Date d=sdf.parse(s);}catch (ParseException e){e.printStackTrace();}}}
2.7、异常处理之throws
虽然可以通过try…catch…对异常处理,但并不是所有情况都有权限进行异常的处理。即,有些时候可能出现的异常我们处理不了。
针对这种情况,Java提供了throws的处理方案。
格式:
throws 异常类名;
注意:这个格式是跟在方法的括号后面的。
-
编译时异常必须要进行处理,两种处理方案:
try...catch....
或者throws
,将来谁调用谁处理。 -
运行时异常可以不处理,出现问题后,需要回来修改代码。
//编译时异常 public static void methood() throws ParseException { String s="2000-01-01";SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");Date d=sdf.parse(s); }//运行时异常 public static void methood1() throws ArrayIndexOutOfBoundsException{int arr[]={1,2,3};System.out.println(arr[3]); }
2.8、自定义异常
格式:
public class 异常类名 extends Exception{无参构造带参构造
}
示例:
-
自定义异常类
//自定义异常类 package com.test1;public class ScoreException extends Exception {public ScoreException(){}public ScoreException(String message){super(message);} }
-
抛出异常。
package com.test1;public class Score{public static void check(int score) throws ScoreException{if(score<0||score>100){throw new ScoreException("分数不在0-100之间");}else{System.out.println("分数正常");}} }
-
处理异常
package com.test1;import java.util.Scanner;public class ScoreDemo {public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("请输入分数:");int score=sc.nextInt();try{Score.check(score);}catch(ScoreException e){e.printStackTrace();}}}
注意:
- 运行时异常类继承自:
RuntimeException
。 - 编译时异常类继承自
Exception
。
2.9、throws和throw的区别
throws
- 用在方法声明后,跟的是异常类名。
- 表示抛出异常,由该方法的调用者来处理。
- 表示出现异常的一种可能性,并不一定发生这些异常。
throw - 用在方法体内,跟的是异常对象名。
- 表示抛出异常,由方法体内的语句处理。
- 执行throw一定抛出了某种异常。
3、集合进阶
集合体系结构
3.1、Collection
- 是单列集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素。
- JDK不提供此接口的任何直接实现,它提供更具体的子接口实现,如
Set
和List
。
创建Collection集合的对象:
-
多态的方式
-
具体的实现类ArrayList
import java.util.Collection;
import java.util.ArrayList;
public class CollectionDemo {
public static void main(String[] args) {
Collection c=new ArrayList();
c.add(“Hello”);
c.add(“world”);
System.out.println©;
}
}
Collection集合常用方法:
方法名
说明
boolea:n add(E e)
添加元素
boolean remove(Object o)
从集合中移除指定的元素
void clear()
清空集合中的元素
boolean contains(Object o)
判断集合中是否存在指定的元素
boolean isEmpty()
判断集合是否为空
int size()
集合的长度,也就是集合中元素的个数
Collection集合的遍历:
- Iterator:迭代器,集合的专用 遍历方式。
- Iteratoriterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到。
- 迭代器是通过集合的iterator()方法得到的,所以我们说它是依赖于集合面存在的。
Iterator中的常用方法:
-
E next():返回迭代中的下一个元素。
-
boolean hasNext():如果迭代具有更多元素,则返回true
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
public class CollectionDemo {
public static void main(String[] args) {
Collection c=new ArrayList();
c.add(“Hello”);
c.add(“world”);
c.add(“java”);
Iterator it=c.iterator();
while(it.hasNext()){
String s=it.next();
System.out.println(s);
}}
}
3.2、List
3.2.1、List
List集合概述
- 有序集合(也称序列),用户可精确控制列表中每个元素的插入位置。用户可通过索引访问元素。
- 与Set集合不同,列表通常允许重复的元素。
List集合特点
- 有序:存储和取出的元素顺序一致。
- 可重复:存储的元素可以重复。
List集合特有方法:
方法名
说明
void add(int index,E element)
在此集合中的指定位置插入指定的元素
E remove(int index)
删除指定索引处的元素,返回被删除的元素
E set(int index,E element)
修改指定索引处的元素,返回被修改的元素
E get(int index)
返回指定索引处的元素
示例:
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class ListDemo {public static void main(String[] args) {List<String> list=new ArrayList<String>();list.add("Hello");list.add("world");list.add("java");//第一种遍历:迭代器遍历Iterator<String> it=list.iterator();while(it.hasNext()){String s=it.next();System.out.println(s);}//第二种遍历:for循环方式for(int i=0;i<list.size();i++){String s=list.get(i);System.out.println(s);}}
}
3.2.2、List并发修改异常
并发修改异常
ConcurrentModificationException
产生原因
- 迭代器遍历的过程中,通过集合对象修改了集合中元素的长度,造成了迭代器猎取元素中判断预期修改值和实际值不一致。
解决方案:
-
用for循环遍历,然后用集合对象做对应的操作即可。
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class ListDemo {
public static void main(String[] args) {
List list=new ArrayList();
list.add(“Hello”);
list.add(“world”);
list.add(“java”);
//第一种遍历:迭代器遍历
Iterator it=list.iterator();
while(it.hasNext()){
String s=it.next();//触发并发修改异常
if(s.equals(“world”)){
list.add(“aaa”);
}
}
//用for循环方式遍历可解决List并发修改异常的问题:
for(int i=0;i<list.size();i++){
String s=list.get(i);
if(s.equals(“world”)){
list.add(“aaa”);
}
}
}
}
3.2.3、ListIterator
ListIterator列表迭代器
- 通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器。
- 可沿任一方向遍历列表的列表迭代器,迭代期间修改列表,并获取列表中迭代器的当前位置。
ListIterator中的常用方法:
-
E next()
:返回迭代中的下一下元素。 -
boolean hasNext()
:如果迭代具有更多元素,则返回true。 -
E previous()
:返回列表中的上一个元素。 -
boolean hasPrevious()
:如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true。 -
void add(E e)
:将指定的元素插入列表。import java.util.List;
import java.util.ArrayList;
import java.util.ListIterator;
public class ListIteratorDemo {
public static void main(String[] args) {
List list=new ArrayList();
list.add(“hello”);
list.add(“world”);
list.add(“java”);
ListIterator lit=list.listIterator();
while(lit.hasNext()){
String s=lit.next();
System.out.println(s);
}System.out.println("---------");while(lit.hasPrevious()){String s = lit.previous();System.out.println(s);} }
}
ListIterator不触发并发修改异常
import java.util.List;
import java.util.ArrayList;
import java.util.ListIterator;
public class ListIteratorDemo {public static void main(String[] args) {List<String> list=new ArrayList<String>();list.add("hello");list.add("world");list.add("java");ListIterator<String> lit=list.listIterator();while(lit.hasNext()){String s = lit.next();if(s.equals("world"))lit.add("javaEE");}System.out.println(list);}
}
3.2.4、增加for循环
- 简化数组和Collection集合的遍历。
- 实现Iterable接口的类允许其对象成为增强型for语句的目标
- JDK5之后出现,其内部原理是一个Iterator迭代器。
增强for的格式:
for(元素的数据类型变量名:数组或者Collection集合){//在此处使用变量即可,该变量就是元素。
}
示例:
int[] arr={1,2,3,4,5};
for(int i:arr){System.out.println(i);
}
3.2.5、数据结构
3.2.5.1、栈
- 先进后出。
3.2.5.2、列
- 先进先出。
3.2.5.3、数组
- 数组是一种查询快,增删慢的模型。
- 查询数据通过索引定位,查询任意数据耗时相同,查询速度快。
- 删除数据时,要将原始数据删除,同时后面两个数据前移,删除效率低。
- 添加数据时,添加位置后的每人数据后移,再添加元素,添加效率极低。
3.2.5.4、链表
- 链表是一种增删快的模型(对比数组)。
- 链表是一种查询慢的模型(对比数组)。
- 查询数据是否存在,必须从头(head)开始查询 。
3.2.6、List集合子类特点
List集合常用子类:ArrayList
、LinkedList
- ArrayList:底层数据结构是数组,查询快,增删慢
- LinkedList:底层数据结构是链表,查询慢,增删快。
ArrayList集合的三种遍历方式
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.ListIterator;
public class test6 {public static void main(String[] args) {ArrayList<String> array=new ArrayList<String>();array.add("Hello");array.add("world");array.add("java");for(String s:array){System.out.println(s);}System.out.println("************");for(int i=0;i<array.size();i++){String s=array.get(i);System.out.println(s);}System.out.println("************");ListIterator<String> it=array.listIterator();while(it.hasNext()){String s=it.next();System.out.println(s);}System.out.println("************");while(it.hasPrevious()){String s=it.previous();System.out.println(s);}//LinkedList与ArrayList三种遍历方法相同LinkedList<String> linkedList=new LinkedList<String>();linkedList.add("aaa");linkedList.add("bbb");linkedList.add("ccc");for(String s:linkedList){System.out.println(s);}}
}
3.2.7、LinkedList集合的特有功能
方法名
说明
puclic void addFirst(E e)
在该列表开头插入指定的元素
public void addLast(E e)
将指定的元素追加到此列表的末尾
public E getFirst()
返回此列表中的第一个元素
public E getLast()
返回此列表中的最后一个元素
public E removeFirst()
从此列表中删除并返回第一个元素
public E removeLast()
从此列表中删除并返回最后一个元素
3.3、Set
3.3.1、Set集合概述和特点
Set集合特点
-
不包含重复元素的集合。
-
没有带索引的方法,所以不能使用普通for循环遍历。
import java.util.Set;
import java.util.HashSet;
public class SetDemo {
public static void main(String[] args) {
Set set=new HashSet();
set.add(“Hello”);
set.add(“world”);
set.add(“java”);//没有带索引的方法,所以不能使用普通for循环遍历//只能使用增强for循环遍历for(String s:set){System.out.println(s);} }
}
3.3.2、哈希值
哈希值: 是JDK根据对象的地址或者字符串或者数字计算出来的int类型的数值。
Object
类中有一个方法可获取对象的哈希值:
public int hashCode():
返回对象的哈希值。
对象的哈希值特点
- 同一个对象多次调用
hashCode()
方法返回的哈希值是相同的。 - 默认情况下,不同对象的哈希值是不相同的。
- 通过重写
Object
中的hashCode
方法,可以实现不同对象的哈希值是相同的。
3.3.3、HashSet集合添加一个元素的过程
HashSet集合存储元素:
- 要保证元素唯一性,需要重写
hashCode()
和equals()
3.3.4、哈希表
- JDK8之前,底层采用
数组+链表
实现,可以说是一个元素为链表的数组。 - JDK8以后,在长度比较长的时候,底层实现了优化。
3.3.5、LinkedHashSet
LinkedHashSet集合特点:
-
哈希表和链表实现的Set接口,具有可预测的迭代次序。
-
由链表保证元素有序,也就是说元素的存储和取出顺序是一致的。
-
由哈希表保证元素唯一,也就是说没有重复的元素经。
import java.util.LinkedHashSet;
public class LinkedHashSetDemo {
public static void main(String[] args) {
LinkedHashSet linkedHashSet=new LinkedHashSet();
linkedHashSet.add(“Hello”);
linkedHashSet.add(“world”);
linkedHashSet.add(“java”);
for(String s:linkedHashSet){
System.out.println(s);
}
}
}
3.3.6、TreeSet
TreeSet集合特点
-
元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法。
- TreeSet()根据其元素的自然排序进行排序。
- TreeSet(Comparator comparator)根据指定的比较器进行排序
-
没有带索引的方法,所以不能使用普通for循环遍历
-
由于是Set集合,所以不包含有重复元素的集合
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet treeSet=new TreeSet();
treeSet.add(10);
treeSet.add(50);
treeSet.add(30);
treeSet.add(20);
treeSet.add(40);
for(Integer i:treeSet){
System.out.println(i);
}
}
}
3.3.7、自然排序Comparable的使用
- 存储学生对象并遍历,创建TreeSet集合使用无参构造方法。
- 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母排序。
结论:
- Student类不实现
Comparable
接口,会触发ComparablClassCastException
异常。 - 实现
Comparable
接口就必须要实现compareTo?(T o)
方法。
compareTo?(T o)
方法的返回值:
-
返回0,会认为是重复元素不添加(添加的第一个元素除外)
-
返回正数,按存储的顺序正着输出。
-
返回负数,按存储的顺序倒着输出。
//Student.java
public class Student implements Comparable {
private String name;
private int age;public Student(String name, int age) {this.name = name;this.age = age; }public String getName() {return name; }public void setName(String name) {this.name = name; }public int getAge() {return age; }public void setAge(int age) {this.age = age; }@Override public int compareTo(Student s){ /*return 0; //会认为是重复元素不添加进TreeSet(添加的第一个元素除外)return 1;//按存储的顺序升序输出。return -1;//按存储的顺序倒着输出。*//*//按照年龄从小到大排序return this.age-s.age;//按照年龄从大到小排序return s.age-this.age;*/int num=this.age-s.age;return num==0?this.name.compareTo(s.name):num;}
}
//TreeSetDemo.java
import java.util.TreeSet;public class TreeSetDemo {
public static void main(String[] args) {
TreeSet treeSet=new TreeSet();
Student s1=new Student(“bbb”,20);
Student s2=new Student(“aaa”,20);
Student s3=new Student(“ccc”,21);
Student s4=new Student(“ddd”,30);
Student s5=new Student(“eee”,19);
treeSet.add(s1);
treeSet.add(s2);
treeSet.add(s3);
treeSet.add(s4);
treeSet.add(s5);
for(Student s:treeSet){
System.out.println(s.getName()+“,”+s.getAge());
}
}
} -
用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的。
-
自然排序,就是让元素所属的类实现Comparable接口,重写compareTo方法。
-
重写方法时,一定要注意排序规则按要求的主要条件和次要条件来写。
3.3.8、比较器排序Comparator的使用
-
用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序。
-
比较器排序,就是让集合构造方法接收Comparator的实现类对象。
-
重写方法时,一定要注意排序规则必须按照主要条件和次要条件来写。
//Studen.java
public class Student {
private int age;
private String name;public Student( String name,int age) {this.age = age;this.name = name; }public int getAge() {return age; }public void setAge(int age) {this.age = age; }public String getName() {return name; }public void setName(String name) {this.name = name; }
}
//TreeSetDemo.java
import java.util.TreeSet;
import java.util.Comparator;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet treeSet=new TreeSet(new Comparator(){
@Override
public int compare(Student s1,Student s2){
int num=s1.getAge()-s2.getAge();
int num1=(0==num?s1.getName().compareTo(s2.getName()):num);return num1;}});Student s1=new Student("aaa",25);Student s2=new Student("bbb",19);Student s3=new Student("ddd",20);Student s4=new Student("ccc",20);treeSet.add(s1);treeSet.add(s2);treeSet.add(s3);treeSet.add(s4);for(Student s:treeSet){System.out.println(s.getName()+","+s.getAge());} }
}
3.4、泛型
3.4.1、泛型概述
-
JDK5中引入的特性。
-
它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型,它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
-
泛型类、泛型方法、泛型接口。
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;public class GenericDemo {
public static void main(String[] args) {
Collection c=new ArrayList();
c.add(“Hello”);
c.add(“world”);
Iterator it=c.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
}
}
3.4.2、泛型类
泛型的定义格式:
-
格式:
修饰符 class 类名<类型>{}
-
范例:
public class Generic<T> {}
此处T
可以随便定为任意标识,常见的如T
、E
、K
、V
//Generic.java
public class Generic {
private T t;public Generic(T t) {this.t = t; }public T getT() {return t; }public void setT(T t) {this.t = t; }
}
GenericDemo.java
public class GenericDemo {
public static void main(String[] args) {
Generic g1=new Generic(“李淳罡”);
System.out.println(g1.getT());
Generic g2=new Generic(20);
System.out.println(g2.getT());
}}
3.4.3、泛型方法
泛型方法定义格式:
-
格式:修饰符<类型> 返回值类型 方法名(类型 变量名){}
-
范例:
pubcli <T> void show(T t){}
public class Generic{
public void show(T t){
System.out.println(t);
}
}
泛型方法改进:
public class Generic{public<T> void show(T t){System.out.println(t);}
}
3.4.4、泛型接口
泛型接口定义格式:
-
格式:修饰符 interface 接口名<类型>{}
-
范例:
pubcli interface Generic<T>{}
public interface Generic {
void show(T t);
}public class Genericlmpl implements Generic {
@Override
public void show(T t){
System.out.println(t);
}
}public class Demo {
public static void main(String[] args) {
Generic g1=new Genericlmpl();
g1.show(“hello”);
Generic g2=new Genericlmpl();
g2.show(15);
}
}
3.4.5、类型通配符
类型通配符
- 为了表示各种泛型List的父类,可以使用类型通配符
- 类型通配符:
<?>
List<?>
:表示元素类型未知的List,它的元素可以匹配任何的类型- 这种带通配符的List仅表示它是各种泛型List的父类,并不能把元素添加到其中。
类型通配符上限
如果不希望List<?>
是任何泛型List的父类,只希望它代表某一类型泛型List的父类,可以使用类型通配符的上限。
- 类型通配符上限:<extends 类型>
List<? extends Number>
:它表示的类型是Number或者其子类型
类型通配符下限
除了可以指定类型通配符的上限,还可指定类型通配符的下限
-
类型通配符下限:
<? super 类型>
-
List<? super Number>
:它表示的类型是Number或者其父类型
import java.util.List;
import java.util.ArrayList;
public class Demo {
public static void main(String[] args) {
//类型通配符:<?> List<?> list1=new ArrayList();
List<?> list2=new ArrayList(); List<?> list3=new ArrayList();
System.out.println(““);
//通配符上限:<? extends 类型>
// List<? extends Number> list4=new List();//报错,这里超过了上限
List<? extends Number> list5=new ArrayList();
List<? extends Number> List6=new ArrayList();
System.out.println(””);
//通配符下限:<? super 类型>
List<? super Number> list7=new ArrayList();
List<? super Number> list8=new ArrayList();
// List<? super Number> list9=new ArrayList();//报错,这里超过了下限}
}
3.4.6、可变参数
-
格式:
修饰符 返回值类型 方法名(数据类型... 变量名){}
-
范例:
public static int sum(int... a)
public class Demo {
public static void main(String[] args) {
System.out.println(sum(1));
System.out.println(sum(1,2));
System.out.println(sum(1,2,3));
}
public static int sum(int… arr){
int total=0;
for(int i:arr){
total+=i;
}
return total;
}
}
注意:
-
这里的变量a其实是一个数组
-
如果一个方法有多个参数,可变参数要放在最后。
public static int sum(int a,int... arr){return 0; }
3.4.7、可变参数的使用
Arrays工具类中有一个静态方法:
-
public static<T> List<T> asList(T... a)
:返回由指定数组支持的固定大小的列表。 -
返回的集合不能做增删操作(增删会改变长度),可以做修改操作。
import java.util.Arrays; import java.util.List; public class Demo {public static void main(String[] args) {List<String> list= Arrays.asList("hello","world","java","hello"); // list.add("aaa");//UnsupportedOperationException // list.remove("hello");//UnsupportedOperationExceptionlist.set(1,"aaa");System.out.println(list);} }
List接品中有一个静态方法:
-
public static<E> List<E> of(E... elements)
:返回包含任意数量元素的不可变列表。 -
返回的集合不能做增删改操作。
import java.util.List;public class Demo {public static void main(String[] args) {List<String> list= List.of("hello","world","hello"); // list.add("aaa");//UnsupportedOperationException // list.remove("hello");//UnsupportedOperationException // list.set(1,"aaa");//UnsupportedOperationExceptionSystem.out.println(list);} }
Set接口中有一个静太方法:
-
public static<E> Set<E> of(E... elements)
:返回一个包含任意数量元素的不可变集合。 -
不能给重复的元素。
-
返回的集合不能做增删操作,没有修改的方法。
import java.util.Set;public class Demo {public static void main(String[] args) { // Set<String> set= Set.of("hello","world","hello");//IllegalArgumentException,set中不能有重复元素Set<String> set= Set.of("hello","world"); // set.add("aaa");//UnsupportedOperationException // set.remove("hello");//UnsupportedOperationExceptionSystem.out.println(set);} }
3.5、Map
3.5.1、Map集合概述
Map集合概述
Interface Map<k,v>
K:键的类型; V:值的类型。- 将键映射到值的对象;
- 不能包含重复的键;
- 每个键可以映射到最多一个值。
创建Map集合对象
-
多态的方式
-
具体实现类HashMap
import java.util.HashMap;
import java.util.Map;public class MapDemo {
public static void main(String[] args) {
Map<String,String> map=new HashMap<String,String>();
map.put(“001”,“唐僧”);
map.put(“002”,“孙悟空”);
map.put(“003”,“猪八戒”);
map.put(“003”,“沙悟净”);//key重复,会被新的value覆盖
System.out.println(map);
}
}
3.5.2、Map集合的基本功能
方法名
说明
V put(K key,V value)
添加元素
V remove(Object key)
根据键删除键值对元素
void clear()
移除所有的键值对元素
boolean containsKey(Object key)
判断集合是否包含指定的键
boolean containsValue(Object value)
判断集合是否包含指定的值
boolean isEmpty()
判断集合是否为空
int size()
集合的长度,即集合中键值对的个数
3.5.3、Map集合的获取功能
方法名
说明
V get(Object key)
根据键获取值
Set<K> keySet()
获取所有键的集合
Collection<V> values()
获取所有值的集合
Set<Map.Entry<K,v>> entrySet()
获取所有键值对对象的集合
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapDemo {public static void main(String[] args) {Map<String,String> map=new HashMap<String,String>();map.put("张无忌","赵敏");map.put("郭靖","黄蓉");map.put("杨过","小龙女");System.out.println(map.get("杨过"));System.out.println("*************");Set<String> set=map.keySet();for(String key:set){System.out.println(key);}System.out.println("*************");Collection<String> values=map.values();for(String value:values){System.out.println(value);}System.out.println("*************");System.out.println(map);}
}
3.5.4、Map集合的遍历
方式一:
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapDemo {public static void main(String[] args) {Map<String,String> map=new HashMap<String,String>();map.put("张无忌","赵敏");map.put("郭靖","黄蓉");map.put("杨过","小龙女");//获取所有键的集合Set<String> keys = map.keySet();for(String key:keys){String value=map.get(key);System.out.println(key+","+value);}}
}
方式二:
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapDemo {public static void main(String[] args) {Map<String,String> map=new HashMap<String,String>();map.put("张无忌","赵敏");map.put("郭靖","黄蓉");map.put("杨过","小龙女");Set<Map.Entry<String, String>> entries = map.entrySet();for(Map.Entry<String,String> entry:entries){String key=entry.getKey();String value=entry.getValue();System.out.println(key+","+value);}}
}
3.5.5、HashMap的案例
-
创建一个HashMap集合,键是学生对象(Student),值是居住地(String)
-
要求保证唯一性:若学生对象成员变量值相同,认为是同一对象。
//Student.java
public class Student {
private String name;
private int age;public Student(String name, int age) {this.name = name;this.age = age; }public String getName() {return name; }public void setName(String name) {this.name = name; }public int getAge() {return age; }public void setAge(int age) {this.age = age; }@Override public boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;if (age != student.age) return false;return name != null ? name.equals(student.name) : student.name == null; }@Override public int hashCode() {int result = name != null ? name.hashCode() : 0;result = 31 * result + age;return result; }
}
//HashMapDemo.java
import java.util.HashMap;
import java.util.Set;public class HashMapDemo {
public static void main(String[] args) {
HashMap<Student,String> hm=new HashMap<Student,String>();Student s1=new Student("孙悟空",30);Student s2=new Student("猪八戒",20);Student s3=new Student("沙悟净",20);Student s4=new Student("孙悟空",30);/*s1和s4对象相同,value应该被覆盖若要s1和s4对象相同,须重写Student类的hashCode和equals*/hm.put(s1,"花果山");hm.put(s2,"高老庄");hm.put(s3,"流沙河");hm.put(s4,"水帘洞");//遍历Set<Student> students = hm.keySet();for(Student s:students){String value=hm.get(s);System.out.println(s.getName()+","+s.getAge()+",住在"+value);}}
}
3.5.6、ArrayList中嵌套HashMap
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;public class ArrayListIncludeHashMap {public static void main(String[] args) {ArrayList<HashMap<String,String>> arrList=new ArrayList<HashMap<String,String>>();HashMap<String,String> hm1=new HashMap<String,String>();hm1.put("郭靖","黄蓉");hm1.put("杨过","小龙女");HashMap<String,String> hm2=new HashMap<String,String>();hm2.put("吕布","貂蝉");hm2.put("诸葛亮","黄月英");HashMap<String,String> hm3=new HashMap<String,String>();hm3.put("张无忌","赵敏");hm3.put("宋青书","周芷若");arrList.add(hm2);arrList.add(hm2);arrList.add(hm3);for(HashMap<String,String> hm:arrList){Set<String> keySet = hm.keySet();for(String key:keySet){String value=hm.get(key);System.out.println(key+","+value);}System.out.println("************");}}
}
3.5.7、HashMap中嵌套ArrayList
3.5.8、统计字符串中每个字符出现的次数
需求:
- 键盘录入一个字符串,统计字符串中每个字符出现的次数。
- 举例:录入"aabbccdd"在控制台输出“a(2)b(2)c(2)”
思路:
-
键盘录入一个字符串
-
创建HashMap集合,键是Character,值是Integer
-
遍历字符串,得到每一个字符。
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;public class Demo {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println(“请输入一个字符串”);
String line = sc.nextLine();
Map<Character,Integer> map=new TreeMap<Character,Integer>();
//遍历字符串,得到每一个字符
for(int i=0;i<line.length();i++){
char key=line.charAt(i);
Integer value=map.get(key);
if(null==value){
map.put(key,1);
}else{
value++;
map.put(key,value);
}
}//遍历HashMap集合StringBuilder sb=new StringBuilder();Set<Character> keySet = map.keySet();for(Character key:keySet){Integer value=map.get(key);sb.append(key).append("(").append(value).append(")");}System.out.println(sb.toString()); }
}
3.6、Collections
3.6.1、Collections的概述
- 是针对集合操作的工具类。
常用方法
-
public static <T extends Comparable<? super T>> void sort(List<T> list)
:将指定的列表按升序排序。 -
public static void reverse(List<?> list)
:反转指定列表中元素的顺序。 -
public static void shuffle(List<?> list)
:使用默认的随机源随机排列指定的列表。import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class CollectionsDemo {
public static void main(String[] args) {
List list=new ArrayList();list.add(3);list.add(4);list.add(1);list.add(6);list.add(5);list.add(2);//排序Collections.sort(list);System.out.println(list);//反转list中的顺序Collections.reverse(list);System.out.println(list);//洗牌Collections.shuffle(list);System.out.println(list); }
}
3.6.2、对ArrayList排序
public class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;public class Demo {public static void main(String[] args) {ArrayList<Student> array=new ArrayList<Student>();Student s1=new Student("linqingxia",30);Student s2=new Student("zhangmanyu",35);Student s3=new Student("aaaaa",33);Student s4=new Student("bbbb",33);array.add(s1);array.add(s2);array.add(s3);array.add(s4);//使用Collectons对ArrayList集合排序Collections.sort(array, new Comparator<Student>() {@Overridepublic int compare(Student s1, Student s2) {//按照年龄排序int num=s1.getAge()-s2.getAge();int num2=num==0?s1.getName().compareTo(s2.getName()):num;return num2;}});for(Student s:array){System.out.println(s.getName()+","+s.getAge());}
相关文章:
Java入门进阶
文章目录 1、常用API 1.1、Math1.2、System1.3、Object1.4、Arrays1.5、基本类型包装类 1.5.1、基本类型包装类概述1.5.2、Integer1.5.3、int和String相互转换1.5.4、自动装箱和拆箱 1.6、日期类 1.6.1、Date类1.6.2、SimpleDateFormat类 1.6.2.1、格式化(从Date到…...
torchtext.get_tokenizer
文章目录 1. 说明2. pytorch代码 1. 说明 假设我们有一个句子如下:You can now install TorchText using pip! 分词后可得:[you, can, now, install, torchtext, using, pip, !] 2. pytorch代码 import torchtext from torchtext.data import get_tok…...
零技术开始,但想用 Next.js 基于 React 构建一个类似 18Touch 的网站
如果你从零技术开始,但想用 Next.js 基于 React 构建一个类似 18Touch 的网站,以下是一个详细的规划和学习路径。这个网站看起来是一个内容展示型网站,可能包含博客、产品展示、用户交互等功能。 1. 项目规划 1.1 确定核心功能 根据 18Touc…...
python实现多路视频,多窗口播放功能
系列Python开发 文章目录 系列Python开发前言一、python实现多路视频播放功能二、代码实现1. http申请视频流地址并cv2播放功能 三、打包代码实现生成可执行文件 总结 前言 一、python实现多路视频播放功能 服务端开发后通常需要做功能测试、性能测试,通常postman、…...
设计模式---观察者模式
设计模式—观察者模式 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决的问题:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,…...
TensorFlow深度学习实战(6)——回归分析详解
TensorFlow深度学习实战(6)——回归分析详解 0. 前言1. 回归分析简介2. 线性回归2.1 简单线性回归2.2 多重线性回归2.3 多元线性回归 3. 构建基于线性回归的神经网络3.1 使用 TensorFlow 进行简单线性回归3.2 使用 TensorFlow 进行多元线性回归和多重线性…...
Deepseek v3R1 学习笔记
o1 o1 模型在训练过程中混合了多种奖励函数的设计方法,并且尝试从结果监督转向过程监督,在中间过程进行打分 使用的搜索策略:基于树的搜索和基于顺序修改的搜索 R1 R1-Zero 是从基础模型开始,完全由强化学习驱动,不…...
Spring Boot统一异常拦截实践指南
Spring Boot统一异常拦截实践指南 一、为什么需要统一异常处理 在Web应用开发中,异常处理是保证系统健壮性和用户体验的重要环节。传统开发模式中常见的痛点包括: 异常处理逻辑分散在各个Controller中错误响应格式不统一敏感异常信息直接暴露给客户端…...
lmk内存压力测试工具mem-pressure源码剖析
背景: android系统开发过程中,经常会遇到一些low memory kill的问题,在分析这些系统低内存导致被杀问题时候,经常因为不好复现而成为一个比较烦恼的阻碍。因为这种低内存问题本身就不属于一种功能操作类型的问题,属于…...
物联网 STM32【源代码形式-ESP8266透传】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】
一、MQTT介绍 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅模式的轻量级通讯协议,构建于TCP/IP协议之上。它最初由IBM在1999年发布,主要用于在硬件性能受限和网络状况不佳的情…...
【大模型】AI 辅助编程操作实战使用详解
目录 一、前言 二、AI 编程介绍 2.1 AI 编程是什么 2.1.1 为什么需要AI辅助编程 2.2 AI 编程主要特点 2.3 AI编程底层核心技术 2.4 AI 编程核心应用场景 三、AI 代码辅助编程解决方案 3.1 AI 大模型平台 3.1.1 AI大模型平台代码生成优缺点 3.2 AI 编码插件 3.3 AI 编…...
Eclipse IDE 快捷键大全
文章目录 简介 ✨常用编辑快捷键 ⌨️基础编辑操作查找和定位代码优化 调试快捷键 🐛编辑器通用快捷键 📝窗口操作快捷键 🪟特殊功能快捷键 🔧重构相关快捷键 🔄提示 💡 简介 ✨ Eclipse 作为一款强大的集…...
ES面试题
1、Elasticsearch的基本构成: (1)index 索引: 索引类似于mysql 中的数据库,Elasticesearch 中的索引是存在数据的地方,包含了一堆有相似结构的文档数据。 (2)type 类型:…...
设置git区分大小写
设置git区分大小写 1.全局设置 (影响全部仓库): git config --global core.ignorecase false2.仓库级别设置 (影响当前仓库): git config core.ignorecase false3.已经提交了大小写不一致的文件处理: git mv -f OldName newName # 强制重命名 git commit -m "Fix cas…...
0205算法:最长连续序列、三数之和、排序链表
力扣128:最长连续序列 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 class Solution {public int longestConsecutive(in…...
VLAN 基础 | 不同 VLAN 间通信实验
注:本文为 “ Vlan 间通信” 相关文章合辑。 英文引文,机翻未校。 图片清晰度限于原文图源状态。 未整理去重。 How to Establish Communications between VLANs? 如何在 VLAN 之间建立通信? Posted on November 20, 2015 by RouterSwi…...
DeepSeek各版本说明与优缺点分析
DeepSeek各版本说明与优缺点分析 DeepSeek是最近人工智能领域备受瞩目的一个语言模型系列,其在不同版本的发布过程中,逐步加强了对多种任务的处理能力。本文将详细介绍DeepSeek的各版本,从版本的发布时间、特点、优势以及不足之处࿰…...
DS图(中)(19)
文章目录 前言一、图的遍历广度优先遍历深度优先遍历 二、最小生成树Kruskal算法Prim算法两种方法对比 总结 前言 承上启下,我们来学习下图的中篇!!! 一、图的遍历 图的遍历指的是遍历图中的顶点,主要有 广度优先遍历 …...
协同探索与导航文献整理
文章目录 1.SOAR:异构无人机协同探索与拍摄以实现快速自主重建2. RACER: 一种使用分散式无人机群进行快速协同探索的方法3. 使用协作式纳米无人机在非结构化环境中进行最小感知探索4.GVP-MREP:通过动态拓扑图上的 Voronoi 分区进行快速且通信高效的多无人机探索5.森林的快速多无…...
排序算法--计数排序
唯一种没有比较的排序(指没有前后比较,还是有交换的)。统计每个元素出现的次数,直接计算元素在有序序列中的位置,要求数据是整数且范围有限。适用于数据为小范围整数(如年龄、成绩),数据重复率较高时效率更优。可用于小…...
吴恩达深度学习——对象检测
内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 对象定位特征点检测基于滑动窗口的目标检测算法原理将全连接层转化成卷积层通过卷积实现滑动窗口检测算法 YOLOBounding Box预测交并比非极大值抑制Anchor BoxYOLO检测训练集中预…...
BUU19 [BJDCTF2020]Easy MD51
题目 当点进去不知道干啥的时候:1.看源代码 2.抓包 3.看网络请求 F12 用bp抓包,在response消息头中有hint提示: select * from admin where passwordmd5($pass,true) 如果md5($pass,true)后是 or 1 那么整句话就是password or 1&a…...
蓝桥杯刷题DAY2:二维前缀和 一维前缀和 差分数组
闪耀的灯光 📌 题目描述 蓝桥公园是一个适合夜间散步的好地方,公园可以被视为由 n m 个矩形区域构成。每个区域都有一盏灯,初始亮度为 a[i][j]。 小蓝可以选择一个大的矩形区域,并按下开关一次,这将使得该区域内每盏…...
HTB:EscapeTwo[WriteUP]
目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…...
vue 引入百度地图和高德天气 都得获取权限
vue接入百度地图---获取ak https://blog.csdn.net/qq_57144407/article/details/143430661 vue接入高德天气, 需要授权----获取key https://www.jianshu.com/p/09ddd698eebe...
AI大模型:DeepSeek
近期DeepSeek产生了很大的影响力。首先来自于性能,给了业内一个很好的释放,缓解了HPC以及大规模集群被卡的焦虑。通过实验证实了小规模团队(公开资料显示规模约150左右)在资源受限的情况下(2M H100 GPU时),依然可以完成对领先大模型的实现与部署。后续观察该团队是否可以…...
LeetCode - #198 打家劫舍
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
从离散傅里叶变换(DFT)到快速傅里叶变换(FFT)
摘要 离散傅里叶变换(DFT)是数字信号处理领域中分析信号频域特性的重要工具,但直接计算DFT的复杂度较高,限制了其在大规模数据处理中的应用。快速傅里叶变换(FFT)的出现显著降低了计算复杂度,极…...
【STM32】HAL库USB虚拟U盘MSC配置及采用自带的Flash作为文件系统
【STM32】HAL库USB虚拟U盘MSC实现配置及采用自带的Flash作为文件系统 本文将自带的Flash作为文件系统 通过配置USB的MSC功能实现虚拟U盘 没有单独建立FATFS文件系统 仅仅是配置USB和Flash读写而已 当然 这里也可以用外部Flash等等 也可以配置文件系统来进行套壳 但总体而言不如…...
Math Reference Notes: 符号函数
1. 符号函数的定义 符号函数(Sign Function) sgn ( x ) \text{sgn}(x) sgn(x) 是一个将实数 ( x ) 映射为其 符号值(即正数、负数或零)的函数。 它的定义如下: sgn ( x ) { 1 如果 x > 0 0 如果 x 0 − 1 如…...
拉格朗日乘数法算法详解Python实现
目录 一、拉格朗日乘数法算法详解1.1 基本思想1.2 数学推导1.3 算法步骤1.4 算法在编程中的实现 二、案例分析案例一:二维最优化问题——求 f ( x , y ) x 2 y 2 f(x,y)x^2y^2 f(x,y)x2y2 在约束 x y 1 xy1 xy1 下的极值2.1.1 问题描述2.1.2 数学模型构建2.1.…...
ip属地是手机号还是手机位置?一文理清
在数字化和网络化的今天,IP属地这一概念逐渐成为了人们关注的焦点。特别是在社交媒体和在线平台上,IP属地的显示往往让人联想到用户的地理位置。然而,关于IP属地到底与手机号还是手机位置有关,却存在着不少误解和混淆。本文将深入…...
C++常用拷贝和替换算法
算法简介: copy // 容器内指定的元素拷贝到另一容器replace // 将容器内指定范围的旧元素改为新元素replace_if // 容器内指定范围满足条件的元素替换为新元素swap //互换两个容器的元素 1. copy 功能描述: 将容器内指定范围的数据拷贝到另一容器中函…...
vue项目搭建
1.准备工作,按照下面的安装一下脚手架vue-cli node16安装vue-cli时报错:需要node>20(但根本就不是版本问题)-CSDN博客文章浏览阅读157次,点赞4次,收藏2次。这种情况我碰到不下5次了,…...
Java进阶面试八股文
1、Java SE和Java EE区别? Java SE 是 Java 的基础版本,Java EE 是 Java 的高级版本。Java SE 更适合开发桌面应用程序或简单的服务器应用程序,Java EE 更适合开发复杂的企业级应用程序或 Web 应用程序。 2、JVM和JRE和JDK区别?…...
Python Django 嵌入 Grafana Dashboard(随手记)
作为一名网络工程师/运维工程师,现在都在往DevOps的方向发展。其中大家都不可避免的会往自己开发平台的方向发展。 那么如何将自己制作的 Grafana 面板 引入到自己的平台上? 一般来说,大家都会选择Python来作为自己开发的语言,并会…...
[Android] IKTV专享版
[Android] IKTV专享版 链接:https://pan.xunlei.com/s/VOILXXuEd3ASo93c88UW79sxA1?pwd4tsw# 2025年2月最新免费K歌神器!家庭KTV软件,手机平板电视盒子电脑都可用...
阿里 Java 岗个人面经分享(技术三面 + 技术 HR 面):Java 基础 +Spring+JVM+ 并发编程 + 算法 + 缓存
技术一面 20 分钟 1、自我介绍 说了很多遍了,很流畅捡重点介绍完。 2、问我数据结构算法好不好 挺好的(其实心还是有点虚,不过最近刷了很多题也只能壮着胆子充胖子了) 3、找到单链表的三等分点,如果单链表是有环的…...
C++多线程编程——call_once和单例模式
目录 1. 前言 2. call_once和once_flag 3. 后记 3.1 单例类的析构问题 3.2 饿汉式单例模式的线程安全问题 1. 前言 之前在讲解单例模式时,有提到懒汉式单例模式使用了双重检测Double-Checked Locking Pattern (DCLP)来解决多线程的安全访问问题。但是该方法也…...
vue2-为啥data属性是一个函数而不是对象
vue2-为啥data属性是一个函数而不是对象 1. data在vue实例和组件中的表现差异 vue实例的时候,data既可以是一个对象也可以是一个函数 new Vue({data:{//对象name:tom},data(){//函数return{name:tom}} })而在组件中定义data,只能是函数,如…...
Spark--算子执行原理
一、sortByKey SortByKey是一个transformation算子,但是会触发action,因为在sortByKey方法内部,会对每个分区进行采样,构建分区规则(RangePartitioner)。 内部执行流程 1、创建RangePartitioner part&…...
keil 单步调试
一、常见错误分析 warningerror警告错误 不影响编译过程 能够输出Hex文件 无法完成编译 不输出Hex文件 注意的是,warning的信息是要去关注的。 下面的UNCALLED SEGMENT除外 二、单步调试配置 1、在keil中添加单片机型号 本文不详细介绍,如有需要可查看这篇文章:...
html的字符实体和颜色表示
在HTML中,颜色可以通过以下几种方式表示,以下是具体的示例: 1. 十六进制颜色代码 十六进制颜色代码以#开头,后面跟随6个字符,每两个字符分别表示红色、绿色和蓝色的强度。例如: • #FF0000:纯红…...
[数据结构] 线性表和顺序表
目录 线性表 顺序表的实现 顺序表各个方法的实现 boolean isFull() -- 判断数组是否放满 : void add(int data) -- 在数组末尾插入新元素 : void add(int pos,int data) -- 在指定位置插入元素 : boolean contain(int toFind) -- 判断是否包含某个元素 int indexOf(in…...
第12章:基于TransUnet和SwinUnet网络实现的医学图像语义分割:腹部13器官分割(网页推理)
目录 1. 前言 2. TransUnet 和 SwinUnet 3. 腹部多器官分割 4. 训练 5. 推理 6. 项目下载 1. 前言 TransUNet 是一种用于医学图像分割的混合架构,结合了 Transformer 和 U-Net 的优势。它利用 Transformer 的全局上下文建模能力和 U-Net 的精确定位特性&…...
DS图(下)(19)
文章目录 前言一、最短路径的概念二、单源最短路径-Dijkstra算法三、单源最短路径-Bellman-Ford算法四、多源最短路径-Floyd-Warshall算法总结 前言 加油,今天就是图的最后一篇了,撑住!! 今天我们要学的就是最短路径问题&…...
鸿蒙Harmony-Progress组件概述
鸿蒙Harmony-Progress组件概述 1.1Progress组件概述 作用:显示操作或任务的进度,支持线性,环形,刻度等多种样式适用场景:文件上传/下载、任务完成度、系统状态反馈等 2.1基础属性(参考官方文档ÿ…...
流数据库中的RisingWave和Materialize
流数据库(Streaming Database)是一种专门设计用于处理大量实时流数据的数据库,它能够在数据生成时立即进行处理,从而实现实时洞察和分析。RisingWave和Materialize都是这一领域的代表性技术。RisingWave和Materialize都是强大的流…...
【C++】多态详细讲解
本篇来聊聊C面向对象的第三大特性-多态。 1.多态的概念 多态通俗来说就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态)。 编译时多态:主要就是我们前⾯讲的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同的函数,通…...
防火墙的安全策略
1.VLAN 2属于办公区;VLAN 3属于生产区,创建时间段 [FW]ip address-set BG type object [FW-object-address-set-BG]address 192.168.1.0 mask 25 [FW]ip address-set SC type object [FW-object-address-set-SC]address 192.168.1.129 mask 25 [FW]ip address-se…...