Java学习笔记, 不断更新

时间:2022-07-23
本文章向大家介绍Java学习笔记, 不断更新,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

SXF

目录

文章目录
  • 基本数据类型
  • 创建字符串String
  • 字符串操作
  • 输入: Scanner()
  • .hasNext()
  • .hasNextInt()
  • .next()
  • .nextLine()
  • 字符切割:split()
  • 使用一个或多个空格分割字符串
  • String 转换成 int
  • int 转换成 String
  • Char[] 转换成 String
  • bytes[]转换成String
  • String 转换成 Char[]
  • String 转换成 Int[]
  • 数组[]转list
  • float取整
  • 获取数组最大值
  • 函数迭代示例
  • HashMap方法
  • 数组sort排序
  • list集合sort排序
  • 倒序输出
  • 捕捉异常
  • 数组快速打印
  • 两个数组间复制
  • Java引用类型
  • 静态区、堆区、栈区、文字常量区
  • 权限修饰符
  • Jsoup(HTML解析器)
  • Jsoup下载文件
  • File类
  • 进制转换

  • MQTT

基本数据类型

数据类型

内存空间(1字节=8位)

Boolean

8位/16位

byte

8位

char

16位

short

16位

int

32位

long

64位

float

32位

double

64位

创建字符串String
1、String s = new String({'g','o','o','d'});
2、String s = new String("good");
3、String s = new String({'g','o','o','d'}, 2, 1); // 从2开始取1个
4、String s;
  s = "good";
字符串操作
str.indexOf("g");								// 查找第一次索引位置
str.lastIndexOf("g");						// 查找最后一次出现的索引位置
str.length;											// 字符串长度
str.charAt(index);							// 获取指定位置的字符
str.substring(beginIndex);			// 获取子字符串
str.substring(index1, index2);	// 获取子字符串
str.trim();											// 去除前后空格
str.replace(old, new);					// 字符串替换
str.startsWith(string);					// 判断字符串的开始
str.endsWith(string);						// 判断字符串的结尾
str.equals(str2);								// 判断字符串相等
str.equalsIgnoreCase(str2);			// 忽略大小写的判断字符串相等
str.compareTo(str1);						// 比较字符串
str.toLowerCase();							// 转为小写
str.toUpperCase();							// 转为大写
str.split(str);									// 字符串分割
str.format(str, args);					// 格式化字符串
输入: Scanner()
Scanner scan = new Scanner(System.in)
.hasNext()

判断是否存在下一个输入,返回bool类型。

.hasNextInt()

判断下一个输入是否为Int型,返回bool类型。

.next()

取下一个输入值,遇到结束符停止(空格键、Tab键或Enter键等)。

.nextLine()

取下一行输入值,遇到Enter键停止,可以获得空白。

字符切割:split()

(1)split表达式,就是一个正则表达式。* ^ | 等符号在正则表达式中属于一种有特殊含义的字符,如果使用此种字符作为分隔符,必须使用转义符即 加以转义。 (2)如果使用多个分隔符则需要借助 | 符号,如 “^|@|#”,但需要转义符的仍然要加上分隔符进行处理。

使用一个或多个空格分割字符串
str.split("\s+");
String 转换成 int
1). int i = Integer.parseInt([String]);//遇到不能被转换为整型的字符时,会抛出异常
或
i = Integer.parseInt([String],[int radix]);//radix为进制数

2). int i = Integer.valueOf(str).intValue();
int 转换成 String
1.) String s = String.valueOf(i);

2.) String s = Integer.toString(i);

3.) String s = "" + i;
Char[] 转换成 String
String str = String.copyValueOf(charArray)
bytes[]转换成String
new String(bytes[]);
String 转换成 Char[]
char[] arr = str.toCharArray()
String 转换成 Int[]
int[] arr = Arrays.stream(str.split(" "))
                .mapToInt(Integer::parseInt)
                .toArray();
或
String[] strSplit = str.split(" ");
int[] intArray = new int[strSplit.length];
for(int i=0; i<intArray.length; i++){
    intArray[i] = Integer.parseInt(strSplit[i]);
}
数组[]转list
List<String> list = Arrays.asList(stringArray);
List<int[]>  list = Arrays.asList(intArray);
float取整
// 1、向下取整:floor
	Math.floor(1.7); // 1
// 2、向上取整:ceil
	Math.ceil(1.3);  // 2
// 3、四舍五入取整:round
	Math.round(1.3); // 1
	Math.round(1.7); // 2  
获取数组最大值
int max = Arrays.stream(arr).max().getAsInt();
函数迭代示例
// 输入: 一个整数,当月利润。
// 输出: 一个整数,奖金。
// 利润低于或等于100000元的,奖金可提10%;
// 100000<I≤200000时,低于100000元的部分按10%提成,高于100000元的部分,可提成 7.5%;
// 200000<I≤400000时,低于200000元部分仍按上述办法提成,(下同),高于200000元的部分按5%提成;
// 400000<I≤600000时,高于400000元的部分按3%提成;
// 600000<I≤1000000时,高于600000元的部分按1.5%提成;
// I>1000000时,超过1000000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。
static double solve(int val)
{
	if (val < 0) return 0;
	if (val <= 100000){
		return (val*0.1);
  }else if (val>100000 && val<=200000){
    return (val-100000)*0.075+solve(val-100000);
  }else if (val>200000 && val<=400000){
    return (val-200000)*0.05+solve(val-200000);
  }else if (val>400000 && val<=600000){
    return (val-400000)*0.03+solve(val-400000);
  }else if (val>600000 && val<=1000000){
    return (val-600000)*0.015+solve(val-600000);
  }else{
    return (val-1000000)*0.01+solve(val-1000000);
  }
}
public static void main(String[] arg)
{
  Scanner scanner = new Scanner(System.in);
  if (scanner.hasNextInt()){
    System.out.println((int)solve(scanner.nextInt()));
  }
}
HashMap方法
.put(Object key,Object value)// 添加元素
.putAll(Collection c) 			 // 添加元素,map1.putAll(map2)
.get(Object key) 						 // 根据键来获取对应的值
.containsKey(Object key) 		 // 检测是否存在指定key的元素
.containsValue(Object value) // 检测是否存在指定value的映射
.remove(Object key) 				 // 根据key的值删除指定的元素
.values()										 // 返回值的集合
.isEmpty()									 // 测试元素是否为空
.clone() 										 // 返回此HashMap实例的浅层副本:键和值本身未克隆
.entrySet()									 // 将映射关系返回到Set中,通过Iterator或foreach输出,Set<String> set = map1.entrySet();
.keySet()										 // 将映射中所包含的键返回到Set中,通过Iterator或foreach输出,Set<String> set = map1.keySet();
.replace(K key, V oldValue, V newValue) // 替换指定键的项
.size() 										 // 返回此映射中的键值映射数
.putIfAbsent(K key, V value) // key不存在才put,存在就跳过
.getOrDefault(Object key, V defaultValue) // 返回指定键映射到的值,如果此映射不包含键的映射,则返回defaultValue  
数组sort排序
1.Array.sort(int[] a) // 直接对数组进行升序排序
2.Array.sort(int[] a , int fromIndex, int toIndex) // 对数组的从fromIndex到toIndex进行升序排序
list集合sort排序
// 注意,要想改变默认的排列顺序,不能使用基本类型(int,double, char),而要使用它们对应的类
1、降序排列
Collections.sort(list, new Comparator<ResultTypeDesc>() {
  public int compare(ResultTypeDesc o1, ResultTypeDesc o2{
    return o2.getRatio().compareTo(o1.getRatio());
  }
});
或
Arrays.sort(list, Collections.reverseOrder());
  
2、进行升序排列
Collections.sort(list, new Comparator<ResultTypeDesc>() {
  public int compare(ResultTypeDesc o1, ResultTypeDesc o2){
    return o1.getRatio().compareTo(o2.getRatio());
  }
});
倒序输出
// 注意,要想改变默认的排列顺序,不能使用基本类型(int,double, char),而要使用它们对应的类
1、list集合:
Collections.reverse(list); // 仅针对引用类型
System.out.println(list);

2、字符串:
StringBuffer stringBuffer = new StringBuffer(str);
stringBuffer.reverse();
捕捉异常
try{
  // 程序代码块
}
catch(Exception e){
  e.printStackTrace();  // 打印异常信息
  // 异常处理代码块
}
finally{
  // 始终执行代码块
}
数组快速打印
// 打印一维数组
System.out.println(Arrays.toString(arr)); 

// 可打印多维数组
System.out.println(Arrays.deepToString(arr)); 
两个数组间复制
// 直接 = ,则是引用的复制,改变一个,另一个也会变:
int[] a={1,2,3,4,5};
int[] b=a;

// 若要复制值,则可用:
int[] b=Arrays.copyOf(a, a.lenght);
// 或
System.arraycopy(src, srcPos, dest, destPos, length);
// 或
int[] b = (int[]) a.clone(); // 注意clone要使用强制转换
Java引用类型

Java 中的“引用”,类似于C 和 C++ 里的“指针”。 类、接口类型、数组类型、枚举类型、注解类型

基本数据类型:在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上。
引用数据类型:在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。
静态区、堆区、栈区、文字常量区

静态区: 保存自动全局变量和 static 变量(包括 static 全局和局部变量)。静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配。 ​ 堆区: 一般由程序员分配释放,由 malloc 系列函数或 new 操作符分配的内存,其生命周期由 free 或 delete 决定。在没有释放之前一直存在,直到程序结束,由OS释放。其特点是使用灵活,空间比较大,但容易出错 ​ 栈区: 由编译器自动分配释放,保存局部变量,栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁,其特点是效率高,但空间大小有限 ​ 常量区: 常量字符串就是放在这里的。 程序结束后由系统释放。

权限修饰符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pscmC35G-1583850660847)(C:UsersSXFAppDataRoamingTyporatypora-user-imagesimage-20200226213729890.png)]

Jsoup(HTML解析器)
继承关系:Document继承Element继承Node。TextNode继承Node。
->java.lang.Object
	->org.jsoup.nodes.Node
		->org.jsoup.nodes.Element
			->org.jsoup.nodes.Document
html文档:Document
元素操作:Element
节点操作:Node

官方API:https://jsoup.org/apidocs/org/jsoup/nodes/Document.html
  
一、解析HTML并取其内容
	Document doc = Jsoup.parse(html);

二、解析一个body片断
  Document doc = Jsoup.parseBodyFragment(html);
  Element body = doc.body();

三、从一个URL加载一个Document
  Document doc = Jsoup.connect("http://example.com")
    .data("query", "Java")
    .userAgent("Mozilla")
    .cookie("auth", "token")
    .timeout(3000)
    .post();
  String title = doc.title();

四、从一个文件加载一个文档
  File input = new File("/tmp/input.html");
  // baseUri 参数用于解决文件中URLs是相对路径的问题。如果不需要可以传入一个空的字符串
  Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");  

五、使用DOM方法来遍历一个文档
  1、查找元素
  getElementById(String id)
  getElementsByTag(String tag)
  getElementsByClass(String className)
  getElementsByAttribute(String key) // 和相关方法
  // 元素同级
  siblingElements()
  firstElementSibling()
  lastElementSibling()
  nextElementSibling()
  previousElementSibling()
  // 关系
  parent()
  children()
  child(int index)

	2、元素数据
  // 获取属性attr(String key, String value)设置属性
	attr(String key)
  // 获取所有属性
  attributes()
  id()
  className()
  classNames()
  // 获取文本内容text(String value) 设置文本内容
	text()
  // 获取元素内HTMLhtml(String value)设置元素内的HTML内容
	html()
  // 获取元素外HTML内容
	outerHtml()
  // 获取数据内容(例如:script和style标签)
	data()
	tag()
  tagName()

	3、操作HTML和文本
	append(String html)
  prepend(String html)
	appendText(String text)
  prependText(String text)
  appendElement(String tagName)
  prependElement(String tagName)
  html(String value)
  
六、使用选择器语法来查找元素(类似于CSS或jquery的选择器语法)
  //带有href属性的a元素
  Elements links = doc.select("a[href]"); 
  //扩展名为.png的图片
  Elements pngs = doc.select("img[src$=.png]");
  //class等于masthead的div标签
  Element masthead = doc.select("div.masthead").first(); 
  //在h3元素之后的a元素
  Elements resultLinks = doc.select("h3.r > a"); 

七、从元素抽取属性、文本和HTML
  1、要取得一个属性的值,可以使用Node.attr(String key) 方法
  2、对于一个元素中的文本,可以使用Element.text()方法
  3、对于要取得元素或属性中的HTML内容,可以使用Element.html(), 或 Node.outerHtml()方法
  4、其他:
    Element.id()
    Element.tagName()
    Element.className()
    Element.hasClass(String className)
Jsoup下载文件
Connection.Response imgRes = Jsoup.connect(str).ignoreContentType(true).execute();
FileOutputStream out = (new FileOutputStream(new java.io.File("file.jpg")));
// imgRes.body() 就是图片数据
out.write(imgRes.bodyAsBytes());
out.close();
File类

java.io.File类用于表示文件或目录。

创建File对象:
// 文件/文件夹路径对象
	File file = new File("E:/...");
// 父目录绝对路径 + 子目录名称
	File file = new File("..." ,"");
// 父目录File对象 + 子目录名称  
	File file = new File("...","...");

序号

方法描述

1

public String getName() 返回由此抽象路径名表示的文件或目录的名称。

2

public String getParent()****、 返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回 null。

3

public File getParentFile() 返回此抽象路径名的父路径名的抽象路径名,如果此路径名没有指定父目录,则返回 null。

4

public String getPath() 将此抽象路径名转换为一个路径名字符串。

5

public boolean isAbsolute() 测试此抽象路径名是否为绝对路径名。

6

public String getAbsolutePath() 返回抽象路径名的绝对路径名字符串。

7

public boolean canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。

8

public boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。

9

public boolean exists() 测试此抽象路径名表示的文件或目录是否存在。

10

public boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。

11

public boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。

12

public long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。

13

public long length() 返回由此抽象路径名表示的文件的长度。

14

public boolean createNewFile() throws IOException 当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件。

15

public boolean delete() 删除此抽象路径名表示的文件或目录。

16

public void deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。

17

public String[] list() 返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。

18

public String[] list(FilenameFilter filter) 返回由包含在目录中的文件和目录的名称所组成的字符串数组,这一目录是通过满足指定过滤器的抽象路径名来表示的。

19

public File[] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。

20

public File[] listFiles(FileFilter filter) 返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器。

21

public boolean mkdir() 创建此抽象路径名指定的目录。

22

public boolean mkdirs() 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。

23

public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。

24

public boolean setLastModified(long time) 设置由此抽象路径名所指定的文件或目录的最后一次修改时间。

25

public boolean setReadOnly() 标记此抽象路径名指定的文件或目录,以便只可对其进行读操作。

26

public static File createTempFile(String prefix, String suffix, File directory) throws IOException 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。

27

public static File createTempFile(String prefix, String suffix) throws IOException 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。

28

public int compareTo(File pathname) 按字母顺序比较两个抽象路径名。

29

public int compareTo(Object o) 按字母顺序比较抽象路径名与给定对象。

30

public boolean equals(Object obj) 测试此抽象路径名与给定对象是否相等。

31

public String toString() 返回此抽象路径名的路径名字符串。

进制转换
// 10进制转2进制,返回一个二进制字符串
  Integer.toBinaryString(n);	
// 10进制转8进制,返回一个八进制字符串
  Integer.toOctalString(n);	
// 10进制转16进制,返回一个16进制字符串
  Integer.toHexString(n);	
// 10进制转 r 进制,返回一个r进制字符串
  Integer.toString(100, 16);	
// 2进制转10进制
  Integer.valueOf("0101", 2).toString();
// 8进制转成10进制
  Integer.valueOf("876", 8).toString();
// 16进制转成10进制
  Integer.valueOf("FFFF", 16).toString();
// r进制的字符串s转10进制
  Integer.parseInt((String) s, (int) r);

MQTT

基类

介绍

MqttClient

同步调用客户端,使用阻塞方法与MQTT服务器通信

MqttAsyncClient

异步调用客户端,使用非阻塞方法与MQTT服务器通信,允许操作在后台运行

MqttClientPersistence

表示持久性数据存储,用于存储正在传输的出站和入站消息,从而实现向指定的QoS的传递。 可以使用 MqttClient指定此接口的实现,MqttClient将使用该实现来持久保存QoS为1和2消息

MqttConnectOptions

保存控制客户端连接到服务器的方式的选项集,包括用户名、密码等

MqttMessage

MQTT消息,保存应用程序有效负载和指定消息如何传递的选项消息