阿里实习面试总结

简介:

这次妥妥的倒在了一面上。还是基础不够扎实。

1. 重载与多态区别

重载(overload)一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。 重载的规则: a、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样); b、不能通过访问权限、返回类型、抛出的异常进行重载; c、方法的异常类型和数目不会对重载造成影响;

重写/覆盖(override),子类在继承父类时,重写父类中的方法。 重写的规则: a、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载. b、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。 c、重写的方法的返回值必须和被重写的方法的返回一致; d、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类; e、被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。 f、静态方法不能被重写为非静态的方法(会编译出错)。

多态为了避免在父类里大量重载引起代码臃肿且难于维护。通过重写实现。


public class Shape {  
    public static void main(String[] args) {  
        Triangle tri = new Triangle();  
        System.out.println("Triangle is a type of shape? " + tri.isShape());// 继承  
        Shape shape = new Triangle();  
        System.out.println("My shape has " + shape.getSides() + " sides."); // 多态  
        Rectangle Rec = new Rectangle();  
        Shape shape2 = Rec;  
        System.out.println("My shape has " + shape2.getSides(Rec) + " sides."); // 重载  
    }  

    public boolean isShape() {  
        return true;  
    }  

    public int getSides() {  
        return 0;  
    }  

    public int getSides(Triangle tri) { // 重载  
        return 3;  
    }  

    public int getSides(Rectangle rec) { // 重载  
        return 4;  
    }  
}  

class Triangle extends Shape {  
    public int getSides() { // 重写,实现多态  
        return 3;  
    }  
}  

class Rectangle extends Shape {  
    public int getSides() { // 重写,实现多态  
        return 4;  
    }  
}


2. read()执行时操作系统完成的工作

3. 进程有哪些状态

基本状态:运行-就绪-阻塞(也称为等待或睡眠)。实际的系统中经常引入新建态和终止态。有的系统引入了挂起态。 Java线程状态共6个:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED

4. url中参数去掉一部分的算法

当时想到了切分字符串和正则替换,但是写的正则有问题。面试结束和面试官交流,他提示扫描一遍就可以。


package monitor;  

import java.util.Arrays;  

class CheckHelper {  
    private char temp[] = new char[64];  
    private String params[];  
    private boolean check[];  
    private int tag = 0;  

    public CheckHelper(String params[]) {  
        this.params = params;  
        check = new boolean[params.length];  
    }  

    public void initCheck() {  
        for (int i = 0; i < check.length; i++)  
            check[i] = true;  
        tag = 0;  
    }  

    public void doCheck(char c) {  
        for (int i = 0; i < params.length; i++) {  
            String param = params[i];  
            temp[tag] = c;  
            if (tag >= param.length() || param.charAt(tag) != c) {  
                check[i] = false;  
            }  
        }  
        tag++;  
    }  

    public String getResult() {  
        for (int i = 0; i < params.length; i++) {  
            String param = params[i];  
            if (check[i] && param.length() == tag) {  
                initCheck();  
                return null;  
            }  
        }  
        String ret = new String(Arrays.copyOf(temp, tag));  
        initCheck();  
        return ret;  
    }  
}  

public class Test {  
    public static String removeParam(String url, String[] params) {  
        CheckHelper ch = new CheckHelper(params);  
        ch.initCheck();  
        StringBuilder sb = new StringBuilder();  
        boolean start = false;  
        boolean rest = false;  
        boolean copy = false;  
        for (int i = 0; i < url.length(); i++) {  
            char c = url.charAt(i);  
            if (!start) {  
                sb.append(c);  
                if (c == '?')  
                    start = true;  
            } else if (c == '=') {  
                rest = true;  
                String ret = ch.getResult();  
                if (ret != null) {  
                    if (sb.charAt(sb.length() - 1) != '?')  
                        sb.append('&');  
                    sb.append(ret);  
                    sb.append('=');  
                    copy = true;  
                } else {  
                    copy = false;  
                }  
            } else if (!rest) {  
                ch.doCheck(c);  
            } else if (c != '&') {  
                if (copy)  
                    sb.append(c);  
            } else {  
                ch.initCheck();  
                rest = false;  
                copy = false;  
            }  
        }  
        return sb.toString();  
    }  

    public static void main(String[] args) throws Exception {  
        String url = "http://s.taobao.com/search?spm=a230r.1.0.100.S98nmj&" +  
                "q=Apple%2F%C6%BB%B9%FB+MacBook+Pro+MD101CH%2FA&v=product&p=" +  
                "detail&pspuid=202666380&cat=1101&from_pos=55_1101.xlcombo_1_2_202666380";  
        String[] params = { "spm", "pspuid", "cat" };  
        System.out.println(removeParam(url, params));  
    }  
}


PS. 2014年的今天已经是阿里巴巴的一员了。觉得应该对自己的Java有信心并提出让Java工程师来面试我。

目录
相关文章
|
5月前
|
存储 关系型数据库 MySQL
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
|
4月前
|
监控 Java 数据安全/隐私保护
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
|
3月前
|
负载均衡 架构师 Cloud Native
阿里面试:服务与发现 ,该选 CP 还是 AP?为什么?
阿里面试:服务与发现 ,该选 CP 还是 AP?为什么?
阿里面试:服务与发现 ,该选  CP 还是 AP?为什么?
|
4月前
|
SQL Java 数据库连接
阿里腾讯互联网公司校招 Java 面试题总结及答案解析
本文总结了阿里巴巴和腾讯等互联网大厂的Java校招面试题及答案,涵盖Java基础、多线程、集合框架、数据库、Spring与MyBatis框架等内容。从数据类型、面向对象特性到异常处理,从线程安全到SQL优化,再到IOC原理与MyBatis结果封装,全面梳理常见考点。通过详细解析,帮助求职者系统掌握Java核心知识,为校招做好充分准备。资源链接:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
135 2
|
6月前
|
存储 算法 架构师
阿里面试:PS+PO、CMS、G1、ZGC区别在哪?什么是卡表、记忆集、联合表?问懵了,尼恩来一个 图解+秒懂+史上最全的答案
阿里面试:PS+PO、CMS、G1、ZGC区别在哪?什么是卡表、记忆集、联合表?问懵了,尼恩来一个 图解+秒懂+史上最全的答案
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
11月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
11月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!