牛客Java刷题day0笔记(上)

1、整型表达式(*)和局部变量必须初始化的问题

1.1、ava语言中的数组元素下标总是从0开始,下标可以是整数或整型表达式。(正确)

例如平时有这样的用法

for(int i=0;i<10;i++)

{

    a[i+1]=a[i]

}

这个i+1就是整数型表达式  或者a[5+3]就是a[8]

1.2、 局部变量必须初始化的问题&局部变量的细节知识点

下列代码中的错误原因是(尚未初始化变量)

(1)   public class Test

(2)   {

(3)       public static void main(String [] args)

(4)       {

(5)           int i;

(6)           i+=1;

(7)       }
(8) }

尚未初始化变量

类变量(静态变量static)在类加载过程的准备阶段会进行一次赋值,一般是空值或constantValue属性值,同时在初始化阶段会调用类构造器再进行一次赋值。

实例变量在创建对象时会调用实例构造器进行一次赋值。

因此无论是类变量还是实例变量,在使用前都是非空的。

而局部变量没有初始化过程,在使用前必须赋值,初始化。

局部变量:方法定义中或者方法声明上。 

局部变量:在内存的栈中。

局部变量:随方法的调用而存在,随着方法的调用完毕而消失。 

局部变量:没有默认值,必须定义,赋值,然后才能使用

2、对字符串对象的引用指向理解及toUpperCase方法的测试


String x="fmn";
x.toUpperCase();
String y=x.replace('f','F');
y=y+"wxy";
System.out.println(y);

本题输出结果是Fmnwxy

针对本题掌握了如下知识点:

String x="fmn";  “fmn”是在常量池里的不可变对象。

x.toUpperCase();   在堆中new一个"FMN"对象,但无任何引用指向它。

String y=x.replace('f','F'); 在堆中 new一个"Fmn"对象,y指向它。

y=y+"wxy"; 在堆中 重新new一个"Fmnwxy"对象, 修改y指向,现在y指向它。

作用:用于把字符串中转换为大写
语法:stringObject.toUpperCase()
返回:一个新的全部大写的字符串。
提示:原字符串不改变。

我们做了如下测试:

构建字符串,如果只对字符串调用这个方法,那么相当于在堆上搞了一个对象出来,但是没有引用指向这个对象。

即: 在堆中new一个"全大写的"对象,但无任何引用指向它。

如果声明一个字符串型变量String1指向它,测试结果如下

 然后这个toUpperCase()方法是将字符串中全部小写转换成大写字母。

 

3、final修饰符

 

排除三个,选C 

final的作用:

    1. 修饰变量,变量的引用地址不可变,但是地址中的内容可以变。

    2. 修饰方法,方法不可被重写,但是还是可以重载

    3. 修饰类,类不可继承。

不可变类,说的是一个类一旦被实例化,就不可改变自身的状态。常见的比如String和基本数据类型的包装类,对于这种不可变类,一旦在进行引用传递的时候,形参一开始就和实际参数指向的不是一个地址,所以在方法中对形参的改变,并不会影响实际参数。

不可变类(Immutable Class)是一旦被实例化就不会改变自身状态(或值)的类。

String就是一种典型的不可变类。

不可变类的主要用途是在多线程环境下确保对象的线程安全。

不可变类一般建议使用final来修饰(比如String就是final类),否则子类可以通过继承不可变类的方式,增加setter方法,从而改变对象的状态,破坏了不可变的约束。

这一题我个人认为答案C也可以算作是final的作用,只不过ABD是更加常见和直接的final用法。

4、向左向右移位


public class Test {
 
    public static void main(String args[]) {
        int x, y;
        x = 5 >> 2;
        y = x >>> 2;
        System.out.println(y);
    }
}

向左移位 >>

向右移位 >>  向右一位相当于 除以 2 

但是移位的运算速度大于除以2的速度

例如二分法中的mid=(right-left)>>1+right;

5、JVM中关于堆:

Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。

在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。
这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。
堆的内存模型大致为:



从图中可以看出: 堆大小 = 新生代 + 老年代。其中,堆的大小可以通过参数 –Xms、-Xmx 来指定。
本人使用的是 JDK1.6,以下涉及的 JVM 默认值均以该版本为准。
默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。
老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 to,以示区分。
默认的,Edem : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 ),即: Eden = 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小。
JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以无论什么时候,总是有一块 Survivor 区域是空闲着的。
因此,新生代实际可用的内存空间为 9/10 ( 即90% )的新生代空间。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻根根呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值