eg:三个数字比较最大值
中E为泛型(即装在集合中的元素统一是什么类型),泛型类型只能是引用类型
常用方法:
eg:对象数组
ArrayList存储基本类型,使用包装类:
eg: ArrayList list=new ArrayList<>();
equals方法
eg:equals方法
字符串的获取相关方法:
字符串的截取方法:
字符串的转换方法:
eg:
字符串的分割
eg:
static关键字:用以修饰共有变量
eg:
学号计数器
静态代码块
eg:
eg:
eg:
抽象出共有的行为作为抽象方法
eg:(动物 吃—>狗 吃骨头)
引例:
一种公共的规范标准
一个对象拥有多种形态,这就是对象的多态性
eg:小明是一个学生,小明也是人—人是学生的父类
/*final关键字修饰成员变量--必须直接赋值和构造赋值二选一
* 且值不能变*/
public class Final {//手动赋值final private int age=15;final private String name;//构造方法赋值public Final() {name="不可变";// age=16;值不可变}public Final(String name) {this.name = name;}}
Objects.equals(对象1,对象2)–>String的equals方法的改良。防止空指针异常eg:null.equals(string)
时间日期类
毫秒:1秒=1000毫秒
日期时间格式化(日期–>文本),解析(文本—>日期)类
DateFormat-----抽象类
Calendar cInstance();c.set(2016,12,30);c.add(Calendar.YEAR,4);c.get(Calendar.YEAR);Date time = c.getTime();System.out.println(time);
概念:
完成Collection集合的遍历
多态完成创建对象
Collection coll=new 实现类();
Iterator i=coll.iterator();
方法参数类型确定,参数个数不确定时使用
eg:
此类仅由静态方法组合或返回集合—类名调用
Collection工具类
eg:
eg:
是一种未知的数据类型,当我们不知道使用什么类型的数据,可以使用泛型
interface A<E>{viod method(E e){sout(e)}}
public class B implements A<String>{public void method(String e){sout(e)}
}
interface A<E>{viod method(E e){sout(e)}}
public class B<E> implements A<String>{public void method(E e){sout(e)}
}
mian(){B<String> b=new B<>();b.method("字符串");
}
传递参数时可以用
定义时不可以用
使用泛型通配后,只能使用Object类中的共性方法
eg:
public interface List
extends Collection
Collection的子类
public interface Set
extends Collection
多态创建对象
public class HashSet
extends AbstractSet
implements Set
特点:
有序—哈希表+链表
public class LinkedHashSet
extends HashSet
implements Set
继承HashSet类实现了Set接口
两个泛型
图解:
无序
key和value不能为空
单线程,速度慢
有序—哈希表+链表
HashMap的子类-----extends HashMap<k,v>
eg:
概念
异常体系
Exception:举例
1.DafeFormat中的parse方法导致的异常
2.索引越界异常
Error:
内存溢出异常
int[] a=new int(102410241024);创建数组空间超出了虚拟机的空间
public class MyThread extends Thread {@Overridepublic void run() {for (int i = 0; i < 20; i++) {System.out.println("run"+i);}}
}
public class Demo1 {public static void main(String[] args) {//创建多线程MyThread myThread=new MyThread();myThread.start();for (int i = 0; i < 2; i++) {System.out.println("main"+i);}}
}
2.实现Runnable接口:好
public class MyThread2 implements Runnable {@Overridepublic void run() {for (int i = 0; i < 20; i++) {System.out.println(Thread.currentThread().getName()+" "+i);}}
}
public class Demo2 {public static void main(String[] args) {//创建多线程MyThread2 myThread=new MyThread2();Thread thread=new Thread(myThread);thread.start();for (int i = 0; i < 20; i++) {System.out.println(Thread.currentThread().getName()+" "+i);}}
}
Thead类
//匿名内部类创建线程
public class Demo3 {public static void main(String[] args) {//实现Thread类new Thread(){@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+" "+i);}}}.start();//实现Runnable接口new Thread(new Runnable(){@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+" "+i);}}}).start();}
}
多线程访问共享数据,就会产生线程安全问题
代码实现
package Thread.demo2;
/*idea:模拟电影院买票,三个窗口共卖100张票
* 分析:
* 3个线程为三个窗口进行买票
* 一个Runnable实现类对象产生100张票*/
public class MyThread1 implements Runnable {//定义100张票private int ticket=100;@Overridepublic void run() {while(true){if(ticket>0){//为了提高出现问题的概率,让线程睡眠一下try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"在卖第"+ticket+"张票");ticket--;}}}
}
public class Demo1 {public static void main(String[] args) {//创建Runnable实现类的对象MyThread1 mt=new MyThread1();//创建Thread类对象构造方法中传递Runnable实现类的对象Thread t1=new Thread(mt);Thread t2=new Thread(mt);Thread t3=new Thread(mt);//调用Thread类的start方法开启多线程t1.start();t2.start();t3.start();}
}
运行结果
Thread-0在卖第100张票
Thread-2在卖第100张票
Thread-1在卖第100张票
分析产生原理:
Lock l = new ReentrantLock();
l.lock();
try { // access the resource protected by this lock }
finally { l.unlock(); }
/*idea:模仿用户买包子和老板做包子(5秒)* 分析:* 顾客和老板进程放在同步代码synchronized(锁对象)块中* 两者只能有一个执行,不能同时执行* 1创建顾客线程-告知老板买包子后-锁对象调用wait方法等待* 2创建并执行老板线程--sleep(5000)花费5秒做包子--然后告知顾客做好了-锁对象调用notify()唤醒顾客线程* 3顾客开始吃包子*/
public class demo {public static void main(String[] args) {//创建锁对象Object o = new Object();//创建顾客线程new Thread() {@Overridepublic void run() {synchronized (o) {System.out.println("老板,我要买包子");try {o.wait();//被唤醒后执行后边代码} catch (InterruptedException e) {e.printStackTrace();}//唤醒后执行的代码System.out.println("包子来了,开吃!");}}}.start();//创建老板线程new Thread() {@Overridepublic void run() {//睡眠5秒做包子try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (o) {System.out.println("包子做好了!");o.notify();}}}.start();//}
}
等待和唤醒方法:
1.1线程间通信:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同
1.2等待唤醒机制:
底层原理
2.ExecutorService接口:线程池接口
urrent ExecutorService
ExecutorService接口方法:
用来从线程池中获取线程,调用start方法,执行线程程任务
submit(Runnable task) 提交一个可运行的任务Runnable去执行
关闭销毁线程池的方法(不建议使用):
shutdown() 启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。
/*线程池的使用*/
public class MyThread implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+" 执行此任务!");}
}
public class main {public static void main(String[] args) {//1. 使用线程池的工厂类Executors里边的静态方法newFixedThreadPool创建包含一定线程数量的线程池ExecutorService pool = wFixedThreadPool(2);//2. 创建一个类实现Runnable接口,重写run方法,设置线程任务MyThread mt=new MyThread();//3. 调用ExecutorService接口中的submit(Runnable task) 方法,传递线程任务(Runnable实现类),开启线程pool.submit(mt);pool.submit(new MyThread());pool.submit(new MyThread());//4. 调用ExecutorService接口中的shutdown方法销毁线程池(不建议执行)pool.shutdown();//当执行shutdown操作后使用线程池会异常// pool.submit(new MyThread());//RejectedExecutionException}
## Lambda表达式
public class Demo1 {public static void main(String[] args) {//匿名内部类实现创建线程new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"创建了这个线程!");}}).start();//使用Lambda表达式创建线程new Thread(()->{System.out.println(Thread.currentThread().getName()+"创建了这个线程!");}).start();}
}
public interface Cook {void cooking();
}
public class cookMain {public static void main(String[] args) {//匿名内部类实现makeCook(new Cook(){@Overridepublic void cooking() {System.out.println("做饭啦!");}});//Lambda实现makeCook(()->{System.out.println("做饭啦!");});}static void makeCook(Cook cook){king();}
}
java.io.File
递归求1-n的和
文件搜索
/*文件过滤器+匿名内部类+Lambda表达式
idea:递归打印多级目录且只打印.java文件
* 分析:
* 使用递归需要创建方法来遍历文件
* 1打印指定路径下的目录需要创建一个File对象
* 2使用listFiles方法将目录下所有子目录以及文件存入File数组
* 3进行判断
* AFile数组中的元素是文件夹则继续调用方法本身进行遍历
* BFile数组中的元素是文件则直接打印
* */public class fileSearchFilter2 {public static void main(String[] args) {File f=new File("E:\IdeaProjects\Base_Code\src\FileP");printAllFile(f);}
//创建打印方法private static void printAllFile(File dir) {//匿名内部类/* File[] files = dir.listFiles(new FileFilter(){ @Overridepublic boolean accept(File pathname) {if (pathname.isDirectory()){return true;}Name().toLowerCase().endsWith(".java");}});*///Lambda简化
/* File[] files = dir.listFiles((File pathname)->{if (pathname.isDirectory()){return true;}Name().toLowerCase().endsWith(".java");});*///FilenameFilter过滤器+匿名内部类/* File[] files = dir.listFiles(new FilenameFilter(){@Overridepublic boolean accept(File dir, String name) {return new File(dir,name).isDirectory()||LowerCase().endsWith(".java");}});*/FilenameFilter过滤器+Lambda表达式File[] files = dir.listFiles(( d,name)->new File(d,name).isDirectory()||LowerCase().endsWith(".java"));for (File fi : files) {//System.out.println(fi);//不想打印根目录可直接使用这个if(fi.isDirectory()){printAllFile(fi);}else{System.out.println(fi);}}}
}
public class Demo1 {public static void main(String[] args) {//匿名内部类实现创建线程new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"创建了这个线程!");}}).start();//使用Lambda表达式创建线程new Thread(()->{System.out.println(Thread.currentThread().getName()+"创建了这个线程!");}).start();}
}
public interface Cook {void cooking();
}
public class cookMain {public static void main(String[] args) {//匿名内部类实现makeCook(new Cook(){@Overridepublic void cooking() {System.out.println("做饭啦!");}});//Lambda实现makeCook(()->{System.out.println("做饭啦!");});}static void makeCook(Cook cook){king();}
}
java.io.File
递归求1-n的和
文件搜索
/*文件过滤器+匿名内部类+Lambda表达式
idea:递归打印多级目录且只打印.java文件
* 分析:
* 使用递归需要创建方法来遍历文件
* 1打印指定路径下的目录需要创建一个File对象
* 2使用listFiles方法将目录下所有子目录以及文件存入File数组
* 3进行判断
* AFile数组中的元素是文件夹则继续调用方法本身进行遍历
* BFile数组中的元素是文件则直接打印
* */public class fileSearchFilter2 {public static void main(String[] args) {File f=new File("E:\IdeaProjects\Base_Code\src\FileP");printAllFile(f);}
//创建打印方法private static void printAllFile(File dir) {//匿名内部类/* File[] files = dir.listFiles(new FileFilter(){ @Overridepublic boolean accept(File pathname) {if (pathname.isDirectory()){return true;}Name().toLowerCase().endsWith(".java");}});*///Lambda简化
/* File[] files = dir.listFiles((File pathname)->{if (pathname.isDirectory()){return true;}Name().toLowerCase().endsWith(".java");});*///FilenameFilter过滤器+匿名内部类/* File[] files = dir.listFiles(new FilenameFilter(){@Overridepublic boolean accept(File dir, String name) {return new File(dir,name).isDirectory()||LowerCase().endsWith(".java");}});*/FilenameFilter过滤器+Lambda表达式File[] files = dir.listFiles(( d,name)->new File(d,name).isDirectory()||LowerCase().endsWith(".java"));for (File fi : files) {//System.out.println(fi);//不想打印根目录可直接使用这个if(fi.isDirectory()){printAllFile(fi);}else{System.out.println(fi);}}}
}
在原来基本的流的基础上添加了缓冲区,增加了读取和写入的效率
BufferOutputStream字节缓冲输出流
extends OutputStream
使用步骤:
eg:
BufferInputStream字节缓冲输入流
extends InputStream
构造方法
使用步骤
eg:
测试效率
eg:用缓冲流实现文件复制
BufferWriter字符缓冲输出流
构造方法:
特有成员方法:
使用步骤:
eg:
BufferReader字符缓冲输入流
构造方法:
特有的成员方法:
读取一行数据
使用步骤:
eg:
文本排序练习
分析:
实现:
字符编码
字符集
问题
转换流的原理
OutputStreamWriter
java.io.OutputStreamWriter extends Writer
构造方法:
使用步骤:
eg:
写utf_8格式:写gbk格式:
InputStreamReader
java.io. InputStreamReader extends InputStream
构造方法
使用步骤
注意事项
eg
转换文件编码练习
public class Person implements Serializable {//手动添加序列号,防止更改Person后反序列化报错private static final long serialVersionUID=1L;private String name;private Integer age;//使用transient关键字修饰的成员变量不会被序列化,static修饰的也不会transient private String aclass;static int i;public Person() {this.i=++i;}//静态代码块比构造方法先执行,常用于对静态变量的赋值static {i=0;}public Person(String name, Integer age) {this.name = name;this.age = age;}// Testpublic void Test(){//对象的序列化操作ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\IdeaProjects\"));oos.writeObject(new Person("yh",12));oos.close();ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\IdeaProjects\"));Object o = adObject();System.out.println(o);Person p=(Person)o;System.out.Name()+" "Age());if(o instanceof Person){System.out.println("1");}}ois.close();
*注意:
java包
概述
格式
函数式接口作为方法的参数的使用
函数式接口作为方法的返回类型的使用
1.Supplier–获取数据
eg
练习:获取数组中的最大值
/*idea:求出数组中最大的元素值
* 使用函数式编程,使用supplier接口*/
public class DemoSupplier {/*定义一个方法将supplier接口作为方法的参数*/public static Integer getArrayMax(Supplier<Integer> sup){();}public static void main(String[] args) {int[] a={1,3,-8,100,80};Integer max = getArrayMax(()->{int m=a[0];for (int i : a) {if (m<i) m=i;}return m;});System.out.println(max);}
}
2.Consumer接口–(使用)消费数据
eg:
默认方法:andThen
eg:
练习:
3.Predicate接口:对数据进行判断
eg:
默认方法and:与
默认方法or:或
默认方法negate:非(取反)
eg:
Predicate接口练习:集合信息筛选
public class DemoPredicate {/*定义筛选方法*/public static ArrayList<String> checkString(String[] arr, Predicate<String> pre1,Predicate<String> pre2){ArrayList<String> data=new ArrayList<>();for (String s : arr) {//两个判断的条件boolean test = pre1.and(pre2).test(s);//成立则向集合中添加元素if(test) data.add(s);}return data;}public static void main(String[] args) {String[] s={"迪丽热巴,女","古力娜扎,女","赵丽颖,女","马儿扎哈,男"};ArrayList<String> d = checkString(s, (String b) -> {return b.split(",")[1].equals("女");}, (String b) -> {return b.split(",")[0].length() == 4;});for (String s1 : d) {System.out.println(s1);}}
}
4.Function<T,R>接口:类型转换T–>R
apply方法进行转换
R apply(T t)
将此函数应用于给定的参数
eg:
默认方法andThen:进行组合操作
eg:
/*idea:使用Function<R,T>实现将一个字符串转为Integer+10,然后在转为Integer类型打印输出
* 分析:两次转换操作,可以使用andThen方法
* */
public class FunctionDemo {/*定义方法实现需求*/public static void BufferType(String s, Function<String,Integer> f1,Function<Integer,String> f2){/*Integer i=f1.apply(s);* String str=f2.apply(i);*/String str = f1.andThen(f2).apply(s);System.out.println("转换后的字符串是"+str);}public static void main(String[] args) {String a="125";BufferType(a,s->Integer.parseInt(s)+10,r->r+"");}
}
用于解决已有集合类库中的弊端
eg:不用在遍历多次
/*过滤出集合中以张开头,且长度为3的数据并打印*/
public class Demo1 {public static void main(String[] args) {ArrayList<String> a=new ArrayList<>();a.add("张无忌");a.add("张三丰");a.add("张大头鬼");a.add("无忌");//过滤操作+过滤操作a.stream().filter(n->n.startsWith("张")).filter(n->n.length()==3).forEach(name-> System.out.println(name));}
}
流式思想:
Stream<Integer> s = Stream.of(1, 2, 3, 4, 5, 6, 7); long count = s.count(); System.out.println(count);
对lambda表达式的优化
方法引用eg
eg:
/*传递两个整数,计算乘积*/
@FunctionalInterface
public interface Multiply {int multiply(int x,int y);
}/*输入数组长度new一个int[]数组*/
@FunctionalInterface
public interface ArrayNew {int[] method(int a);
}/*传递一个字符串,计算其长度String类中的length方法 */
@FunctionalInterface
public interface StringLen {int len(String s);
}/*使用new构建一个字符串*/
public interface StringNew {String m(String n);
}/**/
public class Demo1 {public static void main(String[] args) {//1.静态方法引用//static int multiplyExact(int x, int y)//返回参数的乘积,如果结果溢出int,则抛出 int 。Multiply m=Math::multiplyExact;int result = m.multiply(2, 6);System.out.println(result);System.out.println("-------------------");//2.实例方法引用StringLen s=String::length;int len = s.len("12345");System.out.println(len);System.out.println("-------------------");//3.构造方法引用ArrayNew a= int[]::new;int[] x = a.method(10);System.out.String(x));System.out.println(x);StringNew n=String::new;String c = n.m("aaa");System.out.println(c);System.out.println("----------------------");}
}
本文发布于:2024-02-03 01:34:07,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170689524747782.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |