Tag Archives: java

Сравнение строк в Java

Недавно проходил собеседование по Java. В тестах был вопрос. Что возвращает следующий код?
public class Main
{
    public static void main(String[] args) 
    {
	String s1 = "abc";
	String s2 = "abc";

	String str1 = new String("abc");
	String str2 = new String("abc");

	if (s1 == s2){
	    System.out.println("s1 == s2");           
	} 
	else { 
	    System.out.println("s1 != s2");
	}

	if(s1 + s2 == s2 + s1){
	    System.out.println("s1 + s2 == s2 + s1");
	} 
	else {
	    System.out.println("s1 + s2 != s2 + s1");
	}

	if (str1 == str2) {
	    System.out.println("str1 == str2");           
	} 
	else {
	    System.out.println("str1 != str2");
	}
		
	if (s1 == str1){
	    System.out.println("str1 == s1");         
	}
	else {
	    System.out.println("str1 != s1");
        }
    }
}
Внимание, правильный ответ:
s1 == s2
s1 + s2 != s2 + s1
str1 != str2
str1 != s1
Для меня было неожиданно, что s1 == s2. Это связано с тем, что в java есть так называемый string intern pool (см. String interning), в который заносится адрес обьекта строковой константы, при ее первом обьявлении. А если дальше еще встречается эта константа, то используется адрес объекта String из пула, а не создается новый. Но если строка была создана, вот так:
String str1 = new String("abc");
то она автоматически в пул не помещается. Для того, что бы это произошло, нужно вызвать метод intern()

Инициализация java класса org.apache.http.client.HttpClient для работы с https

Ниже привожу пример инициализации HttpClient для https доверяющего всем сертификатам

import org.apache.http.client.HttpClient;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.BasicClientConnectionManager;

import java.security.NoSuchAlgorithmException;
import java.security.KeyManagementException;
import java.security.cert.X509Certificate; 
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.net.ssl.SSLContext; 
import javax.net.ssl.HostnameVerifier;


    
public MyHttpClient
{
    .......

    private HttpClient getHttpClient(boolean isHttps)
    {
        if(isHttps)
        {
            // Create a trust manager that does not validate certificate chains
            TrustManager[] trustAllCerts = new TrustManager[] { 
                new X509TrustManager() {
                @Override
                public X509Certificate[] getAcceptedIssuers() { 
                    return new X509Certificate[0]; 
                }
                
                @Override
                public void checkClientTrusted(X509Certificate[] certs, String authType) {}
                
                @Override
                public void checkServerTrusted(X509Certificate[] certs, String authType) {}
            }};

            SSLContext sslContext;
            try {
                sslContext = SSLContext.getInstance("SSL");
            } catch (NoSuchAlgorithmException e) { //  if no Provider supports a TrustManagerFactorySpi implementation for the specified protocol.
                System.out.println(e.getMessage());
                return null;
            }
            
            try {
                sslContext.init(null, trustAllCerts, new SecureRandom());
            } catch (KeyManagementException e) {
                System.out.println(e.getMessage());
                return null;
            }
            
            HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
            SSLSocketFactory sf = new SSLSocketFactory(sslContext, (X509HostnameVerifier)hostnameVerifier);
            
            Scheme httpsScheme = new Scheme("https", 443, sf);
            SchemeRegistry schemeRegistry = new SchemeRegistry();
            schemeRegistry.register(httpsScheme);

            ClientConnectionManager cm = new BasicClientConnectionManager(schemeRegistry);
            return new DefaultHttpClient(cm);
        } 
        else
        {
            return new DefaultHttpClient();
        }    
    }        
}