Java中的⼀些奇淫技巧总结
不⽤中间变量交换两个数
public class SWapTest {
static int a = Integer.MAX_VALUE;
static int b = 1;
public static void main(String[] args) {
System.out.println("初始值,a = " + a + ",b = " + b);
int temp = a;
a = b;
b = temp;
System.out.println("中间变量交换,a = " + a + ",b = " + b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("异或交换,a = " + a + ",b = " + b);
a = a + b;
System.out.println(a); // 溢出
b = a - b;
a = a - b;
System.out.println("求和交换,a = " + a + ",b = " + b);
}
}
⽤异或能够实现两个数之间的交换主要是异或具有如下的性质:
1. 任意⼀个变量X与其⾃⾝进⾏异或运算,结果为0,即X^X=0。
2. 任意⼀个变量X与0进⾏异或运算,结果不变,即X^0=X。
3. 异或运算具有可结合性,即a^b^c=(a^b)^c=a^(b^c)。
4. 异或运算具有可交换性,即a^b=b^a。
第⼀步:a = 原来的a ^ b;
第⼆步:b = 原来的a ^ b ^ b = 原来的a(b已经得到了交换);
第三步:a = 原来的a ^ b ^ 原来的a = b。(a和b都得到交换)。
如何更好地打印数组中的内容
我们知道如果直接打印数组名,将会打印其hash码。如何漂亮地显⽰数组中的内容?——使⽤java.String()⽅法。
public class ArrayTest {
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4, 5, 6, 7, 8 };
// a = null;
System.out.String(a));
printArray(a);
}
/**
* 以良好的格式输出数组中的内容,和String()⽅法类似
* @param arr
*/
private static void printArray(int[] arr){
if (arr==null) {
System.out.println("null");
return;
}
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i!=arr.length-1) {
System.out.print(arr[i] + ", ");
}else {
System.out.println(arr[i] + "]");
}
}
}
}
解决Eclipse中项⽬的乱码问题
中⽂机器上,Eclipse默认的项⽬编码时GBK,如果我们将其导出到UTF-8编码的机器上就会出现乱码。使⽤JavaIO中
的InputStreamReader和OutputStreamWriter这两个类可以完成⽂件编码的转换。(这两个类的构造⽅法中可以指定字符集)。基于此,写出如下的Java⼩程序,可以将指定⽬录下的GBK编码的Java源⽂件转换成UTF-8编码。
public class FileUtil {
/**
* 过滤当前⽬录下的特定后缀名的⽂件,并将⽂件名保存到字符串中不同⽂件名之间以逗号分隔
* @fileName :⽂件名或者⽬录名
* @filter :过滤器,特定的后缀,*或者空字符串表⽰匹配所有
*/
static StringBuilder result = new StringBuilder();
static int count = 0;
private static String getJavaFiles(String fileName, String filter) {
File file = new File(fileName);
if (filter == null || filter.equals("*")) {
filter = "";
}
if (file.isFile() && Name().endsWith(filter)) {
result.AbsolutePath() + ",");
count++;
}
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
java中split的用法AbsolutePath(), filter);
}
}
}
String();
}
/**
* @param file:需要转换的⽂件名
* @param fromCharset:⽂件的原始编码
* @param toCharset:需要转换的编码
*/
private static boolean convertEncoding(File file, String fromCharset,
String toCharset) {
try {
InputStreamReader isr = new InputStreamReader(new FileInputStream(
file), fromCharset);
File tempFile = new File("tmp");
OutputStreamWriter oos = new OutputStreamWriter(
new FileOutputStream(tempFile), toCharset);
int temp = 0;
while ((temp = ad()) != -1) {
oos.write(temp);
}
isr.close();
oos.close();
isr = new InputStreamReader(new FileInputStream(tempFile));
oos = new OutputStreamWriter(new FileOutputStream(file));
while ((temp = ad()) != -1) {
oos.write(temp);
}
isr.close();
oos.close();
tempFile.deleteOnExit(); // 删除临时⽂件
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
public static void main(String[] args) {
String fileString = getJavaFiles("⽬录名", "*");
String[] fileNames = fileString.split(",");
for (String filename : fileNames) {
if (convertEncoding(new File(filename), "gbk", "utf-8")) {
System.out.println(filename + "转换成功!");
}
}
}
}
关于3⽬运算符
3⽬运算符存在⾃动类型提升,例如以下的代码:
char ch = 'A';
System.out.println(true?ch:65535); // 输出字符'A'
System.out.println(true?ch:65536); // 输出ASCII 65
int number = 0;
System.out.println(true?ch:0); // 输出字符'A'
System.out.println(true?ch:number); // 输出ASCII 65
java中的字符采⽤的是UTF-8编码,每⼀个字符采⽤2个字节表⽰,范围从\u0000~\uffff即0~65535.
关于除0问题
整数除以0会发⽣除零异常,但是浮点数除以0不会发⽣除零异常,⽽是输出⽆穷⼤。
System.out.println(1.0 / 0); // 输出Double中定义的Infinity
System.out.println(1 / 0.0); // 输出Double中定义的Infinity
System.out.println(1 / 0); // 抛出算术异常
TreeSet集合问题
添加到TreeSet中的元素必须实现Comparable接⼝。TreeSet底层的实现是⼆叉树。通过覆写compareTo()⽅法我们可以⾃⼰指定元素在此集合中的位置。
class Student implements Comparable<Student> {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Student s) {
// 按照年龄升序排列,如果年龄相同则按照姓名升序排列
int tmp = Integer.valueOf(age)pareTo(Integer.valueOf(s.age));
if (tmp == 0)
return namepareTo(s.name);
return tmp;
}
@Override
public String toString() {
return"Student [name=" + name + ", age=" + age + "]";
}
}
public class TreeSetTest {
public static void main(String[] args) {
TreeSet<Student> treeSet = new TreeSet<Student>();
treeSet.add(new Student("a", 14));
treeSet.add(new Student("c", 12));
treeSet.add(new Student("z", 12));
treeSet.add(new Student("g", 16));
treeSet.add(new Student("B", 1));
treeSet.add(new Student("q", 17));
treeSet.add(new Student("B", 1)); // ⽆法加⼊
System.out.println(treeSet);
}
}
以上程序的运⾏结果是先按照年龄升序,如果年龄相同则按照姓名升序。年龄和姓名均相同就会被认为是同⼀个⼈⽽⽆法加⼊。
TreeSet集合使⽤⼆叉树数据结构存储元素(⼆叉排序树【⼩于0的元素放在左⼦树,⼤于0的元素放在右⼦树,等于0的元素(认为元素相等)不会加⼊到树中】完全依赖于compareTo⽅法的返回值)。每
次向TreeSet集合中加⼊元素都要与根元素⽐较,如果⽐根元素⼩就递归⽐较左⼦树,否则递归⽐较右⼦树,直到该元素到正确的插⼊位置或者被树拒绝。TreeSet取得元素是先序遍历(从⼩到⼤)。
了解了TreeSet的⼯作原理,下⾯就可以使⽤TreeSet来实现插⼊顺序和输出顺序⼀致和以插⼊顺序的逆序输出。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论