
Java
记录Java学习
「已注销」
这个作者很懒,什么都没留下…
展开
-
学习博客:类加载内存分析
当程序主动使用某个类时,若该类还未被加载到内存中,则系统会通过三个步骤对该类进行初始化类的加载与ClassLoader加载将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,再生成一个代表该类的java.lang.Class对象链接将Java类的二进制代码合并到JVM的运行状态之中的过程验证:确保加载的类信息符合JVM规范,无安全隐患准备:正式为类变量(static)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行分配解析:虚拟机常量池内原创 2022-03-25 19:03:53 · 332 阅读 · 0 评论 -
学习博客:初识反射机制
动态语言在运行时可以根据某些条件改变自身结构,包括新的函数、对象、代码Object-C,C#,JavaScript,PHP,Python静态语言运行时结构不可改变Java,C,C++Java是准动态语言,可以利用反射机制获得类似动态语言的特性反射(Reflection)是Java被视作动态语言的关键,允许在程序执行期间借助Reflection API获得任何类的内部信息,也可以直接操作任意对象的内部属性和方法Class c = Class.forName(“java.lang.St原创 2022-03-25 15:16:46 · 212 阅读 · 0 评论 -
学习博客:初识线程池
经常创建和销毁线程、使用量特别大的资源,对性能影响很大(并发时的线程)可提前创建多个线程,放入线程池中,使用时直接获取,使用完放回池中,避免频繁创建和销毁,实现重复利用使用线程池可提高响应速度(减少创建新线程的时间)降低资源消耗(重复利用线程池中的线程,无需频繁创建)便于管理corePoolSize:核心池大小maximumPoolSize:最大线程数keepAliveTime:线程没有任务时最多保持多久后终止ExecutorService:线程池接口,子类ThreadPool原创 2022-03-24 21:11:14 · 363 阅读 · 0 评论 -
学习博客:初始线程协作
针对生产者消费者问题四个角色:生产者、消费者、仓库、产品仓库只能存在一件产品,生产者放入,消费者取出仓库中不存在产品,生产者放入,否则停止生产并等待,直到仓库中的产品被消费者取出仓库中存在产品,消费者取出,否则停止取出并等待,直到生产者再次放入产品这是一个线程同步问题,生产者和消费者共享同一个产品,并且生产者和消费者之间相互依赖,互为条件对于生产者,没有生产产品,要通知消费者等待,生产之后又要通知消费者取出对于消费者,取出产品后,要通知生产者再次生产在此问题中,仅使用synchron原创 2022-03-24 20:46:39 · 398 阅读 · 0 评论 -
学习博客:初步了解Lock(锁)
JDK5.0,Java提供了更强大的线程同步机制,通过显式定义同步锁对象来实现同步,同步锁使用Lock对象充当java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具,锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象ReentrantLock(可重入锁)类实现了Lock,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,常用ReentrantLock,可显式加锁、原创 2022-03-24 15:26:55 · 286 阅读 · 0 评论 -
学习博客:初步了解死锁
多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,这导致两个或多个线程都在等待对方释放资源,形成僵持停止执行。某一个同步块同时拥有两个以上对象的锁时,就可能会发生死锁HR:说说死锁吧我:你先给我发offer双方都抱着对方需要的资源不肯让步,形成僵持,这种现象就是死锁//死锁 多个线程互相抱着对方需要的资源,形成僵持public class DeadLock { public static void main(String[] args) { Int原创 2022-03-24 09:50:08 · 269 阅读 · 0 评论 -
学习博客:初步了解并发
并发:同一个对象被多个线程同时操作(抢票)每个对象都有一把锁,sleep不会释放锁线程同步:多个线程操作同一个资源处理多线程问题时,多个线程访问同一个对象,且某些线程需要修改这个对象,这时需要线程同步。线程同步是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕,下一个线程才能使用线程同步的条件:队列和锁(安全性高,但会损失性能)例子:队列(排队上厕所)和锁(为保证安全,一次只能有一个上厕所)同一进程的多个线程共享同一块存储空间,使用方便,但会带来原创 2022-03-23 22:48:48 · 370 阅读 · 0 评论 -
学习博客:线程优先级
Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行优先级低说明获得调度的概率低,并不是不会调用,看CPU的调度改变/获取优先级方法,优先级的设定最好放在start()调度前getPriority() setPriority(int a)默认:MAX_PRIORITY=10NORM_PRIORITY=5MIN_PRIORITY=1//测试线程的优先级public class TestPriority extends原创 2022-03-23 19:51:28 · 550 阅读 · 0 评论 -
学习博客:用户线程和守护线程
线程分为用户线程和守护线程虚拟机必须确保用户线程执行完毕虚拟机不用等待守护线程执行完毕后台记录操作日志、监控内存、垃圾回收等待//测试守护线程public class TestDaemon { public static void main(String[] args) { God god = new God(); You you = new You(); Thread thread1 = new Thread(god); .原创 2022-03-23 19:53:48 · 886 阅读 · 0 评论 -
学习博客:线程状态及线程方法
线程状态1.线程停止//建议线程正常停止 设置标志位 不使用stop、destory等过时或者JDK不建议使用的方法public class TestStop implements Runnable{ //设置一个标志位 private boolean flag = true; @Override public void run() { int i = 0; while(flag){ System.out.p原创 2022-03-23 17:33:27 · 453 阅读 · 0 评论 -
学习博客:静态代理
//静态代理public class StaticProxy { public static void main(String[] args) { new Thread().start(); Intermediary intermediary = new Intermediary(new Me()); intermediary.Buy(); }}//购买接口interface Buy{ void Buy();}//购原创 2022-03-23 16:51:36 · 221 阅读 · 0 评论 -
学习博客:线程的三种创建方式
1.继承Thread类步骤:继承Thread类,重写run方法,调用start方法开启线程//继承Thread类,重写run方法,调用start开启线程//线程开启不一定立即执行,由CPU调度执行public class TestThread01 extends Thread{ @Override public void run() { //run方法线程体 for (int i = 0; i < 999; i++) {原创 2022-03-23 07:08:50 · 303 阅读 · 0 评论 -
学习博客:IO流之字节流(InputStream、OutputStream)
字节输入流 InputStream,该抽象类是所有类字节输入流的超类字节输出流 OutputStream,该抽象类是所有类字节输出流的超类1.文件输入输出流1.1 文件输入流 FileInputStreamimport org.junit.jupiter.api.Test;import java.io.FileInputStream;import java.io.IOException;public class FileInputStream_ { public static vo原创 2022-03-20 22:25:24 · 619 阅读 · 0 评论 -
学习博客:IO流之字符流(Reader、Writer)
1.字符输入流 FileReader常用方法:创建对象new FileReader(File/String)每次读取单个字符,返回该字符,若到文件末尾返回-1read()批量读取多个字符到数组,返回读取到的字符数,到文件末尾返回-1read(char[])将char[]转换为String:new String(char[])将char[]的指定部分转换为String:new String(char[], off, len)import org.junit.jupiter.原创 2022-03-20 22:27:22 · 602 阅读 · 0 评论 -
学习博客:IO流之节点流、处理流
处理流/包装流”连接“在已存在的流(节点流和处理流)之上,拥有更强大的读写功能、更灵活(BufferedReader、BufferedWriter)消除不同节点流之间的实现差异,提供更方便的方法完成输入输出使用修饰器设计模式,不会直接与数据源相接提高性能:以增加缓冲的方式提高输入输出的效率方便操作:一次大批量输入输出数据1.BufferReaderimport java.io.BufferedReader;import java.io.FileReader;public class原创 2022-03-20 22:26:07 · 547 阅读 · 0 评论 -
学习博客:IO流之目录的操作
import org.junit.jupiter.api.Test;import java.io.File;public class Directory_ { public static void main(String[] args) { } //判断文件是否存在,若存在则删除 @Test public void m(){ String filePath = "D:\\test2.txt"; File file = ne原创 2022-03-20 00:01:19 · 479 阅读 · 0 评论 -
学习博客:IO流之获取文件信息
import org.junit.jupiter.api.Test;import java.io.File;public class FileInformation { public static void main(String[] args) { } //获取文件信息 @Test public void info(){ //创建文件对象 File file = new File("D:\\test1.txt");原创 2022-03-19 23:42:13 · 449 阅读 · 0 评论 -
学习博客:IO流之创建文件的三种方法
import org.junit.jupiter.api.Test;import java.io.File;import java.io.IOException;public class Demo01 { public static void main(String[] args) { } //创建文件 //方法1: new File(String pathname) @Test public void create1(){ St原创 2022-03-19 22:47:41 · 1070 阅读 · 0 评论 -
学习博客:集合框架之collection的使用
集合即对象的容器,定义了对多个对象进行操作的常用方法,可实现数组的功能与数组的区别:1.数组长度固定,集合长度不固定2.数组可以存储基本类型和引用类型,集合只能存储引用类型import java.util.*;操作元素import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;public class Demo01 { public static void main(Str原创 2022-03-18 15:01:41 · 311 阅读 · 0 评论 -
学习博客:集合学习小结
CollectionMap集合对象的容器,和数组类似,定义了对多个对象进行操作的常用方法List集合有序、有下标、元素可重复ArrayList、LinkedList、VectorSet集合无序、无下标、元素不可重复HashSet、TreeSetMap集合存储一对数据,无序、无下标、键不可重复、值可重复HashMap、HashTable、TreeMapCollections集合工具类,定义了除存取以外的集合常用方法泛型约束,避免类型转换之间的问题原创 2022-03-19 21:28:30 · 272 阅读 · 0 评论 -
学习博客:collection工具类
集合工具类:定义了除存取以外的集合常用方法import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.List;//collection工具类public class Test { public static void main(String[] args) { List<Integer> list = new ArrayLi原创 2022-03-19 21:20:11 · 241 阅读 · 0 评论 -
学习博客:集合框架之Map集合实现类
1.HashMap基于哈希表实现的Map接口JDK1.2,线程不安全,运行效率高允许null作为key或value创建一个Person类public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public Stri原创 2022-03-19 20:57:07 · 664 阅读 · 0 评论 -
学习博客:集合框架之Map接口
Map接口的使用import java.util.HashMap;import java.util.Map;import java.util.Set;/** * Map接口的使用 * 存储键值对 * 键不能重复、值可以重复 * 无序 */public class Demo01 { public static void main(String[] args) { //创建集合 Map<String,String> map = new原创 2022-03-19 19:09:14 · 304 阅读 · 0 评论 -
学习博客:集合框架之Set实现类
HashSet存储结构为哈希表哈希表 JDK1.7(数组+链表) JDK1.8(数组+链表+红黑树)1.基于HashCode实现元素不重复2.当存入元素的哈希码相同时,会调用equals进行确认,若结果为true,则拒绝后者存入import java.util.HashSet;import java.util.Iterator;/** * HashSet集合 * 哈希表 JDK1.7(数组+链表) JDK1.8(数组+链表+红黑树) */public class De原创 2022-03-19 16:55:58 · 673 阅读 · 0 评论 -
学习博客:Java集合框架之泛型
Java泛型是JDK1.5引入的新特性,本质是参数化类型,将类型作为参数传递常见形式:泛型类、泛型接口、泛型方法语法:<T,…> T称为类型占位符,表示一种引用类型,通常有E、K、V优势:提高代码重用性、防止类型转换异常、提高代码安全性1.泛型类/** * 泛型类 * 语法:类名<T> * T是类型占位符,表示一种引用类型,可以使用多个 <T,E,K,V,...> */public class MyGeneric<T> { /原创 2022-03-18 21:37:17 · 298 阅读 · 0 评论 -
学习博客:集合框架之Set接口的使用
无序、无下标、元素不重复全部继承Collection中的方法import java.util.HashSet;import java.util.Iterator;import java.util.Set;/** * Set接口的使用 * 无序、五下标、不重复 */public class Demo01 { public static void main(String[] args) { //创建集合 Set<String> set =原创 2022-03-18 21:58:05 · 409 阅读 · 0 评论 -
学习博客:Java集合框架之List实现类
1.ArrayList存储结构:数组,查询快,增删慢运行效率高,线程不安全创建Animals类import java.util.Objects;public class Animals { private String name; private int age; private String shout; public Animals(String name, int age, String shout) { this.name = nam原创 2022-03-18 20:18:31 · 697 阅读 · 0 评论 -
学习博客:集合框架之List接口的使用
List子接口:有序、有下标、元素可重复import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.ListIterator;public class Demo03 { public static void main(String[] args) { //创建集合对象 List list = new ArrayList<>原创 2022-03-18 15:57:02 · 188 阅读 · 0 评论 -
学习博客:Object类
Object类是超类、基类,所有的类的直接或间接父类,位于继承树的最顶层,任何类若没有extends显示继承某个类,都默认直接继承Object类,否则为间接继承。Object类中所定义的方法,是所有对象都具备的方法。Object类可以存储任何对象作为参数,可接受任何对象作为返回值,可返回任何对象1.getclass()方法:返回引用中存储的实际对象类型,通常用于判断两个引用中实际存储对象类型是否一致创建一个Student类public class Student { privat原创 2022-03-17 21:50:29 · 190 阅读 · 0 评论 -
学习博客:常用类小结
内部类:在一个类的内部再定义一个完整的类成员内部类、静态内部类、局部内部类、匿名内部类Object类:所有类的直接或间接父类,可存储任何对象hashcode() 返回该对象的哈希码值(哈希值根据对象的地址、字符串或数字使用hash算法计算出来的int类型的数值),一般情况下相同对象返回相同哈希码toString() 返回该对象的字符串表示(表现形式),可以根据程序需求重写该方法,比如展示对象各个属性值clone() 拷贝对象,分为浅拷贝和深拷贝getClass() 返回原创 2022-03-18 14:18:40 · 191 阅读 · 0 评论 -
学习博客:File类
File类实现文件、文件夹的创建、写入、查看、修改、删除import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.FileNotFoundException;public class TestFile {原创 2022-03-18 10:29:08 · 308 阅读 · 0 评论 -
学习博客:Math类
Math类中的方法都是static型,可直接用类名调用import java.util.Arrays;public class TestMath { public static void main(String[] args) { //随机数 System.out.println("-----随机数-----"); int[] a = new int[10]; for (int i = 0; i < 10; i++) {原创 2022-03-17 22:12:38 · 421 阅读 · 0 评论 -
学习博客:System类
System系统类,主要用于获取系统的属性数据和其他操作,构造方法私有,不需要创建对象,属性方法都是静态的public class TestSystem { public static void main(String[] args) { //arraycopy实现数组复制 //src:原数组 //srcPos:从哪个位置开始复制 //dest:目标数组 //destPos:目标数组位置 //lengt原创 2022-03-17 11:20:04 · 403 阅读 · 0 评论 -
学习博客:SimpleDateFormat类
SimpleDateFormat是以与语言环境有关的方式来格式化和解析日期的具体类时间字母年y月M日d时H分m秒s毫秒Simport java.text.SimpleDateFormat;import java.util.Date;public class TestSimpleDateFormat { public static void main(String[] args) throws Exception{原创 2022-03-15 22:36:21 · 172 阅读 · 0 评论 -
学习博客:BigDecimal类
float和double都是浮点类型,由于不是精确计算,计算后会有误差。BigDecimal可以解决这个问题,它能够精确计算浮点数。方法BigDecimal add(); //加BigDecimal subtract(); //减BigDecimal multiply(); //乘BigDecimal divide(); //除引入包import java,math.BigDecimal;例子import java.math.BigDecimal;public class Tes原创 2022-03-15 21:26:07 · 205 阅读 · 0 评论 -
学习博客:Date类
import java.util.Date;public class TestDate { public static void main(String[] args) { //今天 Date d1 = new Date(); System.out.println(d1.toString()); System.out.println(d1.toLocaleString()); //已过时 //昨天原创 2022-03-15 21:46:41 · 392 阅读 · 0 评论 -
学习博客:可变长字符串StringBuffer与StringBuilder
(1)StringBuffer 运行效率慢,线程安全(2)StringBuilder 运行效率快,线程不安全效率比String高,比String节省内存单线程情况下尽量使用StringBuilderpublic class Demo03 { public static void main(String[] args) { //StringBuffer sb = new StringBuffer(); StringBuilder sb = new Strin原创 2022-03-11 23:59:00 · 323 阅读 · 0 评论 -
学习博客:Calendar类
Calendar提供了获取、设置各种日历字段的方法构造方法:protected Calendar(); 由于修饰符为protected,无法直接创建对象,但可以使用静态方法static Calendar getInstance();import java.util.Calendar;public class TestCalendar { public static void main(String[] args) { Calendar calendar = Calend原创 2022-03-15 22:14:53 · 412 阅读 · 0 评论 -
学习博客:常用类之String类
字符串是常量,创建之后不可改变,字面值存储在字符串池中,可以共享产生一个对象,字符串中存储Strings s = "java"; 产生两个对象,堆、池各存储一个String s = new String("java");常用方法原创 2022-03-06 15:00:43 · 245 阅读 · 0 评论 -
学习博客:常用类之包装类
1.包装类包装类就是基本数据类型所对应的引用数据类型Object可统一所有数据,包装类的默认值是null基本数据类型包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublebooleanBooleancharCharacter下面是文档的介绍:将基本类型包装起来,使其具备对象的性质2.装箱与拆箱装箱:将基本数据类型转为对应类型的包装类的过程拆箱原创 2022-03-05 17:50:54 · 313 阅读 · 0 评论