牛客网Java专题练习

目录

1. final关键字

2. Java的封装类型(引用类型)

3. Java多线程

 4. 列表和集合

5. 取模取余符号问题

6. 关于字符串的问题

1.  字符串储存地址问题

 字符串拼接问题



1. final关键字

  1. final修饰类:表示此类不能被继承,即此类不能存在子类。
  2. final修饰方法:父类中方法用final修饰,子类不能重写此方法,父类和子类中可存在相同的方法,但是不是重写来的,子类中与父类相同的方法只隶属于子类,与父类无关。
  3. final修饰变量:被final修饰的变量值不能改变。

2. Java的封装类型(引用类型)

这也体现了Java中一切皆对象的原则,基本数据类型封装成封装类型,就相当封装成了一个对象,就具有了方法和属性,使我们更好的处理所需的数据。

 基本类型 vs 封装类型

Java封装类型与基本类型相比,有如下区别:

  1. 从参数传递上来说,基本类型只能按值传递,而每个封装类都是按引用传递的;
  2. 从存储的位置上来说,基本类型是存储在栈中的,而所有的对象都是在堆上创建和存储的,所以基本类型的存取速度要快于在堆中的封装类型的实例对象;JDK5.0开始可以自动封包了 ,也就是基本数据可以自动封装成封装类,基本数据类型的好处就是速度快(不涉及到对象的构造和回收),封装类的目的主要是更好的处理数据之间的转换,方法很多,用起来也方便。
  3. 基本类型的优势是:数据存储相对简单,运算效率比较高;
  4. 封装类型的优势是:类型转换的api更好用了,比如Integer.parseInt(*)等的,每个封装类型都提供了parseXXX方法和toString方法。而且在集合当中,也只能使用封装类型。封装类型满足了Java中一切皆对象的原则。

3. Java多线程

同步是害怕在操作过程的时候被其他线程也进行读取操作,一旦是原子性的操作就不会发生这种情况。

因为一步到位的操作,其他线程不可能在中间干涉。另外三项都有读取、操作两个步骤,而X=1则是原子性操作。

 4. 列表和集合

 

List 有序值 可重复 允许为null

Set 无序  值不可重复 可为null(至多只能有一个空元素)

Map

5. 取模取余符号问题

当x和y的正负相同时,取余和取模符号和xy一致;

当x和y的正负不同时,取余结果的符号和x相同,取模结果的符号和y相同。(口诀:取余取头,取模取尾)

6. 关于字符串的问题

1.  字符串储存地址问题

     String b ="b";
//        System.out.println(a==b);
        String string1 = new String("a");
        String a =string1.intern();//检查字符串中是否有a,存在的话就返回常量池中的字符串,不存在的话就会把字符串加到常量池中,并返回他的引用


        System.out.println(string1==a);
        System.out.println(a.hashCode());//97
        System.out.println(string1.hashCode());//97

        System.out.println(System.identityHashCode(a));//856419764
        System.out.println(System.identityHashCode(string1));//621009875


        System.out.println("加入常量池中");

        String c="a";
        System.out.println(a==c);//true
        System.out.println(System.identityHashCode(c));//856419764这个和上面啊的地址一样说明,常量池中已经存在”a“这个字符串了

 2. 字符串拼接问题

常量相加

一开始“abc“是没有的,常量池中存在”a” “bc”,相加之后,将这两个字符串拼接“abc” 然后放入常量池中,此时常量池中有三个字符串“a”“bc”“abc”

String a = "a";

String b ="bc";

String c ="a"+"bc";

String d="abc";

变量相加

 变量相加

        String a="a";

        String b="b";

        String c=a+b;//现在堆中开辟新的空间用来拼接这两个字符串,在堆中存在字符串“ab”,并把它放到常量池中;

        String i=c.intern();//ba地址指向常量池中

        String d="ab";//这个"ab"是前面a和b拼接来的

        System.out.println(i==d);//true

java是从左向右输出的,

1.先出现字符串,后面的内容就会一律转为字符串来拼接所以是is 1005

2. 先出现数字类型,先按数字类型相加,再拼接字符串

3. 括号的优先级高,先计算括号里的数字类型

7. Java的加载顺序

父类的静态代码块
子类的静态代码块
父类非静态代码块
父类构造函数
子类的非静态代码块
子类构造函数


class Father {


        {
            System.out.println("父类非静态代码块");
        }
        static
        {
            System.out.println("父类的静态代码块");
        }
        public Father(){

            System.out.println("父类构造函数");
        }


}
class Son extends Father{

    {
        System.out.println("子类的非静态代码块");
    }
    static
    {
        System.out.println("子类的静态代码块");
    }
    public Son(){
        System.out.println("子类构造函数");
    }


    /**
     * 父类的静态代码块
     * 子类的静态代码块
     * 父类非静态代码块
     * 父类构造函数
     * 子类的非静态代码块
     * 子类构造函数
     * @param args
     */
    public static void main(String[] args) {
        Son son = new Son();



    }

}

8. 异常

在java的try catch finally中finally中的代码是一定会执行的,所以try 中的return会被finally中的return覆盖,在下面的情况下,return才不会改变

 如果finally中没有返回值,那么结果还是try中的返回值

9. 继承声明

 

 public A foo(){return A;} 方法名相同,返回值相同,返回值A没有定义,会报错

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值