数组及其常用类

1.数组:是有相同类型的、用一个标识符名称封装到一起的一个对象序列或基本数据类型 数据序列
数组是一种最简单的复合数据类型。
数组可以是一维的也可以是多维的。

2.用new关键为对象分配其内存空间。
type arrayName = new type[arraySize]
例如: int x = new int[100];
通过引用来使用数组元素 :arrayName[index]
index为数组下标,可是整型常数或表达式。
index取值从0 到arraySize-1

3.x = null 即该数组对象不再被任何引用变量使用的时候,“垃圾回收器”将自动放
  该内存资源

4.用时要注意的问题
空指针异常(NullPointException
只声明但没有初始化的时候直接使用该变量。
数组越界异常(ArrayIndexOutBoundsException
所有数组的下标都从0开始
int[]a ={1,2,3};
for (int i= 0; i< a.length; i++){

      System.out.println(a[i])中length属性表示数组的长度




5.数组的使用分为两个步骤

*声明数组:是在栈内存中声明的
*为数组开辟空间:是使用关键字new在堆内存中完成
*    求数组长度使用数组名称.length
*    数组的下标从0开始,最大为数组长度-1
*    Java中数组是对象,不是基本数据类型
6.

public char charAt(int index)

返回指定下标的字符

public boolean equals(Object o)

比较此字符串与指定的对象

public int indexOf(int ch)

搜索第一个出现的字符ch(或字符串value)的下标

public int indexOf(String value)

public int lastIndexOf(int ch)

搜索最后一个出现的字符ch(或字符串s)的下标

public int lastIndexOf(String s)

public String substring(int index)

提取从位置索引开始的字符串部分

public String trim()


去掉字符串前后的空格


*String类是final的,一断创建后就不能更改,因此对于String对象的各种操作都生成了一个新的String 对象,那有什么方法弥补的?
*
*StringBuffer类:当频繁修改字符串内容的时候建议使用该类,提供了与String类类似的方法

============================面试题=============================
1.Java中垃圾回收有什么目的?什么时候进行垃圾回收?

垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。

2.System.gc()和Runtime.gc()会做什么事情?

这两个方法用来提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于JVM的。

3.finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?

垃圾回收器(garbage colector)决定回收某对象时,就会运行该对象的finalize()方法 但是在Java中很不幸,如果内存总是充足的,那么垃圾回收可能永远不会进行,也就是说filalize()可能永远不被执行,显然指望它做收尾工作是靠不住的。 那么finalize()究竟是做什么的呢?它最主要的用途是回收特殊渠道申请的内存。Java程序有垃圾回收器,所以一般情况下内存问题不用程序员操心。但有一种JNI(Java Native Interface)调用non-Java程序(C或C++),finalize()的工作就是回收这部分的内存。

4.如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?

不会,在下一个垃圾回收周期中,这个对象将是可被回收的。

5.Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?

JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。
堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。

6.串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?

吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。

7.在Java中,对象什么时候可以被垃圾回收?

当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。

8.JVM的永久代中会发生垃圾回收么?

垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下Java8:从永久代到元数据区
(注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区)
9.

JVM对那些没有根引用的对象进行来及回收,也就是无法从根对象中追述的象。

JVM垃圾回收的根对象的范围有以下几种:

1、栈中引用的对象,引用是在栈帧中的本地变量表中的,真正的对象在堆中

2、方法区perm中的类静态属性引用的对象,以及常量引用的对象

3、本地方法栈中JNI(Native方法)的引用的对象

10.

垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身
11.

减少GC开销的措施

根据上述GC的机制,程序的运行会直接影响系统环境的变化,从而影响GC的触发。若不针对GC的特点进行设计和编码,就会出现内存驻留等一系列负面影响。为了避免这些影响,基本的原则就是尽可能地减少垃圾和减少GC过程中的开销。具体措施包括以下几个方面:

  (1)不要显式调用System.gc()

  此函数建议JVM进行主GC,虽然只是建议而非一定,但很多情况下它会触发主GC,从而增加主GC的频率,也即增加了间歇性停顿的次数。

  (2)尽量减少临时对象的使用

  临时对象在跳出函数调用后,会成为垃圾,少用临时变量就相当于减少了垃圾的产生,从而延长了出现上述第二个触发条件出现的时间,减少了主GC的机会。

  (3)对象不用时最好显式置为Null

  一般而言,为Null的对象都会被作为垃圾处理,所以将不用的对象显式地设为Null,有利于GC收集器判定垃圾,从而提高了GC的效率。

  (4)尽量使用StringBuffer,而不用String来累加字符串

  由于String是固定长的字符串对象,累加String对象时,并非在一个String对象中扩增,而是重新创建新的String对象,如 Str5=Str1+Str2+Str3+Str4,这条语句执行过程中会产生多个垃圾对象,因为对次作“+”操作时都必须创建新的String对象,但 这些过渡对象对系统来说是没有实际意义的,只会增加更多的垃圾。避免这种情况可以改用StringBuffer来累加字符串,因StringBuffer 是可变长的,它在原有基础上进行扩增,不会产生中间对象。

  (5)能用基本类型如Int,Long,就不用Integer,Long对象

  基本类型变量占用的内存资源比相应对象占用的少得多,如果没有必要,最好使用基本变量。

  (6)尽量少用静态对象变量

  静态变量属于全局变量,不会被GC回收,它们会一直占用内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值