CoreJava第一阶段内容考试

CoreJava第一阶段内容考试
package Test;
/*
1.说一下 &和&& 的区别
& 是非短路与, 第一个逻辑表达式为false,第二个表达式依然会执行判断
&& 是短路与,第一个表达式为 false ,第二个表达式不会判断执行
2.方法覆盖和方法重载的语法要求
方法覆盖:
访问修饰符 子类与父类的访问修饰符相同或者更宽
返回值类型  子类与父类的返回值类型相同或是其子类型
函数名相同 形参列表相同
异常  子类抛出的异常不可以比父类的异常更宽或者更大
方法重载
访问修饰符 返回值类型无要求
函数名相同 形参列表不同
3. 说明 HashMap和Hashtable的区别 ,ArrayList 和LinkedList的区别
HashMap 可以使用null作为键和值 ,线程不安全,并发效率高
Hashtable 不可以使用 null 作为键和值 ,线程安全,并发效率低

ArrayList 底层使用数组实现 查询快,增删慢 线程不安全,并发率高
LinkedList 底层使用链表实现,查询慢,增删快

4.List Map Set  三个接口,存取元素时,各有什么特点
List  有序 有下标  元素可以重复
Map   键值对形式存储  key value  key  不可以重复 无序  value 可以重复
Set  无序  无下表  元素不可以重复
5. 什么是对象序列化?对象序列化的要求是什么?
将对象放在流上传输就是对象序列化
要求
  1只有实现了Serializable接口,支持序列化
  2若传输的对象具有对象类型的属性 ,则要求该属性的所属类型也是可序列化的,若该属性为集合或者数组,要求集合或者数组元素也是可序列化的
  3被transient修饰的属性,变为临时属性,对应的对象属性值不参与序列化
6.String类型的值“123”,转换为对应的int值
String  s1 = “123”;
int a = Integer.perseInt(s1);
7.final,finally,finalize的区别
final 是最终不可修改的意思,修饰类 该类不可以被继承,修饰属性没有默认值,值一旦给定不可以修改,修饰方法不可以被覆盖值可以被继承
finally  中的代码无论异常产生与否,都会执行,return中的语句总是会被执行,主要作用是关闭资源
finalize  销毁垃圾时,释放内存空间调用的方法
8.请说出访问修饰符public,private,protected,以及default的区别
访问修饰符      本类内部      本包非本类      非同包子类              非同包非子类              继承性
public          √               √              √                   √                   可以继承
protected       √               √              √                   √                  可以继承
default         √               √                                                    同包子类可以继承
private         √                                                                     不可以继承
9.请简述异常的分类和各自的特点
Throwable 所有异常的直接父类或者间接父类,分为 Error和Exception,Error 属于程序中无法处理的错误,Exception属于可以处理的异常,分为
RuntimeException(运行时异常):未检查异常,可以处理也可以不处理 ;和CheckedException(已检查异常):编译时异常不可避免,必须处理
10.获取Class对象的3种方式
   1 类名.class  2 类对象  引用名.getClass  3  Class.forNmae("类的全限定名")--进行类加载
  如 1 Class c1 = ArrayList.class   2 ArrayList  list = new ArrayList();   Class  c2 = list.getClass
  3 Class.forNmae("java.util.ArrayList");
11请写出eauals和==的区别
equals : 判断当前引用中保存的对象与引用中保存的对象是否一样(内容是否一致)
==  : 判断引用的对象地址是否相同, 判断基本类型的值是否相等
12局部变量和实例变量的区别
                    局部变量                成员变量
位置                 在函数以内            函数以外 内的内部
默认值       没有默认值需先赋值在使用       与数组的默认值相同
作用范围   从定义行开始到定义它的代码快结束     整个类内部
命名冲突    作用范围内不可以命名重复       与局部变量命名冲突时,优先使用局部变量
13 this和super的区别
this 指带当前对象  super 指带当前父类
14 什么是类加载
当JVM第一次使用类的信息时,需要将字节码文件中描述的信息读取到程序中保存
15字节流和字符流的区别
字节流是以字节为单位进行数据传输 可以传输任意类型的文件
字符流是以字符为单位进行数据传输 可以传输文本文件(使用编辑器打开人还可以看的懂)
16写出实现线程的两种方式,两种方式的区别是什么?
    继承Thread类,把自身当做任务对象
    实现Runnable接口,实现类充任务对象
17 线程中sleep()和wait()方法的区别
 sleep :当前线程会持有锁标记进入睡眠状态,此时线程会释放时间片,时间到期以后会回到就绪状态,等待再一次被OS选中
 wait : 当前线程会进入阻塞状态,线程会释放锁标记等待通知。
18 abstract和 interface 的区别
相同点
1都可以生成字码文件
2都是java的一种数据类型
3都无法实例化对象,只能声明引用
不同点
1接口没有构造函数,抽象类可以有构造函数
2关键词不同
3接口的属性都是公开静态常量 pubilc static final
接口中的方法都是公开抽象方法  public abstrac

* */

import sun.text.normalizer.UCharacter;

import java.io.*;
import java.util.*;
import java.util.function.Consumer;

public class CoreJava1 {
}

/*
程序填空:完成getAllDog方法,从一个Animal 集合中挑选出 所有的Dog对象,并把这些对象放在一个Dog集合中返回
*/
class Animal{}
class  Do extends Animal{}
class Cat extends Animal{}
class TestAnimal{
    public static void main(String[] args) {
        List<Animal> as = new ArrayList<Animal>();
        as.add(new Do());
        as.add(new Cat());
        as.add(new Do());
        as.add(new Cat());

        List<Do> dogs =getAllDo(as);
        for(Do d:dogs){
            System.out.println(d);
        }
    }
    public static List<Do> getAllDo(List<Animal> animal){
        List <Do> dog = new ArrayList<Do>();
        for(Animal a: animal){
            if(a instanceof Do){
                dog.add((Do)a);
            }
        }
        return dog;
    }
}
/*
* 匿名内部类 使用匿名内部类创建IA 接口实现类的对象*/
interface IA{
    void m();
}
class Test2{
    public static void main(String[] args) {
         new IA(){
            public void m(){
            }
        };
    }
}
/*
3.给定一个由字符串,如“abcdefghijkiacedfjk”统计出每个字符出现的次数
* */

class Test3{
    public static void main(String[] args) {
        String s ="abcdefghijkiacedfjk";
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            char  c  = s.charAt(i);
            if(map.containsKey(c)){
              Integer cout = map.get(c);
              map.put(c,++cout);
          }else{
                map.put(c,1);
            }
        }
        Set<Character> zimu = map.keySet();
        for(Character k: zimu){
            System.out.println("key:"+k+" value:"+map.get(k));
        }
    }
}

// 4.定义一个学生类(属性:年龄 姓名) 在List 集合中存储 5名学生的信息,并采用两种遍历的方法遍历List集合【加泛型】
class Test4{
    public static void main(String[] args) {
        List<Student_1> list = new ArrayList<Student_1>();
        list.add(new Student_1(18,"大宝"));
        list.add(new Student_1(13,"二宝"));
        list.add(new Student_1(11,"三宝"));
        list.add(new Student_1(12,"四宝"));
        list.add(new Student_1(17,"五宝"));
        for(Student_1 s: list){
            System.out.println(s);
        }
        System.out.println();
        Iterator it = list.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
        System.out.println();
        for (int i = 0; i <list.size(); i++) {
            System.out.println(list.get(i));
        }
        System.out.println();
        list.forEach(new Consumer<Student_1>() {
            @Override
            public void accept(Student_1 student_1) {
                System.out.println(student_1);
            }
        });
        System.out.println();
        list.forEach((student_1)->System.out.println(student_1));
    }
}
class Student_1{
    int age;
    String name;

    @Override
    public String toString() {
        return "Student_1{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    public Student_1() {
    }

    public Student_1(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

//5.int[]a = {2,4,3,1,6,8,7};
// 请用冒泡或选择排序法,将数组中的元素从小到大重新排列,写出代码

class Test5{
    public static void main(String[] args) {
        int[] a= {2,4,3,1,6,8,7};
        //Jdk排序
        java.util.Arrays.sort(a);
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
        //冒泡排序
        for (int i = 1; i < a.length; i++) {
            for(int j = 0;j< a.length-i;j++){
                if(a[j]>a[j+1]){
                    int b = a[j+1];
                    a[j+1]=a[j];
                    a[j]=b;
                }
            }
        }
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }

        for (int i = 1; i < a.length; i++) {
            for (int j = i; j < a.length; j++) {
                if(a[i-1]>a[j]){
                    int b = a[j];
                    a[j]=a[i-1];
                    a[j]=b;
                }
            }
        }
    }
}

// 使用缓冲流,完成文件复制,D盘根目录下有文件test.png 复制到E盘下
class Test6{
    public static void main(String[] args) {
        try(InputStream in = new FileInputStream("D:/自己.jfif");
            BufferedInputStream bis =new BufferedInputStream(in);
            OutputStream ot = new FileOutputStream("D:/自己人.jfif");
            BufferedOutputStream bos = new BufferedOutputStream(ot)){
            byte[] ss =new byte[10];
            while(true){
                int r  = bis.read(ss);
                if(r==-1)break;
                bos.write(ss,0,r);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
/*设计一个类型用来描述产品(Product),属性有编号(id);产品名称 (name);产品价钱
(price);产品描述 (message);有一个方法叫show方法,用来展示产品相关信息(输出格式
id name price message)
要求 1完成类的封装 提供 get set
 2提供无参以及有有参的构造方法给必要的属性赋值
 3覆盖 toString 方法,要求返回值以如下的方式现实
   编号1 名称 鲜花 价钱 12.5 详细描述 玫瑰鲜花1朵
 4 覆盖equals方法 比较各个属性的内容
 5 实现show方法
* */
class Product{
    private String id;
    private String name;
    private double price;
    private String message;

    public void setId(String id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public String getMessage() {
        return message;
    }

    public Product() {
    }

    public Product(String id, String name, double price, String message) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.message = message;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Product product = (Product) o;
        return id == product.id && Double.compare(product.price, price) == 0 && Objects.equals(name, product.name) && Objects.equals(message, product.message);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, price, message);
    }

    @Override
    public String toString() {
        return "编号:"+id+" 名称:"+name+" 价钱:"+" 详细描述:"+message;
    }
    void show(){
        System.out.println("编号:"+getId()+" 名称:"+getName()+" 价钱:"+getPrice()+" 详细描述:"+getMessage());
    }
}

// 已知在相对路径下有一个test.txt文件 ,内容如下
/*1/鲜花/12.5/玫瑰鲜花一朵
2/手机/1999.0/三星手机一部
3/电脑/13000.0/苹果电脑一台
请完成如下要求
1 利用UTF-8的解码方式,读取文件,将所有的内容读取出来
2 将读取到的内容进行字符串解析并保存在Map集合中(Map<Integer,Product>)
 key 是产品的编号 value 是上题中的 Product 对象
 3遍历集合 输出以下内容 (key 编号 value 是对象的toString 方法的返回值)
 key1: Value :编号:1    名称 : 鲜花  价钱:12.5  详细描述 : 玫瑰鲜花一朵
 key2: Value :编号:2    名称 : 手机  价钱:1999.0  详细描述 : 三星手机一部
 key3: Value :编号:3    名称 : 电脑  价钱:13000.0  详细描述 : 苹果电脑一台
 4.修改Product类,并将key为3对应的Product对象序列化到 test.obj文件中
* */
class Test8{
    public static void main(String[] args) {
        try(InputStream  in = new FileInputStream("D:/test.txt");
            InputStreamReader isr = new InputStreamReader(in,"UTF-8");
            BufferedReader br = new BufferedReader(isr);
            OutputStream ot = new FileOutputStream("D:/test2.obj");
            ObjectOutputStream oi = new ObjectOutputStream(ot);){
            Map<Integer,Product> map = new HashMap();
            while(true){
                String s = br.readLine();
                if(s==null)break;
                System.out.println(s);
                String[] ss =s.split("/");
                Product p = new Product();
                p.setId(ss[0]);
                p.setName(ss[1]);
                p.setPrice(Double.parseDouble(ss[2]));
                p.setMessage(ss[3]);
                map.put(Integer.parseInt(p.getId()),p);
            }
            Set<Integer> ss = map.keySet();
            for(Integer sss:ss){
                System.out.println(map.get(sss));
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值