热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java多线程编程_Java学习中注解与多线程,网络编程与XML技术

本部分内容主要有集合框架及泛型,实用类,输入和输出处理,注解与多线程,网络编程与XML技术。初次学习这部分会感觉很难

本部分内容主要有集合框架及泛型,实用类,输入和输出处理,注解与多线程,网络编程与XML技术。初次学习这部分会感觉很难,主要是概念难于理解,最好是多看看例子,多练习。下面是个人的总结 拉勾IT课小编为大家分解

一、集合框架及泛型

1、集合框架

是一套性能优良、使用方便的接口和类(位于包中)解决数组在存储上不能很好适应元素数量动态变化,查找效率低的缺陷

集合接口: Map、Collection(子接口List、Set) 、 Iterator

接口实现类:HashMap TreeMap 、ArrayList LinkedList、 HashSet TreeSet 实现map、list、set接口

集合工具类:Arrays 、Collections 提供对集合元素进行操作的算法

2、接口的区别

Collection 接口存储一组可重复,无序的对象(包括List Set接口)

通用方法:clear() 清除元素 isEmpty()判断集合是否为空

iterator() 获得集合的迭代器 toArray()集合转换为数组

List 接口存储一组可重复,有序的对象

Set 接口存储一组唯一,无序的对象

Map接口存储一组键值对象,键是唯一的,Map和Set很像

3、题外话:

如果在学习过程中遇到任何问题,可以看下我的公告栏,小编在线解答,助你起飞,还有我这段时间整理的一些Java学习手册,面试题,开发工具,PDF文档书籍教程,需要的话都可以免费分享!

4、接口实现类

  • ArrayList:在内存中分配连续的空间。根据下标遍历元素和随机访问元素的效率比较高,而增加和删除由于位置移动操作很慢

常用方法: add(Objiect o)在列表末尾顺序添加元素

get(int index) 返回指定索引位置处的元素

size() 返回列表中的元素个数

contains(Objiect o) 判断列表中是否存在指定元素

remove(Objiect o) 删除列表中的元素

  • LinkedList:采用链表存储方式。所有顺序查找的时候很慢,而插入、删除元素时无需移动位置,效率比较高

常用方法:addFirst(Objiect 0)在列表首部添加元素

addLast(Objiect 0)在列表尾部添加元素

getFirst()获得当前集合的第一个元素

getLast()获得当前集合的最后一个元素

removeFirst() 删除并返回列表中的第一个元素

removeFirst()删除并返回列表中的最后一个元素

  • TreeSet|TreeMap比较:底层是二叉树结构;

TreeMap、TreeSet都保存了对象的排列次序;

TreeSet只存储一个对象,而TreeMap存储两个对象Key和Value;

存储速度比Hash集合慢。

  • HashSet|HashMap比较:底层数据结构为哈希表;

HashMap存储键值对,键唯一,而HashSet仅仅存储对象,对象唯一;

HashMap使用唯一的键来获取对象,速度相对较快。

add(Objiect o) 添加对象

size() 返回元素个数

contains(Objiect o) 判断是否存在

remove(Objiect o) 移除有关对象

put(key,value)添加键值对

get(key) 获取与key有关的值

remove(key) 移除与key有关的映射,并返回旧值

containsKey( ) containsValue( )判断是否存在key value

size()返回元素个数

keySet()获取所有key的集合

values()获取所有values的集合

5、集合遍历

三种方法:普通for循环 增强for循环 Iterator迭代器遍历

(Object object : list) { (object); }

(int i &#61; 0 ;i<();i&#43;&#43;) { int j&#61; (Integer) (i); (j); }

3.Iterator iterator &#61; list.iterator();while(()){

int i &#61; (Integer) (); (i); }

Iterator方法&#xff1a;

HasNext()判断是否存在下一个可访问的元素&#xff0c;如果可以&#xff0c;返回true

Next() 返回要访问的下一个元素

6、Collections工具类

作用&#xff1a;实现对元素的排序、查找和替换操作

如果要比较一个类的对象之间的大小&#xff0c;必须要实现Comparable接口。

Comparable接口&#xff1a;对实现它的每个类的对象进行自然排序。

comparableTo(Object obj)方法&#xff1a;用于比较此对象与指定对象的顺序

返回值&#xff1a;0等于、1大于、-1小于指定对象obj

方法&#xff1a;

fill( ) 替换集合中所有元素为相同元素的方法

sort( ) 对集合进行排序的方法

binarySearch( ) 对集合进行查找的方法

max( )min( ) 查找最大值、最小值

7、泛型集合

  • 泛型即参数化类型&#xff0c;通过指定集合中的元素类型来实现约束

作用&#xff1a;将对象的类型作为参数&#xff0c;指定到其他类或者方法上&#xff0c;从而保证类型转换的安全性和稳定性

举例&#xff1a;List list&#61;new ArrayList( );

ArrayList students &#61; new ArrayList();

  • 典型的泛型集合&#xff1a;ArrayList、HashMap

泛型类&#xff1a; public class User{}

泛型接口&#xff1a;public interface Pair{}

泛型方法&#xff1a; public void getMiddle(T[] b) {} 注意的位置

在泛型中&#xff0c;基本类型是不可以做泛型参数&#xff0c;只能使用包装类、引用数据类型。

二、实用类

1、基本概念

Java API&#xff1a;Java应用程序的编程接口、Java帮助文档

实用类&#xff1a; 由Java API提供的常用类

学习这部分一定要多看 Java API 。Java帮助文档提供的常用包如下&#xff1a;

lang包&#xff1a;包含基础类和接口 如 Comparable接口 、包装类、 String、Math类

Util包&#xff1a;包含系统辅助类 如 Collection、Map接口、 Date、Arrays类

Io包&#xff1a; 与输入输出有关类 如 Serializable接口、File、Reader、Writer类

Net包&#xff1a;与网络有关类 如COOKIEStore接口 、Socket、URL、ServerSocket类

Sql包&#xff1a; 与数据库有关类 如 Statement接口、DriverManager、DriverPropertyInfo类

2、枚举

指由一组固定的常量组成的类型。使用enum关键字定义

举例&#xff1a;定义&#xff1a;public enum Genders{男,女} 调用&#xff1a;Genders.男

作用&#xff1a;类型安全、易于输入、代码清新

3、包装类

概念&#xff1a;把基本数据类型包装为对象&#xff0c;方便对象的操作&#xff0c;体现了java面向对象的特点。 ag&#xff1a;int→Integer char→Character byte→Byte

包装类作用&#xff1a;

  • 方便在各种类型之间的转化 如&#xff1a;int类型和String类型互相转换
  • 提供了基本数据类型的相关属性与方法 如&#xff1a;最小值、toString() 、valueOf()、equals()方法

常用方法&#xff1a;

toString()&#xff1a;将基本数据类型转换为字符串类型

valueOf()&#xff1a;静态的重载方法 将基本数据类型、字符串转换为包装类

parseInt()、parseBoolean()&#xff1a;把字符串转换为相应基本数据类型

4、类型转换

  • 基本类型转包装类&#xff1a;Integer i&#61;5;或 Integer i&#61;new Integer(5);或Integer i&#61;new Integer(“5”);或Integer i&#61;(“5”);

注意&#xff1a;除Character包装类外&#xff0c;都可以将字符串作为参数来构造实例

  • 包装类转基本类型&#xff1a;int intId&#61;();或int intId&#61;id&#xff1b;
  • 自动转换&#xff1a; Integer i&#61;5;//装箱 基本→包装 int j&#61;i;//拆箱 包装→基本

jdk 1.5以后&#xff0c;基本类型和包装类的转换&#xff0c;编译器会自动完成

5、String类

  • 在Java中&#xff0c;字符串常被作为String类型的对象来处理。
  • 创建String对象方法&#xff1a;

String a&#61;”hello”或String a &#61; new String(“hello”);

注意&#xff1a;第2个方法 &#xff0c;创建了两个对象&#xff1a;一个”hello”字符串对象&#xff0c;在堆内存中&#xff1b;一个s对象&#xff0c;在栈内存中。

判断&#xff1a; equals():判断两个字符串的内容是否相同

equalsIgnoreCase():判断两个字符串的内容是否相同&#xff0c;不区分大小写

contains(String s):判断一个字符串中是否包含另一个字符串

endsWith(String s):测试此字符串是否以指定的后缀结束

startsWith(String s):测试此字符串是否以指定的前缀开始

isEmpty():测试字符串是否为空

获取&#xff1a; int length():返回此字符串的长度

char charAt(int index):返回指定索引处的char值(字符)

int indexOf():返回指定字符(串)在此字符串中第一次出现处的索引

int lastIndexOf(int c):返回指定字符在此字符串中最后一次出现的索引

String substring(int beginIndex, int endIndex)返回一个新字符串&#xff0c;它是此字符串的一个子字符串,包含头不包含尾。

转换&#xff1a; byte[] getBytes()&#xff1a;从字符串到字节数组的方法

char[] toCharArray()&#xff1a;从字符串到字符数组的方法

String valueOf(数据类型):把该数据类型的数据转换成字符串

String toLowerCase()&#xff1a;把字符串转换成小写

String toUpperCase()&#xff1a;把字符串转换成大写

String concat(String str):将指定字符串连接到此字符串的结尾

替换分割&#xff1a; String replace(char oldChar, char newChar):用新字符替换旧字符

String[] split(String regex)&#xff1a;根据指定的字符串把一个字符串分割成一个字符串数组

String trim():去除字符串的前后空格

int compareTo(String anotherString)按字典顺序比较两个字符串

int compareToIgnoreCase(String str)按字典顺序比较两个字符串&#xff0c;不考虑大小写

6、StringBuffer

  • 相当于给字符串一个缓冲区&#xff0c;是String的增强类。对字符串频繁修改&#xff08;如字符串连接&#xff09;时&#xff0c;使用StringBuffer类可以大大提高程序执行效率。
  • StringBuffer声明

StringBuffer strb &#61; new StringBuffer();

StringBuffer strb &#61; new StringBuffer(“aaa”);

增加&#xff1a;append(“**”)&#xff1a;追加各种类型的数据到字符串之后

insert (1, “**”): 在容器指定位置插入各种类型的数据

删除&#xff1a;deleteCharAt() : 删除指定位置的字符

delete()&#xff1a; 清空StringBuffer的缓冲区

替换&#xff1a;replace()&#xff1a;用新字符替换旧字符

toString()&#xff1a;将StringBuffer类型的字符串转换为String类型的对象

获取&#xff1a;charAt() &#xff1a;返回指定索引处的char值(字符串)

length():返回此字符串的长度

  • 后提供了StringBuilder&#xff0c;等价StringBuffer。但是是单线程的&#xff0c;效率相对较高&#xff0c;但是不保证线程安全。

7、Math类

提供了常用的数学运算方法和两个静态常量E&#xff08;自然对数的底数&#xff09;和PI&#xff08;圆周率&#xff09;

常用方法&#xff1a;

abs():返回绝对值&#xff1b;

max()&#xff1a;返回最大值&#xff1b;

random()&#xff1a;返回随机数

ag&#xff1a;生成[0,10)区间的整数 int random &#61; (int)(()*10);

8、Random类

是产生随机数的一个类

常用方法&#xff1a;

Random() 创建一个新的随机数生成器。

Random(long seed) 使用单个种子创建一个新的随机数生成器。

注意&#xff1a;种子数只是随机算法的起源数字&#xff0c;和生成的随机数字的区间无关

ag&#xff1a;Random rand &#61; new Random(10);

int nextInt() 返回下一个伪随机数&#xff0c;它是此随机数生成器的序列中均匀分布的 int 值。

int nextInt(int n) 返回一个伪随机数&#xff0c;该值介于[0,n)的区间。

ag&#xff1a;生成[0,10)区间的整数 int num &#61; (10);

11、Scanner类

位于包&#xff0c;是获取从键盘的输入数据的一个类

Scanner(InputStream source) 创建一个用来解析基本类型和字符串的文本扫描器

ag&#xff1a;Scanner sc &#61; new Scanner(System.in);

hasNext() 判断扫描器中当前扫描位置后是否还存在下一段。

hasNextLine() 如果在此扫描器的输入中存在另一行&#xff0c;则返回 true。

nextInt() 将输入信息的下一个标记扫描为一个int&#xff0c;接受整型变量。

next() 以换行或空格符为分界线接收下一个String类型变量。如&#xff1a;输入hello world!,接收到的只是hello

nextLine() 以换行为分界线接收下一个String类型变量。如&#xff1a;输入hello world!,接收到的是hello word!

12、Date类

位于包&#xff0c;表示日期和时间的类

Date() 分配Date对象并初始化此对象&#xff0c;以表示分配它的时间&#xff08;精确到毫秒&#xff09;。

Date(long date) 分配Date对象并初始化此对象&#xff0c;以表示从标准基准时间&#xff08;即1970年1月1日00:00:00GMT&#xff09;以来的指定毫秒数。

int compareTo(Date anotherDate) 比较两个日期的顺序

boolean equals(Object obj) 比较两个日期的相等性。

13、SimpleDateFormat类

位于包&#xff0c;格式化和解析日期的具体类

固定写法&#xff1a;

//创建日期对象 Date date &#61; new Date();

//定制日期格式 SimpleDateFormat f&#61; new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);

String now &#61; (date); (now);

14、Calendar类

位于包&#xff0c;用于设置和获取日期/时间数据的特定部分

int get(int field) 返回给定日历字段的值

YEAR 指示年 MONTH 指示月

DAY_OF_MONTH 指示一个月中的某天

DAY_OF_WEEK 指示一个星期中的某天

三、输入/输出和反射

1、File类

位于java.io包&#xff0c;用来操作文件目录和属性

File(String pathname)指定文件路径

File(String dir,String subpath)dir参数指定目录路径&#xff0c;subpath参数指定文件名

File(File parent,String subpath)parent参数指定目录文件&#xff0c;subpath参数指定文件名

创建&#xff1a;

boolean createNewFile( ) 创建名称的空文件&#xff0c;不创建文件夹

boolean mkdir() 创建由该File对象表示的目录&#xff08;一级文件夹&#xff09;

boolean mkdirs() 创建包括父目录的目录&#xff08;二级文件夹&#xff09;

判断&#xff1a;

boolean exists( ) 判断文件或目录是否存在

boolean isFile( ) 判断是否是文件

boolean isDirectory( ) 判断是否是目录

获取&#xff1a;

String getPath( ) 返回此对象表示的文件的相对路径名

String getAbsolutePath( ) 返回此对象表示的文件的绝对路径名

String getName( ) 返回此对象表示的文件或目录的名称

String getParent() 返回此对象父目录的路径名&#xff1b;

long length() 返回文件的长度&#xff0c;单位为字节, 如果文件不存在&#xff0c;则返回0L

删除&#xff1a;

boolean delete( ) 删除此对象指定的文件或目录

2、相对路径与绝对路径

相对路径&#xff1a;从中间目录出发&#xff0c;到目前位置路径。

绝对路径&#xff1a;从根目录出发&#xff0c;到目前位置的路径。

3、Java IO流

指二进制的字节序列&#xff0c;是一连串流动的字符&#xff0c;是以先进先出方式发送信息的通道

分类&#xff1a;

(1)按照流操作的数据类型分为&#xff1a;字节流和字符流。

字节流是8 位通用字节流&#xff0c;字符流是16位Unicode字符流

(2)按照流的流向分为&#xff1a;输入流&#xff0c;输出流&#xff08;相对计算机程序而言&#xff0c;先入后出、先读后写&#xff09;

源数据源&#xff08;键盘、硬盘&#xff09;→输入流&#xff08;读&#xff09;→程序→输出流&#xff08;写&#xff09;→目标数据源&#xff08;控制台&#xff09;

4、IO流常用基类

注意&#xff1a;( )里面是子类 如File**类&#xff0c;Buffered**类

Buffered**类带有缓冲区&#xff0c;有按行读取内容的readLine()方法

字节输入流&#xff1a;InputStream (FileInputStream、BufferedInputStream)

字节输出流&#xff1a;OutputStream (FileOutputStream、BufferedOutStream)

字符输入流&#xff1a;Reader (FileReader、BufferedReader)

字符输出流&#xff1a;Writer (FileWriter、BufferedWriter)

5、常用基类的方法

void close() 关闭此输入流并释放与该流关联的所有系统资源

int read() 读取一个字节数据

int read(byte[] b) 读取一定数量的字节&#xff0c;并将其存储数组中

int read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节&#xff0c;保存到字节数组b中

void close() 关闭此输出流并释放与此流有关的所有系统资源

write(int b) 写入一个字节数据

void write(byte[] b) 写入数组b的所有字节

void write(byte[] b, int off, int len)将字节数组中从偏移量 off 开始的 len 个字节写入到输出流

void close() 关闭输入流

int read() 读取单个字符

int read(char[] c) 将长度的字符读入数组c中

int read(char[] c, int off, int len) 将最多len长度的字符读入数组c&#xff0c;保存位置从off位置开始

void close() 关闭输出流

void flush() 刷新输出流

int read() 读取单个字符。

int read(char[] cbuf) 将字符读入数组

int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分

6、节点流与包装流

节点流&#xff1a;创建对象时&#xff0c;参数是字符串或File类对象

包装流:创建对象时&#xff0c;参数是流对象。

包装的作用&#xff1a;1.提高效率 2.方便书写代码

7、使用字节流读写文本文件

//构造字节输入流对象

FileInputStream fis&#61; new FileInputStream(“c:\”);

//循环读取文件数据 最后关闭流对象();

(“可读取的字节数”&#43;());

byte []buf &#61; new byte[1024]; int len&#61;0;

while((len&#61;(buf))>0){ (buf, 0, len); }

//构造字节输入流对象

FileOutputStream fos&#61;new FileOutputStream(“f:/”);

//把数据写入文本文件 最后关闭流对象();

int num&#61;12345;String s&#61;(num);

((), 0, ().length);

8、使用字符流读写文本文件

  • 使用FileReader/BufferedReader读取文件

//创建FileReader/BufferedReader对象

Reader fr&#61; new FileReader(“D:\myDoc\简介.txt”);//节点流

BufferedReader br&#61;new BufferedReader(fr); //包装流

//调用readLine()方法读取文本文件的数据 最后关闭流对象

String s&#61;null; while((s&#61;())!&#61;null){…}

  • 使用FileWriter/BufferedWriter写文件

//创建FileWriter/BufferedWriter对象

FileWriter fw&#61; new FileWriter(“D:\myDoc\简介.txt”);

BufferedWriter bw&#61;new BufferedWriter(fw);

//调用write()方法写文本文件的数据 最后关闭流对象

(); ();

9、解决读取时中文乱码

//使用InputStreamReader并设置编码格式

InputStreamReader fr&#61;new InputStreamReader(fis,”UTF-8”);

//以字节数组的形式读取

byte []buf &#61; new byte[1024]; (buf)

10、读写二进制文件

  • 使用FileInputStream/DataInputStream读取二进制文件

//构造数据输入对象

FileInputStream fis&#61;new FileInputStream(“C:\”);

DataInputStream dis&#61;new DataInputStream(fis);

//调用read()方法读取

(); ();

  • 使用FileOutputStream/DataOutputStream写二进制文件

//构造数据输出对象

FileOutputStream outFile&#61;newFileOutputStream(“C:\”);

DataOutputStream out&#61;new DataOutputStream(outFile);

//调用write()方法写入

(); ();

11、序列化与反序列化

序列化&#xff1a;将对象的状态写入到特定的流中的过程。对象—>流

反序列化&#xff1a;从特定的流中获取数据重新构建对象的过程。流—>对象

作用&#xff1a;Java对象序列化后&#xff0c;得到的二进制字节序列可以方便的保存到磁盘或者云上。二进制序列可以方便地跨平台传输&#xff0c;不用担心因平台问题而显示异常。

实现步骤&#xff1a;

1、实现Serializable接口

2、创建对象输出流ObjectOutputStream(序列化)/输入流ObjectInputStrean(反序列化)

3、调用writeObject()/readObject ()方法将对象写入文件(序列化)/读取对象(反序列化)

4、关闭对象输入流

注意&#xff1a;使用transient关键字修饰对象的某些属性时&#xff0c;这些属性将不再被序列化

12、java反射

反射&#xff1a;指java程序能自描述和自控制&#xff0c;它允许程序在运行时才加载、探知、使用编译期间完全未知的类

反射机制&#xff1a;指在运行状态中&#xff0c;动态获取类信息以及动态调用对象方法的功能

反射常用API&#xff1a;

Class类—可获取类和类的成员信息

Field类—可访问类的属性

Method类—可调用类的方法

Constructor类—可调用类的构造方法

使用反射的步骤&#xff1a;

1、导入.*;

2、获取需要操作类的Class对象

3、调用Class的方法获取Field、Method等对象

4、使用反射API进行操作

反射的应用&#xff1a;

获取Class对象&#xff1a;getClass()方法 ()方法 .class 方法

创建Class对象&#xff1a;newInstance()方法

访问类的属性&#xff1a;getXxx()方法 setXxx()方法

访问类的方法&#xff1a;getMethod()方法 invoke()方法

四、注解和多线程

1、注解

Java代码里的特殊标记。它为在代码中添加用Java程序无法表达的额外信息提供了一种形式化的方法。注解可以看成修饰符&#xff0c;修饰程序元素。

注解可以在编译、类加载、运行时被读取。而注释不会被程序所读取。

2、注解分类

(1)内建注解&#xff1a;标准注解类型;

&#64;Overrid 限定重写父类方法

&#64;Deprecated 标示已过时

&#64;SuppressWarnings 抑制编译器警告

(2)元注解: 修饰其他的注解定义

&#64;Target 指定被其修饰的注解能用于修饰哪些程序元素

&#64;Retention 指定该注解可使用反射读取

&#64;Documented 指定该注解将被JavaDoc工具提取成文档

&#64;Inherited 指定被其修饰的注解将具有继承性

(3)自定义注解: 注解类型是一种接口

使用关键字&#64;interface定义新注解

如&#xff1a;public &#64;interface AnnotationTest{}

3、读取注解信息

AnnotatedElement接口是所有程序元素的父接口&#xff0c;指定了程序中可以接受注解的程序元素。通过反射获取对象信息。

getAnnotation()方法&#xff1a;返回该程序元素上存在的、指定类型的注解

getAnnotations()方法&#xff1a;返回该程序元素上存在的所有注解

4、进程与线程

  • 程序&#xff1a;是对数据描述与操作的代码的集合。
  • 进程&#xff1a;指程序的一次动态执行过程。是系统运行程序的基本单位&#xff0c;有独立的内存空间和系统资源
  • 线程&#xff1a;指进程中的一个执行流程。是进程中执行运算的最小单位&#xff0c;真正在处理机上运行的是线程&#xff0c;一个进程中至少要有一个线程。
  • 线程创建与启动&#xff1a;

&#xff08;1&#xff09;继承类 如&#xff1a;class MyThread extends Thread{}

&#xff08;2&#xff09;实现接口 如&#xff1a;class MyThread implements Runnable{}

都需要重写run()方法&#xff0c;调用start()方法

MyThread myThread &#61; new MyThread(); new Thread(myThread).start();

5、线程状态

↙阻塞|睡眠状态↘

新生状态—>可运行状态<—>运行状态—>死亡状态

新生状态&#xff1a;线程对象已经创建&#xff0c;还没有在其上调用start()方法。

可运行状态&#xff1a;当线程有资格运行&#xff0c;但调度程序还没有把它选定为运行线程时线程所处的状态。

运行状态&#xff1a;线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态

等待/阻塞/睡眠状态&#xff1a;是线程有资格运行、只是没有条件使线程苏醒所处的状态。

死亡状态&#xff1a;当线程的run()方法完成时就认为线程死去

6、线程调度

多个线程处于可运行状态&#xff0c;线程调度会根据优先级来决定线程进入可运行状态的次序。

线程的优先级用1&#xff5e;10 表示&#xff0c;10的优先级最高&#xff0c;默认值是5

设置优先级&#xff1a;setPriority(int grade) 如&#xff1a;(3);

调度方法&#xff1a;

join()&#xff1a;将指定的线程加入到当前线程。先执行完调用该方法的线程再继续执行本线程

sleep()&#xff1a;当前线程在指定毫秒内停止执行而转入不可运行状态

yield()&#xff1a;当前线程转入暂时停止运行的状态

7、线程同步

当两个或多个线程需要访问同一资源时&#xff0c;需要以某种顺序来确保该资源某一时刻只能被一个线程使用。同步就相当于上锁&#xff0c;上了锁的线程首先访问资源&#xff0c;其他线程等待。

实现线程同步&#xff1a;

同步方法: 用synchronized关键字修饰的方法

public synchronized void save(){}

同步代码块: 用synchronized关键字修饰的代码块

synchronized(object){}

注意&#xff1a;多线程使用同步存在”死锁”的潜在危险。

死锁&#xff1a;如果多个线程都处于等待状态而无法被唤醒&#xff0c;就构成了死锁。比如同步方法里面有sleep()方法&#xff0c;那么这个锁就成了死锁。

8、线程通信

线程同步可以阻止并发访问同一资源&#xff0c;但不能实现不同线程之间的消息传递。所以需要用到线程通信。注意下面方法只能在同步方法或同步代码块中使用

wait()方法&#xff1a;

挂起当前线程&#xff0c;并释放共享资源的锁

notify()方法&#xff1a;唤醒线程

在因调用该对象的wait()方法而阻塞的线程中随机选择一个解除阻塞&#xff0c;但要等到获得锁后才可执行

notifyAll()方法&#xff1a;

将因调用该对象的wait()方法而阻塞的所有线程一次性全部解除阻塞

五、网络编程技术

1、基本概念

网络&#xff1a;是信息传输、接收、共享的虚拟平台&#xff0c;把各个点、面、体的信息联系到一起&#xff0c;从而实现资源共享

网络编程&#xff1a;通过使用套接字来达到进程间通信目的的编程

2、IP地址&#xff08;Internet Protocol&#xff09;

概念&#xff1a;唯一标识网络上的每一台计算机

IP组成&#xff1a;32位&#xff0c;由4个8位二进制数组成(ipv4)

–>192.168.1.200

IP地址&#61;网络地址&#43;主机地址

3、IP检测

查看IP地址&#xff1a;cmd—ipconfig

检测网络是否通畅&#xff1a;ping IP地址

4、DNS

域名解析器&#xff0c;把IP地址映射到域名。实现网站通过域名访问

5、网络服务器

指在网络环境下&#xff0c;具有较高计算能力&#xff0c;能够提供用户服务功能的计算机(邮件服务器&#xff1b;web服务器 如Apache Tomcat 阿里云)

客户机→服务器 &#xff08;Client/Server&#xff09; &#xff08; c/s&#xff09;

浏览器→服务器 &#xff08;Browser/Server&#xff09;&#xff08; b/s&#xff09;

6、网络通信协议

为了在网络中不同的计算机之间进行通信而建立的规则、标准或约定的集合

应用层 HTTP FTP TFTP SMTP SNMP DNS协议

传输层 TCP UDP 协议

网络层 ICMP IGMP IP ARP RARP 协议

数据链路层和物理层 由底层网络定义的协议

7、Socket编程

  • Socket(套接字)&#xff1a;是通信链路的端点。也是Java提供的接口。因为Socket的底层机制复杂&#xff0c;所以Java提供了API方便我们使用Socket编程
  • Socket通信模型&#xff1a;进行网络通信时&#xff0c;Socket需要借助数据流来完成数据的传递工作
  • 流式套接字&#xff1a;基于TCP协议的Socket网络编程

1、客户端Socket 类

//创建一个客户端Socket

Socket socket &#61; new Socket&#xff08;“localhost”&#xff0c;端口参数&#xff09;

//通过输出流&#xff0c;发送请求 getOutputStream( ) write&#xff08;&#xff09;

OutputStream os&#61;Socket.get OutputStream( );

byte[] infos&#61;();

(infos);

//关闭输出流

();

通过输入流&#xff0c;接收服务端响应

Inputstream is &#61; ();

//释放资源

2、服务器端ServerSocket类

//创建一个服务器Socket

ServerSocket serverSocket&#61;new ServerSocket(5000)

//使用accept&#xff08;&#xff09;方法等待客户的通信

Socket socket&#61;();

//获得输入流&#xff0c;获得客户端请求

InputStream is&#61;();

把获得的字节流包装成字符流

BufferedReader br&#61;new BufferedReader(new IputStreamReader(is));

//通过输出流&#xff0c;发送响应

OutputStream os &#61; socket. getOutputStream&#xff08;&#xff09;&#xff1b; (replys);

//释放相应资源

  • 数据包式套接字&#xff1a;基于UDP协议的Socket网络编程

①利用DatagramPacket对象封装数据包

②利用DatagramSocket发送数据包&#xff08;send&#xff08;&#xff09;&#xff09;

③利用DatagramSocket接收数据包&#xff08;receive&#xff08;&#xff09;&#xff09;

④利用DatagramPacket处理数据包

TCP UDP

是否连接 面向连接 面向非连接

传输可靠性 安全可靠 不可靠

速度 慢 快


六、XML技术

1、XML简介

XML(Extensibel Markup Language)&#xff1a;即可扩展标记语言&#xff0c;是一种简单的数据存储语言&#xff0c;使用一些列简单的标记描述数据。

特点&#xff1a;与操作系统、开发平台无关&#xff1b;规范统一

作用&#xff1a;数据交互&#xff1b;配置应用程序和网站&#xff1b;Ajax基石

2、XML基本结构

&#xff08;1&#xff09;XML声明。如&#xff1a;

&#xff08;2&#xff09;唯一的根元素。如&#xff1a;

&#xff08;3&#xff09;元素描述信息。 如

3、XML标签

<元素名 属性名 &#61; “属性值”>元素内容

如&#xff1a;

注意&#xff1a;属性值用双引号包裹。有多个属性用空格隔开

4、XML转义符

<对应转移符<> 对应转移符 >

”对应转移符" ’对应转移符'

& 对应转移符&

当元素中出现很多特殊字符时&#xff0c;可以使用CDATA节 &#xff1a;

5、XML解析器

非验证解析器&#xff1a;检查文档格式是否良好 (eclipse自带)

验证解析器&#xff1a; 使用DTD&#xff08;文档类型定义&#xff09;或Schema检查文档的有效性

6、XML命名空间

写法&#xff1a;

举例&#xff1a;xmlns:canon&#61;”canon” –XML命名空间

xmlns&#61;”Aptech_edu.ac” —属性命名空间

7、解析XML技术

DOM&#xff08;文档对象模型&#xff09;&#xff1a;把XML文档映射成一个倒挂的树

  • DOM&#xff1a;基于XML文档树结构的解析。适用于多次访问的XML文档。特点&#xff1a;比较消耗资源

步骤&#xff1a;

1.创建解析器工厂对象

DocumentBuilderFactory dbf&#61;( );

2.解析器工厂对象创建解析器对象

DocumentBuilder db &#61; ( );

3.解析器对象指定XML文件创建Document对象

Document document &#61; (“要解析的路径”)

4.以Document对象为起点操作DOM树

NodeList dogList&#61; (“节点”)

DOM接口方法

Document接口&#xff1a;

getElementById&#xff08;&#xff09;getElementsByTagName&#xff08;&#xff09; getElementsByName&#xff08;&#xff09;等方法

Node接口&#xff1a;

getparentNode() getchildNodes() getfirstChild() getlastChild()

getnextSibling () getpreviousSibling() createTextNode( ) removeChild()等方法

Element接口&#xff1a;

getTagName() createElement( )等方法

  • SAX&#xff1a;基于事件的解析。适用于大数据量的XML文档。特点&#xff1a;占用资源少&#xff0c;内存消耗小
  • DOM4J&#xff1a;非常优秀的Java XML API。性能优异、功能强大。特点&#xff1a;开放源代码

DOM4J解析XML方法

//创建SAXReader对象 SAXReader reader &#61; new SAXReader();

//获取XML文档对象 Document document &#61; (“xml/”);

//获取root(根)节点 Element root &#61; ();

//获取节点下的所有子节点集合 List users&#61;();

//遍历输出 for(Element user:users){…}

DOM4J创建XML方法

//创建了一个xml文档

Document document&#61;();

//创建一个根节点 和一个子节点 并添加属性

Element root&#61;(“users”);

Element user &#61; (“user”).addAttribute(“id”, “1”);

//设置子节点的文本

(“username”).addText(“zs”);

(“password”).addText(“111”);

//创建输出流对象

File file &#61; new File(“src/xml/”);

FileOutputStream out &#61; new FileOutputStream(file);

//创建一个XMLWriter的对象 调用write方法写入

writer&#61;new XMLWriter(out, ()); (document);

七、相关代码

这篇文章暂时总结到这里&#xff0c;后期会分享更多Java学习之路上的资料系




推荐阅读
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 在Ubuntu上安装MySQL时解决缺少libaio.so.1错误及libaio在MySQL中的重要性分析
    在Ubuntu系统上安装MySQL时,遇到了缺少libaio.so.1的错误。本文详细介绍了如何解决这一问题,并深入探讨了libaio库在MySQL性能优化中的重要作用。对于初学者而言,理解这些依赖关系和配置步骤是成功安装和运行MySQL的关键。通过本文的指导,读者可以顺利解决相关问题,并更好地掌握MySQL在Linux环境下的部署与管理。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
author-avatar
大爱走钢索的人_738
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有