数组、String

简单java类:

一个类之中只包含基本的属性,setter、getter方法,这种类称为简单java类,对于简单java类的开发规则有如下几点:

  • 类名称必须可以明确的表示出一类的定义,例如:Person、Emp、Dept

  • 类之中的所有属性必须使用private进行封装

  • 类之中的所有属性都必须定义相应的setter、getter;

  • 类之中可以提供构造方法,为属性初始化,但是不管提供多少个构造方法,一定要保留有一个无参构造方法;

  • 类之中不允许直接使用system.out.println()输出,所有内容要返回给被调用处输出。

例题:定义一个表示雇员的操作类,这个类之中包含雇员的编号、姓名、职位、基本工资、佣金,并且可以计算出一个雇员的月薪和年薪,可以返回一个雇员的完整信息。

class Emp
{
    private int empno ;
    private String ename ;
    private String ejob ;
    private double esal ;
    private double ecom ;
    public Emp(){}
    public Emp(int eno , String ena ,String ej , double es , double ec){
        empno = eno ;
        ename = ena ;
        ejob = ej ;
        esal = sa ;
        ecom = ec ;
    }
    public void setEmpno(int eno){
        empno = eno ;
    }
    public void setEname(String ena){
        ename = ena ;
    }
    public void setEjob(String ej){
        ejob = ej ;
    }
    public void setEsal(double es){
        esal = es ;
    }
    public void setEcom(double ec){
        ecom = ec ;
    }
    public int getEmpno(){
        return empno ;
    }
    public int getEname(){
        return ename ;
    }
    public int getEjob(){
        return job ;
    }
    public int getEsal(){
        return sal ;
    }
    public int getEcom(){
        return com ;
    }
public double salary(){
    return sal + com ;
}
public double income(){
    return salary()* 12 ;
}
public String getInfo(){
    return "雇员信息:"+"\n"+
                " \t | - 编号:" + getEmpno() + "\n" +
                " \t | - 姓名:" + getEname() + "\n" +
                " \t | - 职位:" + getEjob() + "\n" +
                " \t | - 基本工资:" + getEsal() + "\n" +
                " \t | - 佣金:" + getEcom() + "\n" +
                " \t | - 月薪:" + salary() + "\n" +
                " \t | - 年薪:" + income() + "\n" +
}

}
public static void main(String args[]){
    Emp emp = new Emp(1234 , "史密斯" , "办事员" , 800.0 , 200.0) ;
    System.out.println(emp.getInfo()) ;
}

数组:

数组的定义格式:
动态初始化:数据类型 数组名称 [] = new 数据类型 [长度];数组内容都是默认值
静态初始化:数据类型 数组名称 [] = new 数据类型 []{值,值…} ;

二维数组:
动态初始化:数据类型 数组名称 [] []= new 数据类型 [长度][长度];
静态初始化:数据类型 数组名称 [] []= new 数据类型 [][]{{值,值…},{值,值…}};

如果要取得数组长度:数组名称.length

数组的两个基本操作方法:
**排序:**java.util.Arrays.sort(数组名称);

说明:
(1)Arrays类中的sort()使用的是“经过调优的快速排序法”;
(2)比如int[],double[],char[]等基数据类型的数组,Arrays类之只是提供了默认的升序排列,没有提供相应的降序排列方法。 
(3)要对基础类型的数组进行降序排序,需要将这些数组转化为对应的封装类数组,如Integer[],Double[],Character[]等,对这些类数组进行排序。(其实还不如先进行升序排序,自己在转为将序)。

用默认的升序对数组排序
函数原型:
static void sort(int[] a) 对指定的 int 型数组按数字升序进行排序。
static void sort(int[] a, int fromIndex, int toIndex) 对指定 int 型数组的指定范围按数字升序进行排序。
代码如下: 

import java.util.Arrays;
public class ArraysSort_11 {
    public static void main(String args[])
    {
        int[] a={1,4,-1,5,0};
        Arrays.sort(a);
        //数组a[]的内容变为{-1,0,1,4,5}
        for(int i=0;i<a.length;i++)
            System.out.print(a[i]+"  ");
    }
}

**数组拷贝:

  • System.Arraycopy(源数组名称,源数组开始点,目标数组名称,目标数组开始点,长度);
    示例:
    System.arraycopy的用法:
    int[] src = {1,3,5,7,9,11,13,15,17};

int[] dest = {2,4,6,8,10,12,14,16,18,20};

//从src中的第一个元素起复制三个元素,即1,3,5复盖到dest第2个元素开始的三个元素

System.arraycopy( src, 0, dest, 1, 3);
System.Arraycopy(源数组名称,源数组开始点,目标数组名称,目标数组开始点,长度);

System.out.println(Arrays.toString(dest));

结果为:[2, 1, 3, 5, 10, 12, 14, 16, 18, 20]

还有其它的两种基本复制用法:

  • Arrays.copyOf的用法:
    int[] src = {1,3,5,7,9,11,13,15,17};

    int[] dest = {2,4,6,8,10,12,14,16,18,20};

    //copyOf(是复制src数组从0开始的两个元素到新的数组对象)

    int[] copyof=Arrays.copyOf(src, 2);

    System.out.println(Arrays.toString(copyof));

    结果为:[1, 3]

  • Arrays.copyOfRange的用法

    int[] src = {1,3,5,7,9,11,13,15,17};

    int[] dest = {2,4,6,8,10,12,14,16,18,20};

    //copyRange(从src数组中从0开始的第二个元素到第五个元素复制到新数组,含头不含尾)

    int[] copyofRange=Arrays.copyOfRange(src, 2,6);

    System.out.println(Arrays.toString(copyofRange));

    结果为:[5, 7, 9, 11]

注意:对象数组开辟之后需要为每一个数组元素分别进行是实例化操作。

String类两种对象实例化方式

直接赋值方式:String str = ”Hello” ;

public class Test2
{
    public static void main(String args[]){
        String str1 = "Hello" ;
        String str2 = new String("Hello") ;
        String str3 = str2 ;
        System.out.println(str1 == str2) ;    //false
        System.out.println(str1 == str3) ;    //false
        System.out.println(str2 == str3) ;    //true
    }
}

分析如下:
图1

现在使用“==”是判断数值的相等,这里判断的是堆内存的地址数值是否相等。

*.equals()(用来比较内存中内容是否相等)

public class Test2
{
    public static void main(String args[]){
        String str1 = "Hello" ;
        String str2 = new String("Hello") ;
        String str3 = str2 ;
        System.out.println(str1.equals(str2)) ;    //true
        System.out.println(str1.equals(str3)) ;    //true
        System.out.println(str2.equals(str3)) ;    //true
    }
}

现在比较的不是内存的地址,而是比较内存中的内容是否相等。

比较“==”、equals()的区别?

  • “==”:比较的是字符串的数值是否想扥,属于数值比较。

  • Equals():比较的是两个字符串在内存中的内容是否相等,属于内存比较。

  • -

字符串常量是string的匿名对象

如果程序在定义字符串(使用“”),那么就表示一个string对象。

匿名对象可以调用类之中的方法和属性,如:”Hello”.equals();,那么这个字符串常量一定是一个对象。

String类的两种实例化操作的区别

  • 分析直接赋值方式:String str = “Hello” ;
public class Test2
{
    public static void main(String args[]){
        String str1 = "Hello" ;
        String str2 = "Hello" ;
        String str3 = "Hello" ;

        System.out.println(str1 == str2) ;    //true
        System.out.println(str1 == str3) ;    //true
        System.out.println(str2 == str3) ;    //true
    }   
}

图2

在string类进行设计时采用了一种共享设计模式的概念,在每一个运行的JVM底层存在一个字符串的对象池(Object Pool),如果用户采用直接赋值的方式,会将字符串的内容放到池中,以供其他继续使用直接赋值方式的string对象使用,如果新声明的字符串内容不再池中,则会开辟一个新的,继续放到池中,以供下次使用。

  • 构造方法赋值:
public class Test2
{
    public static void main(String args[]){
        String str = new String("Hello");
        System.out.println(str) ;  

    }
}

图3
使用构造方法的方式开辟的字符串对象,实际上开辟两块空间,其中一块称为垃圾。

入池方式:

  • 直接入池:String str2 = “Hello” ;
public class Test2
{
    public static void main(String args[]){
        String str1 = new String("Hello");
        String str2 = "Hello" ;   //入池
        String str3 = "Hello" ;     //使用池对象
        System.out.println(str1 == str2) ;  //false
        System.out.println(str1 == str3) ;  //false
        System.out.println(str2 == str3) ;  //true

    }
}

使用构造方法实例化string对象,不会入池。

  • 手工入池:String str1 = new String(“Hello”).intern();
public class Test2
{
    public static void main(String args[]){
        String str1 = new String("Hello").intern();     //手工入池
        String str2 = "Hello" ;   //入池
        String str3 = "Hello" ;     //使用池对象
        System.out.println(str1 == str2) ;  //false
        System.out.println(str1 == str3) ;  //false
        System.out.println(str2 == str3) ;  //true

    }
}

思考:String类的两种实例化方式的区别?

  • 直接赋值:之开辟一块堆内存空间,字符串的内容可以入池,以供下次使用。
  • 构造方法:开辟两块堆内存空间,又有成为垃圾,并且不能自动入池,使用intern()手工入池。

字符串的内容一旦声明就不可改变

public class Test2
{
    public static void main(String args[]){
        String str = "Hello" ;  
        str += " World" ;
        str = str + "!!!" ;
        System.out.println(str) ; 

    }
}

图4

字符串的更改,实际上改变的是字符串对象的引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值