miracle just wanna be better

java基础

2019-08-01
miracle

简答题

题目一

随机组成四个由0-9组成的8位不重复数字的字符串,并且这四个字符串之间也不能重复

public class Domo {

    public static void main(String[] args) {
        HashSet<String> nums = new HashSet<String>();//定义set集合,set集合元素不能重复
        HashSet<StringBuilder> strs = new HashSet<StringBuilder>();//定义set集合,set集合元素不能重复

        while(true) {
            //添加8个不同的数字
            while (nums.size() < 8) {
                Random random = new Random();//随机生成数字,添加到nums集合
                nums.add(Integer.toString(random.nextInt(10)));
            }
            StringBuilder stringBuilder = new StringBuilder();
            for (String str : nums) {
                stringBuilder.append(str);
            }
            strs.add(stringBuilder);
            //当数组有4个数时退出方法
            if(strs.size()==4){
                break;
            }
        }
    }
}

题目二

(简答题)创建一个多线程的TCP 服务器以及客户端,完成下面的功能:
已知在服务器端的目录下有一个worldcup.txt,其格式如下:
2006/意大利
2002/巴西

该文件采用”年份/世界杯冠军 “的方式保存每一年世界杯冠军的信息。
要求从客户端输入年份,从服务器端查询,若查询到,返回举办地;反之,返回”未查询到该年份的世界杯举办地”。

服务器

public class ServerMain {
    public static void main(String[] args) throws IOException {
        System.out.println("服务器已启动");
        ServerSocket ss = new ServerSocket(9999);
        while (true) {
            Socket socket = ss.accept();
            Server server = new Server(socket);
            Thread t = new Thread(server);
            t.start();
        }

    }
}

服务器逻辑

public class Server implements Runnable{
Socket socket ;
public Server(Socket socket){
    this.socket=socket;
}

    // 创建map对象
    private Map<String, String> map = new HashMap<>();

    //构造代码块的内容会在对象创建的时候执行
    {
        try {
            // 创建字符输入流
            BufferedReader br = new BufferedReader(new FileReader("D:/aa/worldcup.txt"));
            // 读取服务端目录下worldcup.txt文件
            String str;
            while ((str = br.readLine()) != null) {
                // 以/为标志将读取到的字符串分割成两个子字符串
                String[] st = str.split("/");
                // 将读到的内容放入到map中
                map.put(st[0], st[1]);
                System.out.println(st[0]+""+st[1]);
            }
            // 关流
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        try{
            //网络输入流
            DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
            //网络输出流
            DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
            // 读取客户端发送过来的数据
            String year = dis.readUTF();
            // 判断map中是否包含year,并将结果发送给客户端
            if (map.containsKey(year)) {
                dos.writeUTF(map.get(year));
            } else {
                dos.writeUTF("未查询到该年份的世界杯举办地");
            }
            dos.close();
            dis.close();
            // 关流
            socket.close();

        }catch (Exception e){
            e.printStackTrace();
        }


    }
}

客户端

public class Client {

    public static void main(String[] args) throws Exception{
        System.out.println("输入年份");
        Scanner sc = new Scanner(System.in);
      Socket  socket = new Socket("localhost", 9999);
        String year = sc.nextLine();
        //网络输入流
        DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
        //网络输出流
        DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
        dos.writeUTF(year);
        dos.flush();
        // 读取服务端返回过来的数据
        String city = dis.readUTF();
        System.out.println(city);
        dis.close();
        dos.close();
        // 关流
        socket.close();



    }
}

不借助第三个变量交换值

借助栈的方式,先进后出,将先取出的值赋给后面的值

void exchange(int x,int y){
		Stack s =new Stack();
		s.push(x);
		s.push(y);
		x=(int) s.pop();
		y=(int)s.pop();
		System.out.println("x="+x+"  y="+y);	
	}

四则运算

int a=13;
int b=23;
a=b-a;
b=b-a;
a=a+b;

位运算符

int x=10; //  1010
int y=5;// y= 0101
x=x^y;  // x= 1111  =15
y=y^x;//   y= 1010  =10
x=x^y;//   x= 0101  =5

builder方式创建对象

public class Person {
	//姓名 -required(必写)
	private final String name;
	//性别-required(必写)
	private final String gender;
	//年龄
	private int age;
	//省份证号
	private String id;
	
	public static class newBuilder{
		//姓名 -required
		private String name;
		//性别-required
		private String gender;
		//年龄
		private int age;
		//省份证号
		private String id;
		
		public newBuilder setAge(int age){
			this.age = age;
			return this;
		}
		public newBuilder setId(String id){
			this.id = id;
			return this;
		}
		public newBuilder(String name,String gender){
			this.name = name;
			this.gender = gender;
		}
		public Person build(){
			return new Person(this);
		}
	}
	//外部类的私有构造函数
	private Person(newBuilder builder){
		this.name = builder.name;
		this.gender = builder.gender;
		this.age = age;
		this.id = id;
	}

}

创建对象时

Person p = new Person.newBuilder("miracle","male").setAge(18).build();
Person p = new Person.newBuilder("miracle","male").setAge(18).setId("1877551230").build();

思路

  • 我们用builder方式创建对象时,用到了静态的内部类,内部类可以访问外部类的所有属性和方法
  • 为外部类写一个私有的构造方法,就不能直接用外部类用new的方式来创建对象
  • 所以用外部类打点内部类的方式先new出内部类对象,通过设置内部类的构造方法限定必须要输入的属性值;然后用内部类调用build()方法,返回一个以子类作为参数的Person类类型,内部类就通过私有的外部类构造器创建了一个新的对象
  • 因为子类set方法的返回值都是子类的类类型,所以可以继续设置属性

优点

  • 成员变量可以是final类型,通过设置构造函数来要求必须输入
  • 对象状态连续,创建时就赋值,更加清晰

总结

  • 外部类构造函数私有,且参数为静态内部类,使用静态内部类的变量为构建类逐一赋值
  • 静态内部类拥有外部类相同的属性
  • 为每一个属性写一个setter方法,返回的是当前Builder对象
  • 最后提供一个方法build方法,new出来一个构建类的对象,参数是当前的Builder对象

ArrayList和Vector的区别

ArrayList和Vector这两个集合本质上并没有什么太大的不停,他们都实现了List接口,而且底层都是基于Java数组来存储集合元素。

点我看详细

Java有哪些容器?

点我看详细

数组和列表(ArrayList)有什么区别?有什么时候应该使用Array而不是Array List?

数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用 Array 而不是ArrayList ? 下面列出了 Array 和 ArrayList 的不同点:Array 可以包含基本类型和对象类型,ArrayList 只能包含对象类型。Array 大小是固定的,ArrayList 的大小是动态变化的。ArrayList 提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

 ArrayList 和 LinkedList 有什么区别?ArrayList 和 LinkedList 都实现了 List 接口,他们有以下的不同点:ArrayList 是基于索引的数据接口,它的底层是数组。它可以以 O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList 是以元素列表的形式存储它的数据,每一个元素都和它的前 一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是 O(n)。相对于 ArrayList ,LinkedList 的插入,添加,删除操作速度更快,因为当元素被添加到集合任 意位置的时候,不需要像数组那样重新计算大小或者是更新索引。LinkedList 比 ArrayList 更占内存,因为 LinkedList 为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。也可以参考 ArrayList vs. LinkedList 。

ConcurrentHashMap的原理?

点我看详情

遍历HashMap的三种方式?

1.利用键的Set集合; 2.利用值的集合遍历所有value; 3.通过entry对象存储每一次的键和值(效率最高)

String s=new String(“abc”)分别在堆栈上新建了哪些对象?

一. 在常量池找abc,如果找到,就不创建对象,如果没找到,就在常量池创建string对象 二.出现了new,在堆内存创建string对象,并存储abc,将其返回给s ,s在栈中这个对象的引用. 如果是String s=”abc”; 在常量池找abc,如果找到就不创建对象,否则,在常量池创建对象

点我看详情

什么是多线程并发安全问题?这种问题的原因是什么?如何去解决?

点我看详情

Synchronized用过吗?其原理是什么?

点我看详情

ThreadLocal的使用场景?

点我看详情

二十三种设计模式

点我看详情

请从100万个数字中找到最大的10个数字?

把100W平均分成100份,每份1W,挑出每份最大的十个数字,组合起来在找最大的十个数字


上一篇 web前端

下一篇 JavaScript

Comments

Content