![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JavaSE
JavaSE基础部分
全栈小李
最近总结分享一些在项目中遇见的问题和解决办法,帮助初级程序员能够快速上手解决问题。
展开
-
Java入门基础知识点
注释:注释不会被执行 是给我们写代码的人开的java中的注释有三种:单行注释 //多行注释 /**//** * 文档注释 */标识符:定义:java 所有的组成部分都需要名字,类名,变量名以及方法名都被成为标识符。以下基本全部覆盖了java中的大部分标识符。797)(C:\Users\L\AppData\Roaming\Typora\typora-user-images\image-20201110180539920.png)]标识符注意点:所有的标原创 2020-11-12 17:32:13 · 116 阅读 · 0 评论 -
LinkedList详解
LinkedList:链表结构实现,增删快,查询慢。案例/** LinkedList* 存储结构:双向链表* */import java.util.Iterator;import java.util.LinkedList;import java.util.ListIterator;public class TestLinkedList { public static void main(String[] args) { //创建集合 ..原创 2020-12-04 09:37:27 · 156 阅读 · 1 评论 -
List实现类
List实现类ArrayList [重点]:数组结构实现,查询快,增删慢;JDK1.2版本,运行效率快,线程不安全。Vector数组结构实现,查询快,增删慢;JDK1.0版本 ,运行效率慢,线程安全。LinkedList:链表结构实现,增删快,查询慢。...原创 2020-12-03 17:59:03 · 78 阅读 · 0 评论 -
接口详解
普通类:只有具体实现抽象类:具体实现和规范(抽象方法)都有!接口:只有规范!自己无法写方法。 约束和实现分离:面向接口编程。接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想。如果你是天使则必须能飞,如果你是汽车,则必须能跑。如果你是好人,则必须干掉坏人;如果你是坏人,则必须欺负好人。接口的本质是契约,就像我们人间的法律一样,制定好后大家都遵守。OO的精髓,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++,ja.原创 2020-11-25 09:27:02 · 104 阅读 · 0 评论 -
Calendar类
Calendar 类Calendar提供了获取或设置各种日历字段的方法。构造函数protected Calendar ():由于修饰符是protected,所有无法创建该对象。基本方法案例 多看看案例 这个案例注释很清楚 基本能把calendar类了解的差不多public class TestCalendar { public static void main(String[] args) { //1.创建Calendar对象 Cal原创 2020-12-02 08:57:02 · 116 阅读 · 0 评论 -
String类
String案例演示案例演示:需求:已知String str=" this is a text ";将str中的单词单独获取出来将str中的text替换为practice在text前面插入一个easy将每个单词的首字母改为大写案例:/** 已知String str=" this is a text ";1. 将str中的单词单独获取出来2. 将str中的text替换为practice3. 在text前面插入一个easy4. 将每个单词的首字母改为大写* */原创 2020-12-01 16:18:58 · 180 阅读 · 0 评论 -
equals方法覆盖
equals()方法覆盖比较两个引用是否指向同一个对象判断obj是否为null判断两个引用指向的实际对象类型是否一致。强制类型转换依次比较各个属性值是否相同案例public class Student { //定义两个属性 private String name; private int age; //定义 get set 方法 和有参无参构造 public String getName() { return原创 2020-11-30 20:10:34 · 374 阅读 · 0 评论 -
创建对象时内存分析
创建对象的内存分析:直接看代码:这个是一个pet类public class pet { public String name; public int age; //默认有无参构造函数 public void shout(){ System.out.println("在大声的叫"); }}这个是一个调用pet的main方法: public static void main(String[] args) { pet c原创 2020-11-19 20:20:06 · 149 阅读 · 0 评论 -
JavaSE学习路线图
原创 2020-12-09 07:30:00 · 1207 阅读 · 2 评论 -
反射操作注解简单案例
package Reflection;import java.lang.annotation.*;import java.lang.reflect.Field;//练习反射操作注解public class Test11 { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException { Class c1 = Class.forName("Reflect原创 2021-01-05 17:12:30 · 158 阅读 · 2 评论 -
反射操作泛型
反射操作泛型Java采用泛型擦除的机制来引用泛型,Java中的泛型仅仅是给编译器Javac使用的,确保数据的安全性和免去强制类型转换问题,但是,一旦编译完成,所有和泛型有关的类型全部擦除。为了通过反射操作这些类型,Java新增了ParameterizedType,GenericArrayType,TypeVariable和WildcardType几种类型来代表不能被归一到Class类中的类型但是又和原始类型齐名的类型ParameterizedType:表达一种参数化类型,比如 Collection原创 2021-01-05 15:37:25 · 175 阅读 · 2 评论 -
动态创建对象执行方法
动态创建对象执行方法创建类的对象,调用Class对象的NewInstance()方法类必须有一个无参数的构造器类的构造器的访问权限需要足够调用指定的方法通过反射,调用类中的方法,通过Method类完成。通过Class类的getMethod(String name,Class…parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型。之后使用Object invoke(Object obj,Object[] args)进行调用,并向方法中传递要设置的o原创 2021-01-04 09:38:06 · 278 阅读 · 2 评论 -
获取运行时类的完整结构
获取运行时类的完整结构通过反射获取运行时类的完整结构Field Method Constructor Superclass Interface Annotation实现的全部接口所继承的父类全部的构造器全部的方法全部的Field注解…案例package Reflection;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.refle原创 2021-01-04 07:37:20 · 271 阅读 · 8 评论 -
类加载器的作用
类加载器的作用类加载的作用:将Class文件字节码内容加载到内存中,并将这些静态数据转成方法区的运行时数据结构,然后再堆中生成一个代表整个类的Java.lang.Class对象,作为方法区中类数据的访问入口类缓存:标准的JavaSE类加载器可以按要求查找类,但一旦某个类被加载到类加载器中,它将维持加载(缓存)一段时间。不过JVM垃圾回收机制可以回收这些Class对象类加载器作用时用来把类(class)装载进入内存的。JVM规范定义了如下类型的类的加载器引导类加载器:用C++编写的,时原创 2021-01-02 23:44:43 · 2315 阅读 · 2 评论 -
类初始化
类初始化什么时候会发生类初始化类的主动引用(一定会发生类的初始化)当虚拟机启动,先初始化main方法所在的类New一个类的对象调用类的静态成员(除了final常量)和静态方法使用Java.lang.reflect包的方法对类进行反射调用当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类类的被动引用(不会发生类的初始化)当访问一个静态域时,只有真正声明整个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化通过数组定义类引用,不会触发此类的初始化。原创 2021-01-02 22:20:17 · 156 阅读 · 0 评论 -
Java内存分析
Java 内存分析Java内存堆存放new的对象和数组可以被所有的线程共享,不会存放别的对象引用栈存放基本变量类型(会包含整个基本类型的具体数值)引用对象的变量(会存放这个引用在堆里面的具体地址)方法区可以被所有线程共享包含了所有的class和static变量了解:类的加载过程当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过如下三个步骤来对该类进行初始化类的加载(Load)----->类的链接(Link)----->类原创 2021-01-02 21:58:09 · 134 阅读 · 0 评论 -
哪些类型有Class对象
哪些类型有Class对象Class :外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类。interface:接口[] : 数组enum :枚举annotation :注解@interfaceprimitive type:基本数据类型voidpackage Reflection;import java.util.Enumeration;//所有类型的Classpublic class Test03 { public static void main(Str原创 2021-01-02 11:06:33 · 325 阅读 · 2 评论 -
得到Class的多种方式
Class类在Object类中定义了以下的方法,此方法将被所有子类继承Public final Class getClass()以上的方法返回值的类型是一个Class类,此类是Java反射的源头,实际上所谓反射从程序的运行结果来看也很好理解,即:可以通过对象反射求出类的名称。对象照镜子后可以得到的信息:某个类的属性,方法,构造器,某个类到底实现了哪些接口。对于每个类而言,JRE都为其保留了一个不变的Class类型的对象。一个Class对象包含了特定某个结构(class/interfcae/en原创 2021-01-02 10:27:04 · 302 阅读 · 2 评论 -
初始反射
反射概述静态VS动态语言动态语言是一类在运行时可以改变其结构的语言:例如新的函数,对象,甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。主要动态语言:Object-c c# JavaScript PHP Python等。静态语言与动态语言相对应的,运行时结构不可变的语言就是静态语言,如Java C C++Java不是动态语言,danJava可以称之为 ”准动态语言“。即Java有一定的动态性,我们可以利原创 2021-01-02 10:21:49 · 157 阅读 · 0 评论 -
自定义注解
自定义注解使用@interface自定义注解时,自动继承了Java.lang.annotation.Annotation接口分析:@interface用来声明一个注解,格式:public@ interface 注解名{自定义内容}其中的每一个方法实际上是声明了一个配置参数方法的名称就是参数的名称返回值类型就是参数的类型(返回值只能是基本类型 class string enum)可以通过default来声明参数的默认值如果只有一个参数成员,一般参数名为value注解元素必须要有值,我们定原创 2021-01-01 15:27:40 · 133 阅读 · 0 评论 -
元注解
元注解的作用就是负责注解其他注解,Java定义了四个标准的meta-annotation类型,他们被用来提供对其他annotation类型作说明。这些类型和它们所支持的类在Java.lang.annotation包中可以找到.(@Target,@Retention,@Documented,@lnherited)@Target:用于描述注解的使用规范(即:被描述的注解可以用在什么地方)@Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(SOURCE(源码)&..原创 2020-12-31 22:25:39 · 157 阅读 · 2 评论 -
内置注解
内置注解:@override:定义在Java.long。Override中,此注解只使用与修饰方法,表示一个方法声明打算重写超类中的另一个方法声明。@Deprecated:定义在Java.lang.Deprecated中,此注解可以用于修饰方法,属性,类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或者存在更好的选择。@SuppressWarnings:定义在Java.lang.SuppressWarnings中,用来抑制编译时的警告信息,与前面两个注解有所不同,你需要添加一个参数才原创 2020-12-31 17:01:12 · 251 阅读 · 0 评论 -
初始注解
什么是注解Annotation是从JDK1.5开始引入的新技术Annotation的作用:不是程序本身,可以对程序作出解释,(这一点和注释(conmment)没什么区别)可以被其他程序(比如:编译器等)读取Annotation的格式:注解是以“@注释名”在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value=“unchecked”)Annotation在哪里使用?可以附加在 package class method field 等上原创 2020-12-31 16:41:45 · 208 阅读 · 0 评论 -
线程的三种创建方式
回顾线程的创建方式:package Thread;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;//总结线程的创建public class ThreadNew { public static void main(String[] args) { new MyThread原创 2020-12-25 11:27:53 · 141 阅读 · 0 评论 -
线程池
线程池的使用背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具。好处:提高影响速度(减少了创建新线程的时间)降低资源消耗(重复利用线程池中线程,不需要每次都创建)便于线程管理(…)corePoolSize:核心池的大小maximumPoolSize:最大线程数keepAliveTime:线程没有任务时最多保持多长时间会终止。原创 2020-12-25 11:22:34 · 142 阅读 · 0 评论 -
生产者消费模式-信号灯法
并发协作模型”生产者/消费者模式“—>信号灯法案例package Thread;//测试:生产者消费者模型--->标志位 信号灯法public class TestPc2 { public static void main(String[] args) { TV tv=new TV(); new player(tv).start(); new Watcher(tv).start(); }}//生产者--&g原创 2020-12-25 09:54:25 · 158 阅读 · 0 评论 -
生产者消费模型-管程法
并发协作模型“生产者/消费者模式”—>管程法生产者:负责生产数据的模块(可能是方法,对象,线程,进程);消费者:负责处理数据的模块(可能是方法,对象,线程,进程);缓冲区:消费者不能直接使用生产者的数据,他们之间有个“缓冲区”生产者将生产好的数据放入缓冲区,消费者从缓冲区拿出数据管程法 案例package Thread;import java.awt.*;//测试:生产者消费者模型--->利用缓冲区:管理法public class TestPc {原创 2020-12-25 08:35:48 · 163 阅读 · 0 评论 -
生产者消费问题
生产者消费问题应用场景:生产者和消费者问题假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费。如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再放入产品为止。线程通信-分析这是一个线程同步问题,生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件。对于生产者,没有生产产品之前,要通知消费者等待。而原创 2020-12-24 20:24:19 · 201 阅读 · 2 评论 -
Lock锁
Lock (锁):从JDK5.0开始,Java提供了更强大的线程同步机制,通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当。Java.util.concurrent.locks.lock接口时控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象ReentrantLock 类实现了Lock ,它拥有与 synchronzied相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是 Ree原创 2020-12-24 19:47:40 · 170 阅读 · 2 评论 -
死锁案例
死锁多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形,某一个同步块同时拥有 "两个以上对象的锁"时,就可能会发生 “死锁” 的问题。死锁避免方法产生死锁的四个必要条件:互斥条件:一个资源每次只能被一个进程使用。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。原创 2020-12-24 17:36:36 · 640 阅读 · 6 评论 -
CopyOnWriteArrayList
package Thread;import java.util.concurrent.CopyOnWriteArrayList;//测试JUC安全类型的集合public class TestJUC { public static void main(String[] args) { CopyOnWriteArrayList<String> list=new CopyOnWriteArrayList<String>(); for (in原创 2020-12-24 16:53:43 · 124 阅读 · 2 评论 -
守护线程
守护(daemon)线程线程分为用户线程和守护线程虚拟机必须确保线程执行完毕虚拟机不用等待守护线程执行完毕如,后台记录操作日志,监控日志,垃圾回收等待…案例:package Thread;//守护线程public class TestDaemon { public static void main(String[] args) { God g=new God(); You1 y=new You1(); Thread threa原创 2020-12-23 20:50:37 · 146 阅读 · 0 评论 -
线程同步
线程同步(重点)线程同步:现实生活中,我们会遇到“同一个资源,多个人都想使用”的问题,比如:食堂排队打饭,每个人都想吃饭,最天然的解决办法就是,排队,一个个来。处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象,这时候我们就需要线程同步,线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池下形成队列,等待前面线程使用完毕,下一个线程在使用。由于同一进程的多个线程共享同一块存储空间,在带来方便的同时,也带来了访问冲突的问题,为了保证数据在方法中被访问时的原创 2020-12-24 08:15:56 · 1181 阅读 · 6 评论 -
三个 线程不安全的案例
三个 线程不安全的案例案例1 :package Thread;import java.util.ArrayList;import java.util.List;//线程不安全的集合public class UnsafeList { public static void main(String[] args) { List<String> list=new ArrayList<String>(); for (int i = 0;原创 2020-12-24 15:02:03 · 244 阅读 · 2 评论 -
多线程案例
三个加synchronized 之后安全的案例案例1: 添加了一个同步块 synchronized(obj){}package Thread;import java.util.ArrayList;import java.util.List;//线程不安全的集合 public class UnsafeList { public static void main(String[] args) { List<String> list=new ArrayLis原创 2020-12-24 16:00:49 · 127 阅读 · 2 评论 -
同步方法以及同步块
同步方法由于我们可以通过private关键字来保证数据对象只能被方法访问,所以我们只需要针对方法提出一套机制,这套机制就是synchronized关键字,它包括两种用法:synchronized方法和synchronized块同步方法:public synchronized void methood(int args){}synchronized方法控制对"对象"的访问,每个对象对应一把锁,每个synchronized方法都必须获得调用方法的对象的锁才能执行,否则线程会阻塞,方法一旦执行,就原创 2020-12-24 16:03:31 · 2699 阅读 · 14 评论 -
观察线程状态
线程状态:线程状态。线程可以处于以下状态之一:NEW尚未启动的线程处于此状态。RUNNABLE在Java虚拟机中执行的线程处于此状态。BLOCKED被阻塞等待监视器锁定的线程处于此状态。WAITING正在等待另一个线程执行特定动作的线程处于此状态。TIMED_WAITING正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。TERMINATED已退出的线程处于此状态。一个线程可以在给定时间点处于一个状态。 这些状态是不反映任何操作系统线程状态的虚拟机状态。原创 2020-12-23 17:52:34 · 185 阅读 · 0 评论 -
线程强制执行-Join
线程强制执行-JoinJoin合并线程,待此线程执行完后,再执行其他线程,其他线程阻塞可以想象成插队。案例package Thread;//测试Join方法//想象为插队public class TestJoin implements Runnable{ @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("我是VI原创 2020-12-23 15:49:23 · 175 阅读 · 0 评论 -
线程礼让-yield
线程礼让礼让线程,让当前正在执行的线程暂停,但不阻塞将线程从运行状态转为就绪状态让cpu重写调度,礼让不一定成功,看CPU心情案例package Thread;//测试礼让线程//礼让不一定成功,看cpu心情public class TestYield { public static void main(String[] args) { MyYield myYield = new MyYield(); new Thread(myYield,"原创 2020-12-23 15:36:13 · 173 阅读 · 0 评论 -
线程休眠-Sleep
线程休眠Sleep(时间)指定当前线程阻塞的毫秒数;Sleep存在异常 InterruptedException;Sleep时间达到后线程静茹就绪状态;Sleep可以模拟网络延迟,倒计时等。每一个对象都有一个锁,Sleep不会释放锁案例package Thread;import java.sql.SQLOutput;import java.text.SimpleDateFormat;import java.util.Date;public class TestSleep {原创 2020-12-23 14:51:12 · 174 阅读 · 0 评论