zoukankan      html  css  js  c++  java
  • java0618

    1、 java的基本数据类型,各占多少字节?

    byte 8位

    short 16位

    int 32位

    long 64位

    float 32位

    double 64位

    boolean 1位

    char 16位

    2、 什么是继承、多态?怎么实现多态?

    继承:子类继承父类的特征和行为,使得子类具有父类的各种属性和方法。

    多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

    在Java中有两种形式可以实现多态:继承和接口。

     基于继承的实现机制主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为。

    “一个接口,多个方法”展示了Java的动态多态性

    3、 重写和重载

    重写发生在父类和子类之间,子类重新定义父类方法,方法名、参数列表和返回类型都相同

    重载是在同一个类里,方法名相同,参数不同。

    4、 什么是堆、栈、队列?分别有什么特点?如何用两个栈实现队列?

    堆是一个运行时数据区,通过new等指令创建,不需要程序代码显式释放

    <1>优点:可动态分配内存大小,生存周期不必事先告诉编译器,Java垃圾回收自动回收不需要的数据;

    <2>缺点:运行时需动态分配内存,数据存取速度较慢。

    栈限制仅在表的一端进行插入和删除运算的线性表,先进后出FILO

    <1>优点:存取速度比堆快,仅次于寄存器,栈数据可以共享;

    <2>缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

    队列限制仅在表的一端(尾端)进行插入,另一端(首端)进行删除的线性表,先进先出FIFO

    package mianshi;

    import java.util.Stack;

    public class StacksToQuene {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    public void add(int x){//进队
    stack1.push(x);
    }
    public int deleteHead(){//出队
    if(stack1.size()+stack2.size()==0){
    System.out.println("队列为空");
    return -1;
    }
    if(stack2.isEmpty()){//只有栈2为空时才把栈1转移到栈2
    stack1ToStack2();
    }
    return stack2.pop();

    }
    public void stack1ToStack2(){
    while(!stack1.isEmpty()){
    stack2.push(stack1.pop());
    }
    }
    public static void main(String[] args){
    StacksToQuene q = new StacksToQuene();
    q.add(1);
    q.add(2);
    System.out.println(q.deleteHead());
    q.add(5);
    System.out.println(q.deleteHead());
    }
    }

    5、 &和&&、==和equals

    & 按位与

    && 逻辑与 当且仅当两个条件都满足时返回true

    使用==比较原生类型如:boolean、int、char等等,使用equals()比较对象

    对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址

    equals用于判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同,返回值为布尔类型

    boolean equals(Object o) { return this==o;}

    6、 ArrayList和LinkedList、HashMap和HashTable

    1)ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 

    2)对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 
    3)对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

       Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized).因此,开销就比ArrayList要大

     HashMap不是线程安全的: HashMap是map接口的子类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。

    HashTable是线程安全的:Hashtable的方法是Synchronize的

    7、 排序的几种方法,描述其思想

    8、 多线程有几种实现方法?同步有几种实现方法?

    实现多线程:继承Thread类;实现Runnable接口;

     用synchronized关键字修饰同步方法

     同步的实现方法分别是synchronized,wait与notify

    wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
    sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
    notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
    Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

    9、  常见的设计模式有什么?有什么作用?

    10、TCP和UDP协议的区别?Http基于哪个?GET和POST请求有什么区别?

    TCP面向连接的协议,通过三次握手建立可靠的连接

    UDP是一个非连接的协议,传输数据之前源端和终端不建立连接

    http基于TCP

    GET用于信息获取,而且应该是安全的和幂等的。GET方式传输的参数安全性低,因为传输的数据会显示在请求的URL中。

    POST表示可能修改变服务器上的资源的请求。POST方式传输的数据安全性较高,因为数据传输不是明显显示的。

    11、使用递归实现数字n的阶乘

      public class Test { 

        public static void main(String[] args) {

            int n = 6;

            System.out.println(jiecheng(n));

        }    

        public static Double jiecheng (int i) {

            Double result = 1.0;

            for (int j = 1; j <= i; j ++) {

                result *= j;

            }

            return result;

        }

    }

    12、对有序数组进行二分查找,返回x的位置

    public class BinarySearch {

            /**

            * 二分查找算法

            *

            * @param srcArray 有序数组

            * @param key 查找元素

            * @return key的数组下标,没找到返回-1

            */ 

            public static void main(String[] args) {

                int srcArray[] = {3,5,11,17,21,23,28,30,32,50,64,78,81,95,101};  

                System.out.println(binSearch(srcArray, 0, srcArray.length - 1, 81)); 

            }

            // 二分查找递归实现  

            public static int binSearch(int srcArray[], int start, int end, int key) {  

                int mid = (end - start) / 2 + start;  

                if (srcArray[mid] == key) {  

                    return mid;  

                }  

                if (start >= end) {  

                    return -1;  

                } else if (key > srcArray[mid]) {  

                    return binSearch(srcArray, mid + 1, end, key);  

                } else if (key < srcArray[mid]) {  

                    return binSearch(srcArray, start, mid - 1, key);  

                }  

                return -1;  

            }

            // 二分查找普通循环实现  

            public static int binSearch(int srcArray[], int key) {  

                int mid = srcArray.length / 2;  

                if (key == srcArray[mid]) {  

                    return mid;  

                }  

                int start = 0;  

                int end = srcArray.length - 1;  

                while (start <= end) {  

                    mid = (end - start) / 2 + start;  

                    if (key < srcArray[mid]) {  

                       end = mid - 1;  

                    } else if (key > srcArray[mid]) {  

                        start = mid + 1;  

                    } else {  

                        return mid;  

                    }  

                }  

                return -1;  

            }

        }

    纸上得来终觉浅,绝知此事要躬行
  • 相关阅读:
    显而易见的python
    GitHub 使用教程图文详解
    linux下搭建hexo环境
    linux 删除软链接
    Django2.1入门教程
    windows下安装PyQt4
    python3 Flask安装
    学习之源
    白话C++系列教程
    面试笔试试题精选
  • 原文地址:https://www.cnblogs.com/yeyueyou/p/7045423.html
Copyright © 2011-2022 走看看