java基础面试题

什么是值传递,什么是引用传递?
1、什么是值传递,什么是引用传递?
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
在这里插入图片描述
Java中只有值传递

1.传值调用(值传递):在传值调用中,实际参数先被求值,然后其值通过复制,在传递给被调函数的形式参数。因为形式参数拿到的只是一个"局部拷贝",所以如果在被调函数中改变了形式参数的值,并不会改变实际参数的值。

2.传引用调用(引用传递)在传引用调用中,传递给函数的是它的实际参数的隐式引用而不是实参的拷贝。因为传递的是引用,所以,如果在被调函数中改变了形式参数的值,改变对于调用者来说是可见的。

3.传共享对象调用(共享对象传递)传共享对象调用中,先获取到实际参数的地址,然后将其复制,并把该地址的拷贝传递给被调函数的形式参数。因为参数的地址都指向同一个对象,所以我们也称之为"传共享对象",所以,如果在被调函数中改变了形式参数的值,调用者是可以看到这种变化的。

因为传共享对象调用的过程和传值调用的过程是一样的,而且都有一步关键的操作,那就是"复制",所以,通常我们认为传共享对象调用是传值调用的特例
传值调用是指在调用函数时将实际参数复制一份传递到函数中,传引用调用是指在调用函数时将实际参数的引用直接传递到函数中。

char 型变量中能不能存贮一个中文汉字,为什么?
答:
char 类型可以存储一个中文汉字,因为 Java 中使用的编码是 Unicode(不选择
任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一
个 char 类型占 2 个字节(16 比特),所以放一个中文是没问题的。

抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被 synchronized修饰?

都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛
盾的。本地方法是由本地代码(如 C 代码)实现的方法,而抽象方法是没有实现
的,也是矛盾的。synchronized 和方法的实现细节有关,抽象方法不涉及实现细
节,因此也是相互矛盾的。

如何实现对象的拷贝
1). 实现 Cloneable 接口并重写 Object 类中的 clone()方法;

public class StaticTest implements Cloneable{
    private Integer age;
    private String name;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public static void main(String[] args) throws CloneNotSupportedException {
    StaticTest test = new StaticTest();
    test.setName("王慧洁");
    test.setAge(18);

    StaticTest h = (StaticTest)test.clone();
    h.setAge(19);
    System.out.println(test.getAge());  //18
}

2). 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆

public static void main(String[] args) throws Exception {
Person test = new Person();
test.setName(“王慧洁”);
test.setAge(18);
Person t = StaticTest.clone(test);
t.setAge(19);
System.out.println(test.getAge()); //18
}

@Data
public class Person implements Serializable {
    private Integer age;
    private String name;
}
public class StaticTest {
    
    @SuppressWarnings("unchecked")
    public static <T extends Serializable> T clone(T obj) throws  Exception {
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bout);
        oos.writeObject(obj);
        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bin);
        return (T) ois.readObject();
    }
}

抽象类是否可继承具体类
抽象类可继承具体类也可以继承抽象类。

怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串?
String s1 = “你好”;
String s2 = new String(s1.getBytes(“GB2312”), “ISO-8859-1”);

List、Set、Map 是否继承自 Collection 接口?

public interface List<E> extends Collection<E> 

public interface Set<E> extends Collection<E> 

public interface Map<K,V>

List、Set 是,Map 不是。Map 是键值对映射容器,与 List 和 Set 有明显的区别,而 Set 存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。

Comparable和Comparator
Comparable:
若一个类实现了Comparable接口,就意味着该类支持排序。实现了 Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
此外,实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器。

此接口只有一个方法compareTo,比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定 对象,则分别返回负整数、零或正整数。

Comparator:int compare(T o1, T o2);

@Data
public class Solution implements Comparable<Solution> {
    private Integer age;
    private String name;
    private Integer grade;

    public static void main(String[] args) throws Exception {
    }
    

    @Override
    public int compareTo(Solution other) {
        return this.age-other.getAge();
    }

    class ageCompare implements Comparator<Solution>{

        @Override
        public int compare(Solution o1, Solution o2) {
            return o1.age=o2.age;
        }
    }

    class gradeCompare implements Comparator<Solution>{

        @Override
        public int compare(Solution o1, Solution o2) {
            return o1.grade=o2.grade;
        }
    }

}
  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值