Java基础

来源:互联网 发布:拉爆淘宝首页流量 编辑:程序博客网 时间:2024/06/17 23:00

主函数中的String[] args的意义和用法

意义:String[]表示该args为字符串类型;args,arguments的缩写,表示数组类型的参数;所以它表示的是主函数的参数列表,是一个数组类型的参数,而且数组元素为字符串。它创建了一个入口,可以让你往里面传参数,不论是数字还是字符,都可以转化成字符串,所以String才是最通用的数据类型。如果在创建类的时候不往里面传输参数,那它里面就没有数据,数组长度为0。但是会创建一个数组实体。

用法

介绍两种不同的传参的方法。

  1. 命令行传参

在相应目录下编写代码如下

import java.util.Arrays;public class ArgsDemo {    public static void main(String[] args) {        System.out.println("args:"+Arrays.toString(args));    }}

在命令行下运行,对比结果

  1. 编译器(eclipse)传参

代码同上,在运行时不使用Run按钮,而是选择Run Configrations

结果如下

Java字符串比较问题

有以下字符串声明

String str = “hello”;

String str1 = “hello”;

String str2 = new String(“hello”);

字符串是一个比较特殊的对象,java在内容中卫String类型的对象开辟一个空间,称之为串池,字符串对象的创建之后会被放到串池中。

对于String a=”hello”;和String
b=”hello”;这种字符串声明方式,串池将他们看作为一个对象,池中只有一份拷贝,a,b只是这个对象的两个引用;而对于使用new关键字声明的字符串存放在堆,都单独作为一个对象。

对“==”号,用来比较对象的内存地址,所以对于表达式str==str1,其返回值为true,因为栈内存中的引用存放的内容就是其所指向的对象的堆内存地址,而对于str==str2而言,其返回值为false。

对String中的equals方法,用来比较内容,对于表达式str.equals(str1),其返回值为true,同样str.equals(str2)的返回值为true。

equals的几个属性:

1 自反性:对任意引用值x,x.equals(x)的返回值一定为true。
2 对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true。
3传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true。
4 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
5 非空性:任何非空的引用值X,x.equals(null)的返回值一定为false

Tip

Tip1:String内容不可更改(StringBuffer对象可更改)

对于字符串变量str=str+“abc”;改变的是str变量堆内存地址的指向,并没有直接改变原有str变量的内容。

Tip2:基本数据类型的变量,对象的引用及函数调用的现场保存都是用的是内存栈空间。通过new关键字和构造器创建的对象放在堆空间,类信息、常量、静态变量放在方法区。

Tip3:printStackTrace()方法的意思是在命令行打印异常信息在程序中出错的位置及原因。

Tip4:java.lang.OutOfMemoryError

原因:

  1. 内存中加载的数据量过于庞大,如一次从数据库读取过多的数据;

  2. 集合类中有对对象的引用,使用后未清空,是得JVM不能回收;

  3. 代码中存在死循环或循环产生过多重复的对象实体;

  4. 使用的第三方软件中的BUG;

  5. 启动参数内存值设定的过小.

解决方法:

  1. 应用服务器提示错误的方法:把启动参数内存值设置足够大
  2. Java代码导致错误的解决:重点排查一下几点:
  3. 检查代码中是否有死循环或递归调用。
  4. 检查是否有大循环重复产生新对象实体。
  5. 检查对数据库查询中,是否有一侧或得去全部数据的查询。一般来首,如果一次取十万条记录到内存,就可能引起内存的溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中井喷式增加,一次查询就有可能引起内存溢出。因此对于数据产讯尽量采用分页的方式查询。
  6. 检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终有对象的引用,使得这些对象不能被GC回收。

Tip5:byte与char

简介:

byte:是字节数据类型,是有符号型的,占一个字节;大小分为为-128-127。

char:是字符数据类型,是无符号型的,占2字节;大小范围是0-65535。

区别

  1. char是无符号性的,可以表示一个整数,不能表示负数;而byte是有符号型的,可以表示-128-127的数。

  2. char可以表示中文字符,byte不可以。

  3. char、byte、int对于英文字符,可以相互转化。

Tip6:StringBuffer缓冲区,本身也是操作字符串,但是与String不同,StringBuffer是可以更改的,StringBuffer是一个操作类,所以必须通过实例化进行操作,相比于StringBuilder而言是线程安全的,但是就单线程而言,StringBuillder速度更快。

Tip7:Java常见的程序异常

  1. 数组越界异常:ArrayIndexOutOfBoundsException

  2. 数字格式化异常:NumbweFormatException

  3. 算数异常:ArithmeticException

  4. 空指针异常:NullPointerException

Tip8:throw关键字与throws关键字的区别

throw:抛出一个异常对象,一般用于程序出现某种逻辑时程序员主动抛出某种特定类型的异常,常用于大型项目。

throws:是方法可能抛出异常的声明(用在声明方法时,表示该方法可能要抛出的异常),当某种方法可能会抛出某种异常时用throws声明可能抛出的异常,然后交给上层调用它的方法处理,如果该声明出现在主方法时,抛出的异常交由JVM处理。

内存管理

虚拟机共划分为三个代:年轻代、老年代、持久代。其中持久代主要存放的是Java类的类信息,与GC(垃圾回收机制)要收集的Java对象关系不大。年轻代和老年代的划分是对垃圾收集影响比较大的。

年轻代:

所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor区也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来
对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。

老年代:

在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

持久代:

用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=\

原创粉丝点击