Java从入门到精通2
2023-12-20 14:51:10 0 举报
AI智能生成
个人复习内容
作者其他创作
大纲/内容
集合类
集合类概述
集合与数组之间的不同是:数组长度是固定的,集合长度是可变的,数组是存放基本数据的,集合是存放对象的引用
Collection接口
Collection接口是层次结构中的根接口,够成Collection的单位称为元素。Collection接口通常不直接使用,但该元素提供了添加、删除、管理数据的方法。List接口跟Set接口都继承Collection接口,所以List接口跟Set接口通用。
Collection接口常用的方法
List集合
List接口的实现类
ArrayList类
底层逻辑是数组,保存所有元素。优点:查找速度快。缺点:向指定索引位置插入元素或删除对象的速度慢。
语法:List<E> list = new ArrayList<>();
linkedlist类
底层逻辑是链表结构。优点:向集合中插入或删除元素效率高。缺点:查找集合中的元素效率低
语法:List<E> list = new linkedList<>();
List增加的方法
Set集合
Set结口实现类
HashSet类
底层是由哈希表(实际是一个HashMap实例)支持。它不保证Set集合的迭代顺序,特别是它不保证该顺序恒久不变。允许使用null元素
语法:Set<> s = new HashSet<>();
TreeSet类
底层是红黑树结构。不仅实现了Set集合,还实现了java.util.SortedSet接口。在遍历时按照自然顺序递增排序,也可以按照指定比较器递增排序
语法:Set<> s = new TreeSet<>();
TreeSet增加的方法
Map集合
Map接口
Map接口的实现类
HashMap类
是基于哈希表的Map接口的实现。此实现提供所有可选的映射操作,允许null值和null键,必须保证键的唯一性。此类不保证映射的顺序,特别是它不保证该顺序恒久不变
语法:Map<key,value> m = new HashMap<>();
TreeMap类
实现了Map接口还实现了java.util.SortedMap接口,所以集合中有一定的顺序。在添加、删除和定位方面不如HashMap类。TreeMap类不允许键对象是null值
语法:Map<key,value> m = new TreeMap<>();
Map结合没有继承Collection接口,其提供的是key到value的映射。Map集合中不能有相同的key,每个key只能映射一个value。key还决定了存储对象在映射中的存储位置,但不是由key对象本身决定的,而是通过一种“散列技术”进行处理,产生一个散列码的数值。
Map增加的方法
枚举与泛型
枚举类型
常用方法
枚举可以看做一种封装在类或者接口中的常量,本质还是以类的形式存在
泛型
泛型是程序员定义的安全类型
泛型使用方法:类名<泛型名>
泛型常规用法
在定义泛型类时可以声明多个类型
定义泛型类时可以声明数组类型
泛型高级用法
限制泛型可用类型
语法:class 类名 <T extends 类名或者接口名>
使用类型通配符
语法:泛型类名称<? extends List> a = null;
继承泛型类与实现泛型接口
语法:class ExtendClass<T1>{} class 类名 <T1,T2,T3> extends ExtendClass<T1>{}
总结
泛型的类型参数只能是类类型,不可以是简单类型,如A<int>这种泛型定义的就是错误的
泛型的类型个数可以是多个
可以使用extends关键字限制泛型的类型
可以使用通配符限制泛型的类型
lambda表达式与流处理
lambda表达式
lambda表达式的作用是补全方法体,用少量的代码实现抽象方法
语法:() -> {} 意思是:这个方法按照这个代码块来执行
方法的引用
符号:"::"
语法:类名::方法名
它可以引用静态方法、成员方法、带泛型的方法
引用构造方法
语法:类名::new
Function接口方法
T:被操作的类型,可以理解为方法参数类型 R:操作结果类型,可以理解为方法的返回类型
流处理
类似数据库的SQL语句,可以执行非常复杂的过滤、映射、查找和收集功能。且代码量少,缺点:可读性不高
Stream接口
流处理的接口都定义在java.uil.stream包下。BaseStream接口才是最基础的接口,但最常用的是BaseStream接口的一个子接口----Stream接口
Option类
此类像是一个容器,可保存任何对象。此类是用final修饰的,所以不能有子类。Optional类带有泛型,所有能保存任何对象的值
Collectors类
Collectors类为收集器类,该类实现了java.util.Collector接口,可以将Stream流对象进行各种各样的封装、归集、分组等操作
数据过滤
数据过滤就是在杂乱的数据中筛选出需要的数据,给出一定条件,将符合的条件数据过滤并展示出来
filter()方法
filter()方法是Stream接口提供的过滤方法,该方法可以将lambda表达式作为参数,然后按照lambda表达式的逻辑过滤流中的元素。过滤出想要的流元素后,还要使用Stream提供的 collect()方法按照指定的方法重新封装
distinct()方法
distinct()方法是Stream接口提供的过滤方法该方法可以去除流中重复的元素,效果跟SQL语句中的DISTINCT关键字一样
limit()方法
limit()方法是Stream接口提供的方法,该方法可以获取流中前n个元素
skip()方法
skip()方法是Stream接口提供的方法,该方法可以忽略流中的前n个元素
数据映射
- 数据映射和过滤的概念不同,过滤是在流中找到符合条件的元素,映射是在流中获得具体的数据
- Stream接口提供了 map()方法用来实现数据映射,map()方法会按照参数中的函数逻辑获取新的流对象,新的流对象中元素类型可能与旧流对象元素类型不相同。
数据查找
数据查找是判断流中是否有符合条件的数据,查找的结果是一个Boolean值或者Optional类的对象
allMatch方法()
allMatch()方法是Stream接口提供的方法,该方法会判断流中的元素是否全部符合某一条件,返回结果是Boolean值。如果所有元素条件符合则返回true,否则返回false
anyMatch()方法
anyMatch()方法是Stream接口提供的方法,该方法会判断流中元素是否符合某一条件,只要有一个元素符合条件就返回true,如果没有符合条件的元素才会返回false
noneMatch()方法
noneMatch()方法是Stream接口提供的方法,该方法会判断流中的所有元素是否都不符合某一条件,此方法逻辑刚好与allMatch()方法正好相反
findFirst()方法
findFirst()方法方法是Stream接口提供的方法,该方法会返回符合条件的第一个元素
数据收集
- 数据收集可以理解为高级的“数据过滤+数据映射”,是对数据的深加工。
- 数据统计:可以筛选出特殊元素,还可以对元素的属性进行统计计算。这种复杂的统计操作不是由Stream实现的,而是由Collectors收集器类实现的,收集器提供了非常丰富的API,有着强大的数据挖掘能力
数据分组
数据分组就是将流中元素按照指定的条件分开保存,分组之后的数据会按照不同的标签分别保存成一个集合,然后按照“键-值”关系封存在Map对象中
数据分组有:一级分组、多级分组两种场景
数据分组有:一级分组、多级分组两种场景
一级分组:将所有数据按照一个条件进行归类,跟一维数组相似 例:学校有100个学生,条件就是按年级分组,直接将学生归类到相应的年级中,然后就不在细分了
Collectors 类提供的 groupingBy()方法就是用来进行分组的方法,方法参数是一个 Function 接口对象,收集器会按照指定的函数规则对数组进行分组
多级分组:将所有条件对照多个条件进行分组,跟二位数组相似 例:学校有100个学生,条件就是按年级班级分组,将相应的学生归类到年纪之后再细分班级。
I/O(输入输出流)
输入输出流
流是一组有序的数据序列,根据操作类型分为输入流和输出流两种
输出流是指数据要到达目的地,程序通过向输出流中写入数据把信息传递到目的地
输出流是指数据要到达目的地,程序通过向输出流中写入数据把信息传递到目的地
输入流
InputStream类是字节输入流的抽象类,是所有字节输入流的父类
输入流一些方法
输出流
OutputStream类是字节输出流的抽象类,此类是表示输出字节流的所有类的超类
输出流方法
file类
File类是Java.io包中唯一代表磁盘文件本身的类
语法:File 对象名 = new File(文件地址)
常用方法
文件输入输出流
程序运行期间,大部分数据都在内存中进行操作,当程序结束或关闭时,这些数据将消失,如果需要将数据永久存储,可使用文件输入输出流与指定文件建立连接,将需要的数据永久保存
文件输入流:FileInputStream
文件输出流:FileOutputStre
语法:字节输出/输入流 对象名 = new 字节输出/输入流(file类对象名)
带缓存输入输出流
缓存时I/O流的一种性能优化,缓存流为I/O流增加了内存缓存区,使得在流上执行skip()、mark()和reset()方法都成为可能
带缓存输入流:BufferdReader
带缓存输入流:BufferdWriter
语法:带缓存输入流/输出流 对象名 = new 带缓存输入流/输出流(输入流/输出流对象名)
常用方法
数据输入输出流
数据输入/输出流允许应用程序以与机器无关的方式从底层输入流中读取基本Java基础类型,也就是说,数据流不在关心这个数值是什么类型了
数据输入流:DateInputStream
数据输出流:DateOutputStream
语法:文件数据输入/输出流 对象名 = new 文件数据输入/输出流(文件类对象)
数据输入/输出流 对象 名 = new 数据输入/输出流(文件数据输入/输出流对象)
数据输入/输出流 对象 名 = new 数据输入/输出流(文件数据输入/输出流对象)
常用方法
反射与注解
反射
通过java反射机制,可以在程序中访问已经装载到JVM中的java对象描述,实现访问、检测和修改描述java对象本身信息功能
语法:
第一种
Class 反射名 = 对象名.getClass();
第二种
Class 反射名 = 类名.class
第三种
Class 反射名 = Class.forName("路径.类名")
第一种
Class 反射名 = 对象名.getClass();
第二种
Class 反射名 = 类名.class
第三种
Class 反射名 = Class.forName("路径.类名")
访问的主要信息
常用的方法
Annotation注解功能
java中提供了Anno注解功能,该功能用于类、构造方法、成员变量、成员方法、参数等的声明中,该功能并不影响程序运行,但是会对编译器警告等辅助工具产生影响
定义:关键字:interface
跟接口定义一样,但是要在关键字前添加一个“@”符
跟接口定义一样,但是要在关键字前添加一个“@”符
语法:public @interface 注解名{}
内置注解
@Overr:限定重写父类方法,作用范围:成员方法
@SuppressWarning:抑制编译器警告,作用范围:类、成员属性、成员方法
@Deprecated:标示已过时,作用范围:类、成员属性、成员方法
自定义注解
语法:public @interface 注解名{}
用法:在类上方填写注解名
给注解成员定义默认值,关键字:default
语法:int i() default 80; 此时i已经被设定为了80
语法:int i() default 80; 此时i已经被设定为了80
@Target:给注解注解,限定注解使用
数据库操作
注册驱动
语法:DriverManager.registerDriver(new Driver());
获取连接
语法:connection = DriverManager.getConnection ("jdbc:mysql://localhost:3306/school_java","root","1234"); //1234:密码 //localhost:本地主机 3306:数据库端口号 school_java:具体数据库名字 root:用户名
获取statement对象
语法:PreparedStatement preparedStatement =
connection.prepareStatement("SQL语句")
connection.prepareStatement("SQL语句")
执行SQL语句返回结果集
语法:ResultSet resultset = preparedStatement.executeQuery();
遍历结果集
语法:while(resultset.next()) {
//next:判断是否有下一条数据
System.out.println(resultset.getInt("id"));
//数据库里什么字段,get方法就填什么类型
System.out.println(resultset.getString("name"));
}
//next:判断是否有下一条数据
System.out.println(resultset.getInt("id"));
//数据库里什么字段,get方法就填什么类型
System.out.println(resultset.getString("name"));
}
关闭连接释放资源
语法:某方法/某数据.close();
Swing程序设计
Swing常用窗体
JFrame窗体
创建方法:public JFrame():创建一个初始不可见、没有标题的窗体。
public JFrame(String title):创建一个不可见、具有标题的窗体。
public JFrame(String title):创建一个不可见、具有标题的窗体。
语法:JFrame jf = new JFrame(“窗体名称”);
Container container = jf.getContentPane();//此方法是将窗体转换为容器
Container container = jf.getContentPane();//此方法是将窗体转换为容器
添加组件方法:容器名.add(组件名)
添加按钮:JButton okBtn= new JButton(“确定“)
container.add(okBtn);
container.add(okBtn);
删除组件:容器名.remove(组件名)
语法:container.remove(okBtn);
窗体一些常用的方法:
关闭窗体的方法
JDialog对话框
创建方法:public JDialogO:创建一个没有标题和父窗体的对话框。
public JDialog(Frame f):创建一个没有标题,但指定父窗体的对话框。
public JDialog(Frame f, boolean model):创建一个没有标题,但指定父窗体和模式的对话框。如果model为true,那么弹出对话框后,用户无法操作父窗体。
public JDialog(Frame f, String title):创建一个指定标题和父窗体的对话框.。
public JDialog(Frame f, String title, boolean model):创建一个指定标题、父窗体和模式的对话框。
public JDialog(Frame f):创建一个没有标题,但指定父窗体的对话框。
public JDialog(Frame f, boolean model):创建一个没有标题,但指定父窗体和模式的对话框。如果model为true,那么弹出对话框后,用户无法操作父窗体。
public JDialog(Frame f, String title):创建一个指定标题和父窗体的对话框.。
public JDialog(Frame f, String title, boolean model):创建一个指定标题、父窗体和模式的对话框。
JOptionPane小型对话框
创建方法:
常用布局管理器
绝对布局
绝对布局也叫null布局,特点是硬性指定组件在容器中的位置大小,组件的位置通过绝对坐标的方式来指定。使用绝对布局先要使用Container.setLayout(null)方法取消容器布局管理器然后再使用Component.setBounds(int x, int y, int width, int height)方法设置每个组件在容器中位置大小
FlowLayout流布局管理器
构造方法:public FlowLayout()
public FlowLayout(int alignment)
public FlowLayout(int alignment,int horizGap,int vertGap)
public FlowLayout(int alignment)
public FlowLayout(int alignment,int horizGap,int vertGap)
alignment参数表示为每一行组件排列方式有以下值
BorderLayout边界布局管理器
边界布局划分为:东南西北中5个区域
语法:容器名.add(组件名,BorderLayout(变量名)
GridLayout网格布局管理器
把容器划分为网格,组件能够按行、列来排列
语法:public GridLayout(行数, 列数) public GridLayout(行数, 列数 ,水平间距, 垂直间距)
常用面板
JPanel面板
JPanel面板必须在窗体容器中使用,无法脱离窗体显示
JScrollPane滚动面板
JScrollPane 滚动面板 不能使用布局管理器,且只能容纳一个组件
文字标签组件与图标
JLable 标签
常用构造方法:public JLabel0:创建一个不带图标或文本的标签。
public JLabel(Icon icon):创建一个带图标的标签。
public JLabel(Icon icon, int aligment):创建一个带图标的标签,并设置图标的水平对齐方式。
public JLabel(String text, int aligment):创建一个带文本的标签,并设置文本的水平对齐方式。
public JLabel(String text, Icon icon, int aligment):创建一个带文本和图标的JLabel对象,并设置文本和图标的水平对齐方式。
public JLabel(Icon icon):创建一个带图标的标签。
public JLabel(Icon icon, int aligment):创建一个带图标的标签,并设置图标的水平对齐方式。
public JLabel(String text, int aligment):创建一个带文本的标签,并设置文本的水平对齐方式。
public JLabel(String text, Icon icon, int aligment):创建一个带文本和图标的JLabel对象,并设置文本和图标的水平对齐方式。
图标的使用
使用javax.swing.Imagelcon类可以依据现有的图片创建图标。ImageIcon类实现了Icon接口,它有多个构造方法
- public ImagelconO:创建一个 Imagelcon 对象,创建 ImageIcon对象后,使用其调用 setImage(Image image)方法设置图片。
- public Imagelcon(Image image):依据现有的图片创建图标。
- public ImageIcon(URL url):依据现有图片的路径创建图标。
按钮组件
JButton 按钮
常用的构造方法如下:
- public JButtonO:创建一个不带文本或图标的按钮。
- public JButton(String text):创建一个带文本的按钮。
- public JButton(Icon icon):创建一个带图标的按钮。
- public JButton(String text, Icon icon):创建一个带文本和图标的按钮。
- 创建JButon 对象后,如果要对JButton 对象进行设置,那么可以使用JButton类提供的方法。
常用方法:
JRadinButton 单选按钮
创建JRadioButton 对象需要使用JRadioButton 类的构造方法
JRadioButton类常用的构造方法如下:
- public JRadioButton():创建一个未被选中、文本未被设定的单选按钮。
- public JRadioButton(Icon icon):创建一个未被选中、文本未被设定,但具有指定图标的单选按钮。
- public JRadioButton(Icon icon, boolean selected):创建一个具有指定图标、选择状态,但文本区未被设定的单选按钮。
- public JRadioButton(String text):创建一个具有指定文本,但未被选中的单选按钮。
- public JRadioButton(String text, Icon icon):创建一个具有指定文本、指定图标,但未被选中的单选按钮。
- public JRadioButton(String text, Icon icon, boolean selected):创建一个具有指定的文本、指定图标和选择状态的单选按钮。
按钮组
Swing 按钮组由 ButtonGroup对象表示,多个单选按钮被添加到按钮组后,能够实现“选项有多个,
但只能选中一个”的效果。ButtonGroup 对象被创建后,可以使用addO方法把多个单选按钮添加到
ButtonGroup对象中
但只能选中一个”的效果。ButtonGroup 对象被创建后,可以使用addO方法把多个单选按钮添加到
ButtonGroup对象中
JCheckBox复选框
常用构造方法如下:
- public JCheckBox():创建一个文本、图标未被设定且默认未被选中的复选框。
- public JCheckBox(Icon icon, Boolean checked):创建一个具有指定图标、指定初始时是否被选中,但文本未被设定的复选框。
- public JCheckBox(String text, Boolean checked):创建一个具有指定文本、指定初始时是否被选中,但图标未被设定的复选框。
列表组件
JComboBox 下拉列表框
类的常用构造方法如下:
- public JComboBox(ComboBoxModeldataModel):创建一个 JComboBox对象,下拉列表中的列表项使用ComboBoxModel中的列表项,ComboBoxModel 是一个用于组合框的数据模型。
- public JComboBox(Object[]arrayData):创建一个包含指定数组中的元素的JComboBox对象。
- public JComboBox(Vector vector):创建一个包含指定 Vector 对象中的元素的JComboBox 对象.Voetor对象中的元素可以通过整数索引进行访问,而且 Vector 对象中的元素可以根据需求被添加或者移除。
常用方法
JTextField文本框
常用构造方法如下:
- public JTextFieldO:创建一个文本未被指定的文本框。
- public JTextField(String text):创建一个指定文本的文本框。
- public JTextField(int fieldwidth):创建一个指定列宽的文本框。
- public JTextField(String text, int fieldwidth):创建一个指定文本和列宽的文本框。
- public JTextField(Document docModel, String text, int fieldWidth):创建一个指定文本模型、本内容和列宽的文本框。
指定文本框设置文本内容:文本框名.setText(String t)
JPasswordField 密码框
JPasswordField类的常用构造方法如下:
- public JPasswordFieldO:创建一个文本未被指定的密码框。
- public JPasswordFiled(String text):创建一个指定文本的密码框。
- public JPasswordField(int fieldwidth):创建一个指定列宽的密码框。
- public JPasswordField(String text, int fieldwidth):创建一个指定文本和列宽的密码框。
- public JPasswordField(Document docModel, String text, int fieldWidth):创建一个指定文本模型和列宽的密码框。
改变密码框的回显字符:框名.setEchoChar(char c)
JTextArea 文本域
常用构造方法如下:
- patie TextArea0:创建一个文本未被指定的文本域。
- publie NTtextArea(String text):创建一个指定文本的文本域。
- pabic leatAesfint rows,int columns):创建一个指定行高和列宽,但文本未被指定的文本域。
- public JTextArea(Document doc): 创建一个指定文档模型的文本域。
- public JTextArea(Document doc,String Text,int rows,int columns):创建内容以及行高和列宽的文本域。
文本组件
创建表格
构造方法的语法:JTable(存储表格数据的二维数组, 存储表格列名的一维数组)
DefaultTableModel 表格数据模型
3个抽象方法:public int getRowCountO);
public int getColumnCountO);
public Object getValueAt(int rowIndex, int columnIndex);
public int getColumnCountO);
public Object getValueAt(int rowIndex, int columnIndex);
DefaultTableModel类提供的常用构造方法
事件监听器
ActionEvent 动作事件
ActionEvent()监听器是Swing中比较常用的事件监听器,很多组件的动作都会使用它监听
KeyEvent 键盘事件
当向文本框中输入内容时,将发生键盘事件。KeyEvent类负责捕获键盘事件,可以通过为组件添加实现了KeyListener接口的监听器类来处理相应的键盘事件
KeyListener接口共有三个抽象方法
public void keyTyped(KeyEvent e); //发生击键事件时被触发
public void keyPressed(KeyEvent e); //按键被按下时被触发
public void keyReleased(KeyEvent e); //按键被释放时被触发
public void keyPressed(KeyEvent e); //按键被按下时被触发
public void keyReleased(KeyEvent e); //按键被释放时被触发
常用方法
MouseEvent 鼠标事件
所有组件都能发生鼠标事件,MouseEvent类负责捕获鼠标事件,可以通过为组件添加实现MouseListener接口的监听器来处理相应的鼠标事件。
public void mouseEntered(MouseEvent e); //光标移入组件时被触发
public void mousePressed(MouseEvent e); //鼠标按键被按下时被触发
public void mouseReleased(MouseEvent e); //鼠标按键被释放时被触发
public void mouseClicked(MouseEvent e); //发生单击事件时被触发
public void mouseExited(MouseEvent e); //光标移出组件时被触发
public void mousePressed(MouseEvent e); //鼠标按键被按下时被触发
public void mouseReleased(MouseEvent e); //鼠标按键被释放时被触发
public void mouseClicked(MouseEvent e); //发生单击事件时被触发
public void mouseExited(MouseEvent e); //光标移出组件时被触发
常用方法
代表鼠标的值
Java绘图
Java绘图类
Graphics类
Graphics类是所有图形上下文的抽象基本类,它允许应用程序在组件以及闭屏图像上进行绘制,它封装了Java支持的基本绘图操作所需的状态信息,主要包括颜色、字体、画笔、文本、图像等,它还提供了常用的绘图方法,利用这些方法可以使直线、矩形、多边形、椭圆、圆弧等形状和文本、图片的绘制操作
Graphics2D类
语法:public void paint(Graphics g){
Graphics2D g1 = (Graphics2D)g;
}
Graphics2D g1 = (Graphics2D)g;
}
绘制图形
Graphics2D类是在继承Graphics 类的基础上编写的,它包含了Graphics类的绘图方法并添加了更强的功能,在创建绘图类时推荐使用该类。Graphics2D类可以分别使用不同的类来表示不同的形状,Line2D类、Rectangle2D类等
常用方法
要绘制指定形状的图形,需要创建并实例化该类的图形对象,且这些图形类必须是Shape接口的实现类,然后使用Graphics2D类的draw()方法绘制该图形对象或者使用fill()方法填充该图形对象
语法:g1.draw(对象名)
g1.fill(对象名)
g1.fill(对象名)
java.awt.geom 包中提供了如下常用的图形类,这些图形类都实现了Shape 接口:
- Arc2D类
- CubicCurve2D类
- Ellipse2D类
- Line2D类
- Point2D类
- QuadCurve2D类
- Rectangle2D类
- RoundRectangle2D类
绘图颜色与画笔属性
设置颜色, Color类
使用Color类可以创建任意颜色的对象,不用担心平台是否支持该颜色,因为Java以跨平台和与硬件无关的方式支持颜色管理
语法1:Color 对象名 = new Color(int r,int g,int b)
语法2:Color 对象名 = new Color(int rgb)
语法2:Color 对象名 = new Color(int rgb)
绘图类可以使用setColor()方法设置颜色
语法
setColor(Color 颜色)
语法
setColor(Color 颜色)
Graphics2D g2 =(Graphics2D) g;
g2.setColo(Color.RED);
g2.setColo(Color.RED);
设置画笔
Graphics2D类可以调用setStroke()方法设置画笔的属性,如改变线条粗细、虚实、形状、风格等
语法1:setStroke(Stroke stroke)
stroke是指Stroke接口的实现类对象
stroke是指Stroke接口的实现类对象
setStroke0方法必须接受一个 Stroke 接口的实现类对象作参数,java.awrt包中提供了BasisSrke类它实现了Stroke接口,并且通过不同的构造方法创建画笔属性不同的对象。这些构造方法如下:
- BasicStroke()
- BasicStroke(float width)
- BasicStroke(float width, int cap, int join)
- BasicStroke(float width, int cap, int join, float miterlimit)
- BasicStroke(float width, int cap, int join, float miterlimit, float[] dash, float dash_phase)
构造方法参数图
语法2:BasicStroke(宽 cap join)
cap参数有:CAP_BUTT、CAP_ROUND、CAP_SQUARE
join参数有:JOIN_MITER、JOIN_ROUND、JOIN_BEVEL
cap参数有:CAP_BUTT、CAP_ROUND、CAP_SQUARE
join参数有:JOIN_MITER、JOIN_ROUND、JOIN_BEVEL
绘制文本
设置字体
Java使用了Font类封装了字体的大小、样式等属性,该类在java.awt包中定义,其构造方法可以指定字体的名称、大小、样式3个属性
语法:Font font = new Font(name style size)
对象名.setFont(font)
对象名.setFont(font)
显示文字
Graphics2D类提供了drawString()方法,使用该方法可以实现图形上下文的文本绘制,从而实现在图片上显示文字的功能
语法1:对象名.drawString(String str,int x,int y)
语法2:对象名.drawString(String str,float x,float y)
语法2:对象名.drawString(String str,float x,float y)
显示图片
使用drawImage()方法将图片资源显示到绘图上下文中,而且可以实现各种特效处理,图片的缩放、翻转等。
语法:g1.drawImage(Image img,int x,inty,ImageObserver observer)
图像处理
放大与缩小
语法:
g1.drawImage(Image img,int x,int y,int width,int height,ImageObserver observer)
img:图片对象
x:水平位置
y:垂直位置
width:图片新的宽度属性
height:图片新的高度属性
observer:要通知的图像观察者
repaint()方法会自动调研费paint()方法,实现组件或画板的重画功能,类似界面刷新
g1.drawImage(Image img,int x,int y,int width,int height,ImageObserver observer)
img:图片对象
x:水平位置
y:垂直位置
width:图片新的宽度属性
height:图片新的高度属性
observer:要通知的图像观察者
repaint()方法会自动调研费paint()方法,实现组件或画板的重画功能,类似界面刷新
图像翻转
语法:g1.drawImage(Image img,int dx1,int dy1,int dx2,int dy2,int sx1,int sy1,int sx2,intsy2,ImageObserver observer)
此方法总是用非缩放的图像来呈现缩放的矩形,并动态地执行所需要的缩放。此操作不使用缓存的缩放图像。执行图像从源到目标的缩放,要将源矩形的第一个坐标映射到目标矩形的第一个坐标,源矩形的第二个坐标映射到目标矩形的第二个坐标,按需要缩放和翻转子图像
图像旋转
图像旋转需要调用Graphics2D类的rotate()方法,该方法将根据指定的弧度旋转图像
语法:g1.rotate(Math.toRadians())
Math.toRadians():角度转弧度
Math.toRadians():角度转弧度
图像倾斜
使用Graphics2D类提供的shear()方法设置绘图的倾斜方向,从而使图像实现倾斜效果
语法:shear(double shx,double shy)
多线程
创建线程
继承Thread类
Thread常用的两个构造方法语法:
- public Thread();
- public Thread(String threadName);
继承Thread类创建新线程语法:
public class ThreadTest extend Thread{}
public class ThreadTest extend Thread{}
完成线程功能的代码放在类的run()方法中,当类继承Thread类后,就要在类中覆盖run()方法,将实现该线程功能代码写入,然后调用Thread类中的start()方法执行
语法:
public void run(){}
public void run(){}
实现Runnable 接口
如果需要继承其他类而且要实现多线程,那么就可以通过Runnable接口来实现
语法:public class 类名 implements Runnable{}
实现Runnable接口的程序会创建一个Thread对象,并将Runnable对象与Thread对象相关联。类中有两个构造方法
- public 类名(Runnable target)
- public 类名(Runnable target,String name)
使用Runnable接口创建新线程步骤
1.建立Runnable对象
2.使用参数为Runnable对象的构造方法创建Thread实例
3.调用start()方法启动线程
2.使用参数为Runnable对象的构造方法创建Thread实例
3.调用start()方法启动线程
实现Runnable接口创建线程的流程
线程的生命周期
周期图
操作线程的方法
线程的休眠
一种控制线程行为方法是调用sleep()方法,sleep()方法需要一个参数来指定该线程休眠时间,以毫秒为单位
语法:Thread.sleep(2000);
线程的加入
jion()方法。当某个线程使用该方法加入另外一个线程时,另一个线程会等该线程执行完毕后再继续执行
线程的礼让
- Thread 类中提供了一种礼让方法,使用yield()方法表示,它只是给当前正处于运行状态的线程个提醒,告知它可以将资源礼让给其他线程,但这仅是一种暗示,没有任何一种机制保证当前线程会将资源礼让。
- yield()方法使具有同样优先级的线程有进入可执行状态的机会,在当前线程放弃执行权时会再度回到就绪状体。对于支持多任务的操作系统来说,不需要调用yield()方法,因为操作系统会为线程自动分配CPU时间片来执行
线程的中断
如果线程是因为使用了slcep()或wait()方法进入了就绪状态,可以使用Thread 类中 interrupt()方法使线程离开run()方法,同时结束线程,但程序会抛出InterruptedException异常,用户可以在处理该异常时完成线程的中断业务处理,如终止while循环。
线程的优先级
线程的优先级
每个线程都具有各自的优先级,线程的优先级可以表明在程序中该线程的重要性,如果有很多线程处于就绪状态,系统会根据优先级来决定首先使哪个线程进入运行状态。
Thread类中包含的成员变量代表了线程的某些优先级,如Thread.MIN_PRIORITY(常数1)、Thread.MAXPRIORITY(常数10)、Thread.NORM PRIORITY(常数5)。其中,每个线程的优先级都在 Thread.MIN_PRIORITY~Thread.MAX_PRIORITY,在默认情况下其优先级都是Thread.NORM PRIORITY。每个新产生的线程都继承了父线程的优先级
优先级为5的线程A首先得到CPU时间片;当该时间结束后,轮换到与线程A相同优先级的线程B;当线程 B的运行时间结束后,会继续轮换到线程A,直到线程A与线程B都执行完毕,才会轮换到线程C;当线程C结束后,才会轮换到线程D。
线程的优先级可以使用 setPriority()方法调整,如果使用该方法设置的优先级不在1~10,将产生IllegalArgumentException异常。
线程同步
同步块
Java 中提供了同步机制,可以有效地防止资源冲突。同步机制使用synchronized关键字,使用该关键字包含的代码块称为同步块,也称为临界区
语法:synchronized(Object) {}
同步方法
语法:synchronized void f(){}
网络通信
网络协议
IP协议
IP是Internet Protocol的简称,是一种网络协议。Internet 网络采用的协议是TCP/IP协议,其全称是Transmission Control Protocol/Internet Protocol。Internet 依靠TCP/IP协议,在全球范围内实现了不同硬件结构、不同操作系统、不同网络系统间的互联。在Internet 网络上存在着数以亿计的主机,每台主机都用网络为其分配的 Internet 地址代表自己,这个地址就是I地址。到目前为止,I地址用4个字节,也就是32位的二进制数来表示,称为IPv4。为了便于使用,通常取用每个字节的十进制数,并且每个字节之间用圆点隔开来表示I地址,如192.168.1.1。现在人们正在试验使用16个字节来表示I地址,这就是IPv6,但IPv6还没有投入使用。
TCP/IP 模式是一种层次结构,共分为4层,分别为应用层、传输层、互联网层和网络层。各层实现特定的功能,提供特定的服务和访问接口,并具有相对的独立性
TCP/IP 模式是一种层次结构,共分为4层,分别为应用层、传输层、互联网层和网络层。各层实现特定的功能,提供特定的服务和访问接口,并具有相对的独立性
TCP与UDP协议
在TCPAIP 协议栈中,有两个高级协议是网络应用程序编写者应该了解的,即传输控制协议(Transmission Control Protocol,TCP)与用户数据报协议(User Datagram Protocol, UDP)。
TCP 协议是一种以固接连线为基础的协议,它提供两台计算机间可靠的数据传送。TCP可以保证数据从一端送至连接的另一端时,能够确实送达,而且抵达的数据的排列顺序和送出时的顺序相同。因此,TCP协议适合可靠性要求比较高的场合。就像拨打电话,必须先拨号给对方,等两端确定连接后,相互才能听到对方说话,也知道对方回应的是什么。
HTTP、FTP 和Telnet 等都需要使用可靠的通信频道。例如,HTTP从某个URL读取数据时,如果收到的数据顺序与发送时不相同,可能就会出现一个混乱的HTML文件或是一些无效的信息。
UDP是无连接通信协议,不保证数据的可靠传输,但能够向若干个目标发送数据,或接收来自若干个源的数据。UDP以独立发送数据包的方式进行。这种方式就像邮递员送信给收信人,可以寄出很多信给同一个人,且每一封信都是相对独立的,各封信送达的顺序并不重要,收信人接收信件的顺序也不能保证与寄出信件的顺序相同。
UDP 协议适合于一些对数据准确性要求不高,但对传输速度和时效性要求非常高的网站,如网络聊天室、在线影片等。这是由于TCP协议在认证上存在额外耗费,可能使传输速度减慢,而UDP协议即使有一小部分数据包遗失或传送顺序有所不同,也不会严重危害该项通信。
端口与套接字
一般而言,一台计算机只有单一的连到网络的物理连接(Physical Connection),所有的数据都通过此连接对内、对外送达特定的计算机,这就是端口。网络程序设计中的端口(port)并非真实的物理存在,而是一个假想的连接装置。端口被规定为一个在0~65535的整数。HTTP服务一般使用80端口,FTP 服务使用21端口。假如一台计算机提供了HTTP、FTP等多种服务,那么客户机会通过不同的端口来确定连接到服务器的哪项服务上
通常,0~1023的端口数用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口数,以避免端口号与另一个应用或系统服务所用端口冲突。
网络程序中的套接字(Socket)用于将应用程序与端口连接起来。套接字是一个假想的连接装置,就像插座一样可连接电器与电线
TCP程序
TCP网络程序设计是指利用Socket 类编写通信程序。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法大不一样。
服务器端与客户端的交互过程
- 服务器程序创建一个 ServerSocket(服务器端套接字)对象,调用accept0方法等待客户机来连接
- 客户端程序创建一个Socket对象,请求与服务器建立连接
- 服务器接收客户机的连接请求,同时创建一个新的Socket 对象与客户建立连接。随后服务器继续等待新的请求
InetAddress 类
java.net包中的InetAddress类是与IP地址相关的类,利用该类可以获取IP地址、主机地址等信息。
常用方法
ServerSocket 类
- ServerSocker 类的构造方法通常会抛出1OException异常,具体有以下几种形式:
- ServerSocket():创建非绑定服务器套接字。
- ServerSocket(int port):创建绑定到特定端口的服务器套接字。
- ServerSocket(int port, int backlog):利用指定的backlog创建服务器套接字,并将其绑定到指定的本地端口号上。
- ServerSocket(int port, int backlog, InetAddress bindAddress):使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器。这种情况适用于计算机上有多块网卡和多个I地址的情况,用户可以明确规定ServerSocket在哪块网卡或哪个IP地址上等待客户的连接请求
常用方法
UDP程序
基于 UDP通信的基本模式:1..将数据打包(称为数据包),然后将数据包发往目的地。
2.接收别人发来的数据包,然后查看数据包。
2.接收别人发来的数据包,然后查看数据包。
发送数据包的步骤:
- 使用DatagramSocketO创建一个数据包套接字。
- 使用DatagramPacket(byte[] buf,int offset, int length,InetAddress address,int port)创建要发送的数据包。
- 使用DatagramSocket 类的sendO方法发送数据包。
接收数据包的步骤:
- 使用DatagramSocket(int port)创建数据包套接字,绑定到指定的端口。
- 使用 DatagramPacket(byte buf, int length)创建字节数组来接收数据包。
- 使用DatagramPacket 类的receive0方法接收UDP包
DatagramPacket类
java.net 包的DatagramPacket 类用来表示数据包。
DatagramPacket 类的构造方法:
第二种构造方法不仅指定了数据包的内存空间和大小,还指定了数据包的目标地址和端口
- DatagramPacket(byte[] buf, int length)
- DatagramPacket(bytel] buf, int length, InetAddress address, int port)
第二种构造方法不仅指定了数据包的内存空间和大小,还指定了数据包的目标地址和端口
DatagramSocker类
第二种构造方法创建DatagramSocket对象,创建数据报套接字,并将其绑定到本地主机的指定端口上。
第三种构造方法创建DatagramSocket对象,创建数据报套接字,并将其绑定到指定的端口和指定的本地地址上。第三种构造函数适用于有多块网卡和多个I地址的情况。
- java.net 包中的()
- DatagramSocket(int port)
- DatagramSocket(int port, InetAddress addr)
第二种构造方法创建DatagramSocket对象,创建数据报套接字,并将其绑定到本地主机的指定端口上。
第三种构造方法创建DatagramSocket对象,创建数据报套接字,并将其绑定到指定的端口和指定的本地地址上。第三种构造函数适用于有多块网卡和多个I地址的情况。
收藏
收藏
0 条评论
下一页