栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

day18Excise

Java 更新时间:发布时间: 百科书网 趣学号

1.阅读下面XML文档,然后判断下列说法正确的是( )。

TEDU

北京海淀 A.是元素对象,同样也是文本对象 B.是元素对象,同样也是文本对象 **C.北京海淀是文本对象** D.北京海淀是元素对象

2.下列是格式正确的XML标记的是( )。
A.张三
B.张三
C.张三
D.

3.下列选项中可以解析XML文档的是( )。
A.DTD
B.DOM
C.SAX
D.CSS

简答题
1.HashMap扩容原理
如果HashMap初始化的时候没有指定容量,会返回一个空的table数组。
第一次往HashMap中put元素的时候,会使用默认的参数16作为数组的初始化长度:
static final int DEFAULT_INITIAL_CAPACITY =1<<4
当HashMap中的元素数量超过容量*加载因子时,会进行扩容操作,
容量变为原来的2倍。HshMap的加载因子,默认是0.75:
2.HashMap底层结构
HashMap 底层是一个Entry数组:transient Node[] table
当存放元素时,首先会根据key的hashCode值找到数据应该保存在
table数组的下标位置。
如果数组的位置上没有数据,直接将这个键值对保存在该位置上。
如果数组的位置上已经有数据了,即发生了哈希冲突,也就是两个对象的key的
hash值相等,那么则需要通过key的equals方法判断这两个对象
是否为同一个对象,如果是,那么原本存储的value值会被新值所替换,
如果不是同一个对象,则采用链地址法,把新的键值对对象保存到旧的键值对
对象的next变量中,形成单向链表结构。
当链表过长时,查询效率会下降,所以JDK8之后新增了红黑树作为
底层数据结构,如果链表长度超过8并且数组长度大于64时,
hashMap会把这个链表转成红黑树来存储(如果数组长度没有超过64会进行扩容)
当链表长度小于6时会从红黑树转回链表。
3.HashSet存储原理
HashSet底层由HshMap实现,利用了HashMap的key不能重复的特性
直接将要存储的元素作为key存储到HashMap中。
4.List和Set的区别
1、List,Set都是继承自Collection接口
Set的实现类主要有HashSet和TreeSet,List的实现类主要有ArrayList linkedList
2、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)
3.Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

5.HashMap和HashTable的区别
相同点:
hashmap和Hashtable都实现了map、Cloneable(可克隆)、Serializable(可序列化)这三个接口
不同点:

  1. 底层数据结构不同:jdk1.7底层都是数组+链表,但jdk1.8 HashMap加入了红黑树
  2. Hashtable 是不允许键或值为 null 的,HashMap 的键值则都可以为 null。
    3.添加key-value的hash值算法不同:HashMap添加元素时,是使用自定义的哈希算法,而HashTable是直接采用key的hashCode()
    4.实现方式不同:Hashtable 继承的是 Dictionary类,而 HashMap 继承的是 AbstractMap 类。
  3. 初始化容量不同:HashMap 的初始容量为:16,Hashtable 初始容量为:11,两者的负载因子默认都是:0.75。
  4. 扩容机制不同:当已用容量>总容量 * 负载因子时,HashMap 扩容规则为当前容量翻倍,Hashtable 扩容规则为当前容量翻倍 +1。
  5. 支持的遍历种类不同:HashMap只支持Iterator遍历,而HashTable支持Iterator和Enumeration两种方式遍历
    迭代器不同:HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。而Hashtable 则不会。
  6. 部分API不同:HashMap不支持contains(Object value)方法,没有重写toString()方法,而HashTable支持contains(Object value)方法,而且重写了toString()方法
  7. 同步性不同: Hashtable是同步(synchronized)的,适用于多线程环境,而hashmap不是同步的,适用于单线程环境。多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。
    由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。

6.xml文件的语法要求有哪些?
1、必须有声明语句。
2、注意大小写
3、XML文档有且只有一个根元素
4、属性值使用引号
5、标签成对存在
自闭合标签,可以独立存在

7.常用的xml解析方式
1.DOM (document Object Model 文档对象模型)
是官方推荐的标准,与平台和语言无关。
会将xml文档中的内容以树的结构一次性加载到内存中,可以对xml文档中的内容进行随机访问或修改的操作,但是对于大文档来说
解析效率低,内存成本高。
2.SAX (Simple Api For Xml 简单应用程序接口)
以事件为驱动,需要哪些数据再加载和解析哪些内容,解析速度快,占用内存少,但是不会将内容加载到内存,使用起来不方便,反而
会增加程序的负担。
3.JDOM
是java和DOM的结合体,是基于java平台使用的,简单高效,但是也需要加载整个文档,对内容容量要求高。
4.DOM4J
是一个java的XML API,类似于JDOM,用来读写xml文件,性能优异、功能强大、简单易用、且开放源代码,是目前最流行、最好用的xml解析工具,解析xml速度最快。
8.什么是maven
关于Maven,可以简单的理解为是一个管理项目中所需要使用的jar包的工具!
jar包是将一系列的类、接口等相关文件压缩打包后形成的文件,表现为扩展名为.jar的文件。

在Maven项目中,在根目录下就存在pom.xml文件,在这个文件中可以通过代码来添加项目中所需要的jar包文件的“依赖(dependency)”,则开发工具可以自动从 “仓库服务器”中下载对应的jar包文件,下载的jar包文件会出现在“本地仓库”中!

9.什么是反射
反射是一种动态机制,它允许我们程序运行起来后再确定实例化对象,
调用方法和操作属性,可以提高代码的灵活度。
但是反射会带来较慢的运行速度和更多的系统开销,所以不能过度依赖反射机制。

10.注解的分类,你用过哪些注解,它们的作用是什么?

1.JDK注解 5个
JDK提供的注解,常用的有@Override
2.元注解 5个
用于描述注解的注解,通常配合元注解完成自定义注解
常用的有:
–@Target 用来指定注解可以出现的位置,比如出现在类上、方法上、属性上
–@Retention 用来指定注解的生命周期,比如.java文件中、.class文件中、运行中

11.谈谈你对socket的理解

编程题

  1. 定义封装类Student,类中的成员有:
    私有属性:学号,姓名,年龄,性别
    无参构造方法,全参数构造方法
    定义每个属性的setters和getters方法
    重写toString方法和equals方法(根据学号比较对象)

    在测试类中利用反射完成以下操作:

    1. 用户从控制台输入要加载的类名
    2. 实例化该类,要求调用有参构造方法完成实例化对象的同时为属性赋值
    3. 获取并遍历类中的所有方法,执行所有的get开头的方法,并将其返回值打印输出。

2.创建Demo类,在类中定义一个私有方法 demo(),方法体中输出“私有方法”,
创建测试类Test,利用反射在运行期输入要加载的类名,然后实例化对象,然后执行该私有方法。

11.谈谈你对socket的理解

编程题

  1. 定义封装类Student,类中的成员有:
    私有属性:学号,姓名,年龄,性别
    无参构造方法,全参数构造方法
    定义每个属性的setters和getters方法
    重写toString方法和equals方法(根据学号比较对象)

    在测试类中利用反射完成以下操作:

    1. 用户从控制台输入要加载的类名
    2. 实例化该类,要求调用有参构造方法完成实例化对象的同时为属性赋值
    3. 获取并遍历类中的所有方法,执行所有的get开头的方法,并将其返回值打印输出。
package JAVA_API.api_homework.day18;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Objects;
import java.util.Scanner;


//在测试类中利用反射完成以下操作:
public class StudentTest {
    public static void main(String[] args) throws Exception {

        Student student = new Student();
        System.out.println(Student.class);
        //	1. 用户从控制台输入要加载的类名
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入类名:");
        String className = scanner.nextLine();
        //2.获取String类对象
        Class cls = Class.forName(className);
        //className = cls.getSimpleName();

        //3.实例化该类,要求调用有参构造方法完成实例化对象的同时为属性赋值
        //创建并初始化对象的属性,需要使用有参构造器创建,第一步先获取有参构造器,需要指定形参参数类型的类对象
       
        //4.为了满足题意,调用构造方法实例化对象的同时为属性赋值
        Object student1 = cls.getConstructor(long.class,String.class,int.class,char.class).newInstance(131141516,"yyc",18,'女');

        //5.获取并遍历类中的所有方法,执行所有的get开头的方法,并将其返回值打印输出
        Method[] methods = cls.getMethods();
        for (Method method : methods){
            String method1 = method.getName();
            if (method1.contains("get"))
                System.out.println(method.getName());
        }
    }
}

2.创建Demo类,在类中定义一个私有方法 demo(),方法体中输出“私有方法”,
创建测试类Test,利用反射在运行期输入要加载的类名,然后实例化对象,然后执行该私有方法。

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/275518.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号