JAVA 牛客与领扣学习第二周期

选择题:

解题思路:

+号两边如果有一边为字符类型  则为字符串连接

如果变为y+z+x 则等价于(y+z)+x  输出47

解题思路:

意思就是存的顺序 与取出来的顺序完全相反
Stack 栈  先进后出
Queue 队列  先进先出
List 集合  有下标  存的顺序与取得的顺序一致
LinedList 类 是Queue的子类  存的顺序与取得的顺序一致

解题思路:

A.抽象类可以有非抽象的方法,而接口中的方法都是抽象方法

B.java中类只能单继承,接口可以‘继承’多个接口

C.抽象类必须有构造方法,接口一定没有构造方法

D.实例化一般指new一个对象,所以抽象类不能实例化

解题思路:

第一点是run与start方法区别,调用run时只是单纯执行方法,故按代码顺序执行下来结果就是SogouHello。

接着我们再来看看把run换成start,结果是HelloSogou,这是为什么呢。

首先调用start是开始了一个线程,那么现在程序中有了两个线程主线程main和线程T。

这就涉及本题第二个知识点了,函数使用的锁是this(即对象本身),若函数被static修饰则锁为 类名.class.

那么题目中两个函数都是使用了同一个锁即HelloSogou.class,当执行t.start时,t线程准备调用Sogou方法,但是锁对象已被主线程占用,故要等待主线程执行完System.out.print("Hello")后释放锁才可以执行自己的Sogou方法。故此结果是HelloSogou。

解题思路:

解题思路:

1.String对象的两种创建方式:
第一种方式: String str1 = "aaa"; 是在常量池中获取对象("aaa" 属于字符串字面量,因此编译时期会在常量池中创建一个字符串对象),

第二种方式: String str2 = new String("aaa") ; 一共会创建两个字符串对象一个在堆中,一个在常量池中(前提是常量池中还没有 "aaa" 字符串对象)。

System.out.println(str1==str2);//false


2.String类型的常量池比较特殊。它的主要使用方法有两种:
直接使用双引号声明出来的String对象会直接存储在常量池中。
如果不是用双引号声明的String对象,可以使用 String 提供的 intern 方法。 String.intern() 是一个 Native 方法,也就是本地方法,它的作用是: 如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用; 如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用。
String s1 = new String("AAA");
String s2 = s1.intern();
String s3 = "AAA";
System.out.println(s2);//AAA
System.out.println(s1 == s2);//false,因为一个是堆内存中的String对象一个是常量池中的String对象,
System.out.println(s2 == s3);//true, s2,s3指向常量池中的”AAA“。

解题思路:

复制的效率System.arraycopy>clone>Arrays.copyOf>for循环,这里面在System类源码中给出了arraycopy的方法,是native方法,也就是本地方法,肯定是最快的。而Arrays.copyOf(注意是Arrays类,不是Array)的实现,在源码中是调用System.copyOf的,多了一个步骤,肯定就不是最快的。for的速度之所以最慢是因为下标表示法每次都从起点开始寻位到指定下标处(现代编译器应该对其有进行优化,改为指针),另外就是它每一次循环都要判断一次是否达到数组最大长度和进行一次额外的记录下标值的加法运算。

 

解题思路:

解题思路:

这道题一定要看仔细了,MyClass方法并不是构造参数,而是返回类型为void的普通方法,普通方法自然需要实例化对象然后去调用它,所以124不对,第三个是正确的,因为没有带int参数类型的构造器,所以自然不能传一个int进去。

解题思路:

多态的作用 
1不必编写每一子类的功能调用,可以直接把不同子类当父类看,屏蔽子类间的差异,提高代码的通用率/复用率 
2父类引用可以调用不同子类的功能,提高了代码的扩充性和可维护性。

解题思路:

继承是根源,重写是表现形式

解题思路:

1.三目运算符结合性为:右结合
2.表达式的执行顺序是从左到右执行的
3.exp1 ? exp2 : exp3中exp2,exp3只有一个执行
实验:
            boolean y=true?false:true==true?false:true;  //=false
            boolean w=true?false:((true==true)?false:true); //右结合Right2Left = false  后面括号根本不会执行

解题思路:

四个选项都是Swing组件。JTextField输入单行文本,JTextArea输入多行文本,JButton显示按钮,JLebel提示信息

解题思路:

1、jps:查看本机java进程信息。

2、jstack:打印线程的信息,制作线程dump文件。

3、jmap:打印内存映射,制作dump文件

4、jstat:性能监控工具

5、jhat:内存分析工具

6、jconsole:简易的可视化控制台

7、jvisualvm:功能强大的控制台

 解题思路:

选C 方法区:主要存储结构信息的地方,比如方法体,同时也是存储静态变量,以及静态代码块的区域,构造函数,常量池,接口初始化等等 方法区物理上还是在堆中,是在堆的持久代里面。堆有年轻代 (由一个Eden区和俩个survivor区组成),老年代,持久代。新创建的对象都在年轻代的Eden区,经过一次JC收集后,存活下来的会被复制到survivor区(一个满了,就全部移动到另外一个大的中,但要保证其中一个survivor为空),经过多次JC后,还存活的对象就被移到老年代了。 持久代就是经常说的方法区里面存放类信息,常量池,方法等 static String str0="0123456789"; static String str1="0123456789";是放在方法区里。也就是持久代,题目中已经说了,不包含持久代,所以剩余空间为5+5+5=15.

解题思路:

由于arr[0] =0,所以在进入 test()方法里面会在第一个if 上抛出一个 NullPointerException,接着会执行 finally 的语句, (finally语句先于 return 和 throw语句执行),输出一个'e,然后回到 main方法中,由于捕捉到异常,所以进入到catch语句中,然后打印一个'E',所以最终结果为"eE"

解题思路:

由于静态方法没有重写一说,所以也就没有动态链的实现,而是被隐藏,要调用的话只能通过父类名.方法名,题目中是用的subTosuper(父类)   调用的getType方法,所以调用的则是Super类中的方法,又因为是静态分配,编译器会根据声类,Collection去找到合适的方法调用,所以会三次调用Super类中的public static String getType(Collection<?> collection)方法,故选C。

解题思路:

 编程题:

https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/(本题所在地)

class Solution {
    public String reverseLeftWords(String s, int n) {
        return s.substring(n)+s.substring(0,n);
    }
}

 https://leetcode-cn.com/problems/count-negative-numbers-in-a-sorted-matrix/

class Solution {
    public int countNegatives(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int sum = 0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]<0){
                    sum+=n-j;
                    break;
                }
            }
        }
        return sum;
    }
}

https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/

这道题主要是题目有点绕(对于我而言),数组长度是n-1,每个数字的范围是大于等于0,小于等于数组长度n-1,在这个范围内本来有n个数字,但现在有一个数字不在,需要找出这个数字。也就是需要用到查找方面的知识,故首选推荐二分查找法,以下是图片过程和代码展示:

class Solution {
    public int missingNumber(int[] nums) {
        int right = nums.length-1;
        int left = 0;
        int mid;

        while(right>=left){
            mid = (right+left)/2;
            if(nums[mid]!=mid){
                right = mid-1;
            } else{
                left = mid+1;
            }
        }
        return left;
    }
}

https://leetcode-cn.com/problems/third-maximum-number/  第三大数

class Solution {
    public int thirdMax(int[] nums) {
        if(nums.length==1){
            return nums[0];
        }
        if(nums.length==2){
            return Math.max(nums[0],nums[1]);
        }
        int max1=Integer.MIN_VALUE;//整形范围内的最小值
        int max2=Integer.MIN_VALUE;
        int max3=Integer.MIN_VALUE;
        boolean flag = true;
        int temp = 0;//唯一元素的个数
        for(int i=0;i<nums.length;i++){
            if(nums[i]==Integer.MIN_VALUE && flag){//为了保证重复的数是整形最小值而影响结果
                temp++;
                flag = false;//出现整形最小值第一次,则temp++,第二次出现就不能temp++了。
            }
            if(nums[i]>max1){
                temp++;               
                max3=max2;//原先第二大传递给第三大                
                max2=max1;//原先最大值传递给第二大             
                max1=nums[i];//更新最大值
            }else if (nums[i]>max2 && nums[i]<max1){
                temp++;
                max3=max2;
                max2=nums[i];//更新第二大值
            } else if( nums[i]>max3 && nums[i]<max2){
                temp++;
                max3=nums[i];//更新第三大值
            }
        }
        return temp>=3?max3:max1;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值