美文网首页Java学习笔记
《Java必须知道的300个问题》学习笔记

《Java必须知道的300个问题》学习笔记

作者: 码梦的一生 | 来源:发表于2017-03-08 17:44 被阅读181次

    1. Java基本数据类型长度(字节)

    • 1个:byte(-128~127)
    • 2个:char(02^16-1),short(-2^152^15-1)
    • 4个:int(-231~231-1),float(IEEE 754)
    • 8个:double(-263~263-1),double(IEEE 754)

    2. goto在Java中作为保留字

    3. 常量定义:final,无法修改,没有子类,不能被重写

    4. float需要用f或F修饰,long用l或L

    5. 3-2.6 == 0.4是false,浮点数计算不精确,可用BigDecimal

    6. >>>:无符号右移。位运算在同等条件下,比四则运算符的乘法或者是除法快

    7. &&是短路运算符,也是逻辑运算符

    8. short s = 1; s = s + 1是错的,Java默认使用的是int,需要强转s = (short)(s + 1)

    9. +=运算符在编译的时候不会报错,但可能产生溢出

    10. 闰年:能被4整除但不能被100整除,或能被400整除

    11. 跳出多重嵌套循环:break Lablel;Label应放在循环语句前,否则不起作用

    12. Arrays类:

    • copyOfRang:复制数组
    • binarySearch:查找元素(二分法)

    13. 排序算法:(待补充)

    14. 存储相同数据量,二维数组比一维大,因为需要指向第一维的指针

    15. 类成员访问权限

    类所在说明 private 默认的 protected public
    本类 可见 可见 可见 可见
    相同包的其他类 不可见 可见 可见 可见
    不同包的其他类 不可见 不可见 不可见 可见
    相同包的子类 不可见 可见 可见 可见
    不同包的子类 不可见 不可见 可见 可见

    16. 抽象类和抽象方法:

    • 抽象类
      • 不能用new实例化
      • 只有它能包含抽象成员
      • 若派生,必须覆盖继承来的抽象成员
    • 抽象方法
      • 必须声明在抽象类
      • 不能用static修饰
      • 方法只含分号
      • 派生需要实现

    17. 静态语句块:通常用于必须的初始化操作

    18. Java只有值传递,对象参数传的是对象引用地址

    19. 一般情况下,抽象类用于继承,接口用于实现

    20. super可调用被重写的方法和成员

    21. final、finally、finalize的比较

    • final:修饰符。修饰类不能被继承。修饰变量赋值后不能被修改;修饰方法不能被重写。
    • finally:异常处理
    • finalize:一个方法,可以被重写,一般用于释放资源

    22. 浅克隆和深克隆

    • 浅克隆:被克隆的对象各个属性是基本类型,而不是引用类型。
      • 使用Object的clone()实现浅克隆,但必须实现Cloneable接口
    • 深克隆:存在引用类型
      • ①在浅克隆的基础上,实现对引用类型初始化
      • ②采用序列化的方式,但是比①效率低

    23. 内部类可被继承,但必须硬性给予这个类一个带参数的构造方法,参数应为外部类的引用,同时使用.super()方法

    24. 创建Class对象:

    • ①Class类的forName()
    • ②通过类的class属性
    • ③调用对象的getClass()方法

    25. 使用反射创建对象

    • ①Class的newInstance(),是对象,且必须提供没有入口参数的构造方法
    • ②使用Constructor:先获得类的Class对象,再通过Class对象方法获得Constructor类的实例,并通过Constructor类实例,调用newInstance(Object... obj)完成对象的创建

    26. 通过反射调用方法:通过Class对象或者Method对象,调用Method类的invoke方法

    27. 通过反射访问字段:通过getFiled()或getDeclaredFiled()获得指定字段,返回Field对象,用Field的getter()或setter()实现访问(只可修改public修饰的字段)

    28. 重写equals()方法

    • 自反性:x.equals(x)始终返回true
    • 对称性
    • 传递性
    • 一致性:始终返回true或false
    • x.equals(null)都应返回false

    29. 自动装包:基本类型自动转换为包装类,自动拆包与之相反

    30. String str = ""String str = null区别:前者为其分配内存空间,长度为0,后者没有

    31. “==”余equals()的区别:前者比较两个对象使用的内存地址和内容是否相同,后者只比较内容

    32. 在Java中,如果将同一字符串常量赋值给多个字符串变量来创建字符串对象,则这些字符串对象具有相同的内存地址

    33. 日期的格式化,时间变量的格式化:(待补充)

    34. 正则表达式:(待补充)

    35. 去掉字符串中的空格:

    • replaceAll方法
    • StringTokenizer类

    36. 判断数字:isDigit(char ch)

    37. 各进制转换:

    • parseInt(String s, int radix)
    • toBinaryString(int i)
    • toHexString(int i)
    • toOctalString(int i)

    38. StringBuilder是非线程安全的,但效率比StringBuffer高

    39. 替换字符串:

    • replace
    • replaceFirst
    • replaceAll

    40. 汉字区位码的转换:

    • 国标码 = 区位码 + 2020H
    • 机内码 = 国标码 + 8080H
    • 机内码 = 区位码 + A0A0H

    41. Arrays.asList方法,Collection定义的toArray方法,可以将数组转为集合,或者将集合转为数组

    42. Iterator接口中的remove方法是迭代过程中删除元素的安全方法

    43. List接口中,定义的ListIterator和Iterator的区别

    图1 ListIterator和Iterator的区别

    44. ArrayList和LinkedList的区别

    |集合 | 底层| 查找|增删|
    | :-------------|:-------------| :-----|:-----|:-----|
    | ArrayList| 数组元素 | 快 |慢,大量移动|
    | LinkedList| 链表对象 | 慢,从头遍历 |快|

    45. List<Integer> list = new ArrayList<>();删除元素时,可list = new LinkedList()<>

    46. Collection主要子接口继承关系

    图2 Collection主要子接口继承关系

    47. List接口实现类继承关系

    图3 List接口实现类继承关系

    48. Queue接口及其实现类继承关系

    图4 Queue接口实现类继承关系(注意,LinkedList底层也实现了List接口)

    49. Set接口及其实现类继承关系

    图5 Set接口实现类继承关系

    50. ArrayList与Vector的比较:Vector有些方法为同步,适合于需要线程安全的开发,但效率差

    51. Deque:两侧进入,两侧离开的队列

    52. Set

    • HashSet实现元素快速保存
    • LinkedHashSet有列表和集合两种功能,由于保存了顺序,性能比HashSet差
    • TreeSet:支持排序
    • 以上三个Set都不支持线程同步

    53. Map

    • HashMap:快速保存,查找数据
    • TreeMap:支持排序
    • LinkedHashMap:保存键值对添加顺序

    54. Map

    • keySet()获得键
    • value()获得值
    • entrySet()获得键值对

    55. 自定义TreeMap排序:修改compareTo()

    new TreeMap<,>(new Comarator<>(){})
    

    56. Math.random()返回0.0~1.0之间的伪随机数,使用的是线性同余法

    57. 线性同余法:

    • (1)将种子设为X0
    • (2)用一个算法X(n+1) = (a * X(n) + b) mod c 产生X(n+1)

    58. 使用RoundingMode进行舍入,HALF_UP实现四舍五入

    59. 数字格式化:DecimalFormat(待补充)

    60. Throwable:

    Throwable
    ->Error
    ->Exception
    

    61. 异常

    • 检查时异常:提供处理方式,如捕获或者抛出
    • 运行时异常:程序员失误引起,可避免

    62. 错误:程序以外的因素引起

    63. try-catch-finally,不管程序是否发生异常,都要执行的是finally

    64. PrintWriter的printLn()可以写入一行数据

    65. 使用Scanner类可以读取文本文件并解析数据

    66. 从控制台接收密码,使用Console的readPassword()

    67. Formatter对字符串进行格式化(待补充)

    68. 使用ObjectInputStream、ObjectOutputStream保存对象,使用transient关键字,让其属性不被保存

    69. 查看Windows硬盘空间:File类

    70. 创建临时文件:createTempFile

    71. SequenceInputStream,方便管理日志文件

    72. LineNumberReader可以设置行号

    73. 获得指定类型文件:FileFilter,FilenameFilter

    74. StreamTokenizer可统计单词和数字的个数

    75. 读取属性文件值:Properties

    76. NIO缓冲实现:

    图6-1 缓冲区示意图 图6-2 保存3个字节的缓冲区示意图 图6-3 调用flip方法的缓冲区示意图

    77. NIO中,增加了内存映射IO,可将文件映射到内存

    78. 泛型类型参数的命名要求

    • E:元素,广泛用于Java集合框架
    • K:键
    • N:数字
    • T:类型
    • V:值
    • S、U、V等:用于第二、三、四个类型变量

    78. 泛型限制类型参数范围

    • <T extends Comparable>表示T的范围限制在Comparable接口的实现类
    • <T extends Number>表示T的范围限制在Number类的子类
    • <T extends Number & Comparable>对类型参数进行多个限制

    79. Java的泛型支持协变,但是泛型不支持

    • Number[] numbers = new Integer[5];// 正确 Object[] objects = new List<?>[3];// 正确 Object[] objects = new List<Integer>[3];// 错误

    80. ?表示类型通配符,具有任意性

    81. 泛型擦除:Java虚拟机在编译的时候,会将类型信息给消去,这个过程称为类型擦除

    比如:boolean result = (new ArrayList<Number>().getClass() = new ArrayList(Integer)().getClass());结果为true,因为在编译的时候,程序变为输出new ArrayList().getClass = new ArrayList().getClass的结果
    由于擦除机制,导致许多常用功能无法实现,比如创建泛型化数组T[] array = new T[10],但可以使用Java的反射机制来实现
    ` public static <T> T[] createGenericArray(Class<T> type, int size) {
        return (T[]) Array.newInstance(type, size);

    82. Java Swing开发注意事项

    • Swing中的控件必须放置在顶层容器类中才能显示
    • 每个控件只能在容器中添加一次,如果想将容器中的空间增加到另一个容器中,则将移除第一个容器中的控件
    • 每个顶层容器都有一个内容窗格,用来保存添加的控件
    • 可以在顶层容器中增加菜单栏。菜单栏通常位于顶层容器中,但是不在内容窗格中(菜单栏仅用于JFrame和JApplet)

    83. Swing顶层容器类的继承关系

    图7 Swing顶层容器类的继承关系

    84. Swing文本控件的继承关系

    图8 Swing文本控件的继承关系
    • JTextField:用于显示单行无格式的文本
    • JFormattedTextField:用于获得指定格式的文本
    • JPasswordField:用于显示单行密码
    • JTextArea:用于显示多行无格式的文本
    • JEditorPane和JTextPane:均用于显示多行有格式的文本

    85. 使用键盘来操作文本控件:在javax.swing.JComponent类中定义了getInputMap()方法,可以用来获得InputMap对象,通过该对象可以将特定的按键与操作绑定

    86. 限制文本域中输入字符的长度:DocumentFilter类提供了对文档增加、替换和删除操作的过滤功能。由于删除操作并不能让字符串长度增加,因此只要限制增加和替换操作即可。

    87. 提示文本框中还有多少字符可用:实现DocumentListener接口,但不要在DocumentListener中修改文档的内容。对于JTextField控件,可以使用继承的getDocument()方法或者Document对象,然后将其强转成AbstractDocument,再调用addDocumentListener()方法为其执行DocumentListener

    88. 设置按钮上文本和图标的位置:

    • setHorizontalTextPosition():用于设置文本相对于图标的水平位置
    • setVerticalTextPosition():垂直位置

    89. 单选按钮需要放在ButtonGroup类中才能实现单选

    90. 获得当前系统支持的全部字体名称的数组:String[] fontNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();GraphicsEnvironment类表示由当前系统上虚拟机可以获得的GraphicsDevice类和Font类对象组成的集合。GraphicsEnvironment类对象的资源可以是本地系统, 也可以是远程系统。该类是一个抽象类,可以使用其getLocalGraphicsEnvironment()方法获得其对象。getAvailableFontFamilyNames()方法可以返回由当前GraphicsEnvironment类对象包含的字体名称字符串组成的数组。

    91. DefaultListCellRenderer类是默认的列表单元格渲染器,它实现了ListCellRenderer接口。在ListCellRenderer接口中定义了唯一的方法getListCellRendererComponent(),用于控制如何绘制单元格

    92. 使用JOptionPane类实现对话框功能

    93. JTestPane改变样式的步骤:

    • (1)将文档根据样式的不同进行分割,得到一个字符串数组
    • (2)分别为不同的字符串样式命名并保存到一个字符串数组中
    • (3)根据步骤(2)确定的名称来定义样式
    • (4)将文档与样式进行关联

    94. 选择图片时的预览功能:JFileChooser类提供了一个setAccessory()方法,它可以为文件选择器设置辅助设施,可以在辅助设施中提供图片预览功能。可以使用Image类来实现图片的缩放。

    95. 实现自动排序的列表:在实现列表模型时,使用TreeSet保存列表元素

    96. 得到显示器大小:Toolkit类的getScreenSize()

    97. 线程的生命周期

    图9 线程的生命周期

    98. Java线程的属性及其作用

    • ID属性:用于标识线程,可以使用Thread类中的getId()方法得到该属性值。但是该属性不能修改。
    • Name属性:用于标识线程,主要是为了方便程序员区分线程。可以使用Thread类中的getName()方法获得该属性值。也可以使用setName()方法修改该属性值。
    • Priority属性:用于表示线程的优先级,高优先级的线程可能有较高的几率获得自由。该属性与底层操作系统密切相关。Java中的线程优先级范围是1~10。可以使用Thread类中的getPriority()方法和setPriority()方法获得和设置该属性值。
    • Daemon属性:用于表示线程是否是守护线程。守护线程的作用是为其他线程提供服务。如果系统中仅剩下守护线程,则虚拟机会退出。可以使用Thread类中的setDaemon()方法设置线程是否是守护线程,方法的参数是一个布尔值

    99. 线程的停止

    • 线程执行时,程序中某段代码抛出InterruptedException异常
    • 当前线程执行了sleep()方法
    • 另一个高优先级的线程处于可运行状态,当前线程可能转为等待状态,与操作系统有联系
    • 当前线程执行了InputStream类的read()方法

    100. 线程中,start和run的区别:一个线程start(),并不表明线程马上执行,它需要等待CPU进程调度机制。run()表示线程的运行,是线程对象的一个方法。

    101. Object类提供的线程相关方法

    • notify():唤醒在此对象监视器上等待的单个线程
    • notifyAll():所有线程
    • wait():线程处于等待状态,直到其他线程调用此对象的notify()或者notifyAll()
    • wait(long timeout):与上者相同,区别是超过指定的时间量会唤醒。时间精度是毫秒级
    • wait(long timeout, in nanos):纳秒级。

    101. 线程同步是一种控制多个线程依次使用共享资源的能力,从而避免了错误的发生

    102. 线程死锁:两个以上的线程互相都要求对方已经占有的资源而导致无法继续运行的现象

    103. 使用Executors创建线程池,因为创建一个新的线程有一定的代价。使用完毕后,使用ExecutorService接口中定义的shutdown()关闭线程池

    104. Swing不是线程安全的

    105. 线程池存在死锁、并发问题、资源不足等风险

    106. 守护线程:又称后台线程,为其他线程服务

    107. 终止线程运行:Interrupted(),(stop()和suspend()不推荐,因为不安全)

    108. 线程的挂起:让线程暂时让出CPU的使用权限,暂时停止执行。

    109. 使用同步锁解决资源冲突问题lock()和unlock()

    110. ISO/OSI参考模型:共有七层

    • 物理层:用于在物理介质上传输可靠的原始比特流,是数据链路层在两个主机之间交换数据的有效途径
    • 数据链路层:以帧为单位在两个相邻节点间的线路上无差错地传输数据,并且接收方在接收到一帧数据时,会对所接收的数据进行检测,如果数据存在差错,就通知发送方重新发送这一帧数据
    • 网络层:用于选择合适的网间路由和交换节点,以确保数据能够在经过很多数据链路或经过很多通信子网的计算机之间及时地传送
    • 传输层:主要是根据通信子网的特性对网络资源进行最佳的利用,该层通过可靠和不可靠两种方式以报文为单位在源主机与目标主机的会话层建立、维护和取消传输连接
    • 会话层:用于建立、管理和终止进程间的会话,该层通过在数据中插入校验点,从而可以保证数据的同步传输
    • 表示层:用于对上层的数据进行转换,如对数据的加密、解密、压缩和格式等进行转换,以确保数据能够在两个主机的应用层进行正确传输
    • 应用层:用于规定应用进程在通信时所应遵循的协议,如收发邮件、浏览网页、上传和下载文件等,从而可以满足用户的实际需要

    111. TCP/IP对OSI参考模型进行了改进

    相关文章

      网友评论

        本文标题:《Java必须知道的300个问题》学习笔记

        本文链接:https://www.haomeiwen.com/subject/dctigttx.html