jre 是 java 的运行环境, jdk 包含 jre 除此之外还具有java的相关jar包
JRE:Java Runtime Environment(java运行时环境)。即java程序的运行时环境,包含了java虚拟机,java基础类库。
JDK:Java Development Kit(java开发工具包)。即java语言编写的程序所需的开发工具包。
? JDK包含了JRE,同时还包括java源码的编译器javac、监控工具jconsole、分析工具jvisualvm等。
‘==‘ 表示 判断变量的值是否相等
equals 表示 变量所代表的字符串是否相等
什么是==?
== 等于比较运算符,如果进行比较的两个操作数都是数值类型,即使他们的数据类型不相同,只要他们的值相等,也都将返回true.如果两个操作数都是引用类型,那么只有当两个引用变量的类型具有父子关系时才可以比较,而且这两个引用必须指向同一个对象,才会返回true.(在这里我们可以理解成==比较的是两个变量的内存地址)
什么是equals()?
equals()方法是Object类的方法,在Object类中的equals()方法体内实际上返回的就是使用==进行比较的结果.但是我们知道所有的类都继承Object,而且Object中的equals()方法没有使用final关键字修饰,那么当我们使用equal()方法进行比较的时候,我们需要关注的就是这个类有没有重写Object中的equals()方法.
== 是java提供的等于比较运算符,用来比较两个变量指向的内存地址是否相同.而equals()是Object提供的一个方法.Object中equals()方法的默认实现就是返回两个对象==的比较结果.但是equals()可以被重写,所以我们在具体使用的时候需要关注equals()方法有没有被重写.
赋值方式中如果调用了new关键字,一定会在内存中给你分配一个新的地址
给Integer类型赋值的时候,如果没有调用new关键字,并且值在-128与+127之间,包括-128和+127,那么指向的都是同一个内存位置.
Integer类中重写了equals()方法,使用equals()方法进行比较的时候,实际上比较的内存中最终指向的值的内存位置,不是直接比较变量的内存位置.
不对,hashCode()返回的是一个int值,虽然几率很小但存在相同的可能性或者重写方法的hashCode()会造成hashCode()相等但是 对象不等的情况
两个对象==,其哈希码一定相等
修饰符,可以修饰变量,效果是使其无法被改变,常量化
(1)修饰类:表示该类不能被继承;
(2)修饰方法:表示方法不能被重写;
(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。
-1
String是引用类型
String
StringBuilder: 相比于String 提供的方法更多,更便利
StringBuffer: 相比StringBuilder 线程更安全,其他与StringBuilder基本一样
从类的继承关系上来开的话,String和StringBuffer,StringBuilder是没有任何关系的但是StringBuffer和StringBuilder的继承关系时一样的.
本质都是一个char类型数组不同的是String类型的数组长度是3,而另外两个数组的长度都是19且默认值为0.
能装下的话什么都不做,不能装下的话会使用Arrays.copyOf()方法将现有的char[]数组赋值到新的char数组中
追加的方法实际上都是调用父类的追加方法,但是StringBuffer类中多了一行toStringCache = null;的代码,其中toStringCache是一个char[];这个属性在重写toString()方法中使用了
java中操作字符串的类,我知道的有三个类,分别是String,StringBuffer和StringBuilder.这三个类都是以char[]的形式保存的字符串,但是String类型的字符串是不可变的,对String类型的字符床做修改操作都是相当于重新创建对象.而对StringBuffer和StringBuilder进行增删操作都是对同一个对象做操作.StringBuffer中的方法大部分都使用synchronized关键字修饰,所以StringBuffer是线程安全的,StringBuilder中的方法则没有,线程不安全,但是StringBuilder因为没有使用使用synchronized关键字修饰,所以性能更高,在单线程环境下我会选择使用StringBuilder,多线程环境下使用StringBuffer.如果声明的这个字符串几乎不做修改操作,那么我就直接使用String,因为不调用new关键字声明String类型的变量的话它不会在堆内存中创建对象,直接指向String的常量池,并且可以复用.效率更高
二分递归地将后面的字符和前面的字符连接起来
取得当前字符并和之前的字符append起来
将字符从后往前的append起来
和StringBuffer()一样,都用了Java自实现的方法,使用位移来实现
使用异或交换字符串
基于栈先进后出的原理
被Abstract修饰词修饰的类被称为抽象类,抽象类不一定有抽象方法,但由抽象方法的类一定是抽象类
普通类: 没有抽象方法,可以直接被继承,可以被实例化
抽象类: 被Abstract修饰的类,里面可以存在抽象方法,当被继承时,必须要重写里面的抽象方法(因此,抽象类方法不能被final修饰),抽象类无法被实例化(但能通过多态的方式去实例化),抽象发方法不能被修饰为静态
什么时候使用抽象类和接口
默认实现的方法
想要多重继承的时候
抽象类的就是要子类继承然后实现内部方法的。但是final修饰的类是不能再被继承和修改的。所以不能用final修饰。
抽象类: 是类,被Abstrac修饰 ,可以存在普通方法和抽象方法和普通类一样只能被单继承
接口: 不是类,被interface 修饰 ,里面的方法默认被abstract 和 public 修饰 (因此所有的方法都是静态方法,但JDK8以后,可以有default和static修饰的普通方法),接口可以被多继承,没有构造器,修饰符必须时public
4种: 字节输入/输出流; 字符输入/输出流
按照流的流向分,可以分为输入流和输出流;
按照操作单元划分,可以划分为字节流和字符流;
按照流的角色划分为节点流和处理流。
InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
Files. exists():检测文件路径是否存在。
Files. createFile():创建文件。
Files. createDirectory():创建文件夹。
Files. delete():删除一个文件或目录。
Files. copy():复制文件。
Files. move():移动文件。
Files. size():查看文件个数。
Files. read():读取文件。
Files. write():写入文件。
java容器类类库的用途是"保存对象"。
Java容器:数组,String,java.util下的集合容器
数组长度限制为 Integer.Integer.MAX_VALUE;
String的长度限制: 底层是char 数组 长度 Integer.MAX_VALUE 线程安全的
List:存放有序,列表存储,元素可重复
Set:无序,元素不可重复
Map:无序,元素可重复
Java 容器分为 Collection 和 Map 两大类
Collection: 存放独立元素的序列。
Map:存放key-value型的元素对
Collection
List
Set
Map
HashMap
TreeMap
ConcurrentHashMap
Hashtable
Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。
Set: 无序,不可重复
Map: 无序,可重复
List:列表形式存储,元素可重复
TreeMap<K,V>
的Key值是要求实现java.lang.Comparable
,所以迭代的时候TreeMap默认是按照Key值升序排序的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)。
HashMap<K,V>
的Key值实现散列hashCode()
,分布是散列的、均匀的,不支持排序;数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。
如果你需要得到一个有序的结果时就应该使用TreeMap(因为HashMap中元素的排列顺序是不固定的)。除此之外,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap,简单来说,需要排序就用TreeMap,不需排序则使用 HashMap。
HashMap底层是链表结构,
迭代器是一种检查容器内元素并且遍历的轻量级数据类型,无需知道对象的底层实现
并发,指的是多个事情,在同一时间段内同时发生了
并行,指的是多个事情,在同一时间点上同时发生了(只有在多CPU的情况中,才会发生并行)
服务线程,准确地来说就是服务其他的线程,比如垃圾回收线程
创建,初始化,待运行,运行中,销毁
New, Runnable, Blocked, Waiting, Timed_Waiting, Terminated
创建, 可运行, 阻塞, 消亡
sleep(): 线程停止一段时间,到时间后开始运行
wait(): 线程休眠,不被唤醒就一直休眠
1、sleep是线程中的方法,但是wait是Object中的方法。
2、sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。
3、sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。
4、sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别人中断)。
Executors目前提供了5种不同的线程池创建配置:
会执行, 会优先执行finally内的代码块再去执行catch中的代码
(1)NullPointerException 当应用程序试图访问空对象时,则抛出该异常。
(2)SQLException 提供关于数据库访问错误或其他错误信息的异常。
(3)IndexOutOfBoundsException指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
(4)NumberFormatException当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
(5)FileNotFoundException当试图打开指定路径名表示的文件失败时,抛出此异常。
(6)IOException当发生某种I/O异常时,抛出此异常。此类是失败或中断的I/O操作生成的异常的通用类。
(7)ClassCastException当试图将对象强制转换为不是实例的子类时,抛出该异常。
(8)ArrayStoreException试图将错误类型的对象存储到一个对象数组时抛出的异常。
(9)IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。
(10)ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
(11)NegativeArraySizeException如果应用程序试图创建大小为负的数组,则抛出该异常。
(12)NoSuchMethodException无法找到某一特定方法时,抛出该异常。
(13)SecurityException由安全管理器抛出的异常,指示存在安全侵犯。
(14)UnsupportedOperationException当不支持请求的操作时,抛出该异常。
(15)RuntimeExceptionRuntimeException 是那些可能在Java虚拟机正常运行期间抛出的异常的超类。
(Spring框架中)单例设计模式: 就是一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()的方法来获取他们的实例
减少了新生成实例的消耗
减少JVM垃圾回收 由于不会每个请求都生成新的bean实例,回收的对象自然少了
[ ] 他不能做到线程安全,在并发场景下可能出现问题
工厂方法模式: 自己不再主动创建对象,而是让工厂来帮我们创建对象。定义一个IFactory,其他接口通过实现这个IFactory,我们直接通过接口的实现来实例化这个工厂
springIOC即控制反转,将创建对象的权力交给spring容器来管理当,当spring容器在启动时,会扫描配置文件中的所有bean标签,一句bean标签里的class的属性通过反射创建出来对象(单例),并将创建好的对象放在线程安全的ConcurrentHashMap中, map的key值就是bean标签里的id的属性值,value值就是通过反射创建出来的对象,所有我们可以通过getBean() 方法来获取对象
面向切面编程
使用切面编程,可以将一些系统性的代码提取出来,独立实现,与核心业务代码剥离,比如权限管理、事务管理、日志记录等等
Spring的AOP为动态AOP
控制反转
一种设计思想
IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建
因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转
Spring容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体情况还是要结合Bean的作用域来讨论。
@Scope("xxxx")改变@Bean的作用域,
只有在 Web 应用中使用Spring时,request、session、global-session 作用域才有效
原文:https://www.cnblogs.com/specailweek/p/15120225.html