热门标签 | 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学习之路上的资料系




推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 本文详细介绍了相机防抖的设置方法和使用技巧,包括索尼防抖设置、VR和Stabilizer档位的选择、机身菜单设置等。同时解释了相机防抖的原理,包括电子防抖和光学防抖的区别,以及它们对画质细节的影响。此外,还提到了一些运动相机的防抖方法,如大疆的Osmo Action的Rock Steady技术。通过本文,你将更好地理解相机防抖的重要性和使用技巧,提高拍摄体验。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
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社区 版权所有