12.System.out.println();System.out.printf();和System.out.print();区别
- System是类,out是System类下的PrintStream类型的静态常量;println是PrintStream的方法。
- println 将它的参数显示在命令窗口,并在结尾加上换行符,将输出光标定位在下一行的开始。
- print将它的参数显示在命令窗口,并将输出光标定位在所显示的最后一个字符之后。
- printf是格式化输出的形式。
'd' 整数 结果被格式化为十进制整数
'o' 整数 结果被格式化为八进制整数
'x', 'X' 整数 结果被格式化为十六进制整数
'e', 'E' 浮点 结果被格式化为用计算机科学记数法表示的十进制数
'f' 浮点 结果被格式化为十进制数
'g', 'G' 浮点 根据精度和舍入运算后的值,使用计算机科学记数形式或十进制格式对结果进行格式化。
'a', 'A' 浮点 结果被格式化为带有效位数和指数的十六进制浮点数
-
FileOutputStream、OutputStreamWriter、BufferedWriter的区别和用法
FileOutputStream是字节流,是OutputStream的子类
BufferedWriter是字符流,是Writer的子类
OutputStreamWriter是字符流(转换流),是字符通向字节流的桥梁:可以指定的charset将要写入流中的字符编码成字节。(编码:能看懂的字符变为看不懂的字节)
字节输入 InputStream 字节输出 OutputStream字符输出流 Writer字符输入流 Reader
文件类读取数据FileInputStream 文件输出流 FileOutputStream
字符转字节OutputStreamWriter 字节转字符InputStreamReader
字节缓冲输入流 BufferedInputStream 字节缓冲输出流 BufferedOutputStream
写入文件 FileWriter 字符缓冲输出 BufferedWriter 文件读取 FileReader 字符缓冲输入 BufferedReader
参考史上最全的IO流教程,没有之一https://www.cnblogs.com/yichunguo/p/11775270.html
- Java 语言有哪些特点?
- 简单易学;
- 面向对象(封装,继承,多态);
- 平台无关性( Java 虚拟机实现平台无关性);
- 可靠性;
- 安全性;
- 支持多线程
- 支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便);
- 编译与解释并存;
- Oracle JDK 和 OpenJDK 的对比
- OpenJDK 是一个参考模型并且是完全开源的,而Oracle JDK是OpenJDK的一个实现,并不是完全开源的;
- Oracle JDK 比 OpenJDK 更稳定。OpenJDK和Oracle JDK的代码几乎相同,但Oracle JDK有更多的类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用OpenJDK 可能会遇到了许多应用程序崩溃的问题,但是,只需切换到Oracle JDK就可以解决问题;
- 在响应性和JVM性能方面,Oracle JDK与OpenJDK相比提供了更好的性能;
- Oracle JDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本;
- Oracle JDK根据二进制代码许可协议获得许可,而OpenJDK根据GPL v2许可获得许可。
- Java和C++的区别?
- Java 不提供指针来直接访问内存,程序内存更加安全
- Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承
- Java有自动内存管理机制,不需要程序员手动释放内存(gc)
- Java 为什么占两个字节的char
- Java语言内部存储采用的是Unicode编码,Unicode编码中的每个字符占两个字节,中文也是占两个字节,所以,Java中的字符可以存储一个中文汉字。
- 而在不同的编码方式中,中文所占的字节数是不同的:
ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序 列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255
UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
Unicode编码中,一个英文等于两个字节,一个中文(含繁体)等于两个字节。
UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。
UTF-32编码中,世界上任何字符的存储都需要4个字节。
- 构造器 Constructor 是否可被 override?
- 父类的私有属性和构造方法并不能被继承,所以 Constructor 也就不能被 override(重写)。
- 可以 overload(重载),一个类中可以有多个构造函数。
- 重载和重写的区别
- 重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
- 重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。
- String,StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?
可变性:String 类中使用 final 关键字修饰字符数组来保存字符串,private final char value[],所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串char[]value 但是没有用 final 关键字修饰,所以这两种对象都是可变的。
线程安全性:String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
-
性能:每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
对于三者使用的总结:
- 操作少量的数据: 适用String
- 单线程操作字符串缓冲区下操作大量数据: 适用StringBuilder
- 多线程操作字符串缓冲区下操作大量数据: 适用StringBuffer