运行速度方面,StringBuilder > StringBuffer > String
String最慢的原因:(以下面拼接字符串为例)
如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
此外,StringBuilder是线程不安全的,而StringBuffer是线程安全的,StringBuffer中很多方法可以带有synchronized关键字,所以StringBuilder最快。
线程池:
四种常见线程池:
name | 创建方法 | 参数特征 |
---|---|---|
可缓存线程池CachedThreadPool() | ExecutorService mCachedThreadPool = Executors.newCachedThreadPool(); | new ThreadPoolExecutor(0 , Integer.MAX_VALUE ,60L, TimeUnit.SECONDS,new SynchronousQueue |
定长线程池FixedThreadPool() | ExecutorService mFixedThreadPool= Executors.newFixedThreadPool(int nThreads); | new ThreadPoolExecutor(nThreads , nThreads ,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue |
SingleThreadPool | ExecutorService mSingleThreadPool = Executors.newSingleThreadPool(); | new ThreadPoolExecutor(1 , 1 ,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue |
ScheduledThreadPool | ExecutorService m = Executors.newScheduledThreadPool(int corePoolSize); | new ThreadPoolExecutor(corePoolSize , Integer.MAX_VALUE , 0, NANOSECONDS,new DelayedWorkQueue()) |
进程
:是具有独立功能的应用程序,它是系统进行资源分配和调度的一个独立单位;线程
:线程是进程内部的一个执行单元,是CPU调度和分派的基本单位,线程自己基本上不拥有系统资源。
|
|
1、一般来说,类的代码在初次使用时被加载。通常指创建第一个对象时,或者访问类的static域或static方法时会发生加载。
2、当类加载器开始加载第一个类的过程中如果发现该类具有基类它将继续进行加载,直至所有的基类被加载完成
3、然后根基类的static初始化会被执行,然后是下一个导出类static域,以此类推,直至所有相关类的static域加载初始化完成。
4、至此必要的类都被加载完成,对象可以被创建。注意:基类的加载不管是否进行对象的创建都会被执行。
5、然后是根基类成员变量按顺序初始化,然后调用根基类构造方法。根基类完成后以相同顺序执行第一个导出类的初始化直至完成对象创建。
通俗来讲,类加载和初始化顺序就是,加载类完成后,先从基类到当前类加载static域,然后从基类到当前类按顺序初始化普通成员变量和普通方法块和构造方法。
|
|
char常用范围:
|
|
java有8种基本数据类型:
基本数据类型 | 对应封装类型 | 最小值 | 最大值 |
---|---|---|---|
byte | Byte | -128(-2^7) | 127(2^7-1) |
short | Short | -32768(-2^15) | 32767(2^15-1) |
int | Integer | -2,147,483,648(-2^31) | 2,147,483,647(2^31-1) |
long | Long | ||
float | Float | ||
double | Double | ||
boolean | Boolean | ||
char | Character |
基本数据类型(原始数据类型)是值传递,封装类型是引用传递
可以利用这些方法和属性来处理数据,例如Integer.parseInt(strings);基本数据类型都是final修饰的,不能被继承和扩展新的类、方法
如int i;默认值为0,而Integer j;默认值为null,因为此时j为对象,对象默认值为null;
定义的基本数据类型的变量
和对象的引用变量(地址)
存储在栈中,而实际对应的对象(value)
是存储在堆中
JDK5.0开始可以自动封包了,基本数据类型可以自动封装成封装类。
比如集合List,往里添加对象Object,需要将数字封装成封装类型对象,再存到List中
在JDK5.0 以后可以自动封包,直接写
特别注意:
JVM中一个字节以下的整型数据会在JVM启动的时候加载进内存,除非用new Integer()显式的创建对象,否则都是同一个对象
对于==,一般比较引用地址,有基本数据类型的都是比较值,例如Integer xx= int xxx
1、什么是反射?
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。)语言的一个关键性质。
2、反射能做什么?
我们知道反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,包括包括其modifiers(修饰符),fields(属性),methods(方法)等,并可于运行时改变fields内容或调用methods。那么我们便可以更灵活的编写代码,代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现等等;但是需要注意的是反射使用不当会造成很高的资源消耗!
https://www.cnblogs.com/ysocean/p/6516248.html
反射示例:
运行结果:
Given a linked list, determine if it has a cycle in it.
|
|
一般思路:
利用位异或:
tag:
缺失模块。
1、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
2、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: true raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true