[Java] 常用功能

avatarplhDigital nomad

Java常用功能

String StringBuffer StringBuilder 有什么区别

String是长字符,创建之后不能修改,每次修改都是创建新字符,stringBuffer和stringBuild 差不多,stringBuffer线程安全。stringBuilder不是线程安全。

public class TestStringAppend {
    public static void main(String[] args) {
        String s = "I love Java";
        String str = "";
        long start = System.nanoTime();
        for (int i = 0; i < 100000; i++) {
            str += s;
        }
        long end = System.nanoTime();
        System.out.println("Time taken using String concatenation: " + (end - start) + " nanoseconds");
        StringBuilder sbuffer = new StringBuilder();
        long start1 = System.nanoTime();
        for (int i = 0; i < 100000; i++) {
            sbuffer.append(s);
        }
        long end1 = System.nanoTime();
        System.out.println("Time taken using StringBuilder: " + (end1 - start1) + " nanoseconds");
        StringBuffer sbuffer2 = new StringBuffer();
        long start2 = System.nanoTime();
        for (int i = 0; i < 100000; i++) {
            sbuffer2.append(s);
        }
        long end2 = System.nanoTime();
        System.out.println("Time taken using StringBuffer: " + (end2 - start2) + " nanoseconds");
    }
}

运行结果如下

Time taken using String concatenation: 2250690542 nanoseconds
Time taken using StringBuilder: 2035292 nanoseconds
Time taken using StringBuffer: 2266000 nanoseconds

List Set Map 是否继承Collection接口,区别在哪

java 体系中,容器库分为collection 和 map,collection是存放一组各自独立的对象,map存放的是key value对象。list 和 set都是collection的子接口,list是有序可重复列表,set是无序,重复集合。

list代码如下, 有序可重复

public class TestList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Python");
        list.add("C++");
        list.add("JavaScript");

        for (String language : list) {
            System.out.println(language);
        }
    }
}
Java
Python
C++
JavaScript

Set 无序可重复

public class TestList {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("one");
        set.add("two");
        set.add("three");
        set.add("four");
        set.add("");
        set.add("");
        for (String number : set) {
            System.out.println(number);
        }
        
    }
}
four
one
two
three

map用来存放key-value的,代码如下

public class TestMap {
    public static void main(String[] args) {
        Map map = new HashMap<>();
        map.put("name", "John43");
        map.put("name", "John23");
        map.put("name", "John12");
        map.put("age", 30);
        map.put("city", "New York");
        for (Object key : map.keySet()) {
            System.out.println(key + " : " + map.get(key));
        }
    }

}

ArrayList LinkedList, Vector 区别

ArrayList是一个可以自动加容量,存放不同类的对象集合, 由于是实现自List, 因此能存放有序对象,插入删除操作比较费事,linkList比较方便插入,因为是链表,搜索查找首选arraylist,插入删除,首选linkList,vector是多线程安全的ArrayList。

public class TestArrayList {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");
        list.add("Date");

        for (String fruit : list) {
            System.out.println(fruit);
        }
        System.out.println("Size of the list: " + list.size());
        System.out.println("Element at index 2: " + list.get(2));

        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("Apple");
        linkedList.add("Banana");
        linkedList.add("Cherry");
        linkedList.add("Date");
        for (String fruit : linkedList) {
            System.out.println(fruit);
        }

        Vector<String> vector = new Vector<>();
        vector.add("Apple");
        vector.add("Banana");
        vector.add("Cherry");
        for (String fruit : vector) {
            System.out.println(fruit);
        }
    }
}

HashMap HashTable 区别

hashtable 和 hashmap除了不同步,hashmap可以使用null作为键值,其他都差不多,hashtable是同步的,hashmap是不同步的。

什么是反射机制,有什么用?

反射机制定义

程序可以访问检测和修改其本身的状态或者行为的一种能力

作用

运行时判断一个对象的类型,构造任意一个对象,判断一个雷所具有的成员变量和方法。运行时可以调用任意一个对象的方法,甚至可以调用private。

反射机制API

  1. class类,代表一个类
  2. field类,代表成员变量
  3. Method,代表方法
  4. Constructor,代表构造器方法
  5. Array类,提供动态创建数组以及访问数组的元素的静态方法

获取属性名和方法

public class TestReflect {
    public static void main(String[] args) {
        TestReflect tr = new TestReflect();
        tr.test1();
    }
    public void test1(){
        Class c = String.class;
        Method[] methods = c.getDeclaredMethods();
        for (int i = 0; i < methods.length; i++) {
            System.out.println(methods[i].getName() + " : " + methods[i].getReturnType());
        }
        Field[] fields = c.getDeclaredFields();
        for(Field f:fields) {
            System.out.println(f.getName() + " : " + f.getType());
        }
    }
}

根据类名字动态创建类

public class TestReflect {
    public static void main(String[] args) throws Exception {
        TestReflect tr = new TestReflect();
        // tr.test1();
        tr.test2();
    }
    public void test1(){
        Class c = String.class;
        Method[] methods = c.getDeclaredMethods();
        for (int i = 0; i < methods.length; i++) {
            System.out.println(methods[i].getName() + " : " + methods[i].getReturnType());
        }
        Field[] fields = c.getDeclaredFields();
        for(Field f:fields) {
            System.out.println(f.getName() + " : " + f.getType());
        }
    }

    public void test2 () throws Exception {
        Class c = Class.forName("Student");
        Student student = (Student) c.newInstance();
        student.setName("John Doe");
        student.setId(20);
        student.show();
    }
}

class Student {
    private String name;
    private int id;

    public String getName() {
        return name;
    }

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

    public int getId() {
        return id;
    }

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

    public void show() {
        System.out.println("Name: " + name + ", ID: " + id);
    }
}

动态创建数组对象

public class TestReflect {
    public static void main(String[] args) throws Exception {
        TestReflect tr = new TestReflect();
        tr.test4();
    }
    public void test4() {
        try {
            Class cls = Class.forName("java.lang.String");
            Object arr = Array.newInstance(cls, 10);
            Array.set(arr, 5, "this is a test");
            String s = (String) Array.get(arr, 5);
            System.out.println(s);
        } catch (Exception e) {
            System.err.println(e);
            // TODO: handle exception
        }
    }
}

如何读取键盘输入信息

public class InputStream {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        System.out.println(s);
        int i = sc.nextInt();
        System.out.println(i);
    }
}

获取系统路径

public class GetPath {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));
        System.out.println(Test.class.getClassLoader().getResource(""));
        System.out.println(ClassLoader.getSystemClassLoader().getResource(""));
        System.out.println(Test.class.getResource(""));
        System.out.println(Test.class.getResource("/"));

        System.out.println(new File("").getAbsolutePath());
        System.out.println(System.getProperty("user.dir"));
    }
}

MD5 vs SHA diff

public class md5 {
    public static void main(String[] args) {
        md5 md1 = new md5();
        System.out.println(md1.digestString("liangjiq", "md5"));
    }

    private String digestString(String string, String string2) {
        try {
            MessageDigest md = MessageDigest.getInstance(string2);
            md.update(string.getBytes());
            byte[] digest = md.digest();
            StringBuilder sb = new StringBuilder();
            for (byte b : digest) {
                sb.append(String.format("%02x", b));
            }
            System.out.println("MD5 Digest: " + sb.toString());
            return sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return string2;
    }
}