javaSE进阶
javaSE进阶
small_py_trade
这个作者很懒,什么都没留下…
展开
-
反射机制(Reflection)
java有一定动态性,使用反射可以在程序运行时借助Reflection API获得任何类的信息,并直接改变其中的属性和方法。类的完整结构包括:Field,Method,Constructor,SuperClass,Interface,Annotation。一个类有唯一的Class对象,类的整个结构被封装在这个对象中。除了上面获得Class对象的三种方法,每种内置包装类型都有Type属性。加载完类之后,在方法区就会生成一个class对象,这个对象包含了类的完整信息。原创 2022-09-21 19:06:15 · 221 阅读 · 0 评论 -
注解机制 (Annotation)
在java中前面有@符号的就是注解,如:@Override。一些特殊的有参数,如:@SuppressWarnings (value="unchecked")。如果没有@SuppressWarnings("all"),在IDEA中Account和bankMoney会是灰色,相当于警告,而加了之后就没有了。Source表示源码,RUNTIME表示运行时候,CLASS表示编译生成的.class文件。@Override @Deprecated @SuppressWarnings()是最常见的。原创 2022-09-21 14:07:30 · 180 阅读 · 0 评论 -
拷贝目录
拷贝目录的思路:对要拷贝的文件夹进行遍历,如果遍历到文件夹就在目标文件夹生成该文件夹。如果遍历到文件就使用IO流拷贝该文件,到此返回上一层的迭代。原创 2022-09-19 17:22:42 · 194 阅读 · 0 评论 -
正则表达式(Regular Expression)
概念:常用于替换、修改符合某种模式的文本。特点:1,灵活性强;2,极简方式控制复杂字符串java中的正则表达式:其为String类型,被验证内容也是String类型,被验证字符使用match方法与正则表达式匹配,返回一个boolean变量。语法:(1)一般形式【内容限定】{长度限定}//长度限定可以不给,默认为1【a-z0-9】表示内容为a-z或0-9的数字,不分先后【^abc】表示内容不能为a或b或c{最小长度,最大长度}表明长度必须在这两个数之间,如{0,}表明最小为0,原创 2022-03-28 14:36:59 · 451 阅读 · 0 评论 -
生产者与消费者
wait和notify是java中任何一个对象都有的方法。某对象调用wait()方法:在该对象上活动的线程进入等待状态,直到被唤醒。某对象调用notify()方法,线程被唤醒。原创 2022-03-02 19:32:20 · 182 阅读 · 0 评论 -
实现线程的另一方法
实现Callable接口://创建未来任务类对象,使用匿名内部类 FutureTask f=new FutureTask(new Callable() { //call方法相当于run方法,但是有返回值 //相当于线程执行结束返回一个结果 public Object call() throws InterruptedException { System.out.println("begin call"); Thread.sleep(5000); S原创 2022-03-01 18:37:54 · 35 阅读 · 0 评论 -
定时器
间隔一段时间,执行特定的程序。使用sleep()方法实现定时器,是最古老的方法。java.util.Timer也可以实现。但是实际开发直接用框架就实现了。使用Timer创建定时器;原创 2022-02-28 20:37:49 · 130 阅读 · 0 评论 -
守护线程
线程分为守护线程和用户线程。守护线程相当于死循环,等所有用户线程结束守护线程就结束了。比如说每天定时备份(需要使用定时器)。实现守护线程:public class test { public static void main(String[] args) throws InterruptedException { BakData bd=new BakData(); bd.start(); for (int i=0;i<1000;i++) { Thread.sleep(原创 2022-02-28 20:23:48 · 35 阅读 · 0 评论 -
开发与线程安全
注意线程安全:(1)尽量使用局部变量;(2)尽量每个线程对应一个对象(3)以上不好实现再使用synchronized原创 2022-02-28 20:06:21 · 29 阅读 · 0 评论 -
死锁
不出现异常和错误,程序却不执行。如下可能出现死锁。class Mythread1 extends Thread { Object o1; Object o2; public Mythread1(Object o1,Object o2) { this.o1=o1;this.o2=o2; } public void run() { synchronized(o1){ synchronized(o2){ } } }}class Mythread2 ext原创 2022-02-28 20:00:49 · 45 阅读 · 0 评论 -
sychronized模块
sychronized(){}称为同步代码块。里面必须填需要进行排队的线程的共享代码块,小括号里面写需要进行排队的对象。如上一节Account的withdraw函数中部分可以放入同步代码块:synchronized(this){ int before=this.bankMoney; int after=before-money; this.bankMoney=after; }就不会出现余额错误。因为当一个线程执行该代码时,会占有小括号中对象的对象锁,其他线程执行到这里时就原创 2022-02-27 22:02:25 · 44 阅读 · 0 评论 -
线程安全
线程的重要问题。出现不安全的情况:(1)多线程并发;(2)多个线程共享数据;(3)共享数据有修改行为;解决方法:使用线程同步机制,就是停止线程并发,依次进行,会牺牲效率。线程同步涉及到同步和异步编程模型。异步即并发,同步即排队。一个例子,存款10000,两个线程各取5000,可能出现账户余额还有5000。因为可能在t1线程获取到bankMoney是10000时,t2也恰好此时获取到是10000,然后t1执行取款操作剩5000,t2也剩5000。最后取了两次还剩5000。//账原创 2022-02-27 20:49:01 · 86 阅读 · 0 评论 -
线程调度
常见的调度模型:抢占式调度(看线程优先级分配CPU,java使用)、均分式调度(平均分配CPU时间线)。线程调度的方法:1,实例方法:void setPriopity(int newPriority)//设置优先级int getPriority()//获取优先级优先级为1-10,默认5void join()//合并线程2,静态方法:static void yield()//让位,暂停当前线程,给其他线程使用...原创 2022-02-27 20:01:05 · 201 阅读 · 0 评论 -
对线程的操作
假设t是一个线程对象//设置线程名字t.setName("");//获取线程名字t.getName();//启动线程t.start();//返回当前正在执行的线程对象,Thread.currentThread()//sleep()方法:使线程进入休眠,放弃占有cpu,这个方法出现在那个线程中,那个线程就休眠,可以间隔特定的时间执行特定的代码Thread.sleep();...原创 2022-02-27 19:32:18 · 110 阅读 · 0 评论 -
实现线程的方式
第一种编写一个类,继承java.lang.Threadpublic class test { public static void main(String[] args) { MyThread t=new MyThread(); t.start(); //这一步表示开辟了一个新的栈空间,运行新的线程,这行代码在空间分配出来瞬间就结束了 //线程启动成功就会自动调用run()方法 //run方法和main()方法地位相同,都是在栈的最底部 for(int i=0;i<原创 2022-02-26 20:08:22 · 161 阅读 · 0 评论 -
多线程
1,进程指一个应用程序,线程指进程中的执行场景/单元,一个进程中可以有多个线程2,进程A和B内存独立不共享。3,在java语言中,堆内存和方法区内存共享,但是栈内存独立,一个线程一个栈。各栈之间互不干扰,称为多线程并发,可以提高程序处理效率。4,事实上要执行几个线程CPU就要有几核,但是由于单核CPU线程切换很快,所以会感觉是同时进行的。...原创 2022-02-26 19:26:56 · 162 阅读 · 0 评论 -
IO流与Properties
如果一个文件存储了内容:username="usi"password=123那么用一个流将它传到一个Property中,就会自动把等号左边作为key,右边作为value所以经常刷新改变的内容可以加载到文件中,再由程序读入,这种文件可以称为属性配置文件。规定文件以.properties结尾。Properties就是专门存这种文件内容的类1,在属性文件中#是注释;2,属性配置文件中key相同,FileInputStream fis=new FileInputStream("C:\\Us原创 2022-02-26 18:53:14 · 152 阅读 · 0 评论 -
对象流\对象序列化和反序列化
1,当内存中的java对象的数据信息需要存到文件上时,需要将该对象进行序列化(serialize),反过来就是反序列化(disserialize)。序列化和反序列化反别由ObjectInputStream 和ObjectOutputStream负责。2,参与序列化和反序列化的对象必须实现Serializable这个接口。实际上这个接口中什么都没有,只是起到标识的作用。java虚拟机识别后自动生成一个序列号。3,如果不希望某个属性参与序列化,可以加上transient关键字4,java中采用序列号原创 2022-02-24 20:49:39 · 523 阅读 · 0 评论 -
File类
1,File类和IO类没有关系,不能完成文件读写2,File可以完成对文件的抽象表示File f=new File("C://ok.txt"); if (!f.exists()) { f.mkdir(); //如果文件不存在,以目录的形式新建 }常用方法:1,getName:获取文件名2,isFile(),isDirectory():是否是文件或者目录3,lastModified():最后一次修改的时间,返回的是毫秒数,用这个构造出Date就获得日期了4,length原创 2022-02-23 21:39:22 · 47 阅读 · 0 评论 -
标准流
1,标准输出流不需要手动关闭,可以改变输出的方向,如:PrintStream pr=new PrintStream(new FileOutputStream("ok")); System.setOut(pr);指定将输出内容由控制台转变到ok文件。原创 2022-02-23 21:20:33 · 47 阅读 · 0 评论 -
数据流
1,java.io.DataOutputStream叫数据专属的流,这个流可以将数据连同数据的类型一同写入文件。构造的时候可以传入一个FileOutputStream.2,DataInputStream也一样原创 2022-02-23 20:54:08 · 42 阅读 · 0 评论 -
带缓冲区的字符流\转换流
1,使用带缓冲区的流不需要数组2,当一个流的构造方法需要一个流,这个流称为节点流,而在外部负责处理它的流称为包装流关闭的时候关闭外部的流就行了FileReader fr; try { fr = new FileReader("C:\\Users\\Administrator\\Pictures\\Camera Roll\\2.txt"); BufferedReader bf= new BufferedReader(fr); String s; //BufferedR原创 2022-02-23 20:43:31 · 79 阅读 · 0 评论 -
FileReader和FileWriter
1,文件字符输入流,只能读取文本因为每次读的是一个字符,要用char数组读取,不是byte使用方法跟FileInputStream和FileOutputStream差不多原创 2022-02-23 20:14:16 · 33 阅读 · 0 评论 -
FileOutputStream
try { //第二个参数为true表示跟着原来的继续写 FileOutputStream fil=new FileOutputStream("C:\\Users\\Administrator\\Pictures\\Camera Roll\\1.txt",true); //输出完成后一定要刷新 byte[] b= {99,100,101,102}; try { fil.write(b); } catch (IOException e1) { // TOD.原创 2022-02-23 19:19:41 · 212 阅读 · 0 评论 -
FileInputStream
1,任何类型文件都可以读2,用字节方式读取3,没有读到就返回-1FileInputStream pic=null; try { pic=new FileInputStream("C:\\Users\\Administrator\\Pictures\\Camera Roll\\1.txt"); int data; while((data=pic.read())!=-1) { System.out.println(data); } } catch (IOEx原创 2022-02-22 21:26:39 · 39 阅读 · 0 评论 -
IO流
IO流的分类:1,按流向分类。到内存中去,称为输入即读;从内存中出,称为输出,即为写。2,按读取方式分类。一种是按一个一个字节进行读取,一种是什么文件都能读,一种是每次只能读取一个字符(字符占用的字节数目不同,比如汉字和字母),这种只能用于纯文本(word不是)。java中所有流都在java.io.*下面。四大类:InputStream/OutputStream字节输入输出流,Reader/Writer字符输入输出流...原创 2022-02-22 21:03:33 · 130 阅读 · 0 评论 -
HashMap常用操作
//创建并添加元素 HashMap<Integer,String> map=new HashMap<Integer,String>(); map.put(1, "zhang");map.put(2, "han");map.put(3, "hua"); //通过key获取value System.out.println(map.get(2)); //通过获取所有key来遍历 Set<Integer> keys=map.keySet(); for.原创 2022-02-22 20:13:45 · 166 阅读 · 0 评论 -
HashSet常用操作
//创建HashSet HashSet<Integer> H=new HashSet<>(); H.add(1);H.add(2);H.add(3); //使用迭代器遍历 Iterator<Integer> it=H.iterator(); while (it.hasNext()){ System.out.println(it.next()); } //使用foreach遍历 for (Integer i:H) { Syste.原创 2022-02-22 19:32:42 · 375 阅读 · 0 评论 -
Collections工具类
Collections中的syncronlized系列使集合变成线程安全的。sort方法给集合进行排序。sort()可以传入List的对象,如果想对Set对象排序,可以用List的构造方法把其转成List对象。原创 2021-12-26 11:36:13 · 180 阅读 · 0 评论 -
TreeSet
数据放进TreeSet,拿出来过后就是有序的。自定义的类型不能用TreeSet排序。因为自定义的类型没有实现Comparable接口,不能做比较运算。所以要实现Comparable,实现其中的compareTo方法。在compareTo中要编写比较规则。比如说String类就实现了compareTo方法...原创 2021-12-26 10:49:51 · 152 阅读 · 0 评论 -
Properties属性类
继承HashTable,key和value都是String.存:setProperty(key,value)取:getPrperty(key)原创 2021-12-26 09:39:34 · 37 阅读 · 0 评论 -
HashMap和HashTable
HashMap的key可以为null,但是只能有一个.HashTable的key和value都不能为空,因为HashTable线程安全的方法导致效率不高,很少使用。原创 2021-12-26 09:34:20 · 119 阅读 · 0 评论 -
哈希表数据结构
哈希表是数组和单向链表的结合。HashMap底层是个一维数组,每个数组存储的是一个静态类HashMap.Node。Node里面有下一个Node的地址,相当于链表,还有哈希值,可以转换成数组的下标。哈希表数据结构示意图:在哈希表中查询相当于在字典中先找到对应字母的页,再在这些页中查找。所以HashMap的key无序且不可重复,不一定挂在那个单向链表上,而且equals方法保证不重复因为如果一个对象的hashCode方法导致哈希值分布不均匀,那么哈希表就得不到有效利用。所以一般放转载 2021-12-24 17:34:39 · 664 阅读 · 0 评论 -
Map接口
Map集合以key和value的形式存储数据,都是引用数据类型。常用方法:void clear();boolean containsKey(Object Key);boolean containsValue(Object Value);.get(key);获取valueput(key,value);存入新键值对boolean isEmpty();keySet();获取所有键,返回一个Set集合remove(Object key);删除键值对size()获取键的个数v原创 2021-12-24 16:23:02 · 290 阅读 · 0 评论 -
增强for循环foreach
如arr是一个数组那么for(int data:arr)其中data就代表arr中的每一个元素但是foreach循环没有下标。原创 2021-12-23 21:18:43 · 136 阅读 · 0 评论 -
泛型
如: List<Animal> list=new ArrayList();这样list里面只能存Animal的对象,不然会报错。只要源码里面有<E>的类就可以用泛型泛型只在编译阶段有作用,运行阶段没有用。自定义泛型: 比如: public class Animal<E>{ void doSome(E o){}}测试时写: Animal<String>...原创 2021-12-23 21:02:13 · 1211 阅读 · 0 评论 -
Vector集合
底层是个数组,初始化容量10,扩容之后是原容量的2倍。ArrayList是1.5倍vector里面的元素都是线程安全的,用得比较少java.util.Collections是一个工具类,里面的syncronized方法可以把非线程安全的变成线程安全的。直接把集合传入就行。...原创 2021-12-23 20:22:51 · 174 阅读 · 0 评论 -
链表数据结构
链表基本单元为节点Node,有两个属性,内容和下一个节点地址示意图,其中删除了链表中的一个对象:所以链表增删元素方便,但是查询困难,因为每次都要从头结点开始遍历。原创 2021-12-23 20:14:20 · 267 阅读 · 0 评论 -
ArrayList
初始化容量是10,底层是一个Object数组。构造的时候可以指定初始容量。(注意size()是获取元素个数,不是容量)如果容量不够,会自动扩容到原来的1.5倍因为数组扩容效率低,给定预估初始容量较好,减小数组扩容次数。这是一个优化策略。数组优点:检索效率高缺点:增删不方便ArrayList的构造方法参数还可以是一个集合。比如建了一个HashSet的集合,这样就可以转成ArrayList的集合。...原创 2021-12-22 20:48:12 · 50 阅读 · 0 评论 -
List接口独有方法
List中方法有序可重复。Collection里面没有的:add(intindex,Eelement)get(intindex)indexOf(Objecto);获取指定对象第一次出现处的索引lastIndexOf(Objecto);最后一次出现的索引remove(intindex)set(intindex,Eelement);改指定位置元素List集合因为有下标,可以用类似数组的方式进行遍历,用get()获取元素。...原创 2021-12-22 20:11:31 · 321 阅读 · 0 评论