0%

JVM内存划分

Xms -Xmx分别设置堆的最小值和最大值,如果要设置成堆的大小可变,那么可以将最大值和最小值设置成不一样,如果要将堆大小固定,那么只需将最大值和最小值设置成一样的就行。 jvm中分为堆和方法区,堆又进一步分为新生代和老年代。方法区为永久代,堆中区分的新生代和老年代是为了垃圾回收,新生代中的对象存活期一般不长,而老年代中的对象存活期较长,所以当垃圾回收器回收内存时,新生代中垃圾回收效果较好,会回收大量的内存,而老年代中回收效果较差,内存回收不会太多。

在开发中,数组复制是经常使用的,很多方法都可以进行数组赋值,但是效率却天差地别:效率最高的是:System.arraycopy(), 下面是它的使用方式的参数说明:

mark

们可以看看它的源代码,它是个native方法,毫无疑问效率最高:

本文主要讲述了Java三大特殊类,String、StringBuffer/StringBuilder、Object和包装类。

String类(上)

String类的两种实例化方式

1.1.直接赋值(常用)

1String str = "Hello Bit";//str是一个对象,那么“Hello Bit”就应该保存在堆内存中
2System.out.println(str);

1.2.传统方法:String本身是一个类,既然是类,就存在构造方法,String类其中一种构造方法如下

1public String(String str);//带参构造
2
3//使用new关键字进行对象实例化
4String str = new String("Hello Bit");
5System.out.println(str);

生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞。在多线程的世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。

mark

平时我们在项目里经常会用到HashMap这个数据结构,所以在面试的时候一定会被问这个问题∶你有没有重写过hashCode方法?你在使用HashMap时有没有重写hashCode和equals方法?你是怎么写的? 那么为什么要重写hashCode与equals方法,这两个方法起着什么作用呢?当我们往HashMap里放key时,首先会调用这个对象的hashCode方法计算它的hash值,随后把key放入hash值所指引的内存位置。

前言

Intent这个类在开发中是很常用的类,代表了着一个意图(获取理解为目标、目的),首先我们需要明确一点的就是:任何一个浏览器链接都是一个隐式意图,打开一个浏览器的方式无非就是显式意图和隐式意图,所以我们配置过滤器即可!

生成器

创建生成器方法一

要创建⼀个⽣成器,有很多种⽅法。第⼀种⽅法很简单,只要把⼀个列表⽣成式的 [ ] 改成 ( )

1In [1]: L = [x*2 for x in range(5)]
2
3In [2]: L
4Out[2]: [0, 2, 4, 6, 8]
5
6In [3]: G = (x*2 for x in range(5))
7
8In [4]: G
9Out[4]: <generator object <genexpr> at 0x000001B281507A98>

创建 L 和 G 的区别仅在于最外层的 [ ] 和 ( ) , L 是列表,G 是生成器。我们可以直接打印出L的每个元素,但我们怎么打印出G的每个元素呢?使用next函数

编译器与解释器

将其他语言翻译为机器语言的工具被称为编译器 编译器翻译的方式有两种,一个是编译、另一个是解释。两中方式的区别在于翻译时间的不同,当编译器以解释方式运行的时候,也称之为解释器 mark