文章目录
2.面向对象
A.面向对象基础
a.设计对象
b.this关键字
3.常用算法
A.Date类
import java.util.Date;
public class test {
public static void main(String[] args) {
Date d =new Date();
//1.输出当前时间Wed Nov 30 22:22:29 CST 2022
System.out.println(d);
//2.Date输出毫秒值
System.out.println(d.getTime());//1669818604571
//System输出毫秒值
System.out.println(System.currentTimeMillis());//1669818604598
}
}
import java.util.Date;
public class test {
public static void main(String[] args) {
//1.获取时间毫秒值
long time1 = System.currentTimeMillis();
time1 += (60*60+121)*1000; //获得1个小时121秒后的时间
Date d =new Date(time1); //将时间毫秒值转化为具体时间
System.out.println(d);
//2.settime
time1 += (60*60+121)*1000;
d.setTime(time1); //设置当前毫秒值的时间
System.out.println(d);
}
}
Date类总结
B.SimpleDateFormate类(简单日期格式化)
import java.text.SimpleDateFormat;
import java.util.Date;
public class test {
public static void main(String[] args) {
Date d =new Date();
System.out.println(d);//Wed Nov 30 23:03:20 CST 2022
//具体时间转格式化
SimpleDateFormat sp = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");//无参数默认为2022/11/30 23:04
System.out.println(sp.format(d));//2022年11月30日 23:11:637 周三 下午
//毫秒值转格式化
long ms1 =System.currentTimeMillis();
System.out.println(sp.format(ms1));
}
}
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class test {
public static void main(String[] args) throws ParseException {
SimpleDateFormat d = new SimpleDateFormat("yyyy年MM月dd日 HH:MM:SS EEE a");
//将字符串转换为日期对象,上下格式需相同
System.out.println(d.parse("2022年11月30日 23:11:637 周三 下午"));//Wed Nov 30 23:00:00 CST 2022
}
}
SimpleDateFormate类的总结
C.Calendar类C
import java.util.Calendar;
public class test {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
System.out.println(cal.get(Calendar.YEAR));//输出年2022
System.out.println(cal.get(Calendar.MONTH)+1);//输出月12
System.out.println(cal.get(Calendar.DAY_OF_MONTH));//输出日1
}
}
D.新增日期类
E.包装类
- 自动拆箱:包装类 可以赋值给 基本类型
- 自动装箱:基本类型 可以赋值给 包装类
public class test {
public static void main(String[] args) {
String number ="23";
int age = Integer.parseInt(number); //转换成int型
System.out.println(age+1);//24
}
}
F.正则表达式
System.out.println("123a".matches("\\w{4,15}"));//true
import java.util.Scanner;
public class test {
public static void main(String[] args) {
phone();
email();
}
//1.手机验证
public static void phone(){
//输入手机号
Scanner s = new Scanner(System.in);
System.out.println("请输入您的手机号");
String phone = s.next();
//正则表达式判断,第一位为1,第二位为3-9,第三到九为数字
if(phone.matches("[1][3-9]\\d{9}")){
System.out.println("手机号验证成功");
}else{
System.out.println("输入有误,请重新输入");
}
}
//2.邮箱验证
public static void email(){
//输入
Scanner s = new Scanner(System.in);
System.out.println("请输入您的邮箱号");
String phone = s.next();
//判断邮箱
if(phone.matches("\\w{1,30}@[a-zA-z0-9]{0,30}(\\.[a-zA-z]{1,30}){1,2}")){
System.out.println("邮箱验证成功");
}else{
System.out.println("输入有误,请重新输入");
}
}
}
- 正则表示式在字符串方法中的使用
public class test {
public static void main(String[] args) {
String name ="我qqqq叫wwwww张eeee三";
String[] arr = name.split("\\w+");
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);//我叫张三
}
String name2 = name.replaceAll("\\w+"," ");
System.out.println(name2); //我叫张三
}
}
G.Arrays
import java.util.Arrays;
public class test {
public static void main(String[] args) {
int[] arr ={10,2,3,4,20,30,1};
System.out.println(Arrays.toString(arr));//输出数组,[10, 2, 3, 4, 20, 30, 1]
Arrays.sort(arr); //排序,[1, 2, 3, 4, 10, 20, 30]
System.out.println(Arrays.toString(arr));
int judge = Arrays.binarySearch(arr,15);//二分查找,-6
System.out.println(judge);
}
}
- 自定义排序规则
import java.util.Arrays;
import java.util.Comparator;
public class test {
public static void main(String[] args) {
Integer[] arr = {10, 2, 3, 4, 20, 30, 1}; //Interger
//降序排序
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1; //降序,顺序为o1-o2
}
});
System.out.println(Arrays.toString(arr));
}
}
- 二分查找
Arrays.binarySearch()
import java.util.Arrays;
public class test {
public static void main(String[] args) {
int[] arr = {10, 2, 3, 4, 20, 30, 1};
//二分查找
System.out.println(Arrays.binarySearch(arr,2));//1
}
}
H.Lambda表达式
- 1.正常重写
public class test {
public static void main(String[] args) {
//1.正常重写
Swimming s1 =new Swimming() {
@Override
public void swim() {
System.out.println("游泳");
}
};
//调用方法
go(s1);
}
private static void go(Swimming s) {
System.out.println("成功");
s.swim();
}
}
interface Swimming{
void swim();
}
- 2.lambda重写
public class test {
public static void main(String[] args) {
//2.lambda重写和调用
go(()->{
System.out.println("游泳");
});
}
private static void go(Swimming s) {
System.out.println("成功");
s.swim();
}
}
//Lambda接口只能又一个抽象方法
interface Swimming{
void swim();
}
降序排序的简化
import java.util.Arrays;
public class test {
public static void main(String[] args) {
Integer[] arr = {10, 2, 3, 4, 20, 30, 1}; //Interger
//lambda表达式
Arrays.sort(arr, (Integer o1, Integer o2)-> {
return o2 - o1; //降序,顺序为o1-o2
});
System.out.println(Arrays.toString(arr));
}
}
- Lambda的进一步简化
import java.util.Arrays;
public class test {
public static void main(String[] args) {
Integer[] arr = {10, 2, 3, 4, 20, 30, 1}; //Interger
//1.省略类型 //降序排序
Arrays.sort(arr, (o1, o2)-> {
return o2 - o1; //降序,顺序为o1-o2
});
System.out.println(Arrays.toString(arr));
//2.只有一个参数省略括号
sum1(a->{
return a+a;
});
//3.只有一条语句时,可省略大括号{}分号;
ride1(a-> System.out.println(a*a));
//4.只有一条return语句时,省略return大括号分号;
sum1(a->a+a);
}
public static void sum1(Math1 s){
System.out.println("加法计算完成");
System.out.println(s.sum(5));
}
public static void ride1(Math2 s){
System.out.println("乘法计算完成");
s.ride(5);
}
}
//接口
interface Math1{
int sum(int a);
}
interface Math2{
void ride(int a);
}
- 简化拓展
//当输出与输入参数相同时,可简化
//1.
ride1(a-> System.out.println(a));
可简化为
ride1(System.out::println);
//2.当对象的输出与输入参数相同时
ride1(s -> new Student(s));
//可简写为
ride1(Student::new);
E.String
import java.util.Random;
import java.util.Scanner;
public class test4 {
public static void main(String[] args) {
//1.生成验证码
String code = y();
//2.输入验证码
Scanner scanner = new Scanner(System.in);
System.out.println("请输入");
String user1 = scanner.next();
//3.比较验证码是否正确(无视大小写)
if (user1.equalsIgnoreCase(code)){
System.out.println("验证成功");
}else {
System.out.println("验证失败");
}
}
//生成随机验证码
public static String y(){
String number = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
String code = "";
Random r = new Random();
for (int i = 0; i < 5; i++) {
int j = r.nextInt(number.length());
char c = number.charAt(j);
code += c;
}
System.out.println("\n"+code);
return code;
}
}
public class phone {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String number = " ";
System.out.println("请输入手机号码");
for (int i = 0; i < 100; i++) {
//1.输入手机号,并判断是否是11位
number = sc.next();
if(number.length()==11)break;
System.out.println("请重新输入");
}
//2.截取前三位
String q3 = number.substring(0,3);
//3.截取第八位到结束
String h4 = number.substring(7);
number = q3 + "****"+h4;
System.out.println("中奖号码:\n"+number);//123****8912
}
}
4.深入泛型
A.泛型类
public class test {
public static void main(String[] args) {
Movie<String> movie = new Movie<>();
movie.add("张三",18);
System.out.println(movie.name+movie.age);//张三18
}
}
class Movie<E>{
public E name;
public int age;
public void add(E e,int a){
this.name = e;
this.age = a;
}
}
总结
B.泛型方法
public class test {
public static void main(String[] args) {
String[] names={"张三","李四","王五"};
Integer[] ages={10,20,30};
print(ages);
}
//定义泛型方法,和泛型参数
public static <T> void print(T[] arr){
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
}
C.泛型接口
public class test {
public static void main(String[] args) {
NewMovie n = new NewMovie();
n.addName("战狼" );
n.addId(10);
System.out.println(n.name);
System.out.println(n.id);
}
}
//继承接口,声明泛型的类型
class NewMovie implements Movie<String> {
String name;
int id;
@Override
public void addName(String name) {
this.name = name;
}
@Override
public void addId(int i) {
this.id = i;
}
}
//定义泛型接口
interface Movie<E>{
void addName(E e);
void addId(int i);
}
D.通配符和上下限
5.集合
集合和数组都是容器
- 数组定义完成并启动后,类型,长度固定
- 集合的大小不固定,启动后可以动态变化,类型可不固定
集合的体系
A.collection集合
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
public class test {
public static void main(String[] args) {
//ArrayList
Collection al1 = new ArrayList();
al1.add(10);
al1.add(10);
al1.add("hello");
al1.add(11.2);
al1.add("hello");
System.out.println(al1);
//HashSet
Collection al2 = new HashSet();
al2.add(10);
al2.add(10);
al2.add("hello");
al2.add(11.2);
al2.add("hello");
System.out.println(al2);
}
}
a.集合对于泛型的支持
Collection <String>al2 = new HashSet();//添加String泛型
al2.add(10); //报错
al2.add(10); //报错
al2.add("hello");
al2.add("hello");
System.out.println(al2);
b.集合的方法
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class test {
public static void main(String[] args) {
Collection a = new ArrayList();
//1.添加集合
a.add(10);
a.add(10);
a.add("hello");
System.out.println(a);
//2.清空集合
//al1.clear();
//3.判断集合是否为空,空为true
System.out.println(a.isEmpty());
//4.获取集合大小
System.out.println(a.size());
//5.判断是否包含元素
System.out.println(a.contains("hello"));//true
System.out.println(a.contains("HELLO"));//false
//分割线
System.out.println("6:==============");
//6.删除元素:多个重复默认删除第一个
System.out.println(a.remove(10));
System.out.println(a);
//7.集合 转 数组
Object[] arrs = a.toArray();
System.out.println("数组"+ Arrays.toString(arrs));
//8.合并集合
Collection<String> b1 =new ArrayList<>();
Collection<String> b2 =new ArrayList<>();
b1.add("hello");
b2.add("你好");
b1.addAll(b2);
System.out.println("b1:"+b1);
System.out.println("b2"+b2);
}
}
c.集合迭代器 Iterator
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class test {
public static void main(String[] args) {
Collection a = new ArrayList();
//1.添加集合
a.add("张三");
a.add("李四");
a.add("王五");
a.add("老六");
System.out.println(a);
//使用迭代器遍历Iterator
Iterator<String> iter = a.iterator();
while (iter.hasNext()){ //判断当前位置是否有元素,否则可能越界
String ele = iter.next();//获取元素并移到下一个位置 //默认索引0
System.out.println(ele);
}
}
}
d.增强版for循环
import java.util.ArrayList;
import java.util.Collection;
public class test {
public static void main(String[] args) {
Collection<String> a = new ArrayList();
//1.添加集合
a.add("张三");
a.add("李四");
a.add("王五");
a.add("老六");
System.out.println(a);
//1.遍历集合
for(String ele : a){
System.out.println(ele);
}
//2.遍历数组
double[] scores = {100,60,59};
for (double score : scores) {
if(score < 60){
score = 60;
}
System.out.println(score);// 100,60,60 //不改变原数组
}
System.out.println(Arrays.toString(scores));//[100,60,59]
}
}
e.集合+Lambda表达式(foreach)
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;
public class test {
public static void main(String[] args) {
Collection<String> alist = new ArrayList();
//1.添加集合
alist.add("张三");
alist.add("李四");
alist.add("王五");
alist.add("老六");
System.out.println(alist);//[张三, 李四, 王五, 老六]
//1.正常foreach遍历
alist.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
//2.lambda简写
alist.forEach(s -> System.out.println(s));
}
}
f.集合存储对象
import java.util.ArrayList;
import java.util.Collection;
public class test {
public static void main(String[] args) {
//自定义Movie类型集合
Collection<Movie> movies = new ArrayList<>();
movies.add(new Movie("战狼",95));
movies.add(new Movie("流浪地球",98));
//遍历对象
for (Movie movie : movies) {
System.out.print("片名:"+movie.name);
System.out.println(movie.score+"分");
}
System.out.println(movies);//输出地址
}
}
//定义电影类
class Movie{
public String name;
public double score;
public Movie() {
}
public Movie(String name, double score) {
this.name = name;
this.score = score;
}
}
(1)List
a.List的独有方法
import java.util.ArrayList;
import java.util.List;
public class test {
public static void main(String[] args) {
//1.List:有序,可重复,有索引
List<String> list = new ArrayList<>();
list.add("hello");
list.add("hello");
list.add("你好");
System.out.println(list); //[hello, hello, 你好]
//2.在某个位置插入元素
list.add(2,"world");
System.out.println(list); //[hello, hello, world, 你好]
//3.根据索引删除元素,返回删除元素
System.out.println(list.remove(2));//world
System.out.println(list); //[hello, hello, 你好]
//4.根据索引获取元素
System.out.println(list.get(2)); //你好
//5.修改索引位置处的元素
System.out.println(list.set(0,"hi"));//hello
System.out.println(list); //[hi, hello, 你好]
}
}
b.List的遍历
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class test {
public static void main(String[] args) {
//List:有序,可重复,有索引
List<String> lists = new ArrayList<>();
lists.add("hello");
lists.add("hello");
lists.add("你好");
System.out.println(lists); //[hello, hello, 你好]
//1.for循环
for (int i = 0; i < lists.size(); i++) {
System.out.println("1:"+lists.get(i));
}
//2.迭代器
Iterator<String> it = lists.iterator();
while (it.hasNext()){
System.out.println("2:"+it.next());
}
//3.for遍历对象
for (String list : lists) {
System.out.println("3:"+list);
}
//4.forEach
lists.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println("4:"+s);
}
});
//5.Lambda
lists.forEach(s-> System.out.println("5:"+s));
}
}
c.LinkedList独有方法
特点:底层结构是双链表(可以完成栈和队列),查询慢,首尾操作速度快,多以多了很多首位操作的特有API
import java.util.LinkedList;
public class test {
public static void main(String[] args) {
//1.栈,先进后出
LinkedList<String> zhan = new LinkedList<>();
//添加
zhan.addFirst("1"); //可改为zhan.push("1");
zhan.addFirst("2");
zhan.addFirst("3");
System.out.println(zhan);//[3, 2, 1]
//移除
zhan.removeFirst(); //可改为zhan.pop();
zhan.removeFirst();
System.out.println(zhan);//[1]
//2.队列:先进先出
LinkedList<String> dui = new LinkedList<>();
//添加
dui.addLast("1");
dui.addLast("2");
dui.addLast("3");
System.out.println(dui);//[1, 2, 3]
//移除
dui.removeFirst();
dui.removeFirst();
System.out.println(dui);//[3]
}
}
d.集合并发修改异常
public class test {
public static void main(String[] args) {
//1.栈,先进后出
List<String> list = new ArrayList<>();
list.add("hello");
list.add("hello");
list.add("你好");
System.out.println(list);
//1.迭代器遍历删除
Iterator<String> it = list.iterator();
while (it.hasNext()){
String ele = it.next();
if("hello".equals(ele)){
//list.remove("hello");//集合报异常,使用迭代器删除
it.remove();//删除当前所在元素,且不会后移
}
}
System.out.println(list);
//2.foreach遍历删除
// for (String s : list) {
// if("hello".equals(s)){
// list.remove("hello");//报异常
// }
// }
//3.Lambda
// list.forEach(s->{if("hello".equals(s)){
// list.remove("hello");//报异常
// }});
//4.for循环
// for (int i = 0; i < list.size(); i++) {
// String ele = list.get(i);
// if("hello".equals(ele)){
// list.remove("hello");//不会报错,但是会漏删
// }
// }
// System.out.println(list);//[hello, 你好]
//4.for循环,解决方法1
// for (int i = list.size()-1; i >=0; i--) {
// String ele = list.get(i);
// if("hello".equals(ele)){
// list.remove("hello");
// }
// }
// System.out.println(list);//[你好]
// 4.2for循环,解决方法2
// for (int i = 0; i < list.size(); i++) {
// String ele = list.get(i);
// if("hello".equals(ele)){
// list.remove("hello");
// i--;
// }
// }
// System.out.println(list);//[你好]
}
}
(2)Set
import java.util.HashSet;
import java.util.Set;
public class test {
public static void main(String[] args) {
//w无序,不重复,无索引
Set<String> sets = new HashSet<>();
sets.add("hello");
sets.add("hello");
sets.add("hi");
sets.add("你好");
sets.add("你好");
System.out.println(sets);//[hi, 你好, hello]
}
}
a.HashSet
- 哈希值
是JDK根据对象的地址,按照某种规则算出来的int类型的数值
public class test {
public static void main(String[] args) {
String name = "张三";
//获取Hash值
System.out.println(name.hashCode());//774889
System.out.println(name.hashCode());//774889,同一个对象相同
String sex = "男";
System.out.println(sex.hashCode());//30007
}
}
- HashSet底层原理
- HashSet集合底层采取 哈希表存储的数据
- 哈希表是一种对于增删改查数据性能都较好的结构
- 两个对象,set集合去重复
b.LinkedHashSet
c.Treeset
- 自定义规则的方式
- 方式一
import java.util.Set;
import java.util.TreeSet;
public class test {
public static void main(String[] args) {
//定义集合
Set<Student> sets = new TreeSet<>();
sets.add(new Student(1,"张三"));
sets.add(new Student(1,"张三"));
sets.add(new Student(2,"李四"));
sets.add(new Student(3,"王五"));
//输出集合内容,去重复按自定义规则排序
for (Student set : sets) {
System.out.println(set.id);
System.out.println(set.name);
}
}
}
class Student implements Comparable<Student>{
public int id;
public String name;
public Student() {
}
public Student(int id, String name) {
this.id = id;
this.name = name;
}
//自定义规则方法一
@Override
public int compareTo(Student o) {
return this.id-o.id;//id升序排序
}
}
- 方式二
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class test {
public static void main(String[] args) {
//自定义规则方法二
//Lambda简写:
//Set<Student> sets = new TreeSet<>((o1,o2)-> o1.id - o2.id);
Set<Student> sets = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.id - o2.id;
}
});
sets.add(new Student(1,"张三"));
sets.add(new Student(1,"张三"));
sets.add(new Student(2,"李四"));
sets.add(new Student(3,"王五"));
输出集合内容,去重复按自定义规则排序
for (Student set : sets) {
System.out.println(set.id);
System.out.println(set.name);
}
}
}
class Student {
public int id;
public String name;
public Student() {
}
public Student(int id, String name) {
this.id = id;
this.name = name;
}
}
- 排序规则
拓展1:可变参数
import java.util.Arrays;
public class test {
public static void main(String[] args) {
System.out.println("元素长度:"+sum(1)); //1
System.out.println("元素长度:"+sum(1,2)); //2
System.out.println("元素长度:"+sum(1,2,3)); //3
System.out.println("元素长度:"+sum(1,2,3,4));//4
}
public static int sum(int...nums) {
System.out.println("元素内容"+Arrays.toString(nums));
return nums.length;
}
}
拓展2:collections集合工具类
- 常用API
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class test {
public static void main(String[] args) {
List<String> lists = new ArrayList<>();
//1.给对象批量添加元素
Collections.addAll(lists,"hello","hi","你好");
System.out.println(lists);//[hello, hi, 你好]
//2.打乱List集合的顺序,注:set无法打乱
Collections.shuffle(lists);
System.out.println(lists);//[hello, 你好, hi]
//3.Collections对List集合排序
List<Integer>scores = new ArrayList<>();
//添加元素
Collections.addAll(scores,99,88,100,77,66);
System.out.println(scores);//[99, 88, 100, 77, 66]
//sort方法排序
Collections.sort(scores);
System.out.println(scores);//[66, 77, 88, 99, 100]
}
}
import java.util.ArrayList;
import java.util.List;
public class test {
//List的自定义排序 方法一
public static void main(String[] args) {
List<Student> lists = new ArrayList<>();
lists.add(new Student(1,"张三"));
lists.add(new Student(1,"张三"));
lists.add(new Student(2,"李四"));
lists.add(new Student(3,"王五"));
输出集合内容,保留重复按自定义规则排序
for (Student list : lists) {
System.out.print(list.id+":");
System.out.print(list.name+" ");//1:张三 1:张三 2:李四 3:王五
}
}
}
class Student implements Comparable<Student>{
public int id;
public String name;
public Student() {
}
public Student(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int compareTo(Student o) {
return this.id - o.id;
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class test {
public static void main(String[] args) {
//自定义排序方法二
List<Student> lists = new ArrayList<>();
lists.add(new Student(1,"张三"));
lists.add(new Student(1,"张三"));
lists.add(new Student(2,"李四"));
lists.add(new Student(3,"王五"));
//sort自带比较器对象
Collections.sort(lists,(o1,o2)-> o1.id - o2.id);
输出集合内容,保留重复按自定义规则排序
for (Student list : lists) {
System.out.print(list.id+":");
System.out.print(list.name+" ");//1:张三 1:张三 2:李四 3:王五
}
}
}
class Student {
public int id;
public String name;
public Student() {
}
public Student(int id, String name) {
this.id = id;
this.name = name;
}
}
B.Map集合
- 使用最多的Map集合是HashMap
- 重点掌握HashMap,LinkedHashMap,TreeMap
- Map集合体系特点
import java.util.HashMap;
import java.util.Map;
public class test {
public static void main(String[] args) {
Map<String,Integer> maps = new HashMap<>();
//1.添加元素:无序,不重复,无索引
maps.put("咖啡",15);
maps.put("奶茶",10);
maps.put("茶",20);
System.out.println(maps);//{咖啡=15, 茶=20, 奶茶=10}
}
}
a.Map常用方法
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class test {
public static void main(String[] args) {
Map<String,Integer> maps = new HashMap<>();
//1.添加元素:无序,不重复,无索引
//put()
maps.put("咖啡",15);
maps.put("奶茶",10);
maps.put("茶",20);
System.out.println(maps);
//2.清空集合clear()
//maps.clear();
//System.out.println(maps);
//3.判断集合是否为空,为空返回true
//isEmpty()
System.out.println(maps.isEmpty());//false
//4.获取键值对的值
//get()
Integer i = maps.get("奶茶");
System.out.println(i);//10
//5.根据键删除值
//remove()
System.out.println(maps.remove("茶"));//20,返回值
System.out.println(maps); //{咖啡=15, 奶茶=10}
System.out.println("6===========================");
//6.containsKey("")判断是否包含某个键,包含true
//containsKey("")
System.out.println(maps.containsKey("奶茶"));//true
//7.判断是否包含某个值,包含true
//containsValue()
System.out.println(maps.containsValue(15));//true
//8.获取全部键的集合
//keySet()
Set<String> keys = maps.keySet();
System.out.println(keys);//[咖啡, 奶茶]
//9.获取全部值的集合
//values()
Collection<Integer> values = maps.values();
System.out.println(values);//[15, 10]
// 10.集合的大小
//size()
System.out.println(maps.size());//2
System.out.println("11==========================");
//11.合并其他Map集合
//putAll()
Map<String, Integer> books1 = new HashMap<>();
books1.put("月亮与六便士",10);
books1.put("福尔摩斯",20);
books1.put("语文",15);
Map<String, Integer> books2 = new HashMap<>();
books2.put("语文",100);
books2.put("数学",30);
books2.put("英语",30);
books1.putAll(books2);
System.out.println(books1);//{月亮与六便士=10, 福尔摩斯=20, 数学=30, 语文=100, 英语=30}//键相同,后面覆盖前面
System.out.println(books2);//{数学=30, 语文=100, 英语=30}
}
}
b.Map遍历–键找值
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class test {
public static void main(String[] args) {
Map<String,Integer> maps = new HashMap<>();
//1.添加元素:无序,不重复,无索引
maps.put("华为",5500);
maps.put("小米",2999);
maps.put("三星",3999);
maps.put("oppo",4999);
System.out.println(maps);//{oppo=4999, 华为=5500, 小米=2999, 三星=3999}
//2.键找值遍历
//获取全部键
Set<String> goods = maps.keySet();
//遍历
for (String good : goods) {
int value = maps.get(good);
System.out.print(good+value+"元 ");//oppo4999元 华为5500元 小米2999元 三星3999元
}
}
}
c.Map遍历–值键对
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class test {
public static void main(String[] args) {
Map<String,Integer> maps = new HashMap<>();
//1.添加元素:无序,不重复,无索引
maps.put("华为",5500);
maps.put("小米",2999);
maps.put("三星",3999);
maps.put("oppo",4999);
System.out.println(maps);//{oppo=4999, 华为=5500, 小米=2999, 三星=3999}
//2.值找键遍历
//将Map转换为Set集合 //maps.entrySet();
Set<Map.Entry<String, Integer>> entries = maps.entrySet();
//遍历
for (Map.Entry<String, Integer> entry : entries) {
String key = entry.getKey();
int value= entry.getValue();
System.out.print(key + value +"元 ");//oppo4999元 华为5500元 小米2999元 三星3999元
}
}
}
d.forEach遍历
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
public class test {
public static void main(String[] args) {
Map<String,Integer> maps = new HashMap<>();
//1.添加元素:无序,不重复,无索引
maps.put("华为",5500);
maps.put("小米",2999);
maps.put("三星",3999);
maps.put("oppo",4999);
System.out.println(maps);//{oppo=4999, 华为=5500, 小米=2999, 三星=3999}
//2.forEach遍历
maps.forEach(new BiConsumer<String, Integer>() {
@Override
public void accept(String key, Integer value) {
System.out.print(key + value +"元 ");//oppo4999元 华为5500元 小米2999元 三星3999元
}
});
}
}
E.Lambda遍历
import java.util.HashMap;
import java.util.Map;
public class test {
public static void main(String[] args) {
Map<String,Integer> maps = new HashMap<>();
//1.添加元素:无序,不重复,无索引
maps.put("华为",5500);
maps.put("小米",2999);
maps.put("三星",3999);
maps.put("oppo",4999);
System.out.println(maps);//{oppo=4999, 华为=5500, 小米=2999, 三星=3999}
//2.Lambda遍历
maps.forEach((key,value)-> System.out.print(key + value +"元 "));
//oppo4999元 华为5500元 小米2999元 三星3999元);
}
}
(1)HashMap
import java.util.HashMap;
import java.util.Map;
public class test {
public static void main(String[] args) {
Map<String,Integer> maps = new HashMap<>();
//1.添加元素:无序,不重复,无索引
maps.put("华为",5500);
maps.put("小米",2999);
maps.put("三星",3999);
maps.put("oppo",4999);
System.out.println(maps);//{oppo=4999, 华为=5500, 小米=2999, 三星=3999}
}
}
(2)LinkedHashMap
public class test {
public static void main(String[] args) {
Map<String,Integer> maps = new LinkedHashMap<>();
//1.添加元素:无序,不重复,无索引
maps.put("华为",5500);
maps.put("华为",5500);
maps.put("小米",2999);
maps.put("三星",3999);
maps.put("oppo",4999);
System.out.println(maps);//{华为=5500, 小米=2999, 三星=3999, oppo=4999}
}
}
(3)TreeStet
import java.util.Map;
import java.util.TreeMap;
public class test {
public static void main(String[] args) {
//1.创建TreeMap集合
Map<Integer, String> maps = new TreeMap<>();
//添加元素
maps.put(1,"张三");
maps.put(2,"李四");
maps.put(3,"王五");
maps.put(3,"王五");
maps.put(4,"老六");
//输出元素
System.out.println(maps );//{1=张三, 2=李四, 3=王五, 4=老六}
//2.创建TreeMap对象集合
Map<Student,String> students = new TreeMap<>();
//添加元素
students.put(new Student(1,"小明","18"),"广东");
students.put(new Student(2,"小红","20"),"江苏");
students.put(new Student(3,"小刚","21"),"福建");
//Lambda表达式遍历 //使用比较器排序
students.forEach((key,value)-> System.out.println("学号:"+key.getId()+" 地区:"+ value));
//学号:1 地区:广东 学号:2 地区:江苏 学号:3 地区:福建
}
}
class Student implements Comparable<Student>{
private int id;
private String name;
private String age;
public Student() {
}
public Student(int id, String name, String age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
//比较器排序
@Override
public int compareTo(Student o) {
return this.id - o.id ;
}
}
C.集合的嵌套
- 投票系统案例
import java.util.*;
public class test {
public static void main(String[] args) {
//集合的嵌套,Mao中包含List(也可以是数组)
Map<String, List<String>> maps = new HashMap<>();
//创建List集合
List<String> selects1= new ArrayList<>();
//添加元素,投票想去的地点A和c
Collections.addAll(selects1,"A","C");
maps.put("小明",selects1);
System.out.println(maps);//{小明=[A, C]}
//创建3个元素
List<String> selects3= new ArrayList<>();
List<String> selects4= new ArrayList<>();
List<String> selects5= new ArrayList<>();
Collections.addAll(selects3,"B","C");
Collections.addAll(selects4,"A","B","C");
Collections.addAll(selects5,"A","D");
maps.put("张三",selects3);
maps.put("李四",selects4);
maps.put("王五",selects5);
//输出每个人的选择情况
System.out.println(maps);//{李四=[A, B, C], 张三=[B, C], 小明=[A, C], 王五=[A, D]}
//统计地点投票情况
Map<String, Integer> allSelect = new HashMap<>();
//定义一个存List的集合
Collection<List<String>> values = maps.values();
System.out.println(values);//[[A, B, C], [B, C], [A, C], [A, D]]
for (List<String> value : values) {
System.out.print(value+"---");//[A, B, C]---[B, C]---[A, C]---[A, D]---
for (String v : value) {
if (allSelect.containsKey(v)){ //判断是否有该类型的票
allSelect.put(v,allSelect.get(v)+1); //allSelect.get(v)获取键的值
}else {
allSelect.put(v,1); //如果没有,就初始化为1
}
}
}
//输出投票结果
System.out.println(allSelect);//{A=3, B=2, C=3, D=1}
}
}
D.不可变集合对象
- 不可变集合的创建
import java.util.List;
public class test {
public static void main(String[] args) {
//1.不可变的List集合List.of()
List<String> lists = List.of("你好","hello","hi");
// lists.set(1,"say"); //报错,不可改变
// lists.add("你还好吗");//报错
String list = lists.get(1);
System.out.println(list);
//2.不可变的Set集合set.of()
Set<String> names = Set.of("小明","小刚","小红");
// names.add("小王"); //报错
System.out.println(names);//[小红, 小刚, 小明]
//3.不可变的Map集合Map.of()
Map<Integer,String> maps = Map.of(1,"语文",2,"数学",3,"英语");
// maps.put(4,"物理"); //报错
System.out.println(maps); //{1=语文, 2=数学, 3=英语}
}
}
6.Stream流
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class test {
public static void main(String[] args) {
//定义List集合
List<String> names = new ArrayList<>();
//添加元素
Collections.addAll(names,"张三","李四","张一三","","张二三");
//stream1.先找出姓张,2.再找出名字为3个字的人,3.输出
//支持链式编程
names.stream().filter(s -> s.startsWith("张")).filter(s -> (s.length()== 3)).forEach(s -> System.out.println(s));
//张一三 张二三
}
}
A.Stream流的获取
- 集合的Stream流
import java.util.*;
import java.util.stream.Stream;
public class test {
public static void main(String[] args) {
//1.List获取流
//添加元素:有序,可重复,有索引
List<String> names = new ArrayList<>();
Collections.addAll(names,"小明","小红","小刚","小强");
//Stream流的创建
Stream<String> stream1 = names.stream();
Stream的输出
stream1.forEach(s -> System.out.print(s + " ")); //小明 小红 小刚 小强
//2.Set获取流
//添加元素:无序,不重复,无索引
Set<Integer> ages = new HashSet<>();
Collections.addAll(ages,10,12,13,12,10);
//Stream流的创建
Stream<Integer> stream2 = ages.stream();
//Stream的输出
stream2.forEach(s-> System.out.print(s + " "));//10 12 13
//3.Map获取流
//添加元素:无序,不重复,无索引
Map<Integer, String> maps = new HashMap<>();
maps.put(1,"广东");
maps.put(2,"江苏");
maps.put(3,"浙江");
maps.put(4,"福建");
//获取maps的键
Stream<Integer> stream3 = maps.keySet().stream();//1 2 3 4
//获取maps的值
Stream<String> stream4 = maps.values().stream();//广东 江苏 浙江 福建
//获取maps的键值对
Stream<Map.Entry<Integer, String>> stream5 = maps.entrySet().stream();
}
}
- 数组获取Stream流
import java.util.Arrays;
import java.util.stream.Stream;
public class test {
public static void main(String[] args) {
//定义数组
String[] names = {"小明","小红","小刚","小强"};
Stream<String> stream1 = Arrays.stream(names);
//获取当前数组的Stream流
stream1.forEach(s-> System.out.print(s + " "));//小明 小红 小刚 小强
//获取当前数组的Stream流
Stream<String> names1 = Stream.of(names);
names1.forEach(s -> System.out.print(s + " "));//小明 小红 小刚 小强
}
}
B.Stream的常用API
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Stream;
public class test {
public static void main(String[] args) {
//创建集合
List<String> names = new ArrayList<>();
Collections.addAll(names,"小明","小红","李刚","张强");
//1.filter()用流对数据进行过滤
//找出“小”开头的人名
Stream<String> xiao = names.stream().filter(new Predicate<String>() {
@Override
public boolean test(String s) {
return s.startsWith("小");
}
});
可替换为Lambda
//Stream<String> xiao = names.stream().filter(s->s.startsWith("小"));
//forEach遍历
xiao.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});//小明 小红
//可替换为Lambda
//xiao.forEach(s->System.out.println(s));
//Lambda中,当输入参数与输出参数一样可简化
//xiao.forEach(System.out::println);
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
public class test {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
Collections.addAll(names,"小明","小红","李刚","张强","小小","小刚");
Stream<String> xiao = names.stream().filter(s -> s.startsWith("小"));
names.stream();
//1.limit(2)输出前两个
xiao.limit(2).forEach(System.out::println);//小明 小红
System.out.println("======");
//2.skip(1)跳过一个,后输出
// xiao.skip(1).forEach(System.out::println);小红 小小 小刚
//3.map加工方法
Stream<String> stringStream = names.stream().map(new Function<String, String>() { //<加工前类型, 加工后类型>
@Override
public String apply(String s) {
return "姓名:" + s;
}
});
stringStream.forEach(System.out::println);//姓名:小明 姓名:小红 ......
//3.1 Lambda表达式
names.stream().map(s -> "lambda:"+s).forEach(System.out::println);//lambda:小明 lambda:小红 ......
//3.2 map加工成对象
//names.stream().map(s -> new Student(s)).forEach(System.out::println);
names.stream().map(Student::new).forEach(System.out::println);//对象姓名:小明 对象姓名:小红 ......
//4.Stream.of()创建Stream流
Stream<String> s2 = Stream.of("java","c++");
Stream<String> s1 = Stream.of("数据结构","数据库");
5.concat(s1, s2)合并
Stream<String> s3 = Stream.concat(s1, s2);
s3.forEach(System.out::print);//数据结构 数据库 java c++
}
}
class Student{
private String name;
public Student() {
}
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "对象姓名:"+ name ;
}
}
C.Stream的终结方法
注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了
7.异常
A.异常示例
package com.test.test;
public class test {
public static void main(String[] args) {
//1.数组索引越界问题
int[] arr = {1,2,3};
//System.out.println(arr[3]);//报异常,索引越界
//2.空指针异常
String name = null;
System.out.println(name);//null
//System.out.println(name.length());//报异常
//3.类型转换异常
Object o = 23;
//String s = (String) o;//报异常
//4.数字操作异常
//int c =10/0;//报异常
//5.数字转换异常
String number = "23abc";
// Integer it = Integer.valueOf(number);//报异常
// System.out.println(it);
}
}
B.异常的处理
ctrl + alt + T快速生成try…catch…
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
//try...catch处理异常
try {
System.out.println("请输入合法价格");
String priceStr = s.nextLine();
Double price = Double.valueOf(priceStr);//当输入非数字时报异常
if (price > 0){ //判断价格是否大于0
System.out.println("定价:"+price);
}else {
System.out.println("价格必须大于0");
}
} catch (NumberFormatException e) {
System.out.println("请输入合法价格");//报异常时输出
}
}
}
C.自定义异常
- 编译时异常
public class test {
public static void main(String[] args) {
//编译时异常,没有try...catch会提示
try {
checkAge(-34);//报异常
} catch (Error e) {
e.printStackTrace();//打印异常信息
}
}
//定义方法
public static void checkAge(int age) throws Error {
if (age<0||age>200){
//throw:在方法内部直接创建一个一个异常对象,并从此点抛出
//throws:用在方法声明上,抛出内部异常
throw new Error(age+"不合法,请重新输入");
}else {
System.out.println("输入成功");
}
}
}
//自定义编译时异常,extends Exception
public class Error extends Exception{
public Error() {
}
public Error(String message) {
super(message);
}
}
public class test {
public static void main(String[] args) {
//运行时异常,没有try...catch不会提示
try {
checkAge(-34);
} catch (RuntimeError e) {
e.printStackTrace();
}
}
public static void checkAge(int age){
if (age<0||age>200){
//throw:在方法内部直接创建一个一个异常对象,并从此点抛出
//throws:用在方法声明上,抛出内部异常
throw new RuntimeError(age+"不合法,请重新输入");
}else {
System.out.println("输入成功");
}
}
}
自定义运行时异常,extends RuntimeException
public class RuntimeError extends RuntimeException{
public RuntimeError() {
}
public RuntimeError(String message) {
super(message);
}
}
D.finally
8.日志
A.Logback
- 日志级别
9.File
- file类定位文件以及操作文件本身
- io流读写文件数据
A.file类的常见方法
import java.io.File;
import java.text.SimpleDateFormat;
public class filetest {
public static void main(String[] args) {
File f1 = new File("src/com/test/file/img1.jpg");
//1.获取绝对路径
System.out.println(f1.getAbsolutePath());//C:\Users\hfq20\IdeaProjects\javastudy\src\com\test\file\img1.jpg
//2.获取定义使用路径
System.out.println(f1.getPath());//src\com\test\file\img1.jpg
//3.获取文件名
System.out.println(f1.getName());//img1.jpg
//4.获取字节大小
System.out.println(f1.length());//16354
//5.获取文件最后修改时间
System.out.println(f1.lastModified());//1672559319356
//时间格式化
long ftime = f1.lastModified();
String time = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(ftime);
System.out.println("最后修改时间"+time);//2023年01月01日 15:48:39
//6.判断是否是文件
System.out.println(f1.isFile());//true
//7.判断是否是文件夹
System.out.println(f1.isDirectory());//false
//8.路径表示的file是否存在
System.out.println(f1.exists());//true
}
}
B.创建和删除文件对象
import java.io.File;
import java.io.IOException;
public class filetest {
public static void main(String[] args) throws IOException {
File f1 = new File("src/com/test/file/img1.jpg");
//1。创建文件,成功返回ture失败false
System.out.println(f1.createNewFile());//false,已经存在
File f2 = new File("src/com/test/file/data.txt");
System.out.println(f2.createNewFile());//true
//2.mkdir创建一级目录,mkdirs创建多级目录
File f3 = new File("src/com/test/file/1");//一级目录
System.out.println(f3.mkdir());//true
File f4 = new File("src/com/test/file/10/20/30/40");//多级目录
System.out.println(f4.mkdir());//false
System.out.println(f4.mkdirs());//true
//3.删除文件和空目录
System.out.println(f3.delete());//true
System.out.println(f4.delete());//ture,只删除空文件40
}
}
C. 文件的遍历
import java.io.File;
public class filetest {
public static void main(String[] args) {
//定位文件
File f1 = new File("src/com/test/file");
//1.list获取所以文件名
String[] names = f1.list();
for (String name : names) {
System.out.print(name+" ;");//10 ;data.txt ;filetest.java ;img1.jpg ;
}
//2.listFiles 获取所以文件对象
File[] files = f1.listFiles();
for (File file : files) {
System.out.println(file.isFile());//判断获取的是文件还是目录
}
}
}
D.非规律化递归—文件搜索
import java.io.File;
public class file1 {
public static void main(String[] args) {
File f1 = new File("D:\\");
String fileName = "QQMusic";
filesearch(f1,fileName);
}
private static void filesearch(File f, String fileName) {
//判断是否是目录
if (f != null && f.isDirectory()){
//提取目录内所有的对象
File[] files = f.listFiles();
//判断是否目录,是否有内容
if(files != null && files.length >= 0){
//遍历目录
for (File file : files) {
//判断是否是文件
if (file.isFile()){
//如果是文件比较文件名。并输出文件位置
if (file.getName().contains(fileName)){
System.out.println(file.getAbsoluteFile());
}
}else {
//如果是目录,递归继续搜索
filesearch(file,fileName);
}
}
}
}
}
}
E.字符集—编码和解码操作
-
String编码
-
String解码
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class test {
public static void main(String[] args) throws UnsupportedEncodingException {
//1.编码:文字转换成字节
String say1 = "你说hello";
String say2 = "我说hi";
byte[] b1 = say1.getBytes();//默认UTF-8,中文3个字节
byte[] b2 = say2.getBytes("GBK");//GBK中文两个字节
System.out.println("b1的长度:"+b1.length);//b1的长度:11
System.out.println(Arrays.toString(b1));//[-28, -67, -96, -24, -81, -76, 104, 101, 108, 108, 111]
System.out.println("b2的长度:"+b2.length);//b2的长度:6
System.out.println(Arrays.toString(b2));//[-50, -46, -53, -75, 104, 105]
//2.解码:把字节转换成对应的形式(编码前后字符集一致)
String s1 = new String(b1);//默认UTF-8
System.out.println("s1的内容为:"+s1);//s1的内容为:你说hello
String s2 = new String(b2);
String s3 = new String(b2,"GBK");
System.out.println(s2);//��˵hi,字符集使用错误
System.out.println(s3);//我说hi
}
}
F.io流—输入流和输出流
- io流的分类
a.FileInputStream字节输入流
import java.io.*;
import java.util.Arrays;
public class test {
public static void main(String[] args) throws IOException {
//1.创建文件字节输入流管道并与源文件连通
InputStream i1 = new FileInputStream("src/file.txt");//文件内容:ab3
//2.读一个字节返回read()
//缺点:1.一个返回一个字节,中文3个字节会出错。2:性能较差
//可使用循环
// while(i1.read()!= -1){}
System.out.println(i1.read());//97,返回int型ASCII编码
System.out.println((char)i1.read());//b
System.out.println((char)i1.read());//3
System.out.println(i1.read());//-1,无内容
//3.定义一个字符数组,用于读取字符数组read(bytes)
InputStream i2 = new FileInputStream("src/data1");//内容为:5月5号123
byte[] bytes = new byte[4];
//可使用循环
// while(i2.read(bytes) != -1){}
int len = i2.read(bytes);//返回读取字节数
System.out.println("读取字节数:"+len);//4
System.out.println(Arrays.toString(bytes));//[53, -26, -100, -120]
String one = new String(bytes);//解码
System.out.println(one);//5月
//第二次
int len2 = i2.read(bytes);
String two = new String(bytes);
System.out.println(two);//5号
//第三次
int len3 = i2.read(bytes);
System.out.println(len3);//3
String three = new String(bytes,0,len3);
//new String(bytes);//内容不足,最后一位出现乱码123�
System.out.println(three);//123
//第四次
int len4 = i2.read();
System.out.println(len4);//-1
String four = new String(bytes);
System.out.println(four);//123�
}
}
- 中文避免乱码
定义一个文件一样大的数组
readAllBytes();
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class test {
public static void main(String[] args) throws IOException {
InputStream f1 = new FileInputStream("src/data1");
byte[] bytes = f1.readAllBytes();
System.out.println(new String(bytes));//5月5号123
System.out.println(bytes.length);//11,中文占3个字节
}
}
b.FileOutputStream字节输出流
package com.test.Fileoutputs;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class test {
public static void main(String[] args) throws IOException {
//1.创建文件字节输出流与目标文件连通
OutputStream o1 = new FileOutputStream("src/data1",true);//连通后会清空原数据,添加true参数变为追加数据
//2.写数据
o1.write(97);
o1.write('a');
o1.write('我');//aa,中文三个字节会出现乱码
//3.写一个数组
byte[] bytes = "写入中文" .getBytes();
o1.write(bytes);//aa写入中文
o1.write("\r\n".getBytes());//换行,\r\n兼容性更强
//4.写入指定数量
byte[] b1 = {'a','b','c','d'};
o1.write(b1,0,3);//aa写入中文
// abc
o1.close();
}
}
1) 流的刷新与关闭
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class test {
public static void main(String[] args) throws IOException {
//1.创建文件字节输出流与目标文件连通
OutputStream o1 = new FileOutputStream("src/data1");
//2.写数据
o1.write(97);
o1.write(98);
o1.write('我');
o1.write('爱');
o1.write('你');
//2.必须刷新数据。防止丢失
o1.flush();
//3。释放数据(包含刷新),一旦关闭不能再写入
o1.close();
2)文件拷贝
import java.io.*;
public class test {
public static void main(String[] args) throws IOException {
//创建一个文本输入流与文件接通
InputStream f1 = new FileInputStream("src/com/test/filecopy/f1.txt");//f1文件内容:你好
//创建一个文本输出流与文件接通
OutputStream f2 = new FileOutputStream("src/com/test/filecopy/f2.txt");//空文本文件
//文件拷贝
byte[] bytes = new byte[6];
int len;
while((len = f1.read(bytes)) != -1){
f2.write(bytes,0,len);//复制f1内容
}
f1.close();
f2.close();
}
}
c.资源释放
无需手动关闭资源
-
jdk7
-
jdk9
d.FileReader字符输入流
- FileReader
- 读取单个字符
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class test {
public static void main(String[] args) throws IOException {
//1.连通
Reader f1= new FileReader("src/com/test/FileReader9d/file1");//内容为:你正在使用java
//2.读取单个字符(循环),返回int型没有可读返回 -1
int code;
while ((code =f1.read() )!= -1){
System.out.print((char) code);//你正在使用java
}
}
}
- 读取字符串数组
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class test {
public static void main(String[] args) throws IOException {
//1.连通
Reader f1= new FileReader("src/com/test/FileReader9d/file1");//内容为:你正在使用java
//2.读取字符数组
char[] arr= new char[1024];
int len;
while((len = f1.read(arr)) != -1){
System.out.println(arr);//数组大小为1024,超出部分显示乱码
//截取长度
String s = new String(arr, 0, len);
System.out.println(s);//你正在使用java
}
}
}
e.Filewriter字符输出流
- 构造器
- 方法
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class test {
public static void main(String[] args) throws IOException {
//1.连通
Writer f1 = new FileWriter("src/com/test/FileReader9d/file2");
//2.写一个字符
f1.write(97);
f1.write('b');
f1.write('王');//不会出错
f1.write(':');
//3.写一串字符/数组
f1.write("吃饭了吗");
char[] chars = "李:没吃呢".toCharArray();
f1.write(chars);
//截取部分字符串
f1.write("\r\n");//换行
f1.write("王:明天有空吗出去玩?",0,7);//王:明天有空吗
//截取数组
char[] chars1 = "李:我明天没空,我要去北京".toCharArray();
f1.write(chars1,0,7);//李:我明天没空
//4.刷新数据
f1.flush();//刷新可以继续使用流
//5.关闭
f1.close();//关闭不可以继续使用流
//最后文本内容为:
//ab王:吃饭了吗李:没吃呢
//王:明天有空吗李:我明天没空
}
}
G.io流—缓冲流
缓冲流可以提高原始字符流,字节流的读写性能
a.字节缓冲输入流/输出流
方法与基本流没有太大变化
- 字节缓冲输入流
import java.io.*;
public class test {
public static void main(String[] args) throws IOException {
//1.连通
InputStream f1 = new FileInputStream("src/file2");//内容:你正在学习java,加油
//2.创建缓冲输入流
InputStream bf1 = new BufferedInputStream(f1);
//3.读取
byte[] chars = new byte[100];
int len;
while((len=bf1.read(chars)) != -1){
String s = new String(chars,0,len);
System.out.println(s);//你正在学习java,加油
}
}
}
- 字节缓冲输出流
import java.io.*;
public class test1 {
public static void main(String[] args) throws IOException {
//1.连通
OutputStream f2 = new FileOutputStream("src/file2");
//2.创建缓冲输出流
OutputStream bf2 = new BufferedOutputStream(f2);
//3.写入
byte[] bytes = "你正在学习java,请继续努力".getBytes();
bf2.write(bytes);
//4.刷新和关闭
bf2.flush();
bf2.close();
}
}
b.字符缓冲输入流/输出流
- 字符缓冲输入流
import java.io.*;
public class test2 {
public static void main(String[] args) {
try(
//1.连通
Reader r1 = new FileReader("src/file2");
//2.绑定缓冲字符输入流
BufferedReader br1 = new BufferedReader(r1);) {
String line;
//3.readLine()读取一行
while((line = br1.readLine())!= null ){
System.out.println(line);//你正在学习java
// 请继续努力
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
- 字符缓冲输出流
import java.io.*;
public class test3 {
public static void main(String[] args) throws IOException {
//1.连通
Writer f1 = new FileWriter("src/file2");
BufferedWriter bf1 = new BufferedWriter(f1);
//2.写一个字符
bf1.write(97);
bf1.write('b');
bf1.write('王');//不会出错
bf1.write(':');
//3.写一串字符/数组
bf1.write("吃饭了吗");
//newLine()换行
bf1.newLine();
char[] chars = "李:没吃呢".toCharArray();
bf1.write(chars);
//截取部分字符串
bf1.write("\r\n");//换行
bf1.write("王:明天有空吗出去玩?",0,7);//王:明天有空吗
bf1.newLine();
//截取数组
char[] chars1 = "李:我明天没空,我要去北京".toCharArray();
bf1.write(chars1,0,7);//李:我明天没空
//4.刷新数据
bf1.flush();//刷新可以继续使用流
//5.关闭
bf1.close();//关闭不可以继续使用流
//最后文本内容为:
//ab王:吃饭了吗
//李:没吃呢
//王:明天有空吗
//李:我明天没空
}
}
H.io流—转换流
a.字符输入转换流
inputStreamReader
,把原始字节流按照指定编码转换成字符输入流
public class test4 {
public static void main(String[] args) throws IOException {
//1.连通
FileInputStream f1= new FileInputStream("src/com/test/BStrea9/GBK.txt");//该文本为GBk的方式
int s;
// while ((s = f1.read()) != -1){
// System.out.print((char) s);//乱码
// }
//2.转换流
InputStreamReader f1r = new InputStreamReader(f1,"GBk");//默认使用UTF-8
//读取
while ((s = f1r.read()) != -1){
System.out.print((char) s);//这是一个gbk文本
}
}
}
b.字符输出转换流
OutputStreamWriyer
,把原始字节输出流按照指定编码转换成字符输出流
import java.io.*;
public class test5 {
public static void main(String[] args) throws IOException {
//1.连通
FileOutputStream f1 = new FileOutputStream("src/com/test/BStrea9/GBK.txt");
//2.转换流,指定编码
OutputStreamWriter gbk = new OutputStreamWriter(f1, "Gbk");//默认UTF-8
//3.把低级流转换成高级流
BufferedWriter bf1 = new BufferedWriter(gbk);
//4.写入
bf1.write("正在使用GBK格式");
bf1.close();
}
}
I.对象序列化
a.对象字节输出流
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class test {
public static void main(String[] args) throws IOException {
//1.创建对象
S1 s = new S1("wang",18);
//2.连通文件
FileOutputStream f = new FileOutputStream("src/file");
//3.使用对象序列化流
ObjectOutputStream o = new ObjectOutputStream(f);
//3.调用对象序列化方法,写入对象
o.writeObject(s);//S1{name='wang', age=0}
o.close();
}
}
class S1
import java.io.Serializable;
//必须实现Serializable接口
public class S1 implements Serializable {
private String name;
//transient修饰的不参与序列化
private transient int age;
public S1(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 String toString() {
return "S1{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
- 对象要序列化必须实现
Serializable
接口- transient修饰的不参与序列化
private transient int age;
b. 对象字节输出流
import java.io.*;
public class test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1.创建对象
S1 s = new S1("wang",18);
//2.连通文件
FileInputStream f1 = new FileInputStream("src/file2");
//3.使用对象序列化流
ObjectInputStream o1 = new ObjectInputStream(f1);
//3.调用对象序列化方法,读取对象
S1 os = (S1) o1.readObject();
System.out.println(os);//S1{name='wang', age=0}
}
}
import java.io.Serializable;
//必须实现Serializable接口
public class S1 implements Serializable {
private String name;
//transient修饰的不参与序列化
private transient int age;
public S1(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 String toString() {
return "S1{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
- 拓展
J.打印流
a.printStream
printStream高级流可以不需要先连接低级流
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class test {
public static void main(String[] args) throws FileNotFoundException {
PrintStream p1 = new PrintStream("src/file.txt");
//PrintStream p1 = new PrintStream(new FileOutputStream("src/file.txt",true));//添加true参数
p1.println(97);
p1.println("abc");
p1.println('d');
p1.println(true);
//97
//abc
//d
//true
}
}
b.printWriter
import java.io.FileNotFoundException;
import java.io.PrintWriter;
public class test {
public static void main(String[] args) throws FileNotFoundException {
PrintWriter p1 = new PrintWriter("src/file.txt");
p1.println(1000);
p1.println("qwe");
p1.println('r');
p1.println(false);
p1.close();
//1000
//qwe
//r
//false
}
}
c.输出语句的重定向
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class test {
public static void main(String[] args) throws FileNotFoundException {
System.out.println("这个数据打印会打印到控制台");
1.输出语句重定向
PrintStream p1 = new PrintStream("src/file.txt");
System.setOut(p1);
System.out.println("这个数据会打印到文件");
}
}
d.拓展properties
- 存信息
- 读取内容
K.框架
- commons-io
10.多线程
A.线程的创建
方法一:继承Thread
public class test {
public static void main(String[] args) {
//1.创建一个子线程
MyThread myThread = new MyThread();
myThread.start();
//主线程
for (int i = 0; i < 10; i++) {
System.out.println("主线程运行中"+ i);
}
}
}
class MyThread extends Thread{
//重写run()方法
@Override
public void run() { //运行内容
for (int i = 0; i < 10; i++) {
System.out.println("子线程运行中:"+ i);
}
}
}
缺点:无法再继承其他类
方法二:实现Runnable接口
public class test2 {
public static void main(String[] args) {
//1。创建子线程
MyRunnable myRunnable = new MyRunnable();
Thread t = new Thread(myRunnable);
t.start();
//主线程
for (int i = 0; i < 10; i++) {
System.out.println(i + "+++主线程+++");
}
}
}
//实现Runnable接口
class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i+"===子线程===");
}
}
}
- 实现Runnable接口(内部类)
public class test2 {
public static void main(String[] args) {
//1.使用内部类
Runnable myRunnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i+"---子线程1---");
}
}
};
//创建子线程
Thread t = new Thread(myRunnable);
t.start();
//2.简化
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i+"===子线程2==="+i);
}
}
}).start();
//3.lambda简化
new Thread(() -> {
for (int i = 0; i < 10; i++) {
System.out.println(i+"###子线程3###"+i);
}
}).start();
for (int i = 0; i < 10; i++) {
System.out.println(i + "主线程");
}
}
}
方法三:实现Callable,FutureTask接口
- 使用方法
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class test3 {
public static void main(String[] args) {
//1.创建一个MYcallable任务对象
Mycallable mc = new Mycallable();
//2.创建一个FutureTask对象,将MYcallable任务对象交给FutureTask
FutureTask<String> sTask = new FutureTask<String>(mc);
//3.创建线程
Thread t = new Thread(sTask);
t.start();
//4.get()方法获取返回值
//调用的是FuturnTask对象
try {
System.out.println(sTask.get());//你好45
} catch (InterruptedException e) {
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
}
}
class Mycallable implements Callable<String>{
@Override
public String call() throws Exception {
int n = 0;
for (int i = 0; i < 10; i++) {
n += i;
}
return "你好"+n;
}
}
B.Thread的常用方法
public class test {
public static void main(String[] args) {
//1.创建子线程
Thread myThread = new MyThread();
myThread.start();
//获取线程名
System.out.println(myThread.getName());//Thread-0
//创建子线程2
Thread myThread2 = new MyThread2();
myThread2.start();
//设置线程名
myThread2.setName("=2=");
System.out.println(myThread2.getName());//=2=
//2.获取当前线程名
Thread thread = Thread.currentThread();
System.out.println(thread.getName());
for (int i = 0; i < 2; i++) {
System.out.println("主线程运行中"+ i);
}
}
}
//继承Thread对象
class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"子线程运行中:"+ i);
//休眠指定时间
Thread.sleep(3000);
}
}
}
}
class MyThread2 extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"子线程运行中:"+ i);
}
}
}
- 通过构造器直接命名
public class test {
public static void main(String[] args) {
//1.创建子线程
//通过构造器直接命名
Thread myThread = new MyThread("002");
myThread.start();
//获取线程名
System.out.println(myThread.getName());//Thread-0
for (int i = 0; i < 2; i++) {
System.out.println("主线程运行中"+ i);
}
}
}
继承Thread对象
class MyThread extends Thread{
public MyThread() {
}
//为当前对象设置名字
public MyThread(String name) {
//送给父类构造器初始化名称
super(name);
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"子线程运行中:"+ i);
}
}
}
C.线程同步的三种方法
a.线程同步代码块
- 锁对象的选择
b.同步方法
c.Lock锁
D.线程通信
F.线程池
a.参数说明
- 构造器参数说明
b.线程池处理Runnable任务
// MyRunnable
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName()+"输出====》"+i);
}
}
}
//主程序
import java.util.concurrent.*;
public class test {
public static void main(String[] args) {
/*
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
* */
ExecutorService pool = new ThreadPoolExecutor( 3,5,
6, TimeUnit.SECONDS,new ArrayBlockingQueue<>(5), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
Runnable myRunnable = new MyRunnable();
//1.execute
//由核心线程执行
pool.execute(myRunnable);
pool.execute(myRunnable);
pool.execute(myRunnable);
//不会创建 临时线程,存放在队列中等待执行
pool.execute(myRunnable);
pool.execute(myRunnable);
pool.execute(myRunnable);
pool.execute(myRunnable);
pool.execute(myRunnable);
//创建临时线程,由于3个核心线程与队列都满了
pool.execute(myRunnable);
pool.execute(myRunnable);
//由于最大线程为5,所以会报错
//t.execute(myRunnable);
//2.关闭线程池(一般不使用)
/*
pool.shutdown();//等待所以任务完成后关闭
pool.shutdownNow()//立即关闭,丢失任务
*/
}
}
c.线程池处理Callable任务
//MyCallable
import java.util.concurrent.Callable;
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
int sum = 0;
for (int i = 0; i < 3; i++) {
sum += i;
}
return Thread.currentThread().getName()+"结果为===》"+sum;
}
}
//主程序
import java.util.concurrent.*;
public class test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService pool = new ThreadPoolExecutor(3,5,
6, TimeUnit.SECONDS,new ArrayBlockingQueue<>(5), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
//1.submit
Future<String> s1= pool.submit(new MyCallable());
Future<String> s2= pool.submit(new MyCallable());
Future<String> s3= pool.submit(new MyCallable());
//获取返回值
System.out.println(s1.get());
System.out.println(s2.get());
System.out.println(s3.get());
}
}
G.Executors工具类实现线程池
//MyRunnable
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName()+"输出====》"+i);
}
}
}
//主程序
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class test1 {
public static void main(String[] args) {
//newFixedThreadPool,设置固定数量3个
ExecutorService e = Executors.newFixedThreadPool(3);
//2.执行任务
e.execute(new MyRunnable());
e.execute(new MyRunnable());
e.execute(new MyRunnable());
e.execute(new MyRunnable());//在队列中等待
}
}
H.定时器
a.Timer
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class test {
public static void main(String[] args) {
Timer timer = new Timer();
//1.schedule
//定时3秒,只执行一次
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"你准备好了吗"+new Date());
}
},3000);
//首次执行3秒,后续等待2秒
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行了"+new Date());
}
},3000,2000);
}
}
b.ScheduledExecutorService
import java.util.Date;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class test2 {
public static void main(String[] args) {
//创建线程池
ScheduledExecutorService s= Executors.newScheduledThreadPool(3);
// 1.scheduleAtFixedRate
//(执行内容,第一次执行等待3秒,后续2秒,单位秒)
s.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行了"+new Date());
}
},3,2, TimeUnit.SECONDS);
}
}
I.线程的六种状态
11.网络编程
A.网络通信的三要素
a.ip地址
import java.io.IOException;
import java.net.InetAddress;
public class test {
public static void main(String[] args) throws IOException {
//1.getLocalHost()获取本地ip
InetAddress ip1 = InetAddress.getLocalHost();
System.out.println(ip1.getHostName());//LAPTOP-Q0PSIA8D
System.out.println(ip1.getHostAddress());//192.168.2.6
//2.getByName通过域名获取ip
InetAddress ip2 = InetAddress.getByName("www.baidu.com");
System.out.println(ip2.getHostName());//www.baidu.com
System.out.println(ip2.getHostAddress());//180.101.50.188
//3.通过ip地址获取公网ip
InetAddress ip3 = InetAddress.getByName("180.101.50.188");
System.out.println(ip3.getHostName());//www.baidu.com
System.out.println(ip3.getHostAddress());//180.101.50.188
//4.3秒后判断是否ping通
System.out.println(ip3.isReachable(3000));//true
}
}
b.端口号与通信协议
端口
通信协议
B.UDP
a.UDP单播—收发数据
//发送端
public class send {
public static void main(String[] args) throws IOException {
System.out.println("===客户端启动===");
//1.创建发送的对象
DatagramSocket socket = new DatagramSocket();
//2.创建一个数据包发送的数据容器
/* public DatagramPacket(byte[] buf, int length,
InetAddress address, int port)*/
byte[] buffer = "这是一份数据".getBytes();
DatagramPacket packet = new DatagramPacket(buffer,buffer.length,InetAddress.getLocalHost(),8888);
//3.发送数据
socket.send(packet);
socket.close();
}
}
//接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class receive {
public static void main(String[] args) throws IOException {
System.out.println("===服务端启动===");
//创建接收数据的对象
DatagramSocket socket = new DatagramSocket(8888);
//2.创建一个数据包接收的数据
/* public DatagramPacket(byte[] buf, int length,
InetAddress address, int port)*/
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
//3.等待接收数据
socket.receive(packet);
//4.getLength()获取到的数据长度
int len = packet.getLength();
String s = new String(buffer,0,len);
System.out.println("收到数据:"+s);
socket.close();
//5.
String s1 = packet.getAddress().toString();
System.out.println("对方的ip:"+s1);
int port = packet.getPort();
System.out.println("对方的端口:"+port);
}
}
+ 实现多发和多收![在这里插入图片描述](https://img-blog.csdnimg.cn/a851433121544372828f3c3df864cdbc.png)
//发送端
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class send {
public static void main(String[] args) throws IOException {
System.out.println("===客户端启动===");
//1.创建发送的对象
DatagramSocket socket = new DatagramSocket();
//2.创建一个数据包发送的数据容器
/* public DatagramPacket(byte[] buf, int length,
InetAddress address, int port)*/
Scanner send = new Scanner(System.in);
while (true) {
System.out.println("请您输入要发送的内容:");
String s = send.nextLine();
if ("exit".equals(s)){
System.out.println("===客户端已退出===");
socket.close();
break;
}
byte[] buffer = s.getBytes();
DatagramPacket packet = new DatagramPacket(buffer,buffer.length,InetAddress.getLocalHost(),8888);
//3.发送数据
socket.send(packet);
}
socket.close();
}
}
//接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class receive {
public static void main(String[] args) throws IOException {
System.out.println("===服务端启动===");
//创建接收数据的对象
DatagramSocket socket = new DatagramSocket(8888);
//2.创建一个数据包接收的数据
/* public DatagramPacket(byte[] buf, int length,
InetAddress address, int port)*/
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
while (true) {
//3.等待接收数据
socket.receive(packet);
//4.getLength()获取到的数据长度
int len = packet.getLength();
String s = new String(buffer,0,len);
System.out.println("收到来自:"+packet.getAddress()+"的数据:" +s);
}
}
}
b.UDP的广播与组播
- 广播
- 组播
//接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class receive {
public static void main(String[] args) throws IOException {
System.out.println("===服务端启动===");
//1.创建接收数据的对象
// DatagramSocket socket = new DatagramSocket(8888);
MulticastSocket socket = new MulticastSocket(8888);
//将当前接收端加入到组播组中去
socket.joinGroup(InetAddress.getByName("224.0.1.1"));
//2.创建一个数据包接收的数据
/* public DatagramPacket(byte[] buf, int length,
InetAddress address, int port)*/
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
while (true) {
//3.等待接收数据
socket.receive(packet);
//4.getLength()获取到的数据长度
int len = packet.getLength();
String s = new String(buffer,0,len);
System.out.println("收到来自:"+packet.getAddress()+"的数据:" +s);
}
}
}
//发送端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class send {
public static void main(String[] args) throws IOException {
System.out.println("===客户端启动===");
//1.创建发送的对象
DatagramSocket socket = new DatagramSocket();
//2.创建一个数据包发送的数据容器
/* public DatagramPacket(byte[] buf, int length,
InetAddress address, int port)*/
Scanner send = new Scanner(System.in);
while (true) {
System.out.println("请您输入要发送的内容:");
String s = send.nextLine();
if ("exit".equals(s)){
System.out.println("===客户端已退出===");
socket.close();
break;
}
byte[] buffer = s.getBytes();
DatagramPacket packet = new DatagramPacket(buffer,buffer.
length,InetAddress.getByName("224.0.1.1"),8888);
//3.发送数据
socket.send(packet);
}
socket.close();
}
}
C.TCP
a.收发数据
发送端
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
public class send {
public static void main(String[] args) {
try {
//1.创建Scocket通信管道
// Socket(本机地址,端口)
Socket socket = new Socket("127.0.0.1",8888);
//2.连接字节输出输出流
OutputStream out = socket.getOutputStream();
//3.将低价流包装成打印流
PrintStream ps = new PrintStream(out);
ps.println("你好我来自火星");
ps.flush();
socket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
//接收端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class receive {
public static void main(String[] args) {
try {
//1.注册端口
ServerSocket server = new ServerSocket(8888);
//2.连通管道,等待客户端连接请求
Socket accept = server.accept();
//3.从Socket中通信管道中得到一个字节输入流
InputStream i = accept.getInputStream();
//4.使用转换流,将字节输入流转换为字符输入流并包装为高级流
BufferedReader br1 = new BufferedReader(new InputStreamReader(i));
//5.
String line;
if ((line=br1.readLine() )!= null){
System.out.println("来自:"+accept.getRemoteSocketAddress()+"发出的内容:"+line);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
拓展 —多发多收
//发送端
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class send {
public static void main(String[] args) {
try {
System.out.println("===客户端已启动===");
//1.创建Scocket通信管道
// Socket(本机地址,端口)
Socket socket = new Socket("127.0.0.1",8888);
//2.连接字节输出输出流
OutputStream out = socket.getOutputStream();
//3.将低价流包装成打印流
PrintStream ps = new PrintStream(out);
//4.
Scanner scanner = new Scanner(System.in);
while (true) {
String s = scanner.nextLine();
if("exit".equals(s)){
System.out.println("===客户端已关闭===");
socket.close();
break;
}
ps.println(s);
ps.flush();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
//接收端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class receive {
public static void main(String[] args) {
try {
System.out.println("===服务端已启动===");
//1.注册端口
ServerSocket server = new ServerSocket(8888);
//2.连通管道,等待客户端连接请求
Socket accept = server.accept();
//3.从Socket中通信管道中得到一个字节输入流
InputStream i = accept.getInputStream();
//4.使用转换流,将字节输入流转换为字符输入流并包装为高级流
BufferedReader br1 = new BufferedReader(new InputStreamReader(i));
//5.
String line;
while((line=br1.readLine() )!= null){
System.out.println("来自:"+accept.getRemoteSocketAddress()+"发出的内容:"+line);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
拓展 —多客户端
//发送端
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class send {
public static void main(String[] args) {
try {
System.out.println("===客户端已启动===");
//1.创建Scocket通信管道
// Socket(本机地址,端口)
Socket socket = new Socket("127.0.0.1",8888);
//2.连接字节输出输出流
OutputStream out = socket.getOutputStream();
//3.将低价流包装成打印流
PrintStream ps = new PrintStream(out);
//4.
Scanner scanner = new Scanner(System.in);
while (true) {
String s = scanner.nextLine();
if("exit".equals(s)){
System.out.println("===客户端已关闭===");
socket.close();
break;
}
ps.println(s);
ps.flush();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
//接收端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class receive {
public static void main(String[] args) {
try {
System.out.println("===服务端已启动===");
ServerSocket server = new ServerSocket(8888);
while(true){
Socket accept = server.accept();
new severThread(accept).start();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
//子线程
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class severThread extends Thread{
private Socket socket;
public severThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream i = socket.getInputStream();
//4.使用转换流,将字节输入流转换为字符输入流并包装为高级流
BufferedReader br1 = new BufferedReader(new InputStreamReader(i));
String line;
while((line=br1.readLine() )!= null){
System.out.println("来自:"+socket.getRemoteSocketAddress()+"发出的内容:"+line);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
拓展 —线程池优化多客户端
//发送端
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class send {
public static void main(String[] args) {
try {
System.out.println("===客户端已启动===");
//1.创建Scocket通信管道
// Socket(本机地址,端口)
Socket socket = new Socket("127.0.0.1",8888);
//2.连接字节输出输出流
OutputStream out = socket.getOutputStream();
//3.将低价流包装成打印流
PrintStream ps = new PrintStream(out);
//4.
Scanner scanner = new Scanner(System.in);
while (true) {
String s = scanner.nextLine();
if("exit".equals(s)){
System.out.println("===客户端已关闭===");
socket.close();
break;
}
ps.println(s);
ps.flush();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
//接收端
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;
public class receive {
private static ExecutorService pool = new ThreadPoolExecutor( 3,5,
6, TimeUnit.SECONDS,new ArrayBlockingQueue<>(5), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
public static void main(String[] args) {
try {
System.out.println("===服务端已启动===");
ServerSocket server = new ServerSocket(8888);
while(true){
Socket accept = server.accept();
severThread target = new severThread(accept);
pool.execute(target);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
//子线程
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.concurrent.*;
public class severThread implements Runnable{
private Socket socket;
public severThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream i = socket.getInputStream();
//4.使用转换流,将字节输入流转换为字符输入流并包装为高级流
BufferedReader br1 = new BufferedReader(new InputStreamReader(i));
String line;
while((line=br1.readLine() )!= null){
System.out.println("来自:"+socket.getRemoteSocketAddress()+"发出的内容:"+line);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
拓展 --B/S
12.单元测试
a.junit基础
b.junit常用注解
13.反射
(1).获取Class对象
- 三种方式
A.获取构造器对象
使用构造器
B.获取成员变量
成员变量赋值与取值
C.获取方法对象
执行方法
(2).反射的作用
A.绕过编译阶段为集合添加参数
14.注解
A.自定义注解
B.元注解
C.注解的解析
15.代理
16.XMl
A.文件文件创建
- 文档声明
- 规则
B.约束
a.DTD
b.schema
C.解析
a.dom4j
D.检索技术